
在CobaltStrike的客户端与服务端创建联系时,服务端传给客户端的SSL默认证书有很明显的特征:git
C=Earth,ST=Cyberspace,L=Somewhere,O=CobaltStrike,OU=AdvancedPenTesting,CN=Major CobaltStrikegithub
而且默认链接端口为50050端口。web
因此能够以此检测CobaltStrike:算法
链接端口50050.安全
SSL证书信息:C=Earth,ST=Cyberspace,L=Somewhere,O=CobaltStrike,OU=AdvancedPenTesting,CN=Major CobaltStrike服务器
可是链接端口能够更改,并且证书也能够经过JAVA自带工具keytools修改。微信

JA3是一种在线识别TLS客户端指纹的方法。编辑器
在平常中,不只正常的应用程序会使用TLS或者SSL对流量进行加密。并且恶意程序也经常使用TLS和SSL进行加密。工具
为了启动TLS会话,客户端将在TCP3次握手后发送TLS客户端的Hello数据包,这个数据包及其生成方式取决于构建客户端应用程序所使用的软件包和方法,若是接受TLS链接,服务器将使用基于服务器端库和配置以及Client Hello消息中的详细信息建立的TLS Server Hello数据包进行相应。因为TLS协商是以明文的方式传输的,因此,可使用TLS Client Hello数据包中的详细信息对客户端应用程序进行指纹识别。 学习
JA3方法用于收集Client Hello数据包中如下字段的十进制字节值:版本、可接受的密码、扩展列表、椭圆曲线密码和椭圆曲线密码格式。而后将这些值串联到一块儿,在使用“,”分割开各个字段,同时用“-”来分隔各个字段中的各个值。
这些字段的顺序以下:TLS版本信息、可接受的密码、扩展列表、椭圆曲线密码和椭圆曲线密码格式。
用CobaltStrike4.1的链接流量举例。
771,49188-49192-61-49190-49194-107-106-49162-49172-53-49157-49167-57-56-49187-49191-60-49189-49193-103-64-49161-49171-47-49156-49166-51-50-49196-49195-49200-157-49198-49202-159-163-49199-156-49197-49201-158-162,67,,11-2-256(若是无上述字段,则这些字段的值为空)
而后会计算这些字符串的MD5哈希值,以生成易于使用和共享的长度为32字符的指纹,他们就是JA3 TLS客户端的指纹。好比上述CobaltStrike4.1客户端指纹:fa704723a210632b2ff9ad03be418651

建立JA3后,就可使用一样的方式对TLS的服务端进行指纹识别,即对TLS Server Hello信息进行指纹识别。JA3S会收集Server Hello数据包中如下各个字段的十进制字节值:版本、可接受的加密算法和扩展列表,而后将这些值串联起来,使用“,”来分隔各个字段,使用“-”分隔每一个字段中的各个值。
这些字段的顺序以下:TLS版本信息、可接受的密码、扩展列表
CobaltStrike4.1的服务端:771,49192,9-------->5513ab2983a0db88fadd353de0341e7c

由于MD5能够更容易集成到现有的技术中。

同一台服务器会根据Client Hello信息机器内容以不一样的方式建立Server Hello消息,所以,这里不能跟JA3那样,仅仅根据服务器的Hello消息来对其进行指纹识别。尽管服务器对不一样客户端的响应不一样,可是他们对同一客户端的响应老是一致的。
好比:客户端正在发送TLS Client Hello数据包,其中数据都是A。所以,服务器会的响应的内容也是由A构成,并将始终用A来提供一样的响应。与此同时,另外一个客户端也在发送数据包,而且内容都是B。相似的,服务器如今会用B进行响应,而且老是用B组成的B串进行响应。能够看到,对于不一样的客户端,服务器会给予不一样的响应,可是对于每一个客户端来讲,老是以相同的方式进行相应。
在这个日志输出中,JA3位于左侧,JA3S位于右侧,使用同一客户端与同一服务器交互了4次。而后,再次使用不一样的客户端进行了4次以上的交互。不难发现,服务器的响应方式对于同一客户端老是相同的,但对于不一样的客户端倒是不一样的。

若是攻击方构建了定制的恶意软件可执行文件,那么JA3指纹极可能对该可执行文件来讲是惟一的,
例如:MetaSploit 的 Meterpreter 和 CobaltStrike(并不是4.1版本) 的 Beacon 都使用 Windows 套接字来启动 TLS 通讯。在 Windows 10 上,JA3=72a589da586844d7f0818ce684948eea(指定 IP 地址),JA3=a0e9f5d64349fb13191bc781f81f42e1(指定域名)。因为 Windows 上的其余普普统统的应用程序也使用相同的套接字,所以,咱们很难识别其中的恶意通讯。可是,Kali Linux 上的 C2 服务器对该客户端应用程序的响应方式与 Internet 上的普通服务器对该套接字的响应方式相比来讲是独一无二的。尽管服务器对不一样客户端的响应不一样,但它们对同一客户端的响应老是一致的。所以,若是结合 ja3+ja3s,就可以识别这种恶意通讯,而不用考虑目的地 IP、域名或证书等细节信息
Trickbot恶意软件:
JA3 = 6734f37431670b3ab4292b8f60f29984 (trickbot)
JA3S = 623de93db17d313345d7ea481e7443cf(C2服务器的响应)
Emotet恶意软件:
JA3 = 4d7a28d6f2263ed61de88ca66eb011e3 ( Emotet )
JA3S = 80b3a14bccc8598a1f3bbe83e71f735f (C2服务器的响应 )
在这些恶意软件样本中,C2服务器始终以彻底相同的方式来响应恶意软件客户端,应该说是分绝不差,所以,即便流量被加密,而且不知道C2服务器的IP地址和域名,由于他们会不断变化,咱们任能经过指纹来识别客户端和服务器之间的TLS写上,以提升恶意通讯识别结果的可信度。
JA3和JA3S地址:https://github.com/salesforce/ja3
本文分享自微信公众号 - 小啦的学习笔记(woshiguolala)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。