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

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

1.基础知识

免杀(Bypass AV/EDR)是指通过修改恶意软件的代码结构、执行方式或行为特征,使其在静态扫描和动态运行过程中不被安全软件检测的技术。要完成免杀任务,必须清楚杀软如何工作:

(1)杀软是如何检测出恶意代码的?
杀软通常结合三种机制进行防御:

①特征码检测:提取已知恶意代码的固定片段(如文件哈希、特定的机器指令字节流、YARA 规则),与目标文件进行比对。

②启发式检测:在执行前,通过分析代码结构(如高熵加壳、异常节表、没有数字签名、可疑 API 组合调用等),推断其“像不像”恶意代码。

③行为检测:在程序运行时(或沙箱中),监控其是否执行了如进程注入、异常内存分配、篡改注册表、建立异常网络连接等恶意动作。

(2)免杀是做什么?
免杀是对恶意软件进行特殊处理,使其能够逃避杀毒软件的查杀。目的是为了让恶意代码(如反弹 shell、木马)能够成功植入目标系统并运行,而不被安全软件阻断或删除。这是渗透测试中获取并维持控制权(后渗透)的核心技术之一。

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

①改变特征码:使用编码器多重编码、对 Payload 进行加密、组件分离(Loader 与 Payload 分开落地)、替换编程语言(如使用 Python、Go 重写)。

②改变行为与外观:使用加壳工具(如 UPX)、隐藏敏感 API 的导入表(动态调用 GetProcAddress)、延迟执行以避开沙箱。

③无文件攻击(纯内存加载):放弃落地 .exe,利用合法解释器(PowerShell、Python)或白进程,直接在内存中解密并执行 Shellcode。

2.实验内容

