錢包只在礦工活著時看得到: 從記憶體與封包挖出攻擊者的收款帳號
門羅幣查不到鏈上餘額,但礦池會記帳。用 /proc 記憶體與逼重連封包拿到錢包,再用礦池公開 API 證明「確實獲利」,而不只是「疑似挖礦」。
- 錢包位址只以字串常駐在礦工的行程記憶體,關機即永久消失。發現當下就要在活體狀態採集。
- 記憶體 dump 與逼重連抓到的 Stratum login 撈到完全一致的錢包與 worker 代號 C4,礦池同時正在派工。
- SupportXMR 與 C3Pool 的公開 miner API 顯示已撥款合計約 22.19 XMR、40 筆鏈上交易,但那是整個 C4 活動、上百台受害機的總額,不是本機損失。
本篇目錄
知道它在挖礦之後,下一個問題是:挖給誰?
礦工要領獎勵,一定得在登入礦池時報上自己的錢包位址與 worker 名稱。順著那條連往 3333 埠的連線往回追,就能挖出攻擊者的收款帳號。關鍵在於一個事實:
錢包位址是礦工登入礦池時送出的參數,平時只以字串常駐在行程記憶體裡。主機一旦關機或終止,記憶體清空、連線中斷,這條證據就永久消失。取證的第一原則:發現當下就在活體狀態採集,不要先關機。
四種取證途徑,依可靠度排序
| 途徑 | 做法 | 可靠度 | 限制 |
|---|---|---|---|
| ① Dump 礦工記憶體 | 由 /proc/PID/mem 逐段讀出、抽字串、比對錢包格式 | 最高 | 礦工必須在跑 |
| ② 抓 Stratum 登入封包 | tcpdump 監聽,主動切斷連線逼礦工重連,擷取明文 login | 高 | 礦池若走 TLS 則不可行 |
| ③ 挖磁碟上的設定檔 | 掛載 snapshot 找 config.json 的 user 欄 | 中 | 設定可能編進 binary 或被 rootkit 藏起 |
| ④ 礦池 IP 威脅情資 | 反查礦池 IP 的被通報紀錄 | 定性用 | 查不到個別錢包 |
方法 ①:從 /proc 抽錢包字串
# 先由礦池連線反查礦工 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
$ 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 |
這次外洩了什麼
這一篇處理的是攻擊端的憑證:他用來領錢的那組識別。它跟我們的金鑰一樣有「服務、用途、存在形式」,只是擁有者是他。
| 服務 | 憑證類型 | 用途 | 存在形式 | 放在哪 | 權限範圍 | 狀態 |
|---|---|---|---|---|---|---|
| 攻擊端: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、應付與已付金額。
$ 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。兩個重要修正
這是「殭屍網路」,不是單機
兩個礦池的 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。
完整的利益鏈
- 未授權存取(對外免驗證 RCE)
- 植入現成 XMRig binary + rootkit + 後門帳號
- 消耗受害者 CPU、電力、雲端資源(整核滿載近一年)
- 執行 RandomX 運算,提交 share 至 141.94.96.71 →(fallback)C3Pool/SupportXMR
- 以錢包
47qQHF…CgHe+ workerC4作為收益識別 - 累積並領取門羅幣報酬 ≈ 22 XMR(全活動)
- 攻擊者取得可量化的經濟利益
犯罪目的:server → XMRig → mining.login(wallet + C4)→ pool → shares → payout。記憶體加封包雙證,最強。 受害者實際損害:AWS 機時、突發費、IR/重建工時、資料外洩處置。權威值查 Cost Explorer。 犯罪所得:錢包已付 ≈ 22.19 XMR,但屬整個活動總額,需明確標註。
誰賺了多少,誰付了多少
同一件事的兩本帳:礦池那本記著他領走多少,雲端帳單那本記著我們付了多少。兩本不能互相代替,這是損害量化最常被搞混的地方。
| 項目 | 用量 | 單價 | 期間 | 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 的機時匯出來,變成一列 proven。
橫向盤點:其他主機有沒有中?
拿同一組 IOC(錢包、礦池 IP、/var/log/log、ld.so.preload、systemd 後門帳號、@reboot 挖礦排程)掃過同叢集其餘 8 台。判定依據是「主動外連礦池是挖礦的必要條件」:所有乾淨主機皆無任何對外 ESTABLISHED 連線且 load 趨近 0。
| 主機 | 判定 | 依據 | |---|---|---| | 排程機(本案) | ● 已感染 | XMRig(worker C4)+ rootkit + 後門帳號 | | 其餘 7 台 | ✓ 乾淨 | 無任何 IOC;其中一台高 CPU 為合法報表工作,外連只到 Google | | 1 台 | — 無法連線 | No route to host,疑已關機,待確認 |
- 用自架 proxy 聚合算力,公開礦池只看到一個 worker、一個錢包,追查者難以估算他有多少台。
- 備援礦池寫了四個,主池被封還能繼續領。
- 門羅幣的隱私設計讓金流無法追蹤,他要的就是「拿得到、追不到」。
- 他也知道你大概率會先重開機或直接 terminate,那樣錢包就永遠消失了。
重點學習
- 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 橫向盤點錢包真正的價值不是追金流(追不到),是拿它去掃其他主機,判斷同源入侵的範圍。
今天就可以來試試
全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。
- 先確認可疑主機還是不是 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 是他的收益,兩者不能互換,寫在報告裡會被打回來。
每篇新文章一封:三點摘要、攻擊者/防守者視角、今天能做的一件事。或先 加入會員 記錄你完成的任務。