西湖论剑2025-0解题-CSCS详细分析
CS流量分析
题目分析
下载附件只有一个流量包

显然CS流量分析
按照常规流程:
首先checksum8算法判断流量是否魔改
然后解密心跳包请求
作为CTF的CS流量分析题,解密无非两种
要么另设考点获取到.cobaltstrike.beacon_keys文件
要么就另设考点获取私钥,1768.py获取公钥
该题考查的后面这种,也就是弱公钥解私钥
判断流量是否魔改

32位的后门得到的结果是92,64位的后门得到的结果是93,该特征符合未魔改Cobalt Strike的流量特征
def checksum8(text):
if len(text) < 4:
return 0
text = text.replace("/", "")
sum_value = 0
for char in text:
sum_value += ord(char)
return sum_value % 256
if __name__ == "__main__":
print(checksum8("mB9u"))
#得到结果93解密心跳包
获取公钥
导出修改后缀为vir

然后利用1768.py解密得到公钥和一些信息

30819e300d06092a864886f70d010101050003818c00308188028180525e1781f2f02d132a7818a6d269baddbf39352c8d20290ec2294fbe4d77e6549ef4766d8b0e1620000adfbd7aff99cd72f05623eb0def202265cf631dd895acd5e981da8424c03a295895c8194a31641f2eecd5a8715ca89cdbf9433c5d437538767666c3bdb0f8629555375b574fe408a94ae82f92960085d416374f1654b30203010001from hex to base64
MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgFJeF4Hy8C0TKngYptJput2/OTUsjSApDsIpT75Nd+ZUnvR2bYsOFiAACt+9ev+ZzXLwViPrDe8gImXPYx3YlazV6YHahCTAOilYlcgZSjFkHy7s1ahxXKic2/lDPF1DdTh2dmbDvbD4YpVVN1tXT+QIqUroL5KWAIXUFjdPFlSzAgMBAAE=获取私钥
过滤一下流量包
(ip.src==10.11.4.3||ip.src==192.168.184.140)&&(ip.dst==192.168.184.140||ip.dst==10.11.4.3)&&http
拿到加密的cookie
不妨再简单分析一下
通信流量是通过生成的 AES Key 和 HMAC Key 进行加密的
而这两个 key 是根据 TeamServer 端接收到第一个心跳包时用私钥去解密心跳包中公钥加密的 cookie根据解密出的协商公钥生成的
私钥就需要去.cobaltstrike.beacon_keys 文件中拿
然后用cs-script去解.cobaltstrike.beacon_keys得到其中的公钥私钥
项目地址: https://github.com/Slzdude/cs-scripts
而这个题并非这样,而是文章开头提到的,私钥其实是通过弱公钥解解的
项目地址: https://github.com/RsaCtfTool/RsaCtfTool
获取私钥private key命令
python RsaCtfTool.py --publickey ./key.pub --privatekey.pub如下
-----BEGIN PUBLIC KEY-----
MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgFJeF4Hy8C0TKngYptJput2/OTUsjSApDsIpT75N
d+ZUnvR2bYsOFiAACt+9ev+ZzXLwViPrDe8gImXPYx3YlazV6YHahCTAOilYlcgZSjFkHy7s1ahx
XKic2/lDPF1DdTh2dmbDvbD4YpVVN1tXT+QIqUroL5KWAIXUFjdPFlSzAgMBAAE=
-----END PUBLIC KEY-----得到私钥
Private key :
-----BEGIN RSA PRIVATE KEY-----
MIICWgIBAAKBgFJeF4Hy8C0TKngYptJput2/OTUsjSApDsIpT75Nd+ZUnvR2bYsO
FiAACt+9ev+ZzXLwViPrDe8gImXPYx3YlazV6YHahCTAOilYlcgZSjFkHy7s1ahx
XKic2/lDPF1DdTh2dmbDvbD4YpVVN1tXT+QIqUroL5KWAIXUFjdPFlSzAgMBAAEC
gYApWVrrvY2c0zZKu/VjQ/ivQUPy0b63GmVyS1Lg8frzAiAaESnE2Pl6bwsGbxTE
I+3jeYuE1IdWOAeMnKPhY80fOSgws6vSri7CcxnMUEEn3AMw4YSwBIaBGkdLnfxf
pbS/kUUb/z7/A1SRtNq1n4hZYinnG2NpUuiO1WqwHqOGoQJBAJE14+VVt8ONGIZ1
qIf4cqAnAmtonPhyDNdYZQC0IlxNzyixo/lnlTc80b3jYUA4w8GGQQZea70op4RS
fIJV420CQQCRNePlVbfDjRiGdaiH+HKgJwJraJz4cgzXWGUAtCJcTc8osaP5Z5U3
PNG942FAOMPBhkEGXmu9KKeEUnyCVeSfAkB6vJQuKe+zaDVMoXKbyxIH8DEJXFkh
XjUgZ+SnXZqVbmclPFEe48Cp+cxGtkRjJhfAIZwgp/pk3lIJdDctay9ZAkAhlDeu
CcNj6hXYyg592tsO49ZwZhGedik4Bw3cOsuTUr7r5yBHBUgBLQRHh/QuOLIz50rU
ITOC24rZU4XNUfV7AkAipEfvmXf4RaJLlIoWZe/XkNXpGcsYIeaedUv29xqaNAbA
7HhEs3twu6+G0QP1YuAPNp28FNoe52XfJhVWTw1D
-----END RSA PRIVATE KEY-----解密cookie得到HMACK key和AES key
项目地址: https://github.com/WBGlIl/CS_Decrypt
这里用项目里的Beacon_metadata_RSA_Decrypt.py
但是要对其进行更改,因为里面用的库M2Crypto很久没更过了
详情参考: https://blog.csdn.net/AomCC/article/details/133298604 这篇文章的方法二不再赘述

