那串 95 碼只活幾分鐘,
關機就永遠問不到了
- 一句話結論
- 錢包位址只以字串常駐在礦工的行程記憶體,關機即永久消失。發現當下就要在活體狀態採集。
- 他要的是什麼
- 他用一台自架的 XMRig-Proxy 聚合上百台肉雞的算力,再以同一個錢包向公開礦池領獎。你的機器只貢獻 1~2 KH/s,是他的百分之一。
- 你今天做一件事
- 拿到錢包不是為了追金流(門羅幣追不到),是拿到一組 IOC:用錢包與 worker 命名規則掃其他主機,判斷同源入侵範圍。 直接去做 →
- 哪些能信
- 5 可證明1 推論1 缺口 每個主張都標了等級,缺口是誠實寫出來的。
- 破口速查
- 受害端一律去識別化;寫「未公開」代表公開資料查不到。
- 伺服器服務商
- AWS EC2(同一台受害排程機;採集時刻意維持 running,關機證據就消失)
- 網路服務商
- 礦池連線走 3333/5555/9443/13333 等埠,主礦池主機在 OVH(法國);受害端出向流量未管制
- 漏洞出現的地方
- 主機層:錢包位址只在礦工活著時以字串留在行程記憶體與 Stratum 登入封包裡,關機或終止即永久消失
- 馬上自我檢測
aws ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType,LaunchTime]' --output table- 漏洞修補方式
- 流程面:發現當下先採活體(記憶體字串、pcap)再談隔離,不先關機;事前備妥 tcpdump/strings/gdb/sha256sum;出向管制與礦池埠告警;損失金額以自家 Cost Explorer 機時為準,不引用礦池總額
有 15 分鐘再看:其餘 2 點
- 記憶體 dump 與逼重連抓到的 Stratum login 撈到完全一致的錢包與 worker 代號 C4,礦池同時正在派工。
- SupportXMR 與 C3Pool 的公開 miner API 顯示已撥款合計約 22.19 XMR、40 筆鏈上交易,但那是整個 C4 活動、上百台受害機的總額,不是本機損失。
錢包位址只以字串留在行程記憶體與登入封包裡,關機就消失。這篇講怎麼趁礦工還活著把它撈出來,再用礦池公開 API 把「疑似挖礦」變成「確實獲利」。
本篇目錄
一個 95 碼的字串,只在那幾分鐘裡看得到
確認那台排程機正在挖礦之後(過程見偵測篇),下一個問題是:誰在收錢?答案是一個 95 碼的字串,而它不存在於磁碟上的任何一個檔案裡——它只在礦工活著的時候,以字串的形式躺在行程記憶體與登入封包中。關機、terminate、甚至只是 kill 掉那個行程,它就永遠消失。
2026-09-15 這一天,那個字串從兩個互相獨立的地方被撈了出來:一邊是 /proc/PID/mem 的記憶體 dump,一邊是主動逼礦工重連後抓到的明文 Stratum 登入封包。兩邊完全一致,而且礦池當下正在派工。拿這個錢包去查兩個公開礦池的 miner API,結論就從「這台有挖礦行為」升級成「受害主機提供算力,對應帳戶因此領到了錢」——這是能不能送出去的分水嶺。
但升級的同時也要立刻踩煞車。礦池上顯示的金額是他整個活動、上百台受害機加總的結果,不是這一台的損失。這篇要講的除了採集順序,還有一條寫報告時最容易犯錯的界線:他賺了多少,查礦池;我們賠了多少,查帳單。兩本帳不能互相代替。
這一篇的「環境」不是架構圖,是一台還在 running 的主機
同一台受害排程機,採集時刻意維持在 running:礦工在跑、連線還在、記憶體還沒清空。這個狀態不是規劃來的——主機在處置過程中曾被重開機一次,@reboot 把礦工拉了起來,它又自己連回礦池,證據因此回來了一次。這是運氣,不是流程,下一次不該指望它。
直覺會想「趕快關機止血」或「重開機看看」,但錢包位址是礦工登入礦池時送出的參數,平時只以字串常駐在行程記憶體裡。主機一旦關機或終止,記憶體清空、連線中斷,這條證據就永久消失。取證的第一原則因此很反直覺:發現當下先在活體狀態採集,不要先關機。
網路面幫了我們一把:礦工以明文 Stratum 連 141.94.96.71 的 3333 埠,另有三個備援端點涵蓋 5555、9443、13333,而受害端出向流量完全沒有管制——所以他送得出去,我們也抓得到。工具面則全部是系統本來就有的東西:ss、dd、strings、tcpdump、curl,採集全程唯讀,沒有在原機寫入任何檔案。這份清單值得事前確認,因為缺哪一樣,事發當下就採不到對應的那一種證據。
這一篇處理的憑證也比較特別:前三列不是我們外洩的,是攻擊端用來領錢的識別。它一樣有服務、用途、存在形式,只是擁有者是他。
| 服務 | 憑證類型 | 用途 | 存在形式 | 放在哪 | 權限範圍 | 狀態 |
|---|---|---|---|---|---|---|
| 攻擊端:SupportXMR/C3Pool 礦池帳戶 | 門羅幣錢包位址(即礦池的帳戶識別,無需註冊) | 收取偷來的算力換得的獎勵 | 95 碼 Base58 字串,放在 Stratum login 的 login 參數 | 礦工行程記憶體;登入封包明文;礦池後台記帳 | 全活動累積約 22.19 XMR 的提領權 | 已提交檢舉,SupportXMR 回覆已 denylist |
| 攻擊端:活動代號(worker/pass) | 礦池 worker 識別字串 | 標記這批肉雞屬於哪一波活動,方便他自己對帳 | Stratum login 的 pass 參數,本案為兩碼字串 | 礦工設定 JSON 與登入封包 | 橫跨上百台受害機共用同一個代號 | 作為 IOC 用於橫向盤點其他主機 |
| 攻擊端:自架的 XMRig-Proxy 聚合器 | 礦池端點位址(無帳密,靠錢包識別) | 先聚合上百台肉雞的算力,再對外以單一 worker 領獎 | 礦工設定中的 pool URL 與備援清單(四個端點) | 礦工設定與 ESTABLISHED 連線 | 這一段的收益不經公開礦池,無法計入 | 已向機房提交 abuse 檢舉 |
| 受害主機(本機憑證) | 無新增外洩 | 這台沒有掛雲端角色,也沒有存放雲端憑證 | 格式上不存在可用的雲端憑證檔,但腳本內寫死的 AI 服務 API key 仍須視為已外洩 | 受害主機 | 橫向擴散到雲端帳號的路徑被擋住 | AI 服務 key 必須視為已外洩並撤銷;是否已撤銷未確認。主機保持 stopped |
同一份清單放在前一篇是「我們漏掉什麼」,放在這裡是「他靠什麼收錢」。角色互換,格式一樣。
同一天之內,證據從揮發性走到服務端
這一天的每一格都發生在 2026-09-15,所以順序比時刻重要:前三格只要錯一步,後面全部拿不到。
- 2026-09-15主機重開機,@reboot 把礦工拉起並重新連上礦池重開後 ss 仍見 ESTABLISHED 至 141.94.96.71:3333。
- 2026-09-15由礦池連線反查礦工 PID,確認礦工仍在跑ss -tnp 對 3333 埠比對;rootkit 攔不到連線表。
- 2026-09-15dump 行程記憶體,抽出錢包字串與 pass C4/proc/PID/mem 逐段讀出後 strings 過濾。
- 2026-09-15逼礦工重連,擷取明文 Stratum login,取得一致的錢包與 XMRig 6.22.2tcpdump 先開,再切斷既有連線。
- 2026-09-15查兩個公開礦池 miner API,取得已付金額與 40 筆撥款紀錄curl 存原始 JSON。
- 2026-09-15以同一組 IOC 盤點同叢集其餘 8 台,7 台乾淨、1 台無法連線逐台看對外 ESTABLISHED 與 load。
- 2026-09-15 之後主機保持 stopped,分析改走離線磁碟詳見 -03 篇。
這七格剛好是一條由快到慢的斜坡:記憶體以秒計、連線以分鐘計、磁碟撐到 terminate 為止,而礦池那本帳反而留得最久——它在第三方手上,我們刪不掉,他也改不掉。
同一條攻擊鏈,這次看的是「每一格還留下什麼可採的東西」
七個階段的事實與偵測篇相同,換個看法讀:把每一格的 signal 欄當成「這裡還採得到什麼」。
值得注意的是第六格:本案證據最集中的地方,恰好是攻擊者最不在意的地方。他不加密 Stratum,因為對他來說被看見也無所謂——除非你把看見的東西寄給礦池。
記憶體、封包、礦池,三個獨立來源對上同一個錢包
礦工要領獎勵,就一定得在登入礦池時報上自己的錢包位址與 worker 名稱。順著那條連往 3333 埠的連線往回追,就能挖出攻擊者的收款帳號。可用的途徑有四條,可靠度差很多。
| 途徑 | 做法 | 可靠度 | 限制 |
|---|---|---|---|
| ① Dump 礦工記憶體 | 由 /proc/PID/mem 逐段讀出、抽字串、比對錢包格式 | 最高 | 礦工必須在跑 |
| ② 抓 Stratum 登入封包 | tcpdump 監聽,主動切斷連線逼礦工重連,擷取明文 login | 高 | 礦池若走 TLS 則不可行 |
| ③ 挖磁碟上的設定檔 | 掛載 snapshot 找 config.json 的 user 欄 | 中 | 設定可能編進 binary 或被 rootkit 藏起 |
| ④ 礦池 IP 威脅情資 | 反查礦池 IP 的被通報紀錄 | 定性用 | 查不到個別錢包 |
本案走的是前兩條。第一條的起點不是 ps——在 rootkit 底下它不可信——而是從礦池連線反查 PID:
# 先由礦池連線反查礦工 PID(ss 較不易被 rootkit 攔截)
$ P=$(sudo ss -tnp | grep :3333 | grep -oE 'pid=[0-9]+' | cut -d= -f2)
# 逐段 dump 可讀記憶體 → 抽字串 → 比對礦池/錢包特徵
$ sudo dd if=/proc/$P/mem ... | strings -n5 | grep -aiE \
"stratum|xmrig|randomx|pool\.|rig_id|\"user\"|4[0-9AB][0-9A-Za-z]{62,105}"
# 門羅幣主網位址 = 95 碼 Base58,以 4 開頭(整合式以 8 開頭)。第二條需要一個違反直覺的動作:主動切斷他的連線。礦工不會抗議,它會立刻重連,而重連就得重送一次登入。
$ sudo tcpdump -i any -n -A 'tcp port 3333' -w /tmp/m.pcap & # 切斷礦工目前連線,xmrig 會立刻重連並重送登入 $ sudo ss -K dst 141.94.96.71 dport = 3333 $ sudo tcpdump -r /tmp/m.pcap -A | grep -iE 'login|authorize|user' # 典型 payload:method=login, params.login=<錢包>, params.pass=<worker>
兩條路徑同時採,撈到的是同一個字串:
// ① 礦工記憶體裡的 xmrig 設定 JSON
"user": "47qQHFXfGixiVEjwPNaVpQ8LJ6p8xNPHLjWKZC86us4WfhxacyXivPAGoThcgbwUaiAi4CjveFdsMLEYEUMhhrLA4nrCgHe",
"pass": "C4", "rig-id": null, "worker-id": null
// ② 逼重連後 tcpdump 抓到的 Stratum 登入封包(明文)
{"method":"login","params":{
"login":"47qQHFXfGixiVEjwPNaVpQ8LJ6...LA4nrCgHe",
"pass":"C4",
"agent":"XMRig/6.22.2 (Linux x86_64) libuv/1.49.2 gcc/7.5.0"}}
// 礦池回派 job → 證實正在挖(algo rx/0 = RandomX = Monero)
{"method":"job","params":{"algo":"rx/0","height":3762742, ...}}
整理成一張對照,後面的檢舉信與 IOC 盤點都從這裡取材:
| 項目 | 值 |
|---|---|
| 幣種/演算法 | Monero (XMR) · rx/0 RandomX |
| 礦工版本 | XMRig 6.22.2 |
| 攻擊者錢包 | 47qQHF…CgHe(完整值見 IOC 對照表) |
| Worker 代號(pass) | C4 |
| 主礦池 | 141.94.96.71 · :3333 / 443 / 5555 |
| 備援礦池 | mine.c3pool.com:13333 · pool.supportxmr.com:5555 · wixerzhongboost.eu:5555 · 77.221.157.206:6196 |
拿到錢包之後,不查區塊鏈,查礦池
門羅幣有隱私設計,區塊鏈瀏覽器查不到某個位址的餘額或入帳。但礦池會為每個錢包記帳:把錢包丟進礦池的公開 miner API,就能讀到算力、有效與無效 share、應付與已付金額,不需要帳號,也不需要付費。
$ curl https://www.supportxmr.com/api/miner/47qQHF…CgHe/stats
{"hash": 114019, # 目前算力 114 KH/s
"totalHashes": 21241747108287, # 累計 21.24 TH
"validShares":104642508,"invalidShares":409,
"amtPaid": 18487033321205, # 已付 18.487 XMR(原子單位 ÷ 1e12)
"amtDue": 7567687709}
$ curl https://api.c3pool.com/miner/47qQHF…CgHe/stats
{"hash": 33875,"lastShareAlgo":"rx/0",
"validShares":71699083,"invalidShares":51085,
"amtPaid": 3698865099345, # 已付 3.699 XMR
"txnCount": 684}
$ curl https://www.supportxmr.com/api/miner/47qQHF…CgHe/payments
[{"pt":"pplns","ts":1789341566,"amount":73332000000,
"txnHash":"ed38df2f8ac78ce99382a8af5cce2884f00ca01020043bb1f664d375ec7e3f1c"}, …]
# SupportXMR 25 筆 + C3Pool 15 筆 = 40 筆已完成付款,每筆帶鏈上 txnHash。兩個礦池回來的四個數字,決定了這份報告能寫到什麼程度:
三個容易寫錯的地方,先在這裡擋掉
第四個數字(148 KH/s)看起來只是旁註,其實是整篇最重要的一個煞車。
第四個來源:其他七台什麼都沒有
錢包拿到之後最有價值的用途不是追金流(門羅幣追不到),是當成 IOC 去掃別台。拿同一組識別——錢包、礦池 IP、/var/log/log、ld.so.preload、後門帳號、@reboot 排程——掃過同叢集其餘 8 台,判定依據是「主動外連礦池是挖礦的必要條件」。
| 主機 | 判定 | 依據 |
|---|---|---|
| 排程機(本案) | ● 已感染 | XMRig(worker C4)+ rootkit + 後門帳號 |
| 其餘 7 台 | ✓ 乾淨 | 無任何 IOC;其中一台高 CPU 為合法報表工作,外連只到 Google |
| 1 台 | — 無法連線 | No route to host,疑已關機,待確認 |
把這些材料排成一條線,就是完整的利益鏈:未授權存取(對外免驗證 RCE)→ 植入現成礦工、rootkit 與後門帳號 → 消耗受害者的 CPU、電力與雲端資源 → 執行 RandomX 運算提交 share 到自架代理,再 fallback 到公開礦池 → 以錢包加 worker 代號作為收益識別 → 累積並領取報酬。對照國際雲端挖礦判例的採證邏輯,這條線分成三層舉證:犯罪目的由記憶體與封包雙證支撐,最強;受害者實際損害要查自家帳單,權威值在 Cost Explorer;犯罪所得則是礦池的已付金額,引用時必須標明那是整個活動的總額。
為什麼證據差一點就沒了,原因不在技術
這一篇的根因追的不是「為什麼被入侵」(那在偵測篇),是「為什麼證據差一點就沒了」。
表面原因可以證明:錢包與 worker 代號只以字串存在礦工的行程記憶體與明文登入封包裡,關機或 terminate 即永久消失。技術原因同樣可證:礦池走明文協定、出向流量未管制,所以他送得出去、我們也抓得到——反過來說,如果他改走 TLS,封包這條路當場失效,只剩記憶體那條。
再往上一層就不是技術了,只能寫成推論:發現當下沒有既定的採證順序,主機先被重開機一次,揮發證據是靠攻擊者自己的 @reboot 才回來的,不是流程保住的。最上面那層同樣是推論:缺事件處置 SOP 與取證工具基線,也缺「損害量化以帳單機時為準」的舉證規範,所以我方損失到現在仍然停在推估——他的收益有第三方紀錄,我們的損失沒有。
線索不只在主機上,礦池那本帳一直是公開的
這一年裡,能發現它的機會不只在那台機器裡。
主機面的三條都指向同一個缺口:整年對境外 3333 埠的連線沒有 egress 管制也沒有流量紀錄;礦池埠從來沒有被告警過,而這是成本最接近零的一條規則——閒置主機連這些埠幾乎等同確診;行程建立與 sudo 使用沒有留下可查的紀錄,事後只能從程式碼與磁碟反推。
另外兩條更值得記住,因為它們不是技術問題。第一,帳單看起來完全正常:挖礦不吃頻寬,機時本來就每天照付,費用曲線一點都不會動——缺的不是帳單,是「帳單抓不到挖礦」這個認知。第二,礦池的公開 API 一直查得到這個活動,免費、免帳號,只是沒有人把自家 IOC 拿去對一次。
先採活體,再談隔離
這一天做對的關鍵只有一個:順序。
偵測階段並不新鮮,是前一篇五條線索的延續;差別在於確認之後沒有伸手去關機,而是先用 ss 反查礦工 PID,確認礦池連線仍是 ESTABLISHED、礦工仍在運算。接著在 running 狀態下 dump 行程記憶體抽出錢包,再開 tcpdump 並切斷既有連線逼礦工重送登入——這兩個動作合起來只花幾分鐘,卻決定了整案有沒有證據。取得錢包之後才讓主機保持 stopped,並以同一組 IOC 盤完同叢集 8 台。那次意外的重開機必須再說一次:它不是計畫的一部分。
清除這一格同樣刻意留白:沒有在原機清除任何東西,改採「讓他的基礎設施變貴」——錢包與礦池端點送交礦池與機房(見舉發篇),腳本內兩把 AI 服務 API key 視為已外洩並撤銷,是否已撤銷未確認。復原則沒有壓力,因為業務早已失效;唯一還欠的是損害量化,那份 Cost Explorer 匯出至今尚未完成。
做對的都跟順序有關,做錯的也是
做對的五件事,每一件都是「忍住沒做某事」的結果:在拿到錢包之前沒有關機、沒有 terminate;記憶體與封包兩條獨立路徑同時採,兩邊對上才下結論;礦池 API 存的是原始 JSON 而不是截圖,第三方可以自己重跑;克制住沒有把礦池總額寫成本機損失——這是全案最重要的一次自我約束;當天就用同一組 IOC 盤完同叢集,把範圍畫出來。
做錯的也同樣關於順序與準備。過程中重開機了一次,揮發證據是靠攻擊者的 @reboot 才回來的;取證工具箱事前沒有清點,tcpdump、strings、gdb 在不在,是到現場才知道;沒有當場匯出機時,導致我方損失至今仍是推估;同叢集有 1 台無法連線,狀態至今未確認,範圍只能畫到那裡;第二支礦工的收益沒有可查的公開 API,那條變現管道完全算不出來。一句話總結:證據守住了,但守住的方式裡有一段是運氣。
讓下一次不必靠運氣
當天就能補的有三件:把本案 IOC(錢包、worker 代號、四個礦池端點、礦工的 agent 字串)加進盤點與偵測清單,檔名就叫 ioc-wallet-sweep-d3k.csv,下次掃叢集直接餵它;到 Cost Explorer 匯出那台過去 12 個月的機時與實付金額,把損失從推估變成可證明;以及最便宜的那一件——在動任何手腳之前,先確認可疑主機是不是還在 running,還在就先別關。
一個月內要補的是準備工作:把 tcpdump、strings、gdb、sha256sum 納入 AMI 基線事前預裝;寫一頁「發現挖礦的前 30 分鐘」SOP,順序是查狀態、記連線、採記憶體、抓封包、才隔離;對礦池埠與未知境外 egress 設告警;把礦池與威脅情資查詢納入標準調查流程,因為服務端證據免費,證據力卻最強。
這一季以後要處理的是制度:log 集中外送與流量紀錄,讓連線與行程都有第三方可比對的來源;導入執行期監控,補上行程建立與提權的稽核;訂一條損害量化規範——我方損失一律以帳單機時為準,礦池數字只用於描述犯罪所得;並定期演練活體取證,把順序練成反射動作。
最後一條規範不是形式主義。同一件事其實有兩本帳:礦池那本記著他領走多少,雲端帳單那本記著我們付了多少。把它們並排,才看得出這門生意的形狀。
| 項目 | 用量 | 單價 | 期間 | US$ | NT$ | 舉證 |
|---|---|---|---|---|---|---|
| 攻擊者已領取(SupportXMR) XMR 數量可證明;幣價換算為當日匯率(估) | 18.487 XMR · 25 筆撥款 | ≈ US$509/XMR | 至 2026-09-15 | 9418.39 | 301,388 | 礦池 miner API 的 amtPaid 原始 JSON,每筆撥款帶鏈上 txnHash,第三方可自行重跑比對 |
| 攻擊者已領取(C3Pool) 同上,幣價換算為估值 | 3.699 XMR · 15 筆撥款 | ≈ US$509/XMR | 至 2026-09-15 | 1884.49 | 60,304 | 礦池 miner API 的 amtPaid 原始 JSON 與 txnCount |
| 礦池 API 與威脅情資查詢 服務端證據最便宜,證據力卻最強 | 數十次 curl | 公開 API,免付費、免帳號 | 2026-09-15 | 0.00 | 0 | SupportXMR/C3Pool 公開 miner API 文件 |
| 攻擊者在自架 proxy 上的收益 22.19 XMR 是地板價,不是天花板 | — | — | — | — | — | 缺口:主要礦池為攻擊者自架的聚合器,收益不經公開礦池 API,永遠無法計入 |
| 本機實際貢獻給他的收益 估/推論:不可主張「從本台竊得 NT$36 萬」 | 1~2 KH/s ÷ 148 KH/s × 22.19 XMR ≈ 0.15 XMR(取下限) | ≈ US$509/XMR | 356 天 | 76.42 | 2,445 | 礦池只回一個 worker 代號,拿不到單機算力;以機型 RandomX 算力佔比推估 |
| 我方為此支付的機時(本機) 估:這一格才是我方損失的正確算法 | t2.small × 8,544 小時 | US$0.0304/小時 | 2025-09-24 → 2026-09-15 | 259.74 | 8,312 | 要升級為可證明:Cost Explorer 依該執行個體匯出 BoxUsage 機時與實付金額 |
| 全活動受害者合計付出的機時 估/推論:列出只為對照,不是我方損失 | 約 99 台同級機 × 8,544 小時 | US$0.0304/小時 | 356 天 | 25714.26 | 822,856 | 以聚合算力 148 KH/s ÷ 單機 1.5 KH/s 推估台數;礦池 worker 清單只回 C4,無法取得實際台數 |
| 攻擊者的聚合 proxy 主機 估:他的基礎設施成本 | 1 台歐洲機房 VPS × 12 個月 | 約 US$7/月 | 356 天 | 84.00 | 2,688 | proxy 位置可證明(ESTABLISHED 連線);租金以公開 VPS 牌價推估 |
| 活體取證人力 估:兩小時的取證,決定了這案子有沒有證據 | 約 0.25 人日:記憶體 dump、逼重連抓包、礦池 API 存證 | 顧問日費 NT$27,500(估) | 2026-09-15 | 214.84 | 6,875 | 當日取證步驟推估,無正式工時單;日費為假設值 |
| 合計(僅可證明列) | 11302.88 | 361,692 | ||||
這張表最難堪的地方是:整件事唯一有第三方可驗證資料的金額,是攻擊者的收益(合計 US$11,302.88);我們自己的損失反而還停在推估。受害方要把損失講到能上法庭,缺的不是律師,是一次 Cost Explorer 匯出。
帶得走的五件事
從他的角度看,worker 代號只是一種記帳方式:標記這是第幾批肉雞。他用自架 proxy 聚合算力,公開礦池只看得到一個 worker、一個錢包,追查者因此很難估算他手上有多少台;備援礦池寫了四個,主池被封還能繼續領;門羅幣的隱私設計讓金流追不到,他要的就是「拿得到、追不到」。而他也知道,你大概率會先重開機或直接 terminate——那樣錢包就永遠消失了。他賭的不是你查不到,是你動作太快。
- 01發現當下的第一個動作決定了整案的上限:先採活體,再談隔離,最後才談清除。
- 02兩個獨立來源撈到同一個字串,才叫互證;單一來源再漂亮也只是一條線索。
- 03門羅幣鏈上查不到餘額,但礦池會記帳;服務端證據免費、免帳號,而且第三方可重跑。
- 04礦池總額是他的犯罪所得,不是你的損失;把 22.19 XMR 寫成自己被偷走的錢,報告會被打回來。
- 05錢包真正的價值不是金額,是 IOC:拿它與 worker 命名規則掃其他主機,才畫得出入侵範圍。
- 01揮發性證據(volatile evidence)錢包只在礦工活著時存在,關機即永久消失;採證順序錯了,後面做再多都補不回來。
- 02/proc/PID/mem錢包字串的實際出處;rootkit 能騙 ps,騙不了行程自己的記憶體映射。
- 03Stratum login礦工要領錢就得報上錢包與 worker,這是封包側完全獨立於記憶體的第二個來源。
- 04ss -K(逼重連)為什麼要主動切斷連線:不重連就抓不到那一包明文登入,這是全篇最關鍵的一個動作。
- 05三路互證記憶體、封包、礦池同時派工三者對上,結論才從「疑似」變成可證明。
- 06礦池 miner API(amtPaid/txnCount)門羅幣鏈上查不到餘額,但礦池會記帳;這是把「有挖礦行為」升級成「確實獲利」的唯一途徑。
- 07損害量化用機時本機損失要用 Cost Explorer 的機時算,把礦池總額當成自己的損失,是最常見也最致命的舉證錯誤。
- 08worker/pass 代號(C4)一個字串就告訴你這是上百台規模的殭屍網路,而你只是其中一台,不是被鎖定的目標。
- 09XMRig-Proxy 聚合器解釋了為什麼公開礦池只看得到一個 worker,也解釋了為什麼 22 XMR 只是地板價。
- 10IOC 橫向盤點錢包真正的價值不是追金流(追不到),是拿它去掃其他主機,判斷同源入侵的範圍。
如果重來一次,證據要照這個順序收
本案的揮發證據是靠攻擊者自己的 @reboot 救回來的。下一次不該把希望放在他身上。
前十五分鐘先查一件事:主機狀態是不是 running。這一格決定了記憶體與連線還在不在,答案是 running 就什麼都先別動——不 terminate、不重開機、不 kill 礦工行程——只用 ss -tnp 把礦池連線、目的 IP 與 PID 原樣存檔。
第二個十五分鐘採兩個獨立來源:dump /proc/PID/mem 抽字串,找 95 碼 Base58 的錢包與設定 JSON;先開 tcpdump 再切斷既有連線,逼礦工重送登入。兩邊字串對上才算數,對不上就繼續找,不要先下結論。第三個十五到三十分鐘轉向服務端與橫向:拿錢包查公開礦池 API,存原始 JSON、SHA256 與 UTC 時間;用同一組 IOC 掃同叢集每一台把範圍畫出來;最後對磁碟建立 snapshot,把靜態分析交給離線那條路(見舉發篇)。
一小時之後才是收尾:匯出機時把我方損失升級成可證明;錢包送礦池檢舉、礦池 IP 送機房 abuse;報告裡把「他的收益」與「我方損失」分成兩張表寫,永遠不要合併。
這五步今天就能在自己的環境練一次,全部唯讀,十五分鐘內做得完。
全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。
- 先確認可疑主機還是不是 running。揮發證據存不存在,取決於這一格。
aws ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType,LaunchTime]' --output table看到什麼代表什麼:還在 running 代表記憶體與連線都還在,先別關機也別重開;已經 stopped 就只剩離線磁碟那條路可走。 - 在可疑主機上找出有礦池連線的行程編號。
sudo ss -tnp | grep -E ':(3333|5555|7777|9443|13333|14444)'看到什麼代表什麼:有 ESTABLISHED 就把 PID 記下來,這條連線就是錢包的入口;沒有任何對外連線、load 又趨近 0,基本上可以排除挖礦。 - 盤點你的取證工具箱齊不齊(只檢查,不安裝)。
command -v tcpdump strings gdb sha256sum看到什麼代表什麼:缺哪一個,就代表真的出事時你採不到對應的證據;現在補比事發當下補便宜太多。 - 用公開礦池 API 練習查一個錢包,對象用本案攻擊者的 IOC,不要去查別人的主機。
curl -s https://www.supportxmr.com/api/miner/WALLET/stats看到什麼代表什麼:amtPaid 大於 0 且 txnCount 大於 0,代表礦池確實付過款,證據等級從「疑似挖礦」升級為「確實獲利」;只有 hash 沒有 amtPaid 只能算嘗試。 - 到 Cost Explorer 把那台主機過去 12 個月的機時與費用篩出來(唯讀報表)。看到什麼代表什麼:這個數字才是你能主張的損失。礦池上的 XMR 是他的收益,兩者不能互換,寫在報告裡會被打回來。
環境背景、時間線、攻擊鏈對照 ATT&CK、關鍵證據、根因、處置與檢討都在完整版,約 12 分鐘。
本文由 AI 團隊協助研究與撰寫,經隱私與事實檢查後發布;證據等級依來源可信度標註。
複製下面這段,貼給你在用的 AI 工具(Claude Code、Cursor、Copilot、ChatGPT 都可以)。它會用本篇的破口位置、自我檢測與學習重點,對你的專案或環境做一次資安掃描,列出潛在問題與建議的調整或加強方式。
預設是唯讀:只發現問題、提出建議,不會改你任何檔案或設定。
M5 活體取證與離線鑑識 · M6 證據包與舉發 · 想在自己的環境做一次同樣的盤點,從 自我盤點 開始。
4 題單選,答對每題 +10 分、全對再 +10 分。加入 LINE 官方帳號、在 LINE 裡作答,成績與積分直接存入;在網頁作答會拿到一組序號,傳到 LINE 就能累積。
1 分鐘重點回饋 →每篇新文章一封:三點摘要、關鍵字定義、今天能做的一件事。或先 加入會員 記錄你完成的任務。