乐于分享
好东西不私藏

AI 搞定全程溯源应急响应

AI 搞定全程溯源应急响应

本文以一道 CTF 应急响应赛题为主线,借助 AI Agent + linux-ir 技能,完整复现攻击者从信息窃取、密码复用到上传 Webshell 的完整攻击链。三道题目涵盖日志分析、流量溯源、数据库取证,全程约 30 分钟完成解题,适合安全从业者和 CTF 选手参考。


背景

靶机通过 SSH 对外暴露,环境内部署了一套公交系统 PHP Web 应用,运行 Apache + MariaDB,并开放了 FTP 服务。

题目要求回答三个问题:

  1. 1. 分析中间件日志,找到黑客获取数据的第一个漏洞,并提取其窃取的前两个用户名
  2. 2. 分析流量,找到黑客密码复用爆破的 FTP 端口,并提交黑客下载的私密文件内容
  3. 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 风格)
  • • 多账号轮询尝试(sunyuechenhaozhangweiwangqiang…)

这些账号正是从 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 加密通信

修复建议

漏洞
风险等级
修复方案
SQL 注入(search.php)
🔴 Critical
使用 PDO 预编译语句,禁止字符串拼接 SQL
任意文件上传(lost_and_found.php)
🔴 Critical
白名单校验扩展名 + 存储路径与 Web 根目录隔离
FTP 弱密码 / 密码复用
🟠 High
启用独立强密码策略,禁止 FTP 使用 Web 账号密码
FTP 非标端口无鉴权监控
🟡 Medium
部署 IDS/IPS 对 FTP 暴力破解行为告警
Webshell 驻留
🔴 Critical
立即删除 /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 靶场环境中完成,严格遵守相关法律法规。