INCIDENT RESPONSE · LOG ANALYSIS
攻击者藏在
哪一行日志里?
拿到被入侵的机器,第一件事不是猜,而是读日志。本章教你三句话方法论:谁打的 → 打的什么 → 打成没有,用日志还原完整攻击链。
01 · Log Map
日志地图:每种日志管什么
先认识一条真实日志长什么样——日志就是案发现场的监控录像,每一行都是一次完整的"谁、何时、干了什么、成没成"。
192.168.189.128 - - [19/Dec/2025:22:14:37 +0800] "GET /phpMyAdmin/index.php?target=../etc/passwd HTTP/1.1" 200 8966 ① 客户端IP ② 请求时间 ③ 请求方法+路径(打了什么) ④状态码 ⑤字节 谁打的 何时 打了什么 成没成 返回量
大白话
日志就是案发现场的监控录像:一行 = 一次请求,五段信息 = 谁、何时、打了什么、成没成、返回多少。后面所有分析,都是对这五段的统计和过滤。
| 日志文件 | 记录什么 | 能回答什么问题 |
|---|---|---|
/var/log/httpd/access_log | 每一个 HTTP 请求(IP、时间、路径、状态码) | Web 攻击者 IP、用了什么漏洞、成败 |
/var/log/httpd/error_log | Web 服务错误 | 崩溃、加载失败等辅助线索 |
/var/log/secure | SSH 登录、sudo、su 等认证 | SSH 爆破/登录者 IP、时间、成败 |
/var/log/wtmp | 成功登录记录(二进制) | 用 last 查看谁登录过 |
/var/log/btmp | 失败登录记录(二进制) | 用 lastb 看爆破来源 |
先看哪个
应急响应里 access_log 和 secure 是首选——它们有明文时间 + IP + 行为,直接支撑"攻击链还原"。wtmp/btmp 是二进制,用
last/lastb 读,且可能被清空(清空本身也是线索)。02 · Method
三问三查:日志分析方法论
第 1 问:谁打的?—— 提取 IP 统计
awk '{print $1}' /var/log/httpd/access_log | sort | uniq -c | sort -rn
# 输出形如:
62 192.168.189.128 ← 次数最多,重点怀疑对象
2 10.13.97.171
1 127.0.0.1第 2 问:打的什么?—— 看请求路径和 payload
grep "192.168.189.128" /var/log/httpd/access_log # 输出示例 ↓ 看它访问了哪些路径 22:10:11 GET /randomfile1 → 404 目录扫描 22:14:37 GET /phpMyAdmin/index.php?target=.../../../etc/passwd → 200 LFI 成功读 passwd
第 3 问:打成没有?—— 看状态码
| 状态码 | 含义 | 判断 |
|---|---|---|
200 + 敏感路径 | 请求成功且返回内容 | 攻击成功 ✓(重点取证) |
404 | 文件不存在 | 没打成(可能只是扫描) |
403 / 302 | 拒绝 / 重定向 | 一般算未成功 |
关键判定
404 ≠ 攻击成功,200 + 敏感路径(etc/passwd、webshell 文件)= 实锤。扫描行为 + 成功利用,同时具备的 IP 才是攻击者。
03 · Profiling
IP 画像法:数量最多 ≠ 攻击者
攻击者不一定访问次数最多,但行为一定最异常。给每个 IP 做"画像"——看它干了什么,而不是只看干了几次。
| 画像特征 | 正常访客 | 攻击者 |
|---|---|---|
| 路径规律 | 首页、静态资源、正常页面 | 目录扫描、随机路径、备份文件探测 |
| payload | 无 | ../、%253f、select、cmd |
| 时间分布 | 分散 | 集中爆发(分钟级连续请求) |
| 成功利用 | — | 对敏感路径返回 200 |
grep -iE "etc/passwd|\.\./|%253f|\.\.\.\/|phpinfo|shell|cmd=|select" /var/log/httpd/access_log
04 · Case Study
实战案例:真实攻击日志还原
以下来自一台被入侵的 CentOS 7 应急响应题。四步把攻击链还原得干干净净。
192.168.189.128(攻击者) │ ① 目录扫描(22:10 一连串 404) ▼ │ ② phpMyAdmin LFI 成功(22:14:37 → 200,读 /etc/passwd) ▼ │ ③ 读取 webshell 源码(22:15:10 → 200) ▼ │ ④ 触发反弹 shell → 攻击者电脑:53218(拿到 root) ▼ 10.13.97.171(另一条线:SSH 登录 root,见 secure 日志)
Step 1 · 提取全部 IP
awk '{print $1}' access_log | sort | uniq -c | sort -rn
62 192.168.189.128
2 10.13.97.171
1 127.0.0.1
1 192.168.189.17Step 2 · 给每个 IP 画像
| IP | 行为 | 画像 |
|---|---|---|
| 192.168.189.128 | 目录扫描 + 探测隐藏文件 + 成功读 /etc/passwd + 访问 webshell | 攻击者 ✓ |
| 10.13.97.171 | 浏览器正常 GET / | 后续访客 / 出题人 |
| 127.0.0.1 | curl / 一次 | 本机正常 |
| 192.168.189.17 | favicon 404 | 普通访客 |
Step 3 · 还原攻击者时间线
22:10:11 GET /randomfile1 → 404 目录扫描 22:10:12 GET /.bash_history → 404 探测敏感文件 22:11:08 GET /forget /gadget /getconfig → 404 继续扫描 22:14:37 GET /phpMyAdmin/index.php?target=db_sql.php%253f/../../../../../../etc/passwd → 200 8966 ← 成功读 /etc/passwd(CVE-2018-12613 LFI) 22:15:10 GET /var/lib/mysql/syscache.php → 200 ← 读取 webshell 源码
Step 4 · 交叉验证 SSH 侧
grep -E "Accepted|Failed" /var/log/secure Accepted password for root from 10.13.97.171 × 3 次(另一台机器,不同时间)
结论模板
Web 攻击者 = 192.168.189.128(利用 phpMyAdmin CVE-2018-12613 文件包含读 /etc/passwd,再读 webshell 触发反弹)。SSH 侧另有 10.13.97.171 的 root 登录记录。两条线时间不同,分别归属不同阶段。
05 · Pitfalls
避坑指南
坑 1 · 时间戳矛盾
access_log 里写着
19/Dec/2025,但文件系统时间戳是 8 月 27 日?以证据链为准——这是出题人构造的"布景时间"。日志里的时间用于识别攻击序列,实际入侵/题目的构建时间看文件 mtime 和系统日志。坑 2 · wtmp/btmp 是空的
不要写"无记录"就完事。清空本身是一条线索(说明攻击者清理过现场),答题时要点明。
坑 3 · 只看数量
访问最多的不一定是攻击者。一定要 展开路径看行为,扫描器可能只发了 3 条请求就命中。
06 · Cheatsheet
命令速查卡
日志分析 · 一条龙
awk '{print $1}' access_log | sort | uniq -c | sort -rn # 提取 IP 统计
grep "IP" access_log # 看某个 IP 全部行为
grep -iE "etc/passwd|\.\./|%253f" access_log # 抓攻击特征
grep -E "Accepted|Failed" /var/log/secure # SSH 登录记录
last && lastb # wtmp / btmp
head -n 2 access_log && tail -n 2 access_log # 时间范围