安全矩阵

 找回密码
 立即注册
搜索
查看: 3387|回复: 0

实战 | CS反制之批量伪装上线

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-26 18:47:39 | 显示全部楼层 |阅读模式
原文链接:实战 | CS反制之批量伪装上线

1.漏洞背景先来张效果图

分析原理:
我们利用Wireshark抓包工具分析一下Cobalt strike的上线过程是怎么样的
CS生成马

受控机上线并抓包


可以看到CS的上线过程中,有一串很明显的加密Cookie,
查找资料得知,是非对称RSA加密类型,需要一个私钥Private Key才能对其进行解密
我们对Cookie解密看看,网上找到了相关的代码提取PrivateKey与Public Key
注意,实战中我们肯定拿不到PrivateKey的,这里只是弄出来分析一下加密的Cookie里有啥)
  1. import java.io.File;
  2. import java.util.Base64;
  3. import common.CommonUtils;
  4. import java.security.KeyPair;

  5. class DumpKeys
  6. {   
  7.     public static void main(String[] args)
  8.     {
  9.         try {
  10.             File file = new File(".cobaltstrike.beacon_keys");
  11.             if (file.exists()) {
  12.                 KeyPair keyPair = (KeyPair)CommonUtils.readObject(file, null);
  13.                 System.out.printf("Private Key: %s\n\n", new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded())));
  14.                 System.out.printf("Public Key: %s\n\n", new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded())));
  15.             }
  16.             else {
  17.                 System.out.println("Could not find .cobaltstrike.beacon_keys file");
  18.             }
  19.         }
  20.         catch (Exception exception) {
  21.            System.out.println("Could not read asymmetric keys");
  22.         }
  23.     }
  24. }

复制代码

代码来自:https://research.nccgroup.com/20 ... gacy-vulnerability/

有一个坑点:代码注意要在JDK11版本下运行。还要把这个java文件放置在CS服务器的CS文件夹下,与“cobaltstrike.jar“同一个目录下。
java -cp“cobaltstrike.jar” Dumpkeys.java
解密完可以看到HTTP类型Beacon上线包里的Cookie是RSA加密过的主机元数据。
解密网站:
https://the-x.cn/cryptography/Rsa.aspx

既然知道了上线的流量过程,我们模拟Cobalt Strike模拟重放一下上线的过程


可以看到通过重放数据包,last被重制为1s,这就说明我们成功了。
实战环境下可以写循环语句,不停模拟上线操作,让攻击者即使能够上线也无法执行命令
当然,如果只是这样那就不会这篇文章了。
​​
继续沿着思路展开,既然数据包中的核心是加密后的Cookie,我们能否进行伪造,达到假的主机上线效果?
答案是可以的
只要知道加密的过程,我们就可以达到伪造的目的
于是,现在的目标很明确,研究加密过程
以上来自:
https://www.secpulse.com/archives/165561.html
核心:
StagerUrl校验算法
Beacon配置的解密算法
其实Stager就是小马拉大马的操作
上线的时候先投递一个小巧的Stager Payload,然后通过Stager 去Beacon Staging Server的某个URL下载完整的Stage(也就是体积更大功能更复杂的Payload),并将其注入内存。
如何得到那个URL?
CS中Stager URL校验算法,就是生成4位的随机校验码,将校验码拼接到URL后面即可请求到Stage的代码



拿到Stage
Beacon配置解密
这里有两个项目地址都可以进行解密操作:
https://github.com/Sentinel-One/CobaltStrikeParser
https://blog.didierstevens.com/2 ... 8-py-version-0-0-7/
第一个项目效果:可以看到我们从stage中得到了Public Key 这意味着我们可以自己对数据进行加密了
Python parse_beacon_config.py stage文件--json

第二个项目效果:不知道为什么这个项目解出来的是串十六进制字符串?我尝试还原了一下。。。没能还原出第一个项目中的Public Key(有了解的大佬麻烦解答一下 感激不尽)

解密后可以看到:公钥PublicKey以及CS服务器地址
坑点:Public key别忘了要删点后面的无效Padding
正确的格式是MIGfXXXXXXXXXXXXXXXX==
也就是说我图中的Public Key 后面那一堆AAAAA要删掉
接下来思路:
加密伪造,向C2服务发送欺骗包
伪造服务器上线。
虽然网上已经有类似项目了,但我还是决定造个轮子试试。
先分析一下各十六进制位都代表了啥
我们只要对着改就行了
Beacon id
Beacon pid
Beacon ip
Computer name
User_name
Process_name
00000000: 00 00 BE EF 00 00 00 52  0A 0E 06 0D 07 06 06 03  .......R........
00000010: 0F 01 03 01 02 09 0D 0E  A8 03 A8 03 00 05 AA 3D  ...............=
00000020: 00 00 8E 89 00 00 04 06  02 23 F0 00 00 00 00 76  .........#.....v
00000030: 91 0A 60 76 90 F5 50 00  00 A8 C0 57 49 4E 2D 74 ..`v..P....WIN-t
00000040: 68 69 73 69 73 61 74 65 73 74 47 35 09 4C69 41  hisisatestG5.LiA
00000050: 6F 09 54 65 73 74 2E 65  78 65                    o.Test.exe
脚本写完了在已有项目上做了些许优化
在Process_name.txt 中加入上线进程的字典
在Computer_name.txt 中加入受控机名称的字典
在User_name.txt 中加入受控机用户名的字典
在Public_key中放入通过Beacon解密获得的Publickey
效果如下:

项目地址:
https://github.com/LiAoRJ/CS_fakesubmit

—————————————————————


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 08:07 , Processed in 0.035731 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表