關機是最好的狀態: 離線掛載繞過 rootkit,然後把證據寄出去
在原機上算不出雜湊的檔案,離線掛到乾淨主機全部現形,還多挖出第二種幣。接著是證據包、保管鏈,以及四封真的有回音的檢舉信。
- 執行期 rootkit 只在原機生效。EBS snapshot → 新 volume → 唯讀掛到乾淨機,四個惡意 binary 的 SHA256 全部到手。
- 離線才看到 ld.so.preload 指向 /usr/local/lib/sshdd.so,以及第二支偽裝成 bash 的 Go 礦工在挖 Ravencoin。
- 四封檢舉信寄給 OVH、Hetzner、SupportXMR、C3Pool:礦池 denylist 了攻擊者錢包,機房受理 abuse ticket。
本篇目錄
三類證據,三種會消失的方式
| 類型 | 本案範例 | 保全方法 | 一旦錯過 |
|---|---|---|---|
| 揮發性(記憶體/連線) | 錢包、pass C4、活體 mining.login | 發現當下在活體狀態採:/proc/PID/mem dump + tcpdump | 關機即永久消失 |
| 服務端(礦池記帳) | hashes、shares、payments、txnHash | 在攻擊者礦池,與受害機無關:curl 存原始 JSON + SHA256 + UTC 時間 | 攻擊者可能停 worker,但已付紀錄多留存 |
| 靜態(磁碟 binary/log) | /var/log/log、nginx log、/etc/passwd | EBS snapshot → 離線唯讀掛載到乾淨機再讀 | 在原機讀=假象;terminate=永久消失 |
直覺會想「趕快關機止血」或「重開機看看」,但對取證而言,stopped 才是理想狀態:磁碟一致、礦工沒在跑。反之重開機會做兩件壞事:@reboot 讓礦工復活繼續替攻擊者挖;洗掉記憶體與連線等揮發證據。正確順序是:發現當下先採活體 → 之後讓它保持 stopped → 靠 snapshot 做靜態分析。
離線繞過 rootkit
本案的 ld.so.preload 是執行期 rootkit:在原機上任何工具讀被保護檔都會 segfault,連 sha256sum 都算不出來。解法是把磁碟搬到不會載入那個 preload 的乾淨機當資料碟唯讀讀取。
# EBS snapshot → 新 volume → attach 到乾淨機 /dev/xvdf,再: $ sudo mount -o ro,noexec,nodev /dev/xvdf1 /mnt/evid $ sudo sha256sum /mnt/evid/var/log/log /mnt/evid/usr/bin/log # ← 這次算得出來 $ sudo cat /mnt/evid/etc/ld.so.preload # ← 看到 rootkit 路徑 $ sudo zcat /mnt/evid/var/log/nginx/*access.log* | grep -i py_exec # ← 找入侵向量 $ sudo umount /mnt/evid # binary 雜湊可上 VirusTotal 關聯同源活動;原碟一律不寫入。
本案實測:離線一掛,rootkit 全現形
166b2551b810e2747d68a47a8431fb1dab24ed54cef47eb9d3a53c46e4291896 /var/log/log # XMRig 礦工 9.4MB 75711c01…1ef6b88 /usr/bin/log # rootkit helper / launcher acb2e78d…9207e3c /usr/local/lib/sshdd.so # ← LD_PRELOAD rootkit 本體(hook readdir 藏檔) e71cffd0ef65adef9d73cc1c5f83ed7d8af1d2c9fad48018c568bb5e08a888df /var/tmp/bash # ← 第二礦工(Go,exec -a bash 偽裝)
這次外洩了什麼
離線掛載多挖出一條收款管道。把兩種幣的收款識別、以及主機端被拿走的登入能力並排,才看得出這次入侵的完整形狀。
| 服務 | 憑證類型 | 用途 | 存在形式 | 放在哪 | 權限範圍 | 狀態 |
|---|---|---|---|---|---|---|
| 攻擊端:kawpow 礦池(第二礦工) | Ravencoin 收款錢包位址+worker1/worker2 | 第二條變現管道,與門羅幣那條互為備援 | 編進 Go 礦工 binary 的設定字串,原機被 rootkit 隱藏 | 離線掛載才看得到的 /var/tmp 下偽裝檔 | 收益金額無公開 API 可查 | 已向該礦池所在機房寄出 abuse 檢舉 |
| 攻擊端:門羅幣礦池帳戶 | XMR 錢包位址+活動代號 | 收取主要的挖礦收益 | 礦工設定 JSON 的 user/pass 欄(見取證篇) | 行程記憶體與 Stratum 登入封包 | 全活動累積約 22.19 XMR | SupportXMR 已 denylist;C3Pool 補件中 |
| 受害主機(Linux 本機帳號) | 攻擊者自建的可登入帳號與免密碼 sudo | rootkit 之外的第二條回來路徑 | /etc/passwd 條目+明文 sudoers 規則,離線掛載可完整讀出 | 受害主機磁碟,已隨 snapshot 封存為證物 | 等同 root | 主機保持 stopped 待重建;帳號未在原機刪除以保全證據 |
| 受害主機(rootkit 載入設定) | 不是憑證,但同樣是攻擊者的持久化資產 | 隱藏檔案與行程,讓原機上的一切檢視結果失真 | ld.so.preload 內的一行函式庫路徑,指向 /usr/local/lib 下的 .so | 原機讀取會 segfault,離線掛載才讀得到 | 影響所有動態連結的程式 | SHA256 已固定並列入證物清單 |
| 檢舉信中揭露的憑證 | 一律遮蔽 | 對外舉發時只提供可驗證的識別,不外流任何有效憑證 | 錢包只給前後數碼、雜湊給完整值、密碼雜湊一律不附 | 寄給礦池與機房的檢舉信與補件 | — | 補件時不能提供的項目明確標示為無法提供 |
完整性與監管鏈
- 雜湊固定:每個原始證物算 SHA256(
SHA256SUMS.txt),記 UTC 擷取時間(date -u)。日後可證明「沒被改過」。 - 唯讀掛載:一律
ro,noexec,nodev,分析都在 snapshot 複製出的 volume 上做,原始 snapshot 當證物封存,絕不寫回原碟。分析用 volume 用畢即刪。 - 可獨立重驗:礦池 JSON 這類服務端證據,第三方可自行重跑 API 比對,證據力最強。截圖不能驗完整性,務必存原始資料。
- 權限用畢即收:鑑識用的 IAM 權限在盤點完成後立即收回。
- 重開機:揮發證據全失,礦工復活繼續挖。
- 在原機掃毒/砍檔:rootkit 下看到的一切不可信,還會破壞時間戳。
- 沒先 snapshot 就 terminate:磁碟證據永久消失。
- 只截圖、不存原始資料:截圖無法驗完整性。
- 寫回或修改原碟:監管鏈斷裂,證據失效。
整理成 Incident Evidence Package
給執法或檢方看的不是一句「伺服器疑似被駭」,而是一份結構化的文件:
事件摘要 → 時間軸(每筆標可證明/推論)→ IOC → 證物清單(附 SHA256)→ 三層舉證 → 損害量化 → 缺口 → 後續動作。
本案證據包內容:活體記憶體字串與 pcap 節錄、兩個礦池的 API 原始 JSON 與 40 筆撥款紀錄、EBS snapshot、離線算出的 4 個 binary 雜湊、叢集盤點結果、SHA256SUMS.txt。
舉發:四封信,兩個回音
私人查不到攻擊者本人,身分揭露須檢警憑證據包向機房與交易所發傳票。但礦池與機房可以直接處理「基礎設施」:
| 對象 | 管道 | 狀態 | |---|---|---| | SupportXMR(礦池) | support 信箱 | ✓ 回覆「this address has been denylisted」 | | OVH(141.94.96.71 所在機房) | abuse 表單 | ✓ 已受理,開立 abuse ticket | | C3Pool(礦池) | support 信箱 | ✓ 已提交;對方回信索取伺服器資訊與證據,已補件 | | Hetzner(wixerzhongboost.eu 所在機房) | abuse 信箱 | ✓ 已寄 | | TWCERT/CC · 165 | 通報/刑法第 358~360 條 | 待提交 |
一封有效的檢舉信長這樣(去識別化):
Subject: [Abuse] Cryptojacking mining proxy at 141.94.96.71 (Monero) - INC-xxxx
Reporting organization : <受害方/資產擁有者>
Incident ref : INC-xxxx
Victim host : <雲端>, <區域>
Compromise window : 2025-09-24 through 2026-09-15 (UTC+8)
Nature : Unauthorized root access; XMRig cryptominer + LD_PRELOAD rootkit + backdoor account.
The malware (XMRig 6.22.2) maintained an ESTABLISHED connection to your IP as its
primary mining pool / proxy:
Pool/Proxy IP : 141.94.96.71 (ports 3333, 443, 5555, 7777)
Protocol : Stratum (rx/0 / RandomX, Monero)
Attacker XMR wallet (login): 47qQHF…CgHe
Worker/pass : C4
Evidence (captured 2026-09-15):
- Live process memory dump AND tcpdump of the Stratum "login" containing the wallet above.
- Malware SHA256: /var/log/log (XMRig) 166b2551…4291896
Request: Please investigate and take down the mining proxy hosted at 141.94.96.71.
Full evidence package (pcap extract, memory strings, SHA256SUMS) available on request.
C3Pool 回信要求補充「伺服器資訊、擁有權證明、取證方式、雜湊、時間戳」。補件時把不能提供的項目明確標 [NOT AVAILABLE],憑證與密碼雜湊一律遮蔽,附上 SHA256SUMS.txt。對方要的是可驗證,不是可怕。
- 主池自架在 OVH,備援放公開礦池;被封一個還有三個。
- 第二礦工挖不同的幣、連不同機房,就算門羅幣那條被切了,Ravencoin 還在跑。
- 他不怕你發現,怕的是你把錢包交給礦池。denylist 之後那個錢包在該池的待付餘額就領不到了。
證據保全這件事花了多少錢
先講結論:保全證據的雲端費用是零頭,貴的是人力。所以「沒做保全」從來不是預算問題,是流程問題。
| 項目 | 用量 | 單價 | 期間 | US$ | NT$ | 舉證 |
|---|---|---|---|---|---|---|
| EBS snapshot(證物封存) 估:文中未載明磁碟容量,以常見的 30 GB 根磁碟、封存一年計 | 30 GB × 12 個月 | US$0.05/GB·月(standard tier) | 2026-09-15 起封存 | 18.00 | 576 | snapshot 已建立並列入證物清單;容量與保存期為假設值,實際金額查 Cost Explorer 的 EBS:SnapshotUsage |
| 分析用 volume(由 snapshot 還原,用畢即刪) 估:唯讀掛載分析完就刪,所以幾乎不計費 | 30 GB gp3 × 約 4 小時 | US$0.096/GB·月,按小時攤提 | 2026-09-15 | 0.02 | 1 | 牌價按小時攤提推算,無帳單明細 |
| 乾淨分析主機機時 估:借用既有主機,實際為邊際成本 | t3.small × 約 4 小時 | US$0.0272/小時 | 2026-09-15 | 0.11 | 4 | 以公開牌價推算;未匯出 Cost Explorer 明細 |
| 證據包傳出(evidence.tgz) 估:證據包很小,傳輸不構成成本 | 約 200 MB | 每月首 100 GB 免費 | 2026-09-16 | 0.00 | 0 | 以壓縮包內容推估大小;未查帳單 |
| 四個惡意檔的 SHA256 與公開情資查詢 整份證據包裡證據力最高的東西,成本是零 | 4 個雜湊 · 數次查詢 | sha256sum 與 VirusTotal 公開查詢免費 | 2026-09-15 | 0.00 | 0 | SHA256SUMS.txt 內四筆雜湊;VirusTotal 公開查詢無需付費 |
| 離線鑑識人力 估:雲端成本 US$0.13,人力 430。貴的從來不是機器 | 約 0.5 人日:snapshot、掛載、算雜湊、翻 log | 顧問日費 NT$20,000~35,000(估),取中間值 NT$27,500 | 2026-09-15 | 429.69 | 13,750 | 處置時間軸推估,無正式工時單;日費為假設值 |
| 證據包整理與四封檢舉信 估:C3Pool 要求補件的往返也算在內 | 約 0.5 人日:監管鏈、補件、abuse 表單 | 顧問日費 NT$27,500(估) | 2026-09-15 → 09-16 | 429.69 | 13,750 | 四封信與補件紀錄;日費為假設值 |
| 攻擊者因 denylist 被凍住的待付餘額 估:一封檢舉信對他造成的直接金錢損失不到 4 美元,真正的成本是他得換錢包重來 | 0.00757 XMR(amtDue 7,567,687,709 原子單位) | ≈ US$509/XMR | 至 2026-09-15 | 3.86 | 124 | amtDue 數值可證明(礦池 API 原始 JSON)+礦池回信確認已 denylist;待付餘額是否沒收未經書面確認 |
| 第二礦工(Ravencoin)替他賺了多少 雙幣雙管道,只算得出其中一條 | — | — | — | — | — | 缺口:該 kawpow 礦池沒有可查的公開 miner API,收款錢包的收益無法計入 |
| 原機重建與憑證輪替 本案全程唯讀,尚未執行重建 | — | — | — | — | — | 缺口:重建工時與並行風險的成本待處置完成後才算得出來 |
| 合計(僅可證明列) | 0.00 | 0 | ||||
可證明的金額:US$0.00。 這張表沒有一列要花錢的是 proven,因為最關鍵的那幾筆都還是牌價推估;但結構已經很清楚:雲端保全成本 US$0.13,人力成本 US$859。 一個 snapshot 的錢不到一杯咖啡,卻是「有證據」與「只有一句伺服器疑似被駭」之間的全部差距。
重點學習
- 01stopped 才是理想狀態第一反應想重開機或直接 terminate,正好是最常見的證據破壞方式;順序錯了,後面全是補救。
- 02離線唯讀掛載(ro,noexec,nodev)rootkit 是執行期的,換一台不載入它的機器讀,它就完全失效——這是全篇的核心手法。
- 03EBS snapshot → 新 volume原碟一律不動、分析在複製品上做,這個工作流是監管鏈能不能成立的前提。
- 04SHA256SUMS.txt證物固定的最小單位;沒有雜湊,日後無法證明「這份東西沒被改過」。
- 05監管鏈(chain of custody)檢方看的不是你抓到什麼,是你怎麼抓到、有沒有斷鏈;斷了就等於沒有。
- 06三類證據(揮發/服務端/靜態)每一類有各自會消失的方式與採集順序,弄混就會用錯方法採錯時機。
- 07exec -a 偽裝行程名第二支礦工偽裝成 bash,說明「看行程名稱抓惡意程式」為什麼完全不可靠。
- 08kawpow/Ravencoin同一次入侵佈了兩種幣、兩個機房;只清掉你先發現的那一條,另一條還在跑。
- 09礦池 denylist 與機房 abuse私人查不到人,但可以讓他的基礎設施變貴;一封信就有結果,這是最高投報率的動作。
- 10Incident Evidence Package把散落的證據變成能交出去的東西:摘要、時間軸、IOC、證物清單、三層舉證、缺口。
今天就可以來試試
全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。
- 看你手上有沒有可以當證物的快照。
aws ec2 describe-snapshots --owner-ids self --query 'Snapshots[].[StartTime,VolumeSize,Description]' --output table看到什麼代表什麼:如果一台主機今天出事、你手上沒有任何近期快照,代表你的第一個動作只會是破壞證據。 - 確認磁碟會不會跟著執行個體一起消失。
aws ec2 describe-instances --query 'Reservations[].Instances[].BlockDeviceMappings[].Ebs.DeleteOnTermination' --output text看到什麼代表什麼:出現 true,代表有人按下 terminate 的那一秒,磁碟證據同時永久消失,事後誰也救不回來。 - 確認你認得出唯讀掛載長什麼樣。
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS | head看到什麼代表什麼:分析證物時若選項裡看不到 ro,就是掛錯了;那一刻起原碟已經被寫入,監管鏈斷裂。 - 把證物固定的最小動作練一次。
sha256sum /bin/ls && date -u看到什麼代表什麼:這兩行就是「雜湊+UTC 時間」;日後要證明證物沒被改過,靠的就是它們,截圖不行。 - 檢查有沒有多區域 CloudTrail,否則連證據被刪都不會知道。
aws cloudtrail describe-trails --query 'trailList[].[Name,IsMultiRegionTrail,S3BucketName]' --output table看到什麼代表什麼:IsMultiRegionTrail 不是 true、或沒有 S3 儲存桶,代表快照被誰刪掉、何時刪的,事後查不到。 - 拿本案的 XMRig 雜湊去 VirusTotal 公開查詢(唯讀,不上傳自家檔案)。看到什麼代表什麼:有其他提交者,代表這是大量散布的通用工具、你是被掃到的其中一台;查無結果反而要警覺是客製化樣本。
每篇新文章一封:三點摘要、攻擊者/防守者視角、今天能做的一件事。或先 加入會員 記錄你完成的任務。