通过命名管道分析检测 Cobalt Strike

VSole2021-09-17 20:59:18

基本分析

Cobalt Strike 在执行其某些命令时会使用一种称为“Fork-n-Run”的特定模式。“Fork-n-Run”模式包括产生一个新进程(也称为牺牲进程)并将shellcode注入其中。

这种模式提供了许多好处,一个是能够执行长时间运行的任务,例如:“键盘记录器”,不会阻塞主 Beacon 线程。一般来说都是由反射 DLL 实现的。

在Cobalt Strike的最新版本 在如何自定义能力注入过程方面为红队提供了极大的灵活性。我们应该更加关注一些没有太大变化的东西。

更具体地说,一个保持不变的特性是能够检索注入模块的输出。例如,“键盘记录器”模块能够将按下的键发送回主信标进程。但是由于“键盘记录器”模块是完全无文件的,与主信标进程的通信是如何发生的?

答案是:管道!

管道是用于进程相互通信的共享内存。基本上有两种类型的管道:

命名管道和未命名管道。命名管道,顾名思义,有一个名字,可以通过引用这个名字来访问。匿名管道,需要将其句柄传递给其他通信进程以交换数据。这可以通过多种方式完成。

Cobalt Strike 使用命名管道和未命名管道在信标与其牺牲进程之间交换数据。

命名管道

F-Secure 观察到,当使用 Cobalt Strike 的一些模块将反射 DLL 注入牺牲进程时,会创建一个具有可预测模式的命名管道。

请注意,这些命名管道不是用于横向移动的 SMB 命名管道,可以通过可塑性配置文件进行自定义。在 4.2 版之前,操作员无法修改此命名管道的名称。

更具体地说,观察到一旦启动了“作业”,信标就创建了一个命名管道;管道的名称仅包含十六进制字符,并且发现其长度等于模块名称的长度(例如,屏幕截图模块的长度为 10 个字符)。

一些被发现具有这种行为的模块:

KeyloggerScreenshotMimikatz (dcsync, dpapi, logonpasswords)PowerpickNet (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.exengen.exesplunk.exesplunkd.exefirefox.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: \\.\pipe\928316d80 0x13372bf3940:$x0\x0p\x0\\x0\x0p \x00p\x00e\x00\\x009\x002\x008\x003\x001\x006\x00d\x008\x000\x00

下面的 Splunk 可以搜索与上述模式匹配的命名管道的创建

index="YOUR_INDEX" source="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=17 PipeName!=""   | regex PipeName="^\\\\[a-f0-9]{7,10}$"

关于使用匿名管道进行自动检测,这种方法更容易出现误报。但是,它可以与其他 IOC 结合使用以达到更好的效果。

Splunk 搜索的示例,可用于获取创建匿名管道的进程,按最低频率排序:

index="YOUR_INDEX" source="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=17 PipeName=""| rare limit=20 Image

注意事项

从红队的角度来看,Cobalt Strike 4.2 版使操作员能够修改上述命名管道命名约定。事实上,可以在“post-ex”块中配置“pipename”参数,其名称在理想情况下可以与环境中使用的管道混合。

“post-ex”块的示例如下所示:

post-ex {        set spawnto_x86 "%windir%\\syswow64\\dllhost.exe";    set spawnto_x64 "%windir%\\sysnative\\dllhost.exe";
    set obfuscate "true";    set smartinject "true";    set amsi_disable "true";
    set pipename "pipe\\CtxSharefilepipe###,";    }

此外,在“spawnto_x86”和“spawnto_x64”参数中选择合法使用匿名管道的二进制文件将减少被检测到的机会。

进程间通信命名管道
本作品采用《CC 协议》,转载必须注明作者和本文链接
Cobalt Strike 在执行其某些命令时会使用一种称为“Fork-n-Run”的特定模式。一般来说都是由反射 DLL 实现的。在Cobalt Strike的最新版本 在如何自定义能力注入过程方面为红队提供了极大的灵活性。例如,“键盘记录器”模块能够将按下的键发送回主信标进程命名管道,顾名思义,有一个名字,可以通过引用这个名字来访问。匿名管道,需要将其句柄传递给其他通信进程以交换数据。
SMB Beacon 与命名管道在 Windows 中,无管理员权限的情况下,即无法添加白名单。定义特定版本的协议的消息数据包集称为方言。进行身份验证后,用户可以访问服务器上不受共享级别安全性保护的所有共享。
1.IPC横向 IPC(Internet Process Connection)共享命名管道的资源,是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,使用139、445端口。 1.1 利用条件
针对中东地区电信服务提供商的网络攻击是利用名为 HTTPSnoop 和 PipeSnoop 的新型恶意软件实施的,这些恶意软件允许网络犯罪分子远程控制这些感染了这种恶意软件的设备。
域内横向移动
2022-01-11 15:18:17
利用域内横向移动技术,访问其他域内主机
IPC$ (Internet Process Connection) 是共享“命名管道”的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。IPC$是NT2000的一项新功能,它有一个特点,即在同一时间内,两个IP之间只允许建立一个连接。
现如今,我们已进入互联网5G时代,工作、生活、办公都离不开移动互联网。在这万物互联的年代,大家都已经习惯了用手机进行购物和支付。 互联网在给我们带来方便的同时,网络知识不够普及、安全意识薄弱也暴露出一些系统风险。对普通人来说,“木马、后门、挂马、IPC”等一些词可能并不熟悉,但往往这些就是网络上的陷阱,可能会给你带来巨额的财产损失。 近期,浙江省杭州市公安局下城区分局破获了一起非法获取计算机信
内网渗透主要是基于前期外围打点getshell的webserver,通过收集webserver上的信息,然后对其他内网主机进行口令上的攻击,当然也有一些基于漏洞的攻击。
VSole
网络安全专家