INC-2026-0915critical挖礦劫持 · 取證與舉證篇

錢包只在礦工活著時看得到: 從記憶體與封包挖出攻擊者的收款帳號

門羅幣查不到鏈上餘額,但礦池會記帳。用 /proc 記憶體與逼重連封包拿到錢包,再用礦池公開 API 證明「確實獲利」,而不只是「疑似挖礦」。

事件期間 2026-09-15·整理於 2026-09-17·10 分鐘·6 可證明1 推論1 缺口
數位鑑識Monero礦池 API證據保全
tl;dr
  1. 錢包位址只以字串常駐在礦工的行程記憶體,關機即永久消失。發現當下就要在活體狀態採集。
  2. 記憶體 dump 與逼重連抓到的 Stratum login 撈到完全一致的錢包與 worker 代號 C4,礦池同時正在派工。
  3. SupportXMR 與 C3Pool 的公開 miner API 顯示已撥款合計約 22.19 XMR、40 筆鏈上交易,但那是整個 C4 活動、上百台受害機的總額,不是本機損失。
◉ 攻擊者視角他用一台自架的 XMRig-Proxy 聚合上百台肉雞的算力,再以同一個錢包向公開礦池領獎。你的機器只貢獻 1~2 KH/s,是他的百分之一。
◎ 防守者視角拿到錢包不是為了追金流(門羅幣追不到),是拿到一組 IOC:用錢包與 worker 命名規則掃其他主機,判斷同源入侵範圍。
本篇目錄
login: 47qQ…/proc/pid/mem → strings → wallet

知道它在挖礦之後,下一個問題是:挖給誰?

礦工要領獎勵,一定得在登入礦池時報上自己的錢包位址與 worker 名稱。順著那條連往 3333 埠的連線往回追,就能挖出攻擊者的收款帳號。關鍵在於一個事實:

錢包只在「礦工活著」時看得到

錢包位址是礦工登入礦池時送出的參數,平時只以字串常駐在行程記憶體裡。主機一旦關機或終止,記憶體清空、連線中斷,這條證據就永久消失。取證的第一原則:發現當下就在活體狀態採集,不要先關機。

四種取證途徑,依可靠度排序

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

方法 ①:從 /proc 抽錢包字串

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 開頭)。

方法 ②:逼重連,抓 Stratum login

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>

本案實際戰果:三路互證

主機重開機後礦工被 @reboot 拉起、重新連上礦池。趁它活著,方法 ① 與 ② 同時採集:

// ① 礦工記憶體裡的 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, ...}}

| 項目 | 值 | |---|---| | 幣種/演算法 | 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 |

這次外洩了什麼

這一篇處理的是攻擊端的憑證:他用來領錢的那組識別。它跟我們的金鑰一樣有「服務、用途、存在形式」,只是擁有者是他。

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
憑證本身已遮蔽或失效;這裡只說明它是哪個服務、拿來做什麼、以什麼形式存放,讓你能對照自己的環境。

拿到錢包之後:不查區塊鏈,查礦池

門羅幣有隱私設計,區塊鏈瀏覽器查不到某地址的餘額或入帳。但礦池會為每個錢包記帳:把錢包丟進礦池的公開 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
當時聚合算力 ≈ 上百台受害機

兩個重要修正

這是「殭屍網路」,不是單機

兩個礦池的 worker 清單都只回 ["C4"],而當時聚合算力高達約 148 KH/s。一台 t2.small 的 RandomX 算力只有約 1~2 KH/s。148 KH/s 意味著上百台受害機,全部掛同一個活動代號 C4,經攻擊者自架的 141.94.96.71(XMRig-Proxy 聚合器)彙總後,再以這個錢包對外領獎。

binary 裡的路徑不是本機的

binary 裡出現 /root/xmrig/scripts/build/… 的字串,但本機並不存在對應檔案。那只是編譯時嵌進 binary 的字串,來自攻擊者自己的編譯環境。受害機拿到的是現成 binary,並非在此 clone 與 make。

完整的利益鏈

  1. 未授權存取(對外免驗證 RCE
  2. 植入現成 XMRig binary + rootkit + 後門帳號
  3. 消耗受害者 CPU、電力、雲端資源(整核滿載近一年)
  4. 執行 RandomX 運算,提交 share 至 141.94.96.71 →(fallback)C3Pool/SupportXMR
  5. 以錢包 47qQHF…CgHe + worker C4 作為收益識別
  6. 累積並領取門羅幣報酬 ≈ 22 XMR(全活動)
  7. 攻擊者取得可量化的經濟利益
§
三層舉證,對照國際雲端挖礦判例的採證邏輯

犯罪目的:server → XMRig → mining.login(wallet + C4)→ pool → shares → payout。記憶體加封包雙證,最強。 受害者實際損害:AWS 機時、突發費、IR/重建工時、資料外洩處置。權威值查 Cost Explorer。 犯罪所得:錢包已付 ≈ 22.19 XMR,但屬整個活動總額,需明確標註。

誰賺了多少,誰付了多少

同一件事的兩本帳:礦池那本記著他領走多少,雲端帳單那本記著我們付了多少。兩本不能互相代替,這是損害量化最常被搞混的地方。

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 的機時匯出來,變成一列 proven。

橫向盤點:其他主機有沒有中?

拿同一組 IOC(錢包、礦池 IP、/var/log/logld.so.preloadsystemd 後門帳號、@reboot 挖礦排程)掃過同叢集其餘 8 台。判定依據是「主動外連礦池是挖礦的必要條件」:所有乾淨主機皆無任何對外 ESTABLISHED 連線且 load 趨近 0。

| 主機 | 判定 | 依據 | |---|---|---| | 排程機(本案) | ● 已感染 | XMRig(worker C4)+ rootkit + 後門帳號 | | 其餘 7 台 | ✓ 乾淨 | 無任何 IOC;其中一台高 CPU 為合法報表工作,外連只到 Google | | 1 台 | — 無法連線 | No route to host,疑已關機,待確認 |

worker 代號 C4,是他標記「第幾批肉雞」的方式。
  • 用自架 proxy 聚合算力,公開礦池只看到一個 worker、一個錢包,追查者難以估算他有多少台。
  • 備援礦池寫了四個,主池被封還能繼續領。
  • 門羅幣的隱私設計讓金流無法追蹤,他要的就是「拿得到、追不到」。
  • 他也知道你大概率會先重開機或直接 terminate,那樣錢包就永遠消失了。

重點學習

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 橫向盤點
    錢包真正的價值不是追金流(追不到),是拿它去掃其他主機,判斷同源入侵的範圍。

今天就可以來試試

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 是他的收益,兩者不能互換,寫在報告裡會被打回來。
newsletter
下一篇拆解直接寄到信箱

每篇新文章一封:三點摘要、攻擊者/防守者視角、今天能做的一件事。或先 加入會員 記錄你完成的任務。