得到我们要的东西
AES key:9fe14473479a283821241e2af78017e8
HMAC key:1e3d54f1b9f0e106773a59b7c379a89d用HMAC key和AES key解密加密数据
这里用项目里的CS_Task_AES_Decrypt.py
讲加密数据和HMAC key和AES key填充到代码里面运行,然后分别查看四个操作

每一个数据都要from hex to base64
第一个:
00000040efeda3e57f7d7fd589d11640ea0f9a4fe6bc91332723ffc5f43f78b37c21cc7485c44d6c8eb6af74fc7044046059c76519e493e351c9f631d6785d5c07eae9e3to base64
AAAAQO/to+V/fX/VidEWQOoPmk/mvJEzJyP/xfQ/eLN8Icx0hcRNbI62r3T8cEQEYFnHZRnkk+NRyfYx1nhdXAfq6eM=
第二个:
000001602a99f7cc51face35199e8b1a4a5616e0301591b6f1f48b1d000149cb83d6a81e9659849a52c4f50a8629b0dfb7c036df406b44d449e40fe18df3594721e1f5849662271c1ea18b18c8eb58af5ee2c3a784852dd1c4a5c699f9518d2e2fc70d756cd68361ac794eed4eae6b062be6c31651caf93954f2a89b10e25b1fd9757ec17ee8b97038c4babb73c4f21688f5d235797844c2c9c288fac3fd2bd9cf5373956389b7e5232e35b6f268f9d67ba54f3e7e1606d4cb4020d5f480c6e5f4409b8d87e0443ae0bcfe93d286291ba6bfd0c7f37593581d90bb4ab7cfb065b4421a727f120fb491c2dc01797e38996dfc123fb120c5ed312577cc917d8a435b73c25b6d29ef0bad595100256c9aa5571e5c0ce0a8ea2c173ca1fae577fa924506b75b86522052f019d6843d74dc6fbdf2219b77e020a049c4e77df3658c80bcb703f8f878ff2f70c5c69d0cf6f4efb5a755ba854dfa5777a23989286770da6e0444d0to base64
AAABYCqZ98xR+s41GZ6LGkpWFuAwFZG28fSLHQABScuD1qgellmEmlLE9QqGKbDft8A230BrRNRJ5A/hjfNZRyHh9YSWYiccHqGLGMjrWK9e4sOnhIUt0cSlxpn5UY0uL8cNdWzWg2GseU7tTq5rBivmwxZRyvk5VPKomxDiWx/ZdX7Bfui5cDjEurtzxPIWiPXSNXl4RMLJwoj6w/0r2c9Tc5VjibflIy41tvJo+dZ7pU8+fhYG1MtAINX0gMbl9ECbjYfgRDrgvP6T0oYpG6a/0MfzdZNYHZC7SrfPsGW0QhpyfxIPtJHC3AF5fjiZbfwSP7Egxe0xJXfMkX2KQ1tzwlttKe8LrVlRACVsmqVXHlwM4KjqLBc8ofrld/qSRQa3W4ZSIFLwGdaEPXTcb73yIZt34CCgScTnffNljIC8twP4+Hj/L3DFxp0M9vTvtadVuoVN+ld3ojmJKGdw2m4ERNA=
第三个:
000000d0c72ef8b74a7d8acc332695b62448280f9a4eaa12457de4adcad279b0563f2d4cb0707f7e2853c45acf28a365d905cf8ca421d557bd7655cbd50aafbdbe5f3f570c9c3d876d0c21b661ca5c46e09f987f7e1263f6d33c34db28a2fd342fe48e5801d1a97fb88e00f0c648ec889f6b72d71edd2eed5affd32bc8d51e27fcc148d16823c1bc235b0e16d9d477bd0b4582941db373e171cce78b10c869eb987baf3fd9f879b236be6f3af43b7742f6241dfe02ab696c96f1779d0003d6b2720d1c93890e75fcce939f1c8e0922ce5044bc3ato base64
AAAA0Mcu+LdKfYrMMyaVtiRIKA+aTqoSRX3krcrSebBWPy1MsHB/fihTxFrPKKNl2QXPjKQh1Ve9dlXL1Qqvvb5fP1cMnD2HbQwhtmHKXEbgn5h/fhJj9tM8NNsoov00L+SOWAHRqX+4jgDwxkjsiJ9rctce3S7tWv/TK8jVHif8wUjRaCPBvCNbDhbZ1He9C0WClB2zc+FxzOeLEMhp65h7rz/Z+HmyNr5vOvQ7d0L2JB3+AqtpbJbxd50AA9aycg0ck4kOdfzOk58cjgkizlBEvDo=
第四个:
00000100f24f15cd6f33c36e70ca228d10babfac1cf6bfbb9b6923a7828c9ed30b76d3ce1cb3d8f97c358bf90004e771ac646b1b996fd248ac8f0b460e0a36950dffcde04f3bae831982b528393f3a3c771310ba0c0bb7418ba5e8734a6bd37bc8a51cc0683c0904e0f404180e4c4c34720a3e5d6767c435f1746e6b93a13a2ecdc8074089e684b90748fc1a7e24e66bd637673437d9e24a37ce6f584b478e2f0485f3c05414dd4c35eb9ecfed8d4fbdab54db4233258f4fea6ed515a1030feeb184db94a4841236b491d2f7379e10f52d50ae573cd6f4504aa9750da273fa65c2a9eaf9b9bb014cafc53a9e9f0042bfcd5d24fc1b29173fd3308ff08d30b2a7d42132d4to base64
AAABAPJPFc1vM8NucMoijRC6v6wc9r+7m2kjp4KMntMLdtPOHLPY+Xw1i/kABOdxrGRrG5lv0kisjwtGDgo2lQ3/zeBPO66DGYK1KDk/Ojx3ExC6DAu3QYul6HNKa9N7yKUcwGg8CQTg9AQYDkxMNHIKPl1nZ8Q18XRua5OhOi7NyAdAieaEuQdI/Bp+JOZr1jdnNDfZ4ko3zm9YS0eOLwSF88BUFN1MNeuez+2NT72rVNtCMyWPT+pu1RWhAw/usYTblKSEEja0kdL3N54Q9S1Qrlc81vRQSql1DaJz+mXCqer5ubsBTK/FOp6fAEK/zV0k/BspFz/TMI/wjTCyp9QhMtQ=
可以看到第四个有secret的流量包
当时比赛的时候是做到这一步了的,奈何怀疑过但是没跟出题人脑电波对上。。。

