2025年Solar应急响应公益月赛-3月

本文最后更新于 2025年3月31日 晚上

比赛 + 赛后复现的题解

【签到】和黑客去Battle把!

1
2
3
4
题目描述
某某文化有限公司被加密啦!老板给了小王5000美元请你帮助小王和黑客谈判争取使用最低的价格买下密钥!
【用户ID为登录青少年CTF平台的手机号】
【本题为模拟请勿当真!禁止攻击平台!】

打开 README.txt,找到了 ID 和网址:https://www.phantomhand.top/

ID 和手机号登录,一直跟它讨价还价,直到它接受 5000 USDT,然后答应就拿到 flag

1
flag{H7Q44S85842W6TQZPERS72ED}

窃密排查-1

1
2
3
题目描述
发现内部数据被窃取,进行紧急上机。请通过黑客遗留痕迹进行排查:
找到黑客窃密工具的账号

把目录翻遍,在 /tmp 目录下找到了 mega 服务,root 运行

进入 /root 目录找到隐藏文件夹

查看目录下的 megacmdserver.log 日志文件

1
2025-03-26_03-51-59.862963 cmd INFO Login complete as 25solar3abc@habenwir.com [megacmdexecuter.cpp:2721]

找到账号 25solar3abc@habenwir.com

1
flag{25solar3abc@habenwir.com}

2503逆向

1
2
3
题目描述
重要文件被加密了,请分析加密器解开该文件。
提示:加密前的文件前四个字节为flag,且开机时间较短

64 位可执行文件

shift+f12 搜索字符串,然后从字符串定位到 main 函数

大概流程:读取明文文件 flag.txt,用 GetTickCount() 作为 srand 种子,生成16字节随机密钥,字符都来自 v14 这个字符集,也就是上面的 qa0wserdf1tg9yuhjio2pklz8xbvcn4mPL7JKOIHUG3YTF6DSREAWQZX5MNCBV 这串字符,然后调用 sub_140001350 函数进行加密得到 flag.txt.freefix

sub_140001350 是标准的 RC4 算法,包含 KSA 和 PRGA 阶段

010 打开加密文件

提取加密后文件数据

1
4C 00 2F AD 84 10 58 AC 8D D1 59 69 79 FB 9D B5 C5 FA 60 17 B0 46 E8 75 D6 CD DE D7 57 DC 7C 96 E1 15 F3 BD C0 72 98 91 88 4D 0C BA 66 04 C9

拷问 deepseek 能出,爆破种子,poc 如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import sys
from concurrent.futures import ThreadPoolExecutor

# 字符池(与C++代码一致)
CHAR_POOL = "qa0wserdf1tg9yuhjio2pklz8xbvcn4mPL7JKOIHUG3YTF6DSREAWQZX5MNCBV"

# 加密后的数据(替换为你的实际密文)
CIPHER_HEX = "4C002FAD841058AC8DD1596979FB9DB5C5FA6017B046E875D6CDDED757DC7C96E115F3BDC0729891884D0CBA6604C9"
ciphertext = bytes.fromhex(CIPHER_HEX)

# -------------------------------
# 精确模拟C++的随机数生成器
# -------------------------------
class MSVCRand:
def __init__(self, seed):
self.state = seed

def rand(self):
self.state = (self.state * 214013 + 2531011) & 0xFFFFFFFF
return (self.state >> 16) & 0x7FFF # 保留低15位

def generate_key(seed):
"""生成16字节密钥(严格匹配C++逻辑)"""
rng = MSVCRand(seed)
key = []
for _ in range(16):
index = rng.rand() % 62 # 62个字符
key.append(CHAR_POOL[index])
return ''.join(key)

# -------------------------------
# RC4解密函数(与sub_140001350严格一致)
# -------------------------------
def rc4_decrypt(ciphertext, key):
# 初始化S盒
S = list(range(256))
j = 0
key_bytes = [ord(c) for c in key]
key_len = len(key_bytes)

