L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

performing-timeline-reconstruction-with-plaso

performing-timeline-reconstruction-with-plaso

使用 Plaso(log2timeline)构建综合取证超级时间线,将文件系统、日志和制品中的事件关联整合为统一的时间顺序视图。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

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 并准备环境

# 在 Ubuntu/Debian 上安装 Plaso
sudo add-apt-repository ppa:gift/stable
sudo apt-get update
sudo apt-get install plaso-tools

# 或通过 pip 安装
pip install plaso

# 或使用 Docker(推荐,依赖隔离)
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 运行
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 过滤和导出时间线

# 导出完整时间线为 CSV(超级时间线格式)
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'"

# 以 JSON Lines 格式导出(用于导入 SIEM/Timesketch)
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'"

# 为 Timeline Explorer 导出(动态 CSV)
psort.py \
   -o dynamic \
   -w /cases/case-2024-001/timeline/timeline_explorer.csv \
   /cases/case-2024-001/timeline/evidence.plaso

步骤 4:使用 Timesketch 分析时间线

# 安装 Timesketch(Docker 部署)
git clone https://github.com/google/timesketch.git
cd timesketch
docker compose up -d

# 通过 CLI 将 Plaso 文件导入 Timesketch
timesketch_importer \
   --host http://localhost:5000 \
   --username analyst \
   --password password \
   --sketch_id 1 \
   --timeline_name "案例 2024-001 工作站" \
   /cases/case-2024-001/timeline/evidence.plaso

# 或导入 JSONL
timesketch_importer \
   --host http://localhost:5000 \
   --username analyst \
   --sketch_id 1 \
   --timeline_name "案例 2024-001" \
   /cases/case-2024-001/timeline/timeline.jsonl

# 在 Timesketch Web 界面中:
# 1. 搜索事件:"data_type:windows:evtx:record AND event_identifier:4624"
# 2. 应用 Sigma 分析器进行自动化检测
# 3. 标记/标签重要事件
# 4. 创建记录调查叙述的故事
# 5. 与团队成员共享

步骤 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)
    print(f"  {hour}: {count:>6} 个事件 {bar}")

# 找出活动异常激增的小时
avg = total / max(len(events_by_hour), 1)
print(f"\n=== 异常活动小时(>{avg*3:.0f} 个事件)===")
for hour in sorted(events_by_hour.keys()):
    if len(events_by_hour[hour]) > avg * 3:
        print(f"  {hour}: {len(events_by_hour[hour])} 个事件(激增)")
PYEOF

关键概念

概念描述
超级时间线(Super-timeline)整合多个来源所有制品时间戳的统一时间顺序视图
MACB 时间戳修改(Modified)、访问(Accessed)、更改(Changed,元数据)、创建(Born)—— 四种关键文件时间戳类型
Plaso 存储文件基于 SQLite 的中间格式,存储导出前的解析事件
L2T CSVLog2timeline CSV 格式,具有标准化的时间线事件列
解析器(Parser)Plaso 模块,从特定制品类型中提取时间戳(如 winevtx、prefetch)
PsortPlaso 排序和过滤工具,用于后处理存储文件
TimesketchGoogle 开源协作式时间线分析平台
轴心点(Pivot points)已知时间戳(如恶意软件执行)用于聚焦调查范围

工具与系统

工具用途
log2timeline(Plaso)主要时间线生成引擎,解析 100+ 种制品类型
psortPlaso 输出过滤、排序和导出工具
Timesketch基于 Web 的协作取证时间线分析平台
Timeline ExplorerEric Zimmerman 的 Windows GUI,用于 CSV 时间线分析
KAPE自动化分类收集,为 Plaso 处理提供输入
mactime(TSK)基于 Sleuth Kit bodyfile 的简单时间线生成
Excel/Sheets对小型过滤数据集进行手动时间线审查
Elastic/KibanaJSONL 时间线数据的替代可视化平台

常见场景

场景 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
Skills enregistrées