日志分析基础
日志分析基础
本文适合
CTF Misc 入门学习者。学完你能:从 Web、系统或安全日志中建立时间线,定位异常 IP、路径、状态码、命令和 flag 片段,并说明证据如何拼接
日志记录系统、应用、网络或用户行为。CTF 中的日志题通常要求从大量正常记录中找异常事件、攻击路径、flag 片段或关键时间线。
一句话判断
看到 access.log、auth.log、syslog、evtx、审计记录或大量请求时,不要先搜最终答案;先按时间、来源、动作和结果建表,再从异常聚合中定位攻击链或 flag 片段。
题目中常见信号
说明:可能还原扫描、注入、上传、越权
第一动作:统计 IP、路径、状态码
说明:登录、sudo、SSH 爆破
第一动作:查失败/成功登录和时间线
说明:事件 ID 驱动分析
第一动作:按事件 ID 和时间筛选
说明:flag 可能被分多次写入
第一动作:按时间或序号拼接
说明:需要聚合降噪
第一动作:top IP、top URI、状态码分布
说明:题目考攻击过程
第一动作:建 timeline 而不是单点搜索
核心概念
日志分析的核心句式是“谁在什么时候对什么做了什么,结果如何”。S 级日志 WP 不能只给出最后一行命中,而要解释:
- 基线是什么:正常访问频率、常见路径、常见状态码。
- 异常是什么:异常 IP、时间、User-Agent、路径、状态码、参数。
- 证据如何串联:扫描 -> 漏洞验证 -> 利用 -> 写入/读取 flag。
- 输出如何复现:用什么命令筛选,为什么这几行是关键。
最小分析流程
- 确认日志格式、时区、字段含义和总行数。
- 统计来源 IP、路径、状态码、User-Agent 和时间分布。
- 找异常:高频 IP、404/500 峰值、可疑 payload、成功状态变化。
- 围绕异常 IP 或时间窗口抽取完整上下文。
- 对 flag 片段、参数值、响应大小、请求顺序做拼接或解码。
- 如果日志指向上传文件、命令执行、内网访问,转对应 Web/Misc 文章。
- 写 WP 时保留筛选命令和关键行,不只写“发现了 flag”。
最小验证示例
# Nginx/Apache access.log 常用聚合
wc -l access.log
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
awk '{print $9}' access.log | sort | uniq -c | sort -nr
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head
# 搜常见攻击关键词
grep -Ei "union|select|sleep|/etc/passwd|cmd=|upload|flag|base64" access.log
# 抽取某 IP 的完整时间线
grep "^192.0.2.10 " access.log > attacker.logflag 分片拼接示例:
grep "FLAGPART" app.log | sort | sed -E 's/.*FLAGPART\[([0-9]+)\]=(.*)/\1 \2/'判断依据:
某 IP 请求量和错误率异常 -> 值得聚焦
异常 IP 后续出现 200/302 -> 可能利用成功
flag 片段有序号或时间顺序 -> 可以拼接复原常见利用 / 解题路线
路线总览:
关键证据:扫描、payload、成功响应
常用动作:聚合 IP/路径,抽时间线
关键证据:多次失败后成功
常用动作:查 auth/EVTX 登录事件
关键证据:多行含 part、chunk、序号
常用动作:按序号或时间拼接
关键证据:请求参数或 shell 命令
常用动作:搜 cmd=、反弹 shell、下载命令
关键证据:POST、multipart、文件路径
常用动作:抽上传请求和后续访问
关键证据:特定 event id
常用动作:用 EvtxECmd/python-evtx 筛选
关键证据:多日志源
常用动作:归一化时区后合并排序
常见失败原因
常见原因:flag 分片、编码或不直接出现
排查动作:聚合异常,再看上下文
常见原因:日志字段含空格或引号
排查动作:用专门 parser 或正则解析
常见原因:时区、日志格式、排序方式错误
排查动作:保留原始时间并统一转换
常见原因:只看 500/404,不看状态变化
排查动作:比较同一 payload 的前后响应
常见原因:扫描只是前奏
排查动作:找利用成功后的访问和输出
常见原因:事件 ID 无上下文
排查动作:查事件源、用户、进程、字段
迷你案例
题目给 access.log,先聚合:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
grep "^10.10.1.5 " access.log > attacker.logattacker.log 显示先访问 /admin 失败,随后请求:
GET /download?file=../../../../var/www/html/flag.txt HTTP/1.1" 200 37这说明关键不是日志里直接有 flag,而是攻击者通过路径穿越成功读取了 flag 文件。WP 应把异常 IP、攻击路径、状态码 200 和响应大小作为证据链。