官方通告说在CobaltStrike4.4版本中修复了一个DoS漏洞Hotcobalt(CVE-2021-36798),跟随参考链接看了sentinel labs的分析。总结就是beacon建立连接后,在解析Screenshot和Keylogger功能返回的数据时,没有对被控客户端返回的数据中声明的文件大小这个值做校验,导致后续申请内存空间时的大小是被控客户端可控的,可以被用来一直申请内存直到占满宕机。

由于一些众所周之的原因,现在没法更新4.4版本,更不可能补丁对比。但是5年前3.5版本的RCE漏洞其实跟这个有点类似(downloads时ip的位置被控客户端可控,可以被替换为../路径穿越),官方当时的修复措施之一就是判断了beacon在download前有没有过至少一次交互:

The Team Server now checks that the beacon has been tasked at least once before allowing most callback responses from the beacon. This ensures that an attacker can’t stage a fake beacon and start spoofing responses without the operator first interacting with the beacon.

大概猜了下关键字然后全局搜索,在BeaconC2.java中看到了相关判断代码:

CobaltStrikeParser模拟的beacon上线一般没有实际命令交互的,就能被这个判断给拦下来,把这段代码复制到漏洞相关的分支即可:

重新编译后测试上线可以正常使用截图功能:

  • 惭愧的是虽然看上去是这么一回事,但是没有仔细去看communication_poc.py和实际打一下做试验。只是作为一个抛砖引玉的想法,说错了的话请师傅们拍砖。

除了这个代码判断外,它默认用的是空UA头EMPTY_UA_HEADERS = {"User-Agent":""}发起请求,在profile中屏蔽掉空UA头可以起到缓解作用:

1
2
3
4
http-config {
...
set block_useragents "curl*,lynx*,wget*,blank";
}

更进一步可以直接关掉stager这个功能,基本就断了CobaltStrikeParser这类蹭payload去解析的工具路子,但是对后渗透会有很大影响:

1
set host_stage "false";

所以可以通过启动teamserver时给添加Java层参数-Xmx2048M限制内存大小。当然也可以像之前说的,改掉checksum8上线规则、修改默认的抑或密钥、stager下发完payload随时kill掉这些方法辅助规避payload泄漏。

参考链接

Cobalt Strike DoS Vulnerability (CVE-2021-36798)

Hotcobalt – New Cobalt Strike DoS Vulnerability That Lets You Halt Operations

Striking Back at Retired Cobalt Strike: A look at a legacy vulnerability