那串 95 碼只活幾分鐘,
關機就永遠問不到了

速讀:5 分鐘掌握重點
一句話結論
錢包位址只以字串常駐在礦工的行程記憶體,關機即永久消失。發現當下就要在活體狀態採集。
他要的是什麼
他用一台自架的 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 點
  1. 記憶體 dump 與逼重連抓到的 Stratum login 撈到完全一致的錢包與 worker 代號 C4,礦池同時正在派工。
  2. SupportXMR 與 C3Pool 的公開 miner API 顯示已撥款合計約 22.19 XMR、40 筆鏈上交易,但那是整個 C4 活動、上百台受害機的總額,不是本機損失。

錢包位址只以字串留在行程記憶體與登入封包裡,關機就消失。這篇講怎麼趁礦工還活著把它撈出來,再用礦池公開 API 把「疑似挖礦」變成「確實獲利」。

挖礦劫持 · 取證與舉證篇·2026-09-15·全文 12 分鐘
本篇目錄
login: 47qQ…/proc/pid/mem → strings → wallet

一個 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,採集全程唯讀,沒有在原機寫入任何檔案。這份清單值得事前確認,因為缺哪一樣,事發當下就採不到對應的那一種證據。

這一篇處理的憑證也比較特別:前三列不是我們外洩的,是攻擊端用來領錢的識別。它一樣有服務、用途、存在形式,只是擁有者是他。

leaked credentials這次外洩了什麼:服務、用途、存在形式
服務憑證類型用途存在形式放在哪權限範圍狀態
攻擊端: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,所以順序比時刻重要:前三格只要錯一步,後面全部拿不到。

  1. 2026-09-15
    主機重開機,@reboot 把礦工拉起並重新連上礦池
    重開後 ss 仍見 ESTABLISHED 至 141.94.96.71:3333。
  2. 2026-09-15
    由礦池連線反查礦工 PID,確認礦工仍在跑
    ss -tnp 對 3333 埠比對;rootkit 攔不到連線表。
  3. 2026-09-15
    dump 行程記憶體,抽出錢包字串與 pass C4
    /proc/PID/mem 逐段讀出後 strings 過濾。
  4. 2026-09-15
    逼礦工重連,擷取明文 Stratum login,取得一致的錢包與 XMRig 6.22.2
    tcpdump 先開,再切斷既有連線。
  5. 2026-09-15
    查兩個公開礦池 miner API,取得已付金額與 40 筆撥款紀錄
    curl 存原始 JSON。
  6. 2026-09-15
    以同一組 IOC 盤點同叢集其餘 8 台,7 台乾淨、1 台無法連線
    逐台看對外 ESTABLISHED 與 load。
  7. 2026-09-15 之後
    主機保持 stopped,分析改走離線磁碟
    詳見 -03 篇。

這七格剛好是一條由快到慢的斜坡:記憶體以秒計、連線以分鐘計、磁碟撐到 terminate 為止,而礦池那本帳反而留得最久——它在第三方手上,我們刪不掉,他也改不掉。

同一條攻擊鏈,這次看的是「每一格還留下什麼可採的東西」

七個階段的事實與偵測篇相同,換個看法讀:把每一格的 signal 欄當成「這裡還採得到什麼」。

發生了什麼 · MITRE ATT&CK T1190
開發用 API 經反向代理對公網開放且免驗證,是推定的進入點。
當時留下的訊號
入侵前的 access log 已被清除,這一格採不到任何東西。
能擋下它的控制
log 即時外送,讓進入點不必靠推論。

值得注意的是第六格:本案證據最集中的地方,恰好是攻擊者最不在意的地方。他不加密 Stratum,因為對他來說被看見也無所謂——除非你把看見的東西寄給礦池。

記憶體、封包、礦池,三個獨立來源對上同一個錢包

礦工要領獎勵,就一定得在登入礦池時報上自己的錢包位址與 worker 名稱。順著那條連往 3333 埠的連線往回追,就能挖出攻擊者的收款帳號。可用的途徑有四條,可靠度差很多。

途徑做法可靠度限制
① Dump 礦工記憶體由 /proc/PID/mem 逐段讀出、抽字串、比對錢包格式最高礦工必須在跑
② 抓 Stratum 登入封包tcpdump 監聽,主動切斷連線逼礦工重連,擷取明文 login高礦池若走 TLS 則不可行
③ 挖磁碟上的設定檔掛載 snapshot 找 config.json 的 user 欄中設定可能編進 binary 或被 rootkit 藏起
④ 礦池 IP 威脅情資反查礦池 IP 的被通報紀錄定性用查不到個別錢包

本案走的是前兩條。第一條的起點不是 ps——在 rootkit 底下它不可信——而是從礦池連線反查 PID:

method ① · 記憶體READ-ONLY
# 先由礦池連線反查礦工 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 開頭)。

第二條需要一個違反直覺的動作:主動切斷他的連線。礦工不會抗議,它會立刻重連,而重連就得重送一次登入。

method ② · 封包READ-ONLY
$ 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、應付與已付金額,不需要帳號,也不需要付費。

