官方通告说在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 | http-config { |
更进一步可以直接关掉stager这个功能,基本就断了CobaltStrikeParser这类蹭payload去解析的工具路子,但是对后渗透会有很大影响:
1 | set host_stage "false"; |
当然也可以像之前说的,改掉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