一、那年我遇到AMSI
在一次渗透测试任务中,我锁定了一个目标系统,该系统的安全防护措施做得相当到位。在深入研究后,发现其中有个名叫AMSI(Antimalware Scan Interface)的组件,它负责拦截和扫描脚本中的恶意代码。AMSI能与多种安全软件协作,实时监控并阻止潜在威胁。为了渗透进这套系统,我需要找到绕过AMSI的方法。
二、漏洞探秘:AMSI是如何工作的
AMSI的工作原理可以用三个字概括:拦截、扫描、阻断。它会在脚本运行时拦截代码,将其传递到注册的反病毒软件进行扫描。如果发现有恶意代码,它会阻止该代码执行,并向管理员发出警告。
具体来说,AMSI主要通过以下几个步骤运行:
- 拦截脚本:当脚本开始执行时,AMSI会调用相关API来拦截代码。
- 扫描代码:拦截到的代码被传递给注册的反病毒软件进行分析。
- 阻断恶意:如果扫描结果表明代码包含恶意内容,AMSI会阻止执行。
这种机制虽然有效,但并不是无懈可击。于是,我开始研究如何绕过这个强大的防御机制。
三、实战环境搭建:准备你的实验室
为了研究AMSI绕过方法,我在实验室搭建了一套测试环境。你可以使用以下组件:
- 一个Windows 10虚拟机,作为目标系统。
- 安装PowerShell,并确保AMSI功能开启。
- 设置开发环境,包括Python和Bash。
搭建步骤:
- 创建虚拟机:使用VirtualBox或VMware安装Windows 10。
- 开启PowerShell:确保PowerShell的版本是5.0或更高,以支持AMSI。
- 安装开发工具:通过Chocolatey或直接安装Python和Bash。
有了这套环境,我可以尽情尝试各种绕过技巧,测试我的代码和策略。
四、流量捕获实战:POC代码来袭

为了绕过AMSI,我尝试了多种方法。其中一个有效的策略是先捕获流量,然后进行代码注入。以下是我实现的POC代码:
<pre><code class="language-python">import ctypes
我们要用到的WinAPI函数
def amsi_bypass():
获取amsi.dll模块句柄
amsi_dll = ctypes.windll.kernel32.GetModuleHandleW('amsi.dll')
确定要覆盖的目标地址,AMSIScanBuffer在amsi.dll的偏移位置
target_address = amsi_dll + 0x00123456 # 假设偏移位置为0x123456,你需要使用调试工具确定
修改内存权限以允许写入
ctypes.windll.kernel32.VirtualProtect(target_address, ctypes.sizeof(ctypes.c_void_p), 0x40, ctypes.byref(ctypes.c_ulong()))

用空字节覆盖目标地址以绕过检查
ctypes.memmove(target_address, b'\x00', ctypes.sizeof(ctypes.c_void_p))
执行绕过函数
amsi_bypass()</code></pre>
代码解释:
- 我们通过
ctypes模块调用WinAPI函数。 - 获取
amsi.dll模块的句柄,然后找到目标函数的内存地址。 - 修改内存权限,让目标地址可写。
- 将目标内存地址写入空字节,以绕过AMSI的检测。
五、Payload构造的艺术:绕过策略详解
AMSI的拦截机制虽然强大,但并不是不可绕过的。除了内存操作,我们还可以采用多种策略来构造免杀Payload。这些策略包括:
- 代码编码:通过对代码进行Base64编码或混淆,让AMSI无法识别。
- 动态加载:使用反射技术,将恶意代码隐藏在合法模块中。
- 拆分执行:将代码拆分成多个部分,逐步执行以避开AMSI的拦截。
以下是一个使用Base64编码绕过AMSI的例子:
<pre><code class="language-bash">echo "cHJpbnQoIkhlbGxvLCBXb3JsZCIp" | base64 -d | python</code></pre>
这种方式简单而有效,通过编码和解码操作,AMSI无法识别其中内容。
六、检测与防御:反制的经验
作为渗透测试人员,我们不仅要攻,还要防。在绕过AMSI的过程中,我也总结了一些检测和反制的经验:
- 监控异常行为:通过行为分析,识别异常内存操作和API调用。
- 启用高级日志:记录所有脚本执行日志,以便在事后分析。
- 定期更新:保持安全软件和系统更新,修补已知漏洞。
这些策略虽然不能百分百防止攻击,但确实能有效提高系统的安全性。

七、那些年的经验分享
最后,我要分享一些个人的实战经验。在绕过AMSI的过程中,我发现以下几点非常重要:
- 不断学习新技术:攻击和防御技术都在快速发展,保持与时俱进。
- 关注细节:许多漏洞和绕过方法都藏在细节中,仔细研究每个函数和模块。
- 团队合作:安全不仅是个人的事,团队协作能更好地提高系统防护。
希望这些经验能帮助你在渗透测试和安全研究中取得突破。记住,唯一的极限是你自己。