pool API · 擷取於 2026-09-15READ-ONLY
$ 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。

兩個礦池回來的四個數字,決定了這份報告能寫到什麼程度:

18.487 XMR
SupportXMR 已付 · 25 筆
3.699 XMR
C3Pool 已付 · 15 筆
≈ 22.19 XMR
合計 ≈ NT$361,754(2026-09-15 匯率)
148 KH/s
當時聚合算力 ≈ 上百台受害機

三個容易寫錯的地方,先在這裡擋掉

第四個數字(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 集中外送與流量紀錄,讓連線與行程都有第三方可比對的來源;導入執行期監控,補上行程建立與提權的稽核;訂一條損害量化規範——我方損失一律以帳單機時為準,礦池數字只用於描述犯罪所得;並定期演練活體取證,把順序練成反射動作。

最後一條規範不是形式主義。同一件事其實有兩本帳:礦池那本記著他領走多少,雲端帳單那本記著我們付了多少。把它們並排,才看得出這門生意的形狀。

cost這場挖礦生意的雙方帳本:用量、單價、期間成本
項目用量單價期間US$NT$舉證
攻擊者已領取(SupportXMR)
XMR 數量可證明;幣價換算為當日匯率(估)
18.487 XMR · 25 筆撥款≈ US$509/XMR至 2026-09-159418.39301,388礦池 miner API 的 amtPaid 原始 JSON,每筆撥款帶鏈上 txnHash,第三方可自行重跑比對
攻擊者已領取(C3Pool)
同上,幣價換算為估值
3.699 XMR · 15 筆撥款≈ US$509/XMR至 2026-09-151884.4960,304礦池 miner API 的 amtPaid 原始 JSON 與 txnCount
礦池 API 與威脅情資查詢
服務端證據最便宜,證據力卻最強
數十次 curl公開 API,免付費、免帳號2026-09-150.000SupportXMR/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/XMR356 天76.422,445礦池只回一個 worker 代號,拿不到單機算力;以機型 RandomX 算力佔比推估
我方為此支付的機時(本機)
估:這一格才是我方損失的正確算法
t2.small × 8,544 小時US$0.0304/小時2025-09-24 → 2026-09-15259.748,312要升級為可證明:Cost Explorer 依該執行個體匯出 BoxUsage 機時與實付金額
全活動受害者合計付出的機時
估/推論:列出只為對照,不是我方損失
約 99 台同級機 × 8,544 小時US$0.0304/小時356 天25714.26822,856以聚合算力 148 KH/s ÷ 單機 1.5 KH/s 推估台數;礦池 worker 清單只回 C4,無法取得實際台數
攻擊者的聚合 proxy 主機
估:他的基礎設施成本
1 台歐洲機房 VPS × 12 個月約 US$7/月356 天84.002,688proxy 位置可證明(ESTABLISHED 連線);租金以公開 VPS 牌價推估
活體取證人力
估:兩小時的取證,決定了這案子有沒有證據
約 0.25 人日:記憶體 dump、逼重連抓包、礦池 API 存證顧問日費 NT$27,500(估)2026-09-15214.846,875當日取證步驟推估,無正式工時單;日費為假設值
合計(僅可證明列)11302.88361,692
匯率假設 1 USD ≈ NT$32。單價為公開牌價或帳單實付,來源:礦池公開 miner API(2026-09-15 擷取)與 AWS 公開牌價 ap-northeast-1(2026-09 查詢);幣價依文中 22.19 XMR ≈ NT$361,754 換算為 US$509/XMR。「舉證」欄標明每筆損失的證據來源與等級( 可證明 推論 缺口)。

這張表最難堪的地方是:整件事唯一有第三方可驗證資料的金額,是攻擊者的收益(合計 US$11,302.88);我們自己的損失反而還停在推估。受害方要把損失講到能上法庭,缺的不是律師,是一次 Cost Explorer 匯出。

帶得走的五件事

從他的角度看,worker 代號只是一種記帳方式:標記這是第幾批肉雞。他用自架 proxy 聚合算力,公開礦池只看得到一個 worker、一個錢包,追查者因此很難估算他手上有多少台;備援礦池寫了四個,主池被封還能繼續領;門羅幣的隱私設計讓金流追不到,他要的就是「拿得到、追不到」。而他也知道,你大概率會先重開機或直接 terminate——那樣錢包就永遠消失了。他賭的不是你查不到,是你動作太快。

lessons本案的 5 個教訓
  1. 01
    發現當下的第一個動作決定了整案的上限:先採活體,再談隔離,最後才談清除。
  2. 02
    兩個獨立來源撈到同一個字串,才叫互證;單一來源再漂亮也只是一條線索。
  3. 03
    門羅幣鏈上查不到餘額,但礦池會記帳;服務端證據免費、免帳號,而且第三方可重跑。
  4. 04
    礦池總額是他的犯罪所得,不是你的損失;把 22.19 XMR 寫成自己被偷走的錢,報告會被打回來。
  5. 05
    錢包真正的價值不是金額,是 IOC:拿它與 worker 命名規則掃其他主機,才畫得出入侵範圍。
keywords重點學習:最需要學習的 10 個關鍵字10 個
  1. 01
    揮發性證據(volatile evidence)
    錢包只在礦工活著時存在,關機即永久消失;採證順序錯了,後面做再多都補不回來。
  2. 02
    /proc/PID/mem
    錢包字串的實際出處;rootkit 能騙 ps,騙不了行程自己的記憶體映射。
  3. 03
    Stratum login
    礦工要領錢就得報上錢包與 worker,這是封包側完全獨立於記憶體的第二個來源。
  4. 04
    ss -K(逼重連)
    為什麼要主動切斷連線:不重連就抓不到那一包明文登入,這是全篇最關鍵的一個動作。
  5. 05
    三路互證
    記憶體、封包、礦池同時派工三者對上,結論才從「疑似」變成可證明。
  6. 06
    礦池 miner API(amtPaid/txnCount)
    門羅幣鏈上查不到餘額,但礦池會記帳;這是把「有挖礦行為」升級成「確實獲利」的唯一途徑。
  7. 07
    損害量化用機時
    本機損失要用 Cost Explorer 的機時算,把礦池總額當成自己的損失,是最常見也最致命的舉證錯誤。
  8. 08
    worker/pass 代號(C4)
    一個字串就告訴你這是上百台規模的殭屍網路,而你只是其中一台,不是被鎖定的目標。
  9. 09
    XMRig-Proxy 聚合器
    解釋了為什麼公開礦池只看得到一個 worker,也解釋了為什麼 22 XMR 只是地板價。
  10. 10
    IOC 橫向盤點
    錢包真正的價值不是追金流(追不到),是拿它去掃其他主機,判斷同源入侵的範圍。

如果重來一次,證據要照這個順序收

本案的揮發證據是靠攻擊者自己的 @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;報告裡把「他的收益」與「我方損失」分成兩張表寫,永遠不要合併。

這五步今天就能在自己的環境練一次,全部唯讀,十五分鐘內做得完。

try today今天就可以來試試約 15 分鐘

全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。

  1. 先確認可疑主機還是不是 running。揮發證據存不存在,取決於這一格。
    aws ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType,LaunchTime]' --output table
    看到什麼代表什麼:還在 running 代表記憶體與連線都還在,先別關機也別重開;已經 stopped 就只剩離線磁碟那條路可走。
  2. 在可疑主機上找出有礦池連線的行程編號。
    sudo ss -tnp | grep -E ':(3333|5555|7777|9443|13333|14444)'
    看到什麼代表什麼:有 ESTABLISHED 就把 PID 記下來,這條連線就是錢包的入口;沒有任何對外連線、load 又趨近 0,基本上可以排除挖礦。
  3. 盤點你的取證工具箱齊不齊(只檢查,不安裝)。
    command -v tcpdump strings gdb sha256sum
    看到什麼代表什麼:缺哪一個,就代表真的出事時你採不到對應的證據;現在補比事發當下補便宜太多。
  4. 用公開礦池 API 練習查一個錢包,對象用本案攻擊者的 IOC,不要去查別人的主機。
    curl -s https://www.supportxmr.com/api/miner/WALLET/stats
    看到什麼代表什麼:amtPaid 大於 0 且 txnCount 大於 0,代表礦池確實付過款,證據等級從「疑似挖礦」升級為「確實獲利」;只有 hash 沒有 amtPaid 只能算嘗試。
  5. 到 Cost Explorer 把那台主機過去 12 個月的機時與費用篩出來(唯讀報表)。
    看到什麼代表什麼:這個數字才是你能主張的損失。礦池上的 XMR 是他的收益,兩者不能互換,寫在報告裡會被打回來。
