Skip to content
This repository was archived by the owner on May 18, 2025. It is now read-only.

mix-archive/SeijakuDART

Repository files navigation

Seijaku C2 Writeup

题面

是溯源反制题目。只给出流量包,见 capture.pcap

Writeup

下载流量包发现一个下载请求,打开对应网址发现是题目环境,根据 Referer 头可以找到 API 文档页面。

image

但是由于题目携带的请求 Token 已经过期,所以目前什么都做不了,于是下载响应文件开逆。

发现是 UPX 壳,小脱一手然后拖进 IDA 分析,瞪眼法可知有个 RC4 和一个 CRC64。

image

简单调调或者也靠瞪眼法应该就能看出来密钥具体是怎么计算的,这里直接贴相关源码了:

char tag_value[sizeof(ENCRYPTION_KEY) + sizeof(uint64_t)];
memcpy(tag_value, ENCRYPTION_KEY, sizeof(ENCRYPTION_KEY));
UINT64_TO_BIG_ENDIAN_ARRAY(time(NULL), tag_value + sizeof(ENCRYPTION_KEY));
char tag[sizeof(uint64_t)];
UINT64_TO_BIG_ENDIAN_ARRAY(crc64(tag_value, sizeof(tag_value)), tag);
// mangle encryption key to ensure difference every time
char mangled_encryption_key[sizeof(ENCRYPTION_KEY)];
memcpy(mangled_encryption_key, ENCRYPTION_KEY, sizeof(ENCRYPTION_KEY));
for (size_t i = 0; i < sizeof(mangled_encryption_key); i++)
mangled_encryption_key[i] ^= tag[i % sizeof(tag)];
// Send tag
ASSERT_ERROR(send(sockfd, &tag, sizeof(tag), 0));
// Initialize RC4 states
rc4_state rc4recv, rc4send;
rc4_init(&rc4recv, mangled_encryption_key, sizeof(mangled_encryption_key));
rc4_init(&rc4send, mangled_encryption_key, sizeof(mangled_encryption_key));

大概就是用给定的固定密钥 + 当前 Unix 秒级时间戳进行 CRC64,把这个值发送给 C2 服务器,然后和固定密钥进行循环异或作为本次 RC4 加密密钥。

Note

这个算法是从 VMessMD5 那里得到启发的,不过 RC4 和这个做法都很不安全,容易受到主动探测攻击,如果你真的要写马的话还是别用了

解密后续流量,主要关注 C2 服务器到客户端的流量,可以得到普通用户的用户名密码(user:user,说不定看到 JWT 也能猜出来,就省得分析了)。

登录看看文件共享端点发现 hint.pydb.sqlite3.env 文件,根据数据库定义可以发现他 JWT Secret 用的是 AES-GCM 加密。

image

读读源码就可以解密了,拿到解密后的 JWT Secret 伪造 Admin 用户登录,执行 RCE 端点即可拿到 Flag,非常简单。

About

A C2 which can be easily countered and compromised. (THUDART commission)

Resources

License

Stars

Watchers

Forks