root@yjxy26:~# ▊ 应急响应 · 系列 02 · 日志分析
INCIDENT RESPONSE · LOG ANALYSIS

攻击者藏在
哪一行日志里?

拿到被入侵的机器,第一件事不是猜,而是读日志。本章教你三句话方法论:谁打的 → 打的什么 → 打成没有,用日志还原完整攻击链。

对象:access_log / secure / wtmp / btmp 难度:入门→进阶 关键词:IP画像 / 200 vs 404
01 · Log Map

日志地图:每种日志管什么

先认识一条真实日志长什么样——日志就是案发现场的监控录像,每一行都是一次完整的"谁、何时、干了什么、成没成"。

一条真实 access_log 长什么样
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_logWeb 服务错误崩溃、加载失败等辅助线索
/var/log/secureSSH 登录、sudo、su 等认证SSH 爆破/登录者 IP、时间、成败
/var/log/wtmp成功登录记录(二进制)用 last 查看谁登录过
/var/log/btmp失败登录记录(二进制)用 lastb 看爆破来源
先看哪个 应急响应里 access_log 和 secure 是首选——它们有明文时间 + IP + 行为,直接支撑"攻击链还原"。wtmp/btmp 是二进制,用 last/lastb 读,且可能被清空(清空本身也是线索)。
02 · Method

三问三查:日志分析方法论

第 1 问:谁打的?—— 提取 IP 统计

access_log 第一列 = 客户端 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

按 IP 过滤出完整请求序列
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 抓全部攻击特征
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

4 个 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.17

Step 2 · 给每个 IP 画像

IP行为画像
192.168.189.128目录扫描 + 探测隐藏文件 + 成功读 /etc/passwd + 访问 webshell攻击者 ✓
10.13.97.171浏览器正常 GET /后续访客 / 出题人
127.0.0.1curl / 一次本机正常
192.168.189.17favicon 404普通访客

Step 3 · 还原攻击者时间线

192.168.189.128 的完整序列
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 侧

secure 日志
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 # 时间范围