0%

CobaltStrike SSL证书配置

CobaltStrike SSL证书配置

起因是我发现我的机器由于长期挂着CS的服务端,然后导致我被扫描器发现,并且把我的机器标记成威胁服务器了。。。。
而为了隐藏CS服务端的信息,就需要从几个方面进行改造,其中之一就是经典的ssl证书配置,而其实CS主要需要配的证书有两个:cobaltstrike.store&https-certificate

期间踩了一个很大的坑,关于在win7等较老机器上使用https出现的tls版本问题

cobaltstrike.store

teamserver脚本中用keytools生成了一个特征及其明显的自签发证书。该证书仅用于客户端与服务端之间的通信,当然,被扫出来就会是及其明显的服务端标记特征。我估摸着也就是扫描器扫到这个证书然后给我标记了。。。

keytool -keystore ./cobaltstrike.store -storepass s0m3th1ng3ls3 -keypass s0m3th1ng3ls3 -genkey -keyalg RSA -alias cobaltstrike -dname "CN=microsoft.com, OU=microsoft, O=MicroSoft, L=AAA, S=BBB, C=CN"

方法也很简单,乱写一个新的看起来合理一点的自签发证书就行了

这个证书的主要功能是让暴露在公网中的CS服务端不那么容易被发现

https-certificate

如果listener选用的是https的话,这个才是CS与beacon之间通信时使用的证书,默认是CS自签发的上述CN等内容均为空的假证书。如果环境中部署了IDS等机器的话,CS默认证书的特征就有可能被发现。指定证书后,https的listener会使用新的证书和beacon进行沟通,抹掉特征
这个证书需要在profile里配置,有三个选择

https-certificate {
    
    ## Option 1) Trusted and Signed Certificate
    ## Use keytool to create a Java Keystore file. 
    ## Refer to https://www.cobaltstrike.com/help-malleable-c2#validssl
    ## or https://github.com/killswitch-GUI/CobaltStrike-ToolKit/blob/master/HTTPsC2DoneRight.sh
   
    ## Option 2) Create your own Self-Signed Certificate
    ## Use keytool to import your own self signed certificates

    #set keystore "/pathtokeystore";
    #set password "password";

    ## Option 3) Cobalt Strike Self-Signed Certificate
    set C   "US";
    set CN  "jquery.com";
    set O   "jQuery";
    set OU  "Certificate Authority";
    set validity "365";
}

profile具体配置可以看这个threatexpress/malleable-c2
与此同时,CS的http流量也有比较明显的特征,可以通过profile将通信规则伪造成jquery,Amazon,Microsoft等看起来比较合理的网站流量,也是一种隐藏手段。

上述三个证书中,真证书没什么好说的,但是如果想在web delivery中使用ssl的假证书的话,得用2中keytools签发的假证书,用3自签发的假证书启动后CS那个ssl的地方勾不了

该配置作用即为在与beacon通信时使用新证书覆盖CS默认特征逃避检测。但这里存在一个问题,为什么网络上的教程都是需要签发一个真证书?为什么不能用自签名的假证书呢?

web delivery SSL

主要问题出在web delivery这边
简单尝试了powershell和bitsadmin两种payload,对于自签发的假证书,powershell和bitsadmin还有certutil都会进行证书合法性校验,然后由于假证书过不了校验,会报出一个基础连接已经关闭:未能为SSL/TLS 安全通道建立信任关系的错误,网上搜了几个加buff忽略证书错误的操作,好像还是屁用没有。。。

对于低版本windows(这里试的是win7),web delivery各种打不通,真证书也不行,报错为基础连接已经关闭: 发送时发生错误,简单搜索都说是win7对tls版本的支持问题,网上搜了几个buff加上去,还是屁用没有。。。http下倒是可以,然而再把下下来的马回连listener的时候,https的listener又打不通。。。最后http的web delivery+http listener打通了。

win7使用https上线

直接生成一个beacon.exe跑一下,wireshark抓包,会发现win7尝试用tls1.2去连接CS服务器,然后CS服务器应答一个Alert(Level: Fatal,Description: Protocol Version),感觉意思是不支持tls1.2。但是换成win10,也是发的tls1.2,然后就行了。。。什么原理

然后开一个https的web delivery,再用wireshark抓包,还是tls1.2?
但是用百度得到的这个命令[Net.ServicePointManager]::SecurityProtocol的输出结果是ssl3,tls,看不懂。。。

总之,最后通过谷歌搜索到了这个链接
解决 Cobalt Strike HTTPS Listener 无法在 Win7 运行问题
大致意思就是jdk更新之后禁用了tls1.0和1.1,在CS服务端把tls老版本启用就好了

然后关于win7发1.2为什么不行,又检查了一下。。。原来是wireshark的显示问题,win7其实是想协商tls1.0的,但是wireshark粗略显示的确是1.2,点开看详细的才显示是1.0。迷惑了我好久。。。

image-20220612170334704

看了下win7只对外协商tls1.0和ssl3.0,而正如上文所述,java在更新中弃用了老算法,导致老一点的tls协议不接受,所以连不上,启用后即可接受tls1.0成功上线了

翻到了微软文档

Windows 8.1, Windows Server 2012 R2, Windows 10, Windows Server 2016, and later versions of Windows natively support TLS 1.2 for client-server communications over WinHTTP.

Earlier versions of Windows, such as Windows 7 or Windows Server 2012, don’t enable TLS 1.1 or TLS 1.2 by default for secure communications using WinHTTP. For these earlier versions of Windows, install Update 3140245 to enable the registry value below, which can be set to add TLS 1.1 and TLS 1.2 to the default secure protocols list for WinHTTP.

How to enable TLS 1.2 on clients

估计之前从网上搜的加buff支持1.2没有用可能是因为虚拟机没怎么更新吧。

结论

若要使用web delivery配合https,需要使用真证书过powershell等证书真实性校验
若只要抹除beacon https通信的证书特征,随便签一个假证书即可
对于win7等较老机器对任何与https有关的操作都不能用的情况,是由于旧机器只支持低版本tls协议而CS服务端不支持低版本tls协议导致的,修补方案为修改jkdpath/jre/lib/security/java.security文件,把jdk.tls.disabledAlgorithms中禁用的老协议去掉即可

无论如何都打不通时,http解决一切烦恼

参考链接

CS 合法证书 + Powershell 上线
CS证书相关
如何隐蔽你的C2
CS profile教程
Malleable Command and Control

默认情况下listener会同时在端口运行stage下发payload服务,这个服务能被任何人访问到,导致CS服务器被轻易探测,这里提出了一个躲避方法
Bypass cobaltstrike beacon config scan