build IR workflow note

2025-12-16

最近在上 Hackthebox 的 CDSA,上到 windows 取證的章節的時候,深覺要收的東西好多好雜,於是就在想有沒有什麼工具是可以自動幫我收我已知跟我未知的 artifacts
然後又能在一個平台上統一查詢跟看的

首先第一個當然就是收集證據的 script
這邊列出我考量的幾個點

  • 有 GUI
  • 有簽章
  • 背後有知名組織或公司
  • 免費

※更,實際部屬後發現 AI 功能無法幫助人員判斷,因為檔案的 metadata 都能被修改,如果AI判讀錯誤的 metadata 給出錯誤的反饋反而會造成誤導與困擾,因此思考後捨棄 AI 功能,只是寫得當下有考量進去就還是列出來了

這邊列出三套工具的優劣提供參考

工具 平台限制 GUI 程式簽章 客製化能力 授權 / 成本 主要優點 主要缺點 適合情境
KAPE 僅 Windows 高(模組化 Artifact / Target) 公司內部免費 成熟穩定、模組化彈性高、有 SANS 背書、取證流程標準化 僅支援 Windows、非完全開源、偏企業導向 企業 IR、DFIR 團隊、SOP 化的事件回應
CDIR 僅 Windows 低(固定撈取項目) 免費(GPL 2.0) 輕量、簡單、可信任簽章、適合快速蒐證 客製化能力不足、無 GUI、平台受限 快速初步蒐證、既定取證清單環境
CyLR Windows / Linux / macOS 高(自訂撈取檔案) 免費(GPL 3.0) 跨平台、彈性高、適合進階使用者與研究用途 無簽章、專案維護風險、信任度較低 跨平台事件、研究測試、客製化取證需求

接著尋找分析平台,可以讓我做綜觀的事件分析
這邊列出考量要點

  • 免費
  • 介面直觀
  • 支援 SSO
  • 架構可擴充
  • 可匯入 Sigma 等規則
  • 有 AI 輔助功能

下面是選擇的三款事件分析平台

  • ELK
  • Timesketch
  • Velociraptor
平台 背景 / 定位 主要特性 LLM / AI 支援 備註 / 相關連結
ELK Stack Elastic 生態系,成熟的搜尋與分析平台 • 支援 SSO
• Search pattern 成熟
• 學習成本相對低
支援 LLM Elastic LLM Connector 文件
Timesketch Google 開發,專注 DFIR 時間軸分析 • 專注時間軸分析
• 介面簡潔
• 適合事件重建
支援 LLM Timesketch LLM 功能說明
Velociraptor Rapid7 支援的開源 DFIR 專案 • DFIR 開源專案
• 功能強但介面不友善
• 偏工程導向
非原生(可串接 Tool) Rapid7 收購說明
Velociraptor mcp tool

當我用 KAPE 撈完 artifacts,準備匯入 Timesketch 的時候發現了一個問題─怎麼匯入?
按照官方的文件
https://timesketch.org/guides/user/import-from-json-csv/
不管是 json 或是 csv 都需轉成他指定的格式才能匯入,最省事的辦法是轉成 plaso檔案
https://github.com/log2timeline/plaso

但遇到另一個問題─我如果把全部的 artifacts 轉成單一 plaso 匯入 timesketch 會太久
因此透過 GPT 幫我寫了一跳能自動爬取資料夾,把單一資料夾內的 artifacts 轉成一個 plaso
這樣可以分散式匯入加快時間

流程是這樣

  1. KAPE 先做一次蒐集
  2. 用以下腳本針對 KAPE 產出的資料夾再跑一次 (這邊用 KapeTriage 為範例),需要更改的地方你可以搜尋 please change it,如果你用 CDIR 的話就沒有這個問題,他當幫忙分類到對應資料夾了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@echo off
setlocal enabledelayedexpansion

REM Source path, please change it
set Tsource=G:\C\

REM Numeric timestamp using WMIC
for /f %%i in ('wmic os get LocalDateTime ^| find "."') do set ldt=%%i
set timestamp=!ldt:~0,14!

REM Output folder relative to current directory
set OutputBase=%CD%\output_!timestamp!
mkdir "!OutputBase!"

REM Log file
set LogFile=!OutputBase!\kape_log.txt
echo KAPE collection started: %date% %time% > "!LogFile!"

REM Kape Targets profile, please change it
set Targets=Antivirus CloudStorage_Metadata EventLogs EvidenceOfExecution FileSystem LNKFilesAndJumpLists Notepad PowerShellConsole RecycleBin_InfoFiles RegistryHives RemoteAccess ScheduledTasks SRUM SUM WER WBEM WebBrowsers WindowsTimeline

REM Loop through targets
for %%T in (%Targets%) do (
set Tdest=!OutputBase!\%%T
mkdir "!Tdest!"

echo ------------------------------------ >> "!LogFile!"
echo Collecting Target: %%T -> !Tdest! >> "!LogFile!"
echo ------------------------------------ >> "!LogFile!"

kape.exe --tsource !Tsource! --target %%T --tdest "!Tdest!" --flatten --tflush >> "!LogFile!" 2>&1

echo Completed Target: %%T - %date% %time% >> "!LogFile!"
)

echo ------------------------------ >> "!LogFile!"
echo KAPE collection finished - %date% %time% >> "!LogFile!"

pause

  1. 然後再用下面的 sh 檔案呼叫 plaso 將一個個的資料夾內的 artifacts 轉成 plaso 檔,記得 <HOST_INPUT> <HOST_OUTPUT> 都要是絕對路徑
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #!/bin/bash

    # === Usage ===
    # ./run_plaso.sh <host_input_folder> <host_output_folder>
    #
    # Example:
    # ./run_plaso.sh /home/user/IR/ /tmp/IR/plaso
    #

    # === Parse arguments ===
    if [ "$#" -ne 2 ]; then
    echo "❌ 錯誤:缺少參數"
    echo "使用方式:"
    echo " $0 <HOST_INPUT> <HOST_OUTPUT>"
    echo ""
    echo "例子:"
    echo " $0 /home/user/IR/ /tmp/IR/plaso"
    exit 1
    fi

    HOST_INPUT="$1"
    HOST_OUTPUT="$2"

    # plaso version
    IMG="log2timeline/plaso:20250918"

    # === Validate Input Path ===
    if [ ! -d "$HOST_INPUT" ]; then
    echo "❌ 錯誤:輸入資料夾不存在:$HOST_INPUT"
    exit 1
    fi

    mkdir -p "$HOST_OUTPUT"

    echo "📁 Host Input: $HOST_INPUT"
    echo "📁 Host Output: $HOST_OUTPUT"
    echo "🐳 Docker Image: $IMG"
    echo ""

    # === Process Each Subfolder Inside Input ===
    for category in "$HOST_INPUT"/*; do
    [ -d "$category" ] || continue

    folder_name=$(basename "$category")
    echo "➡️ 產生 $folder_name.plaso (來源: $category)"

    docker run --rm \
    -v "$HOST_INPUT":/input \
    -v "$HOST_OUTPUT":/output \
    "$IMG" \
    log2timeline.py \
    --storage_file "/output/${folder_name}.plaso" \
    "/input/${folder_name}"

    echo "✔ 完成:$folder_name.plaso"
    echo ""
    done

    echo

因為我 plaso 都用 docker 跑,所以才會用這種方式

timesketch 比較普通,照官方的方式 build
https://timesketch.org/guides/admin/install/

接著可以透過 CLI 達成自動匯入&自動上色的效果
https://timesketch.org/guides/user/cli-client/