Windows AMSI Bypass指北

admin 2024年9月23日01:46:09评论12 views字数 6324阅读21分4秒阅读模式

介绍

Windows AMSI(Antimalware Scan Interface)是微软为增强系统安全性引入的一个通用接口,旨在帮助防病毒软件和安全应用程序检测并阻止恶意代码(如脚本、宏、文件等)的执行,它允许开发人员在其应用程序中集成恶意软件防御功能。AMSI 允许应用程序与系统上安装的任何防病毒软件进行交互,并动态阻止基于脚本的恶意软件执行。在本文中,我们将了解有关 AMSI、代码实现以及一些众所周知的绕过方法的更多信息,本文更多是抛砖引玉,并不一定能够绕过最新的windows版本安全特性,更多的是给出一些绕过的思维

背景

AMSI 为开发人员提供开放的 Win32 API 和 COM 接口。由于 Microsoft 自行管理 AMSI,因此最新的恶意软件签名会自动更新,开发人员可以非常轻松地集成 AMSI,以保护其免受动态、基于脚本的恶意软件的侵害。详情可阅读开发人员指南链接:https://learn.microsoft.com/en-us/windows/win32/amsi/dev-audience

AMSI 的检测基于签名。这意味着对于每个特定的恶意关键字、URL、函数或过程,AMSI 在其数据库中都有一个相关签名。因此,如果攻击者在其代码中再次使用相同的关键字,AMSI 会立即阻止执行。

AMSI功能

实时脚本扫描: AMSI能够对运行时的脚本(如PowerShell、VBScript和JavaScript等)进行拦截和扫描。这使得防病毒软件可以检测到动态生成和执行的恶意代码,特别是那些在脚本执行前被加密、混淆或以其他方式隐藏的恶意内容。

跨平台支持: 虽然AMSI是Windows API,但其设计旨在被任何应用程序使用,特别是那些涉及脚本执行的应用程序,比如Office宏、PowerShell、WMI等。    

与第三方防病毒软件集成: AMSI允许第三方防病毒产品通过它扫描应用程序中的数据,这为防病毒引擎提供了更多机会来捕获恶意行为。AMSI会在脚本代码执行之前将其传递给扫描引擎,因此即使代码经过加密或混淆,也能在解密后检测到恶意活动。

恶意软件绕过难度加大: 传统的恶意软件可能通过混淆或加密脚本来绕过静态检测,但AMSI可以在脚本解密后进行扫描,因此能够捕获这些动态生成的恶意内容。这增加了恶意软件开发者绕过防护的难度。

深度集成Windows Defender: AMSI与Windows Defender集成得非常紧密,当检测到疑似恶意内容时,Defender会及时阻止脚本的继续执行。

恶意软件命名约定

在详细了解 AMSI 的工作原理之前,让我们先了解一下恶意软件是如何命名的。在分析中,Windows 通常会检测到恶意软件,但分析师无法确定恶意软件的确切细节和行为。计算机防病毒研究组织 (CARO) 为恶意软件提供了标准的命名约定。例如,基于快捷方式的 caphaw 后门的命名如下:

Windows AMSI Bypass指北

阅读有关恶意软件的更多信息,可访问https://learn.microsoft.com/en-us/defender-endpoint/malware/understanding-malware?view=o365-worldwide

AMSI 工作原理

作为开发人员,可以使用 AMSI 提供恶意软件防御能力。假设创建一个应用程序,该应用程序输入一个脚本并使用 Powershell 等脚本引擎执行该脚本。在输入时,可以调用 AMSI 来首先检查恶意软件。Windows 提供 COM 和 Win32 API 来调用 AMSI。AMSI 的工作流程如下:

Windows AMSI Bypass指北

解释: 如所见,AMSI API 是开放的,因此任何 AV 都可以从其函数中读取数据。这里,正在运行一个 Windows 脚本。当它通过 AMSI 时,amsi.dll 被注入到与我们程序相同的虚拟内存中。这个 amsi.dll 有各种可以评估代码的函数。这些函数可以链接https://learn.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-functions找到。然而,实际的扫描任务是由这两个函数进行的:

  • AmsiScanString()

  • AmsiScanBuffer()

这些函数会评估代码。如果代码是干净的,则结果最终会传递给 AV 提供程序类,然后使用 RPC 调用从那里传递给 AV 服务。如果代码可疑,则 AMSI 本身会阻止它。

工作流程概括

  1. 应用程序调用AMSI接口,将要执行的内容发送到AMSI。

  2. AMSI会将数据传递给已注册的防病毒或安全扫描引擎进行分析。    

  3. 如果扫描结果显示内容是恶意的,AMSI会返回一个检测结果,并根据安全策略阻止执行。