恢复流量包secret.pcapng后话
数据包有点大,大到终端放不下。。。

然后把这个secret流量包提出来
根据流量包的数据流洗一下数据恢复成正常的流量包
0A 0D 0D 0A 开头 6C 00 00 00结尾,删掉下图红圈部分即可恢复


恢复如下

后面就。。。出题人是这个【赞】
CS1.6的流量分析,有点太夸张了
还是个原题,有点为了出题而出题了后面这部分

https://www.anquanke.com/post/id/261339
so文件的C源码
extern "C"
{
int _LongSwap(int l)
{
unsigned int res = __builtin_bswap32(*(unsigned int *)&l);
return *(int *)&(res);
}
const unsigned char mungify_table[] =
{
0x7A, 0x64, 0x05, 0xF1,
0x1B, 0x9B, 0xA0, 0xB5,
0xCA, 0xED, 0x61, 0x0D,
0x4A, 0xDF, 0x8E, 0xC7};
const unsigned char mungify_table2[] =
{
0x05, 0x61, 0x7A, 0xED,
0x1B, 0xCA, 0x0D, 0x9B,
0x4A, 0xF1, 0x64, 0xC7,
0xB5, 0x8E, 0xDF, 0xA0};
unsigned char mungify_table3[] =
{
0x20, 0x07, 0x13, 0x61,
0x03, 0x45, 0x17, 0x72,
0x0A, 0x2D, 0x48, 0x0C,
0x4A, 0x12, 0xA9, 0xB5};
void COM_UnMunge2(unsigned char *data, int len, int seq)
{
int i;
int mungelen;
int c;
int *pc;
unsigned char *p;
int j;
mungelen = len & ~3;
mungelen /= 4;
for (i = 0; i < mungelen; i++)
{
pc = (int *)&data[i * 4];
c = *pc;
c ^= seq;
p = (unsigned char *)&c;
for (j = 0; j < 4; j++)
{
*p++ ^= (0xa5 | (j << j) | j | mungify_table2[(i + j) & 0x0f]);
}
c = _LongSwap(c);
c ^= ~seq;
*pc = c;
}
}
}然后这个代码根据文章代码小作修改
# -*- coding: UTF-8 -*-
from scapy.all import *
from ctypes import *
lib = CDLL('./dll.so')
COM_UnMunge = lib.COM_UnMunge2
pcaps = rdpcap("secret.pcapng")
with open('res', 'wb') as f:
for mpacket in pcaps:
if mpacket.haslayer(UDP):
udp = mpacket[UDP]
data = bytes(udp.payload)[8:]
seq = bytes(udp.payload)[0]
c = create_string_buffer(data)
COM_UnMunge(c, len(data), seq)
print(mpacket.time, mpacket[IP].src, '->', mpacket[IP].dst)
decode_bytes = bytes(c)
print(' '.join(['%02X' % i for i in bytes(udp.payload)]))
f.write(decode_bytes)
print(decode_bytes)
else:
print(f"Packet at {mpacket.time} is not UDP.")
flag
DASCTF{C0UnT3R_S7R1K3_4nD_C0BaLt_57RIK3_4LL_FUN}reference
https://nnnpc.github.io/2024/04/16/CS%E6%B5%81%E9%87%8F%E6%B5%85%E6%9E%90
pwn和iot的附件没有噢