原文:
https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b
Cobalt Strike最有用的功能之一就是可以修改Beacon payload的行为。通过修改框架内的各种默认值,操作者可以修改Beacon的内存占用,更改其检入的频率,甚至可以修改 Beacon的网络流量。所有这些功能都是由Malleable C2配置文件控制,该配置文件在启动团队服务器时选择。
本文假设你了解malleable C2的基础知识,并将其作为设计和创建malleable C2配置文件的参考。本文的参考配置文件来自GitHub,地址在这里。这个配置文件文档结构非常整洁清晰,并且包含了很多提示和指导,有助于帮你创建新的C2配置文件。
如果你是刚开始接触malleable C2,我们建议您先读一下Jeff mmock的这篇文章,链接如下:
https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/
当然,你也可以阅读其他入门文章。
Tips
以下是设置参数值时要考虑的几点提示。做到以下几点可减少出错:
引用参数时使用双引号,不要使用单引号,例如:
set useragent "SOME AGENT"; # 正确
set useragent 'SOME AGENT'; # 错误
允许使用分号,例如:
prepend "This is an example;";
对双引号进行转义,例如:
append "here is \"some\" stuff";
转义反斜线,例如:
append "more \ stuff";
特殊字符不需要转义,例如:
prepend "!@#$%^&*()";
配置文件介绍
本文所使用的示例配置文件来自GitHub,链接如下:
https://github.com/threatexpress/malleable-c2
这个配置文件旨在模拟jQuery请求。jQuery是JavaScript的一个框架,被很多网站采用并且嵌入到目标网络中。
第一步--选择主题
决定选择模拟的配置文件时要考虑目标环境。C2流量应该与正常流量混合。C2配置文件的网络流量应该能够绕过网络传感器,但是你需要欺骗defender,让它认为流量是合法的。让网络分析师和安全团队相信流量合法是绕过安全防御的一种妙计,这样安全分析师就会忽略报警并将流量标记为安全。我们选择使用jQuery请求来混淆。这是一种通用方法,适用于广泛的目标范围。
第二步--创建配置文件
从头开始自己编写还是使用模板?我们建议使用已有的配置文件,在此基础上修改创建自己的模板。这几年我们一直使用jQuery配置文件作为基本配置文件,并对其进行修改和调整。
参考配置文件结构一目了然,逻辑清晰,不过,我们还是来对每部分进行一些讲解:
配置文件名称
选择一个配置文件名,你将会在你的报告中看到这个文件名。这不会影响Beacon的流量或者其在目标上的占用空间。
sleep时间
这些设置控制着beacon检入的默认时间(以毫秒为单位)。使用此配置文件生成的新的HTTP/S beacon将会使用sleep时间作为其回调间隔进行检入,加上由jitter(抖动率)指定的随机时间量。选择适合你操作需求的默认时间以及任何OPSEC注意事项。这个例子用的是60秒。这个时间对于很多实际环境来说可能有些偏大,但是如果这个时间太有规律的话,很多防御产品就能很快检测到beaconing的行为。
用户代理
在实战中使用一个合适的user-agent值。如果可能的话,从目标机构中捕获一个真实的user-agent值并且插入到真实的流量中。例如,可以向目标机构成员发送一封带有web漏洞的电子邮件并监视后续GET请求中发送的user-agent值。如果你使用的是明文的HTTP流量或者是目标环境中存在SSL拦截,那么与环境不匹配的User-Agent值就会被防御者发现。
SSL证书
此设置控制用于HTTPS通信的SSL证书。如果可能的话,请为你正在使用的域使用真实的,正确发布的SSL证书。LetsEncrypt可以发布所有主要操作系统和浏览器都信任的免费SSL证书,并且会让防御者更难以检查Beacon流量。
SSL证书创建步骤的详情请参考如下链接:
https://www.cobaltstrike.com/help-malleable-c2
注意:建议在重定向主机上设置面向HTTPS证书的目标。这限制了团队服务器上所需的重新配置,以防在操作过程中某个域出现崩溃。
警告:一些CDN供应商要求您的源主机维护有效的SSL证书,并且你的团队服务器需要安装可信的SSL证书才能使Domain Fronting运行。详情请参考Cobalt Strike官方文档
https://www.cobaltstrike.com/help-malleable-c2#validssl
或者这篇关于使用Cobalt Strike配置SSL的用法说明文章:
https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/
SpawnTo过程
spawnto设置控制beacon生成的进程以便后渗透利用工作,以及何时使用spawn命令。该命令也可以使用命令行参数。
set %windir%\\sysnative\\svchost.exe -k localservice -p -s fdPHost
如果防御者查看正在运行进程的命令行,额外的参数可以帮助Beacon进一步混淆。但是很难找到与spawnto一起使用的最合适的选项。选择前要进行实验和测试。
通用指南:
SMB 信标
SMB 信标使用命名管道通过父信标进行通信。这允许在同一主机或网络上的信标之间进行点对点通信。可以配置SMB 信标的管道名称。不要使用默认设置,因为一些防御性产品会查找这些默认设置。选择能够混合到目标环境融的内容。
关于SMB信标的更多能容,请访问:
https://www.cobaltstrike.com/help-smb-beacon
DNS信标
DNS信标使用DNS进行全部或部分通信。根据目标环境的防御技术,DNS流量很容易就能被检测到,但通常是防御者的盲点。DNS最适合用作低速和慢速备份通道。更改默认设置以更好地适应你遇到的环境。
有关DNS信标的更多信息,请访问如下链接:
https://www.cobaltstrike.com/help-dns-beacon
分段过程(staging process)
可以自定义信标分段过程。分段过程是用于完全加载信标的代码存根。
了解有关Beacon分段过程的更多信息,请阅读这篇文章:https://blog.cobaltstrike.com/2013/06/28/staged-payloads-what-pen-testers-should-know/
幸运的是,可以修改Beacon stager的HTTP特性。更改这些设置以模仿单个合法的HTTP请求/响应。
在此示例中,请求将发送到/jquery-3.3.1.slim.min.js或/jquery-3.3.2.slim.min.js(取决于目标进程体系结构),以开始分段过程。构建HTTP服务器参数以模仿jQuery请求。Beacon命令和payload被混合到jQuery javascript文本块中。从CDN请求jQuery时,客户端发出一个合理的请求。很多网站发出请求的实现方式如下:
<script src =“jquery-3.3.1.min.js”> </ script>
可以将URI修改为类似其他CDN的形式。例如,你可以修改http-stager,使其看起来好像是从Microsoft jQuery CDN中提取的。
<script src =“https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js”> </script>
在某些情况下,使用stageless payload可能更好,因为分段过程可能会触发防御产品的报警。
内存指示器
一些最新的Malleable C2功能可以修改许多Beacon内存指示器。
有关控制Beacon内存指示器的详细信息,请参阅下面链接:
https://blog.cobaltstrike.com/2018/02/08/in-memory-evasion
https://www.youtube.com/playlist?list=PL9HO6M_MU2nc5Q31qd2CwpZ8J4KFMhgnK
此示例使用peclone工具从explorer.exe中提取内存元数据,另存为Beaconpayload的一部分,并且采用了Raphael发布的一篇博客“In-Memory Evasion”中的一些建议。
HTTP GET
与http-stager部分一样,可以修改HTTP GET请求/响应。此部分用于检查团队服务器的任务。
更多信息请参考
https://www.cobaltstrike.com/help-http-beacon
此配置文件使用http-stager中的类似格式。区别在于使用了__cfduid =这个cookie。此值包含有关Beacon的信息,并且团队服务器利用它来发出任务。团队服务器对隐藏在jQuery javascript文本中的任务进行响应。修改此部分以匹配你要使用的HTTP流量。如果你选择使用仅限GET的配置文件(见下文),这也是Beacon将信息传回团队服务器的方式。
注意:这个set uri选项可以接受多个URI。这可用于为你的请求添加多样性。但是,Beacons不会以你所想的轮询方式执行请求,而是在staging期间将列表中的单个URI分配给每个Beacon。
HTTP POST
与http-stager和http-get部分一样,可以修改HTTP-POST请求/响应。HTTP-POST部分用作Beacon对服务器发出的命令的响应,实际上可以作为HTTP GET或HTTP POST请求执行。此示例使用HTTP POST,如代码所示“set verb”为“POST”; HTTP流量与HTTP-GET部分一样,使用相同的样式,并模仿jQuery请求。你可以通过注释掉POST部分并取消注释HTTP-POST的GET部分,将模式从HTTP-POST更改为HTTP-GET。
注意: GET-only的配置文件有一些问题,当你尝试提取大量数据时(即下载文件或截取屏幕截图)时可能会让你感到头疼。这是因为数据是通过URI,URI参数或headers来传递的。关于这些问题,请参考Raphael的博客,里面有详细介绍:
https://blog.cobaltstrike.com/2018/03/09/beware-of-slow-downloads
第三步-验证和测试
在目标上使用Malleable C2配置文件之前,始终对其进行验证和测试是非常重要的。格式错误的配置文件很容易导致Beacons无法检入或者无法从任务中发送输出。在实际情况下使用它们之前,请务必测试新的C2配置文件。
C2lint
C2lint是Cobalt Strike中提供的工具,用于测试配置文件中的错误。在实际环境中使用这个工具来更正错误。(https://www.cobaltstrike.com/help-malleable-c2)
示例:
./c2lint c2lint jquery-c2.3.11.profile
Manual Testing(手工测试)
除了使用c2lint进行测试外,还要在测试系统上手动测试Beacon的所有功能。
手动测试和验证的快速步骤
spawn x64 http
spawn x86 http
spawn x64 smb
spawn x86 smb
keylogger
screenshot
download
upload
参考文献:
Cobalt Strike Malleable C2帮助文档
https://www.cobaltstrike.com/help-malleable-c2
示例配置文件
https://github.com/rsmudge/Malleable-C2-Profiles
其他配置文件参考:
https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/
随机配置文件生成器
https://bluescreenofjeff.com/2017-08-30-randomized-malleable-c2-profiles-made-easy/
内存逃逸
https://www.youtube.com/playlist?list=PL9HO6M_MU2nc5Q31qd2CwpZ8J4KFMhgnK
Cobalt Strike 3.6 – 提权之路
https://blog.cobaltstrike.com/2016/12/08/cobalt-strike-3-6-a-path-for-privilege-escalation/
malleable命令与控制
https://blog.cobaltstrike.com/2014/07/16/malleable-command-and-control/