文章来源:黑白天实验室
基本分析
Cobalt Strike 在执行其某些命令时会使用一种称为“Fork-n-Run”的特定模式。“Fork-n-Run”模式包括产生一个新进程(也称为牺牲进程)并将shellcode注入其中。
这种模式提供了许多好处,一个是能够执行长时间运行的任务,例如:“键盘记录器”,不会阻塞主 Beacon 线程。一般来说都是由反射 DLL 实现的。
在Cobalt Strike的最新版本 在如何自定义能力注入过程方面为红队提供了极大的灵活性。我们应该更加关注一些没有太大变化的东西。
更具体地说,一个保持不变的特性是能够检索注入模块的输出。例如,“键盘记录器”模块能够将按下的键发送回主信标进程。但是由于“键盘记录器”模块是完全无文件的,与主信标进程的通信是如何发生的?
答案是:管道!
管道是用于进程相互通信的共享内存。基本上有两种类型的管道:
命名管道和未命名管道。命名管道,顾名思义,有一个名字,可以通过引用这个名字来访问。
匿名管道,需要将其句柄传递给其他通信进程以交换数据。这可以通过多种方式完成。
Cobalt Strike 使用命名管道和未命名管道在信标与其牺牲进程之间交换数据。
命名管道
F-Secure 观察到,当使用 Cobalt Strike 的一些模块将反射 DLL 注入牺牲进程时,会创建一个具有可预测模式的命名管道。
请注意,这些命名管道不是用于横向移动的 SMB 命名管道,可以通过可塑性配置文件进行自定义。在 4.2 版之前,操作员无法修改此命名管道的名称。
更具体地说,观察到一旦启动了“作业”,信标就创建了一个命名管道;管道的名称仅包含十六进制字符,并且发现其长度等于模块名称的长度(例如,屏幕截图模块的长度为 10 个字符)。
一些被发现具有这种行为的模块:
Keylogger
Screenshot
Mimikatz (dcsync, dpapi, logonpasswords)
Powerpick
Net (netview
下面的屏幕截图显示了执行“keylogger”命令后 Sysmon 事件 ID 17 和 18(分别创建和访问管道)的示例:
进行了有限数量的实验,但没有发现其他合法应用程序可以创建具有相同命名约定的命名管道。我们稍后将使用此信息创建 Splunk 搜索,这些搜索使用 Sysmon 和 Yara 规则来扫描进程内存
匿名管道
并非每个 Cobalt Strike 命令都会创建一个命名管道,其中一些将使用匿名管道来实现相同的结果。
下图显示了发出“execute-assembly”命令后创建的管道实例:
我们可以通过调试启动长时间运行的程序集后产生的牺牲进程来确认:
在“ntdll!NtWriteFile”函数上设置了一个断点,并且可以看到,牺牲进程试图写入的句柄与属于管道文件系统(Npfs)的未命名文件相关联:
正如我们所见,发现诸如“execute-assembly”之类的命令并不像上面那么简单。
理论上,我们可以对使用匿名管道的流程进行基线处理。我们知道本机 Windows 进程并不经常使用匿名管道。因此,我们可以查找连接到匿名管道的 Windows 进程并从那里进行检测。
攻击者通常使用本地 Windows 二进制文件作为其可塑性配置文件中的牺牲进程。
''
############################################# #
包含 post_ex 块数据的数据集,包括
spawn-to 进程。
#################################################
“ ''
#
自定义此列表# spawn_processes = ['runonce.exe','svchost.exe','regsvr32.exe','WUAUCLT.exe']
可以看出,上述过程用于后开发作业。它们通常都不会使用匿名管道与不同的进程进行通信;因此,可以使用它来执行搜索并最终创建检测规则。
在实验过程中,发现以下 Windows 二进制文件使用匿名管道进行进程间通信:
wsmprovhost.exe
ngen.exe
splunk.exe
splunkd.exe
firefox.exe
这同样适用于通过 Cobalt Strike 的 dllspawn API 执行的自定义反射 DLL,因为底层的通信机制是相同的。
其中一个例子是 Outflank 的Ps-Tools存储库。Ps-Tools 是与 Cobalt Strike 完全兼容的 rDLL 集合,允许监控过程活动。让我们执行“psw”模块,用于枚举活动的Windows,如下图:
执行这个模块,我们可以识别出我们之前看到的相同的匿名管道行为:
检测规则
异常命名管道的检测可以通过多种方式实现。作为概念验证,我们开发了可用于扫描进程内存和查找实时实例的 Yara 签名,以及可与 Sysmon 结合使用的 Splunk 搜索。
Yara 规则如下所示:
rule cs_job_pipe
{
meta:
description = "Detects CobaltStrike Post Exploitation Named Pipes"
author = "Riccardo Ancarani & Jon Cave"
date = "2020-10-04"
strings:
$pipe = /\.pipe[0-9a-f]{7,10}/ ascii wide fullword
$guidPipe = /\.pipe[0-9a-f]{8}-/ ascii wide
condition:
$pipe and not ($guidPipe)
}
针对牺牲进程的执行示例:
.yara64.exe .cs-job-pipe.yar -s 9908 cs_job_pipe 9908 0x13372b7b698:$pipe: .pipe928316d80 0x13372bf3940:$x0x0px0x0x0p x00px00ex00x009x002x008x003x001x006x00dx008x000x00
下面的 Splunk 可以搜索与上述模式匹配的命名管道的创建
index="YOUR_INDEX" source="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=17 PipeName!="<Anonymous Pipe>" | regex PipeName="^\[a-f0-9]{7,10}$"
关于使用匿名管道进行自动检测,这种方法更容易出现误报。但是,它可以与其他 IOC 结合使用以达到更好的效果。
Splunk 搜索的示例,可用于获取创建匿名管道的进程,按最低频率排序:
index="YOUR_INDEX" source="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=17 PipeName="<Anonymous Pipe>"| rare limit=20 Image
注意事项
从红队的角度来看,Cobalt Strike 4.2 版使操作员能够修改上述命名管道命名约定。事实上,可以在“post-ex”块中配置“pipename”参数,其名称在理想情况下可以与环境中使用的管道混合。
“post-ex”块的示例如下所示:
post-ex {
set spawnto_x86 "%windir%syswow64dllhost.exe";
set spawnto_x64 "%windir%sysnativedllhost.exe";
set obfuscate "true";
set smartinject "true";
set amsi_disable "true";
set pipename "pipeCtxSharefilepipe###,";
}
此外,在“spawnto_x86”和“spawnto_x64”参数中选择合法使用匿名管道的二进制文件将减少被检测到的机会。
【往期推荐】
【超详细 | Python】CS免杀-Shellcode Loader原理(python)
【超详细 | 钟馗之眼】ZoomEye-python命令行的使用
【超详细 | 附EXP】Weblogic CVE-2021-2394 RCE漏洞复现
【超详细】CVE-2020-14882 | Weblogic未授权命令执行漏洞复现
【超详细 | 附PoC】CVE-2021-2109 | Weblogic Server远程代码执行漏洞复现
【漏洞分析 | 附EXP】CVE-2021-21985 VMware vCenter Server 远程代码执行漏洞
【CNVD-2021-30167 | 附PoC】用友NC BeanShell远程代码执行漏洞复现
【奇淫巧技】如何成为一个合格的“FOFA”工程师
【超详细】Microsoft Exchange 远程代码执行漏洞复现【CVE-2020-17144】
走过路过的大佬们留个关注再走呗
往期文章有彩蛋哦
一如既往的学习,一如既往的整理,一如即往的分享。
“如侵权请私聊公众号删文”
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论