想看全部細節?

環境背景、時間線、攻擊鏈對照 ATT&CK、關鍵證據、根因、處置與檢討都在完整版,約 12 分鐘。

本文由 AI 團隊協助研究與撰寫,經隱私與事實檢查後發布;證據等級依來源可信度標註。

看完的心情
ai prompt把這篇的切入點帶回你的環境

複製下面這段,貼給你在用的 AI 工具(Claude Code、Cursor、Copilot、ChatGPT 都可以)。它會用本篇的破口位置、自我檢測與學習重點,對你的專案或環境做一次資安掃描,列出潛在問題與建議的調整或加強方式。

預設是唯讀:只發現問題、提出建議,不會改你任何檔案或設定。

§
對應課程模組

M5 活體取證與離線鑑識 · M6 證據包與舉發 · 想在自己的環境做一次同樣的盤點,從 自我盤點 開始。

quiz · 資安意識積分
讀完了?1 分鐘重點回饋,累積資安意識積分

4 題單選,答對每題 +10 分、全對再 +10 分。加入 LINE 官方帳號、在 LINE 裡作答,成績與積分直接存入;在網頁作答會拿到一組序號,傳到 LINE 就能累積。

1 分鐘重點回饋 →
newsletter
下一篇拆解直接寄到信箱

每篇新文章一封:三點摘要、關鍵字定義、今天能做的一件事。或先 加入會員 記錄你完成的任務。