曾經讀過一篇關於 「 殭屍網路 (Botnet)」 透過 BitTorrent 作為命令與控制中心 (command and control center) 的文章 。 細節雖然已經不太記得 , 但有天心血來潮 , 想說到底要如何透過 BitTorrent 來控制一群殭屍電腦 ?

本文山姆鍋以殭屍網路做例子 , 看看它可能是如何透過 BitTorrent 網路來發現殭屍電腦以及發送命令給受控的殭屍電腦 。 其實這樣的架構同樣可以應用在廣域網路服務發現 (WAN Service Discovery) 的用途 。

背景觀念

「 殭屍網路 (Botnet)」 是由一群被植入控制程式的電腦所組成 , 植入的方式通常透過電腦病毒 、 蠕蟲或特洛伊木馬等 。 透過殭屍網路 , 駭客可以控制大量的運算與頻寬資源對特定目標發動 DDoS 攻擊 [1] 。 DDoS 是目前山姆鍋所知最暴力的網路攻擊方式 , 除非有跟駭客相抗衡的網路資源 , 不然大都是以舉白旗收場 。

BitTorrent 是點對點 (peer-to-peer) 的檔案分享網路 。 傳統 BitTorrent 的節點為了找到檔案下載的對等點 , 透過一個 Tracker 元件來達成 。 現代的 BitTorrent 客戶端已經具備使用 DHT 來取代 Tracker, 完成資源查找工作 。 BitTorrent 使用的分散式雜湊表 (DHT) 便是控制殭屍網路的關鍵技術 。BitTorrent 使用的 DHT 又是什麼 ?

BitTorrent 使用的 DHT 網路主要有兩個 , 本文所使用的是 Mainline DHT 。 Mainline DHT 跟其它 DHT 一樣 , 針對每個物件產生一個全域 ID( 在 Mainline DHT 叫做 infohash), 使用路由協定找到負責儲存該物件的節點 ( 為了容錯 , 有多個節點負責同一物件 )。 本來山姆鍋以為可以透過 DHT 在殭屍電腦間傳遞資訊 / 命令 , 但透過研究 Mainline DHT 使用的協定 , 會發現其實它不允許存放任意的資料 , 只能夠存放 IP 位址跟埠號 (port), IP 位址還不能自己指定 !

這樣的限制導致我們需要轉換做法 。 看來只能使用 Mainline DHT 來先找到其它殭屍電腦 , 再透過其它方式與殭屍電腦溝通 。

基本流程

底下是山姆鍋想像的可能流程 , 用來完成命令的傳遞與執行 [2] :

  1. 受感染的殭屍電腦會自動定時發布自己的 IP 位址跟埠號到 DHT 特定的 infohash。

    需要所有電腦都跟 DHT 註冊嗎 ? 並不需要 。 其中一種方式 : 殭屍電腦可以先查詢 DHT, 依找到的其它殭屍電腦數量來決定要不要註冊 。 只能註冊到一個 infohash? 也不一定 , 例如 : 可以依據殭屍電腦的作業系統 、 運算能力使用不同的 infohash。

  2. 主控電腦使用同樣的 infohash 透過 DHT 查找到幾個殭屍電腦的位址 。

    並不需要也無法透過 DHT 找到全部節點位址 。

  3. 主控電腦將命令送給其中一或幾台殭屍電腦 。

    因為殭屍網路龐大且節點連線狀態不定 , 主控端直接傳送命令給所有節點是不實際的做法 。

  4. 受感染的殭屍電腦間透過 Gossip 協定彼此同步 (synchronize) 從主控端收到的命令 。

    採用 Gossip 可以快速將資料在大型網路內同步 , 不要求所有節點同時在線 , 對於節點故障容錯性也高 。 從技術角度來說 ,Gossip 是個很有趣的網路協定 。

  5. 殭屍電腦執行收到的命令 。

    執行令人討厭的阻斷攻擊 [3] , 發送垃圾郵件等等攻擊行為 。

可行性驗證

說是可行性驗證有點誇張 , 其實只不過是使用開放源碼程式庫實驗可以發布以及查找節點位置罷了 ! 山姆鍋修改 lightdht 這個開源專案的程式 , 驗證發布與查找在技術上不是問題 。 山姆鍋修改的程式已經找不到了 , 不過修改的幅度也不多 , 有興趣的人只好自行研究了 。

結語

山姆鍋原先是想分享如何透過 BitTorrent DHT 實現廣域網路服務 / 節點發現的功能 。 但是這樣的說法好像太無趣了 , 又剛好需要一個比較具體的應用 , 就想到以殭屍網路當作例子 。 希望本文提到的想法 (idea) 對需要實現廣域網路服務發現 (Service Discovery) 功能的人有所啟發 。 這樣的服務應該適用於大型網路的組態管理 (configuration management) 與遠端命令執行 (remote command execution)。

參考資料

Botnet: https://en.wikipedia.org/wiki/Botnet

殭屍網路 。

DDoS: https://en.wikipedia.org/wiki/Denial-of-service_attack

分散式阻斷服務攻擊 。

DHT: https://en.wikipedia.org/wiki/Distributed_hash_table

分散式雜湊表 。

Mainline DHT: https://en.wikipedia.org/wiki/Mainline_DHT

BitTorrent 使用的 DHT 的其中一種 。

Gossip: https://en.wikipedia.org/wiki/Gossip_protocol

一種分散式網路協定 , 通常用來實現資料同步 、 多點傳播 (multicasting) 這類服務 。

Service Discovery: https://en.wikipedia.org/wiki/Service_discovery

在網路組成節點是動態可變動時 , 需要一種機制來找到網路中其它節點或服務 。

[1] 除了 DDoS, 殭屍網路還有其他應用 , 但目前以 DDoS 最具代表 。
[2] 也可以視為如果山姆鍋要設計殭屍網路會用的方法 。
[3] 山姆鍋過去負責的線上服務 , 多次遭到 DDoS 攻擊 。