AMSI 绕过方法

现在我们已经讨论了 AMSI 的基础知识,我们将讨论一些非常著名的绕过 AMSI 的技术。渗透成员通常需要绕过 AMSI 才能执行任意代码以进行横向移动/权限提升。

由于每天都有新方法出现,因此本文无法涵盖所有绕过方法。本文讨论了主要方法,并在 Windows 10 版本 1809 上进行了测试。需要注意的是,最新版本的 Windows(1903 以上)阻止了互联网上几乎所有可用的方法,因为签名不断更新。

注意: AMSI 会屏蔽某些关键字,例如“invoke-mimikatz”或“amsiutils”,因为众所周知,这些关键字会被用于漏洞利用,因此,作为概念验证,我们将仅在绕过后运行这些命令,实际的有效载荷不会在这里被绕过。

微软已将 AMSI 集成到 powershell 终端(powershell.exe 应用程序)中,该终端接收输入并通过 Powershell 引擎进行解析。如果我们打开 process hacker 并搜索 amsi.dll,我们将看到 amsi 正在 powershell 终端中运行,并且任何输入都会首先被它扫描。

Windows AMSI Bypass指北    

方法 1:Powershell 降级

如果正在运行基于 powershell 的有效负载并且 AMSI 阻止它,则可以将 powershell 版本降级到 2.0,因为 AMSI 仅在 v2.0 以上受支持。首先,可以看到我们的关键字被 amsi 阻止了。

Windows AMSI Bypass指北

让我们检查一下 PS 的当前版本,然后降级到版本 2 并再次运行这些被阻止的命令。

JavaScript                  
$PSVersionTable                  
"amsiutils"                  
powershell -version 2                  
"amsiutils"

Windows AMSI Bypass指北

最大的缺点是许多现代函数或脚本无法在 Powershell 2.0 上运行

方法 2:混淆

混淆是指使代码变得复杂且不可读的技巧。AMSI 根据某些关键字检测签名,因此混淆这些关键字是有效的。例如,让我们混淆invoke-mimikatz命令

JavaScript                  
Invoke-Mimikatz                  
"Inv”+"o+"ke"+"-Mimi"+"katz"

Windows AMSI Bypass指北

如所见,只需拆分字符串并使用 + 运算符将它们连接起来,我们就能绕过 AMSI。

然而,这种技术也有其缺点。一个有效载荷可能会触发一次或多次 AMSI。在每次运行有效载荷后继续逐个关键字进行混淆实际上非常耗时且会产生噪音。

Github开源工具“AmsiTrigger”,可以针对 AMSI 扫描脚本/有效负载,并告诉我们哪些行会触发 AMSI,然后我们就可以混淆它们!下载链接:https://github.com/RythmStick/AMSITrigger

现在,我们创建了一个名为 demo.ps1 的脚本,其中包含以下命令

Windows AMSI Bypass指北

我想使用 AmsiTrigger 根据 AMSI 检查这一点。可以这样做:

JavaScript                  
.demo.ps1                  
.AmsiTrigger.ps1 -i .demo.ps1

Windows AMSI Bypass指北

现在,该工具已经告诉我 AMSI 阻止执行的行。我们可以继续使用字符串连接方法对它们进行混淆,如下所示:

JavaScript                  
"am"+"si"+"ut"+"ils"                  
"in"+"vok"+"e"+"-"+"mi"+"mik"+"atz"

Windows AMSI Bypass指北

现在,它们可以运行并成功绕过 AMSI!

Windows AMSI Bypass指北    

还可以尝试使用在线工具 https://amsi.fail 来混淆的代码。

方法 3:强制出错

存在一个名为 amsiInitFailed() 的函数,如果在上述场景中启动 AMSI 扫描,它将抛出 0。此绕过基本上是为 amsiInitFailed 分配一个布尔 True 值,以便 AMSI 初始化失败 - 当前进程根本不会进行任何扫描!代码是:

JavaScript                  
$mem = [System.Runtime.InteropServices.Marshal]::AllocHGlobal(9076)                  
                 
[Ref].Assembly.GetType("System.Management.Automation.AmsiUtils").GetField("amsiSession","NonPublic,Static").SetValue($null, $null);[Ref].Assembly.GetType("System.Management.Automation.AmsiUtils").GetField("amsiContext","NonPublic,Static").SetValue($null, [IntPtr]$mem)

Windows AMSI Bypass指北

方法四:内存劫持

