这是F12sec的第69篇原创
申明:本次测试只作为学习用处,请勿未授权进行渗透测试,切勿用于其它用途!
本文章来自团队师傅考研勇士,转载请注明来源
先来张效果图
分析原理:
我们利用Wireshark抓包工具分析一下Cobalt strike的上线过程是怎么样的
CS生成马
受控机上线并抓包
可以看到CS的上线过程中,有一串很明显的加密Cookie,
查找资料得知,是非对称RSA加密类型,需要一个私钥Private Key才能对其进行解密
我们对Cookie解密看看,网上找到了相关的代码提取PrivateKey与Public Key
注意,实战中我们肯定拿不到PrivateKey的,这里只是弄出来分析一下加密的Cookie里有啥)
import java.io.File;
import java.util.Base64;
import common.CommonUtils;
import java.security.KeyPair;
class DumpKeys
{
public static void main(String[] args)
{
try {
File file = new File(".cobaltstrike.beacon_keys");
if (file.exists()) {
KeyPair keyPair = (KeyPair)CommonUtils.readObject(file, null);
System.out.printf("Private Key: %s\n\n", new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded())));
System.out.printf("Public Key: %s\n\n", new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded())));
}
else {
System.out.println("Could not find .cobaltstrike.beacon_keys file");
}
}
catch (Exception exception) {
System.out.println("Could not read asymmetric keys");
}
}
}
代码来自:
https://research.nccgroup.com/2020/06/15/striking-back-at-retired-cobalt-strike-a-look-at-a-legacy-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/2021/06/15/update-1768-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