# KSA阶段
for i in range(256):
j = (j + S[i] + key_bytes[i % key_len]) % 256
S[i], S[j] = S[j], S[i]

# PRGA阶段
i = j = 0
plaintext = []
for byte in ciphertext:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
k = S[(S[i] + S[j]) % 256]
plaintext.append(byte ^ k)
return bytes(plaintext)

# -------------------------------
# 多线程暴力破解(保持0-10,000,000范围)
# -------------------------------
def worker(seed):
key = generate_key(seed)
plaintext = rc4_decrypt(ciphertext, key)
# 严格检测flag格式(减少误报)
if plaintext.startswith(b'flag{') and b'}' in plaintext:
return seed, key, plaintext.decode(errors='ignore')
return None

def main():
print("[*] 正在破解种子范围: 0 - 10,000,000")

# 多线程加速(根据CPU调整线程数)
with ThreadPoolExecutor(max_workers=8) as executor:
chunk_size = 100000 # 每10万次为一组
total = 10_000_000
found = False

for base in range(0, total, chunk_size):
chunk_start = base
chunk_end = min(base + chunk_size, total)

# 提交任务
futures = [executor.submit(worker, seed) for seed in range(chunk_start, chunk_end)]

# 检查结果
for future in futures:
result = future.result()
if result:
print(f"\n[+] 解密成功!种子: {result[0]}")
print(f"[+] 使用的密钥: {result[1]}")
print(f"[+] Flag内容: {result[2]}")
found = True
executor.shutdown(wait=False)
sys.exit(0)

# 进度显示
progress = (chunk_end / total) * 100
print(f"\r进度: {chunk_end:,}/{total:,} ({progress:.2f}%)", end='', flush=True)

if found:
break

if not found:
print("\n[-] 未在指定范围内找到有效种子,建议:")
print(" 1. 检查密文是否正确")
print(" 2. 扩大种子范围(参见之前的7天范围方案)")

if __name__ == "__main__":
main()

拿到 flag

1
flag{hello_www.sierting.com_fodhaoijsa08324082}

溯源排查-1

1
2
题目描述
某企业的阿里云服务器,现已将镜像从阿里云下载下来,该服务器存在奇怪的外连,请排查出外连地址

把 raw 转成 vmdk 再导入 VM,然后登录对 eth0 抓包,监控非 SSH 的流量

1
tcpdump -i eth0 not port 22 -nn

发现了对同一个 IP 请求

1
flag{156.238.230.167:46578}

溯源排查-2

1
2
题目描述
排查外连进程程序的绝对路径

systemctl status 查看服务发现同时有两个相似服务, systemd-journald 用于日志管理,另一个 journaled 是伪造成系统进程的外连进程

同时也可以用 top 命令监控系统进程资源

然后查找位置

1
flag{/usr/local/systemd/journaled}

溯源排查-3

1
2
题目描述
排查后门,提交其完整名称

R-Studio 挂载进入上面的目录

可以链接到 /tmp/tmp/hsperfdata_root 内的两个被删除的文件

/etc/systemd/system 下可以找到这个服务,就是这个服务名称

1
flag{systemd-journaled}

溯源排查-4

1
2
题目描述
业务系统已被删除,找出可能存在漏洞的应用

发现有 nacos

1
flag{nacos}

溯源排查-5

Nacos历史漏洞复现(汇总)

但是这不是 CNVD 吗???

1
flag{CVE-2023-45001}

溯源排查-6

1
2
题目描述
找出黑客利用漏洞使用的工具的地址,该工具为开源工具

直接搜 nacosrce 找到了工具

1
flag{https://github.com/c0olw/NacosRce}

关于仿真

参考的 n0o0b 师傅的文章:https://www.n0o0b.com/archives/solar-3#%E6%BA%AF%E6%BA%90%E6%8E%92%E6%9F%A5-1 写得很详细


2025年Solar应急响应公益月赛-3月
http://example.com/2025/03/31/2025年Solar应急响应公益月赛-3月/
作者
butt3rf1y
发布于
2025年3月31日
许可协议