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

生命在于学习 · 2025-06-16 · 7 人浏览
2025年Solar应急响应公益月赛-5月

2025年Solar应急响应公益月赛-5月 WP by z3nbyte

1、攻击者使用什么漏洞获取了服务器的配置文件?

桌面上有360浏览器和o2server和CrushFTP,o2server日志没什么东西,看CrushFTP的

这个看着很大,打开看看,发现关键点

攻击者利用 CrushFTP 的 WebInterface 进行了恶意操作,特别是通过 XML 数据修改用户权限并访问敏感目录。

攻击者 (user1@192.168.60.220) 通过 data_action:replace 修改了 user1 的权限配置:

<root_dir>/</root_dir> <!-- 将根目录设置为系统根目录 -->
<item name="/">(read)(view)(resume)</item> <!-- 赋予读取权限 -->
<item name="/C/">(read)(view)(resume)</item> <!-- 允许访问C盘 -->

这使得 user1 可以访问整个文件系统,而不仅限于 FTP 目录。

遍历敏感目录

攻击者后续使用 getXMLListing 和 downloadAsZip 命令(在之前的日志中)下载了:

/Users/Administrator/Desktop/o2server/config/externalDataSources.json
/Users/Administrator/Desktop/o2server/config/token.json

这个也比较大

攻击者 (user1@192.168.60.220) 使用 getXMLListing 命令遍历多个目录:

/Users/Administrator/Desktop/360SE/
/Users/Administrator/Application Data/
/Config.Msi/
/PerfLogs/
/Users/Administrator/Desktop/o2server/config/

最终定位到 O2Server 配置文件路径:

/Users/Administrator/Desktop/o2server/config/externalDataSources.json
/Users/Administrator/Desktop/o2server/config/token.json

下载配置文件

攻击者使用 downloadAsZip 命令打包下载:

command:downloadAsZip
paths::/Users/Administrator/Desktop/o2server/config/externalDataSources.json:/Users/Administrator/Desktop/o2server/config/token.json
zipName:archive.zip

服务器返回 HTTP/1.1 200 OK,文件被成功下载。

攻击完成后注销会话

攻击者执行 logout 命令清理痕迹

因为攻击者使用了CrushFTP的WebInterface,所以在微信公众号搜索了一下:

第一个就是:flag{CVE-2025-31161}

2、攻击者C2服务器IP是什么?

使用常规的netstat已经看不到现在有外连了,直接翻日志,因为攻击者是在27日晚上23点20分左右攻击的,所以看日志就可以看到:

flag{156.238.230.57}

3、系统每天晚上系统都会卡卡的帮小明找到问题出在了那?

查看计划任务:

发现只有这个是在晚上,所以
flag{sqlbackingup}

4、恶意域名是什么?

承上启下,直接看这个计划任务:

vbs:

同目录下cmd:

所以
flag{b.oracleservice.top}

5、疑似是什么组织发动的攻击?

通过微步搜索该域名,就可以看到:

所以
flag{8220Gang}

6、开源项目-一道逆向题目

这道题直接打开的话源码是:

#include <iostream>
using namespace std;

int main() {
    char buffer[100];
    cin.getline(buffer, sizeof(buffer));
    string a = "dnceyvjkq]kq]dcig]dnce";
    for (int i = 0; a[i] != '\0'; i++) {
        a[i] ^= 2;
    }
    if (strcmp(a.c_str(), buffer)) {
        cout << "incorrect" << endl;
    }
    else {
        cout << "incorrect" << endl;
    }
}

这样得出来的flag是:
flag{this_is_fake_flag}

所以通过翻源文件:
找到真实的:ConsoleApplication2.vcxproj
其中 PreBuildEvent 字段藏着一段巨大的 VBS 脚本注入行为,这是本题的核心!

<PreBuildEvent>
  <Command>
    ...
    echo base64Code = "JHRhcmdldCA9ICJMSERoMXgxemRJaVZTK2E1cVlK..."
    ...
    wscript.exe "%vbsfile%"
    del /q "%vbsfile%" >nul 2>&1
  </Command>
</PreBuildEvent>

项目在构建之前会偷偷写一个 .vbs 文件,这个 VBS 文件中会:

  1. 解密一段 base64 编码的 payload;
  2. 将其写入 PowerShell;
  3. 用 -EncodedCommand 执行。

Powershell还原:

$target = "LHDh1x1zdIiVS+a5qYJrBPb0ixqHTxd+uJ/3tckUdOqG+mn113E=";
$k = "FixedKey123!";
$d = [System.Text.Encoding]::UTF8.GetBytes((Read-Host "输入字符串"));
$s = 0..255;
$j = 0;
0..255 | % {
    $j = ($j + $s[$_] + [byte]$k[$_ % $k.Length]) % 256;
    $s[$_], $s[$j] = $s[$j], $s[$_];
};
$i = $j = 0;
$r = @();
$d | % {
    $i = ($i + 1) % 256;
    $j = ($j + $s[$i]) % 256;
    ...

这段代码明显是 RC4 加密解密逻辑:

  • $target 是一串被加密的字符串;
  • $k = "FixedKey123!" 是密钥;
  • $d 是用户输入的一串字符串,会被转成字节流;
  • 然后执行典型的 RC4 初始化和加解密过程;
  • 最后会判断用户输入的内容是否与 $target 解密结果一致。

RC4解密后:

flag{rqweripqwe[rqwe[rjqw[eprjqweprij}

解密脚本:

import base64
from Crypto.Cipher import ARC4

def decrypt_flag(b64_ciphertext, key):
    encrypted_bytes = base64.b64decode(b64_ciphertext)
    cipher = ARC4.new(key.encode())
    decrypted = cipher.decrypt(encrypted_bytes)
    return decrypted.decode(errors='ignore')

if __name__ == "__main__":
    ciphertext = "LHDh1x1zdIiVS+a5qYJrBPb0ixqHTxd+uJ/3tckUdOqG+mn113E="
    key = "FixedKey123!"
    flag = decrypt_flag(ciphertext, key)
    print("解密结果:", flag)
比赛
Theme Jasmine by Kent Liao 京ICP备2023023335号-2京公网安备11010802044340号