| name | performing-timeline-reconstruction-with-plaso |
| description | 使用 Plaso(log2timeline)构建综合取证超级时间线,将文件系统、日志和制品中的事件关联整合为统一的时间顺序视图。 |
| domain | cybersecurity |
| subdomain | digital-forensics |
| tags | ["forensics","timeline-analysis","plaso","log2timeline","super-timeline","event-correlation"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
使用 Plaso 执行时间线重建
适用场景
- 需要从多个证据来源构建综合取证时间线时
- 关联文件系统元数据、事件日志、浏览器历史和注册表中的事件时
- 在需要按时间顺序重建活动的复杂调查中
- 当标准日志分析不足以确定事件序列时
- 以可视化、时间顺序格式呈现调查结果时
前置条件
- 取证工作站上已安装 Plaso(log2timeline/psort)
- 原始(dd)、E01 或 VMDK 格式的取证磁盘镜像
- 充足的 Plaso 输出存储空间(可能是镜像大小的 10 倍以上)
- 至少 8GB 内存(大型镜像建议 16GB+)
- Timeline Explorer(Eric Zimmerman)或 Timesketch 用于可视化
- 理解时间戳类型(MACB:修改、访问、更改、创建)
工作流程
步骤 1:安装 Plaso 并准备环境
sudo add-apt-repository ppa:gift/stable
sudo apt-get update
sudo apt-get install plaso-tools
pip install plaso
docker pull log2timeline/plaso
log2timeline.py --version
psort.py --version
mkdir -p /cases/case-2024-001/timeline/
img_stat /cases/case-2024-001/images/evidence.dd
步骤 2:使用 log2timeline 生成 Plaso 存储文件
log2timeline.py \
--storage-file /cases/case-2024-001/timeline/evidence.plaso \
/cases/case-2024-001/images/evidence.dd
log2timeline.py \
--parsers "winevtx,prefetch,mft,usnjrnl,lnk,recycle_bin,chrome_history,firefox_history,winreg" \
--storage-file /cases/case-2024-001/timeline/evidence.plaso \
/cases/case-2024-001/images/evidence.dd
cat << 'EOF' > /cases/case-2024-001/timeline/filter.txt
/Windows/System32/winevt/Logs
/Windows/Prefetch
/Users/*/NTUSER.DAT
/Users/*/AppData/Local/Google/Chrome
/Users/*/AppData/Roaming/Mozilla/Firefox
/$MFT
/$UsnJrnl:$J
/Windows/System32/config
EOF
log2timeline.py \
--filter-file /cases/case-2024-001/timeline/filter.txt \
--storage-file /cases/case-2024-001/timeline/evidence.plaso \
/cases/case-2024-001/images/evidence.dd
docker run --rm -v /cases:/cases log2timeline/plaso log2timeline \
--storage-file /cases/case-2024-001/timeline/evidence.plaso \
/cases/case-2024-001/images/evidence.dd
log2timeline.py \
--storage-file /cases/case-2024-001/timeline/combined.plaso \
/cases/case-2024-001/images/workstation.dd
log2timeline.py \
--storage-file /cases/case-2024-001/timeline/combined.plaso \
/cases/case-2024-001/images/server.dd
步骤 3:使用 psort 过滤和导出时间线
psort.py \
-o l2tcsv \
-w /cases/case-2024-001/timeline/full_timeline.csv \
/cases/case-2024-001/timeline/evidence.plaso
psort.py \
-o l2tcsv \
-w /cases/case-2024-001/timeline/incident_window.csv \
/cases/case-2024-001/timeline/evidence.plaso \
"date > '2024-01-15 00:00:00' AND date < '2024-01-20 23:59:59'"
psort.py \
-o json_line \
-w /cases/case-2024-001/timeline/timeline.jsonl \
/cases/case-2024-001/timeline/evidence.plaso
psort.py \
-o l2tcsv \
-w /cases/case-2024-001/timeline/registry_events.csv \
/cases/case-2024-001/timeline/evidence.plaso \
"source_short == 'REG'"
psort.py \
-o l2tcsv \
-w /cases/case-2024-001/timeline/evtx_events.csv \
/cases/case-2024-001/timeline/evidence.plaso \
"source_short == 'EVT'"
psort.py \
-o dynamic \
-w /cases/case-2024-001/timeline/timeline_explorer.csv \
/cases/case-2024-001/timeline/evidence.plaso
步骤 4:使用 Timesketch 分析时间线
git clone https://github.com/google/timesketch.git
cd timesketch
docker compose up -d
timesketch_importer \
--host http://localhost:5000 \
--username analyst \
--password password \
--sketch_id 1 \
--timeline_name "案例 2024-001 工作站" \
/cases/case-2024-001/timeline/evidence.plaso
timesketch_importer \
--host http://localhost:5000 \
--username analyst \
--sketch_id 1 \
--timeline_name "案例 2024-001" \
/cases/case-2024-001/timeline/timeline.jsonl
步骤 5:执行定向时间线分析
python3 << 'PYEOF'
import csv
from collections import defaultdict
from datetime import datetime
events_by_hour = defaultdict(list)
source_counts = defaultdict(int)
with open('/cases/case-2024-001/timeline/incident_window.csv', 'r', errors='ignore') as f:
reader = csv.DictReader(f)
total = 0
for row in reader:
total += 1
timestamp = row.get('datetime', row.get('date', ''))
source = row.get('source_short', row.get('source', 'Unknown'))
description = row.get('message', row.get('desc', ''))
source_counts[source] += 1
try:
dt = datetime.strptime(timestamp[:19], '%Y-%m-%dT%H:%M:%S')
hour_key = dt.strftime('%Y-%m-%d %H:00')
events_by_hour[hour_key].append({
'time': timestamp,
'source': source,
'description': description[:200]
})
except (ValueError, TypeError):
pass
print(f"事件窗口内事件总数:{total}\n")
print("=== 按来源类型的事件统计 ===")
for source, count in sorted(source_counts.items(), key=lambda x: x[1], reverse=True):
print(f" {source}: {count}")
print("\n=== 按小时的活动统计 ===")
for hour in sorted(events_by_hour.keys()):
count = len(events_by_hour[hour])
bar = * min(count // 10, 50)
(f)
avg = total / max(len(events_by_hour), 1)
(f)
hour sorted(events_by_hour.keys()):
len(events_by_hour[hour]) > avg * 3:
(f)
PYEOF
关键概念
| 概念 | 描述 |
|---|
| 超级时间线(Super-timeline) | 整合多个来源所有制品时间戳的统一时间顺序视图 |
| MACB 时间戳 | 修改(Modified)、访问(Accessed)、更改(Changed,元数据)、创建(Born)—— 四种关键文件时间戳类型 |
| Plaso 存储文件 | 基于 SQLite 的中间格式,存储导出前的解析事件 |
| L2T CSV | Log2timeline CSV 格式,具有标准化的时间线事件列 |
| 解析器(Parser) | Plaso 模块,从特定制品类型中提取时间戳(如 winevtx、prefetch) |
| Psort | Plaso 排序和过滤工具,用于后处理存储文件 |
| Timesketch | Google 开源协作式时间线分析平台 |
| 轴心点(Pivot points) | 已知时间戳(如恶意软件执行)用于聚焦调查范围 |
工具与系统
| 工具 | 用途 |
|---|
| log2timeline(Plaso) | 主要时间线生成引擎,解析 100+ 种制品类型 |
| psort | Plaso 输出过滤、排序和导出工具 |
| Timesketch | 基于 Web 的协作取证时间线分析平台 |
| Timeline Explorer | Eric Zimmerman 的 Windows GUI,用于 CSV 时间线分析 |
| KAPE | 自动化分类收集,为 Plaso 处理提供输入 |
| mactime(TSK) | 基于 Sleuth Kit bodyfile 的简单时间线生成 |
| Excel/Sheets | 对小型过滤数据集进行手动时间线审查 |
| Elastic/Kibana | JSONL 时间线数据的替代可视化平台 |
常见场景
场景 1:勒索软件攻击重建
使用 Plaso 处理完整磁盘镜像,过滤到发现加密前一周,从浏览器历史和事件日志识别初始访问载体,通过注册表和 Prefetch 追踪权限提升,从网络登录事件中绘制横向移动,从显示大量文件修改的 MFT 时间戳确定加密开始时间。
场景 2:数据盗窃调查
创建嫌疑人工作站的超级时间线,过滤 USB 设备连接事件、文件访问时间戳和云存储浏览器活动,构建显示数据暂存、压缩和渗出的叙述,将带标记证据点的时间线提交给法律团队。
场景 3:多系统入侵分析
将所有受影响系统的磁盘镜像处理到单个 Plaso 存储文件,导入 Timesketch 进行协作分析,在系统时间线中搜索横向移动模式,识别零号患者系统和初始入侵载体,绘制整个环境中的完整攻击链。
场景 4:内部威胁非工作时间活动
仅过滤非工作时间的时间线,识别正常工作时间之外的文件访问模式,与认证事件关联(门禁、VPN 登录),搜索这些时间段内对敏感目录的数据访问,为 HR/法律构建证据包。
输出格式
时间线重建摘要:
证据来源:
磁盘镜像:evidence.dd(500 GB,NTFS)
Plaso 存储:evidence.plaso(2.3 GB)
处理统计:
提取的事件总数:4,567,890
使用的解析器:45 个(winevtx、prefetch、mft、usnjrnl、lnk、chrome、firefox、winreg...)
处理时间:3 小时 45 分钟
事件窗口(2024-01-15 至 2024-01-20):
窗口内事件:234,567
事件来源:
MFT: 89,234
事件日志: 45,678
USN 日志: 56,789
注册表: 23,456
Prefetch: 1,234
浏览器: 5,678
LNK 文件: 2,345
其他: 10,153
关键时间线事件:
2024-01-15 14:32 - 打开网络钓鱼邮件(浏览器)
2024-01-15 14:33 - 下载恶意文档
2024-01-15 14:35 - 执行 PowerShell(Prefetch + 事件日志)
2024-01-15 14:36 - 建立 C2 连接(注册表 + 事件日志)
2024-01-16 02:30 - 执行 Mimikatz(Prefetch)
2024-01-16 02:45 - 横向移动至 DC(事件日志)
2024-01-17 03:00 - 数据渗出(MFT + USN 日志)
2024-01-18 03:00 - 清除日志(事件日志)
导出文件:
完整时间线: /timeline/full_timeline.csv(450 万行)
事件窗口: /timeline/incident_window.csv(23.4 万行)
Timesketch 导入:/timeline/timeline.jsonl