(1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧

  • 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
  • veil,加壳工具
  • 使用C + shellcode编程

(2)通过组合应用各种技术实现恶意代码免杀

如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。

(3)用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本

3.实验过程

3.1 实验准备

  • 攻击机(Kali Linux):IP 地址为 192.168.17.129。

  • 靶机(Windows 11):开启自带的联想杀毒软件,实时防护保持开启状态。网络与 Kali 互通。

2026-10-19-11-21-41-image

  • 测试思路:先使用传统方法(msfvenom直接生成、编码、加壳)进行基线测试;再尝试 C 语言 + 组件分离;若被杀,则尝试高级的脚本语言纯内存加载。

3.2 传统免杀方法测试

使用 msfvenom 生成基础的反弹木马,并使用 UPX 加壳:

首先,在 Kali 上启动 msfconsole 监听:

生成基线样本(msfvenom exe / jar):

使用 msf 编码器(shikata_ga_nai)生成免杀样本:

使用 UPX 加壳时遇到 section size 错误,且系统已安装 UPX 4.2.4,说明该知名壳对现代 msf 生成的 PE 结构兼容性差,且特征已被查杀,如下图:

测试结果:在 Windows 上下载或扫描时,全部被联想杀软瞬间拦截或直接删除。这验证了指导书所述:msfvenom 模板特征已被各大杀软完全收录,单纯编码和知名 UPX 壳均已失效。

3.3 C语言和组件分离技术

采用指导书推荐的思路,将 Shellcode 加密为 encoded.txt 纯文本,编写 C 语言 Loader 动态读取解密并在内存执行。具体步骤如下:

1.组件分离与半手工 C 语言 Loader

生成 raw 格式的原始载荷

使用 perl 脚本将每个字节 +1,并转换成十六进制文本

2.编写并编译 Loader

3.重新启动监听和 HTTP 服务

4.通过http下载loader.exe使用杀毒软件扫描未发现风险

(突然想起来应该给loader.exe改名字o(╥﹏╥)o)
image
使用杀软工具扫描:


显示成功从网站下载所需文件:

5.尝试运行,弹窗卡退,具体如下:
  • 问题:初次编译出的 loader_20242327.exe 双击后闪退。通过排查 Windows“事件查看器”,发现崩溃模块为 unknown,如下图:

  • 结果:联想杀软的文件信誉机制和启发式检测极其强大,不仅能够拦截特定 API,甚至能在 .exe 文件落地的瞬间直接隔离删除(提示包含病毒或潜在的垃圾软件)。传统的落地型 C 语言 Loader 方案失败。

3.4 换语言重写与纯内存加载

本实验采用合法解释器 + 纯内存加载思路。将 Shellcode 以 Base64 编码保存为纯文本数据,不落地任何 .exe。通过 Python 的 ctypes 调用 VirtualAlloc、memmove、CreateThread 在内存中申请、写入并执行代码。由于恶意代码从未以文件形式落地,Python 解释器本身在白名单内,静态特征码和落地监控均无法命中,从而绕过联想杀软。
具体步骤如下:

  1. 生成编码载荷:使用 msfvenom 生成 payload,并将其转换为 Base64 文本格式保存(payload.b64)。

  2. 编写 Python 脚本:编写 loader_20242327.py,在脚本内解码 Base64。利用 Python 的 ctypes 库直接调用底层的 Windows API(VirtualAlloc 申请 RWX 内存,memmove 写入内存,CreateThread 创建线程执行)。

  3. 运行结果:在 Windows 靶机上执行 python loader_20242327.py。杀毒软件毫无反应(Python 解释器本身在白名单内,且无恶意文件落地)。同时,Kali 攻击机成功收到反弹连接(Meterpreter session 1 opened)。

    image

image

image

注:此时安全软件仍然开启

4.问题及解决方案

  • 问题1:使用 upx baseline.exe 加壳时,报错 CantPackException: section size problem。

    问题1解决方案:msfvenom 生成的部分 PE 文件结构特殊,UPX 无法正常压缩。这从侧面说明知名加壳工具在现代依然受到限制,故直接放弃加壳方案,转向更底层的免杀。

  • 问题2:使用 C 语言编写的 loader.exe 在 Windows 上双击后闪退。

image

问题2解决方案:通过打开 Windows “事件查看器 -> Windows 日志 -> 应用程序”,定位到 loader.exe 报错,发现代码在 64 位环境下指针访问或 API 调用异常。虽然修复了代码逻辑,但最终因文件落地被秒杀而放弃此方案。

  • 问题3:使用 Python 脚本加载时,报错 OSError: exception: access violation writing(写入访问冲突)。

    解决方案:这是因为在 64 位 Python 环境下,默认的类型传递与 C 语言的 64 位指针不兼容。通过在 ctypes 中显式声明 restype = ctypes.c_void_p 以及 argtypes 列表,严格规范了数据类型,成功修复了内存写入错误。

5.学习感悟、思考等

本次实验是一次较为真实的对抗体验。

在理论认知中,我学习了编码、加壳、分离等技巧,但在 实战环境下,面对联想杀软这类现代防御体系,那些传统的、试图落地 .exe的免杀手法几乎被全面封杀。这也让我深刻理解了指导书里提到的不一定成功。

在无数次被拦截、删文件、闪退的挫败中,我通过查阅日志(事件查看器)、分析杀软行为(拦截落地文件),最终转换思路,跳出了必须写一个 exe的思维定势,使用配合Python 纯内存加载的思路成功回连。连接时,杀毒软件仍然弹出该程序可能存在威胁(证明并没有完全免杀,但这里可以选择忽略,而不是像之前直接把恶意程序删掉),我选择了依然运行,最终完成实验的成功验证。

另外,本次实验过程发现文件名需要加学号,又修改了一下,又联想到之前实验从未注意这点,痛定思痛……

最后,这次实验也给我敲响了警钟:日常工作中除了安装杀软,还需要具备良好的安全意识,不随意运行不明脚本(哪怕是 .py 或 .bat),做好网络流量监控与沙箱隔离。

参考资料

posted @ 2026-10-20 21:00  小鱼爱大葱  阅读(4)  评论(0)    收藏  举报