其逻辑是使用挂钩函数AmsiScanBuffer(),以便它始终返回句柄 AMSI_RESULT_CLEAN, 表示 AMSI 未发现恶意软件。可以使用 Rohitab 的 API 监控工具监控 API 响应。

首先,让我们下载 Invoke-Mimikatz 脚本并查看 AMSI 是否正常运行。

Windows AMSI Bypass指北

下载绕过工具代码:https://github.com/harshitrajpal/AmsiScanBufferBypass,请确保将主包的名称从“AmsiScanBufferBypass”更改为“Project”或任何喜欢的名称,因为 AMSI 也会阻止字符串“AmsiScanBufferBypass”!

下载后,进入Release文件夹,可以看到有一个名为 ASBBypass.dll的 DLL

在这里,我们将使用内联 C# 代码在 powershell 终端来演示:

JavaScript                  
[System.Reflection.Assembly]::LoadFile("C:usershexProjectASBBypass.dll")                  
[Amsi]::Bypass()

Windows AMSI Bypass指北    

如你所见,amsi 现在已经被绕过了!

方法 5:内存劫持(混淆的操作码)

使用操作码混淆了相同的代码,脚本链接:https://gist.github.com/FatRodzianko/c8a76537b5a87b850c7d158728717998#file-my-am-bypass-ps1 ,要运行该脚本,只需下载它,重命名它(以避免被 AMSI 检测关键字)并运行:

JavaScript                  
"invoke-mimikatz"                  
.my-am-bypass.ps1                  
"invoke-mimikatz"

Windows AMSI Bypass指北    

方法 6:通过反射绕过 AMSI

据 Microsoft 介绍,“反射提供了描述程序集、模块和类型的对象(类型为 Type)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果在代码中使用属性,则反射可让访问它们。” 阅读更多信息可访问链接:https://learn.microsoft.com/en-us/dotnet/csharp/advanced-topics/reflection-and-attributes/

绕过利用代码:https://gist.github.com/shantanu561993/6483e524dc225a188de04465c8512909。请确保下载并重命名脚本,并避免使用“amsibypass”等关键字,因为它们会被阻止。我已将其重命名为“am-bp-reflection.ps1”

JavaScript                  
"invoke-mimikatz"                  
.am-bp-reflection.ps1                  
"invoke-mimikatz"

Windows AMSI Bypass指北

方法 7:Nishang All in One 脚本

著名的工具“Nishang”中添加了一个 AMSI 绕过脚本,脚本链接:https://github.com/samratashok/nishang/blob/master/Bypass/Invoke-AmsiBypass.ps1。该脚本结合了 6 种不同的方法,可在一次运行中绕过 AMSI。这些方法是:

1unload – 从当前 PowerShell 会话中卸载 AMSI。

1unload2 – 从当前 PowerShell 会话中卸载 AMSI。

1unloadsilent – 卸载 AMSI 并避免 WMF5 自动记录。

1unloadobfuscated – 基于上述“unload”方法使用Invoke-Obfuscation 进行混淆 – 从而避免了 WMF5 自动记录。

1dllhijack – 代码中使用的 amsi.dll 来自 p0wnedshell (https://github.com/Cn33liz/p0wnedShell)

1psv2 – 如果 Windows 10 上可用 .net 2.0.50727,则启动不支持 AMSI 的 PowerShell v2。    

我们只需下载脚本并运行,该工具就会使用有效方法自动绕过 AMSI,将其重命名为“nishang.ps1”,运行下列命令

JavaScript                  
Import-Module .nishang.ps1                  
Invoke-AmsiBypass -Verbose                  
“invoke-mimikatz”

Windows AMSI Bypass指北

参考链接

https://rastamouse.me/memory-patching-amsi-bypass/

https://github.com/RythmStick/AMSITrigger

https://learn.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-functions

https://learn.microsoft.com/en-us/defender-endpoint/malware/understanding-malware?view=o365-worldwide

https://github.com/harshitrajpal/AmsiScanBufferBypass

https://gist.github.com/FatRodzianko/c8a76537b5a87b850c7d158728717998#file-my-am-bypass-ps1

https://learn.microsoft.com/en-us/dotnet/csharp/advanced-topics/reflection-and-attributes/

https://github.com/samratashok/nishang/blob/master/Bypass/Invoke-AmsiBypass.ps1    

原文始发于微信公众号(暴暴的皮卡丘):Windows AMSI Bypass指北

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月23日01:46:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows AMSI Bypass指北http://cn-sec.com/archives/3195393.html

发表评论

匿名网友 填写信息