P2P 殭屍網路入門

蔣生武發表於2014-07-31

【導讀】:據Fortinet研究,業界排名前五的殭屍程式分別是:ZeroAccess、Jeefo、Smoke、Mariposa和Grum(Tedroo)。其中,Grum網路在2011年7月被打掉了,Mariposa的主C&C伺服器在幾年前也被拿下。2012年12月下旬,微軟聯合歐美執法部門斷掉了ZeroAccess。

當人們正大肆宣傳ZeroAccess被攻克的訊息,MalwareTech 博主認為是時候介紹一下P2P殭屍網路(botnets)了。包括殭屍網路的工作原理和應對方法。

 

傳統殭屍網路


Traditional Botnet

傳統殭屍網路圖例

無論使用HTTP、IRC或是其他協議,傳統殭屍網路的構成都是相同的。所有的殭屍主機(bot)都通過一個或多個域名連線到一個或多個伺服器。儘管網路結構可能千差萬別,或一目瞭然,或錯綜複雜,通過各伺服器間良好的協作,都可以輕易摧毀殭屍網路。

恢復殭屍主機正常工作最常見的辦法,就是奪取它所使用的域名或伺服器的控制權。然而有些時候由於某些原因我們無法向殭屍主機傳送指令,就需要另一種手段。當然嘗試關閉命令與控制伺服器(C&C Server)一般情況下都是浪費時間的做法,因為主控者(botmaster)不需要花多少時間,就可以找到另一個伺服器,並將域名重定向到它上面。於是我們就只有在域名上做文章來應對了。

高手操縱的殭屍網路通常會使用多個域名,當其中一個被關閉時,殭屍主機會連線到另一個。想要徹底破壞這樣的殭屍網路,有兩個辦法:1、暫時關閉所有和這個殭屍網路相關的域名(需要在短時間內完成,以防主控者操作殭屍主機定向到新的域名);2、把殭屍網路使用的域名定向到一個有特殊功能的伺服器(如Sinkhole路由器),使殭屍主機遠離正常的控制伺服器,從而切斷主控者對它們的控制。

 

P2P


不同於傳統殭屍網路在域名或伺服器被奪取控制權時表現出的脆弱,P2P殭屍網路會建立一個相對分散的網路環境。思路就是所有的殭屍主機都互相連線並且進行通訊,從而不再需要一箇中心伺服器,但實際上並不單純是這樣。

指令

如果所有的殭屍主機都能互相通訊,那麼主控者需要確保只有他能向這些主機傳送指令,通常的解決辦法是數字簽名。這個簽名是由不對稱加密演算法生成的,需要兩個金鑰(公鑰和私鑰)。如果其中一個金鑰用於加密訊息,那麼必須使用另一個來解密。於是主控者可以自己持有一個金鑰(私鑰),將另一個(公鑰)發放到殭屍主機上。他使用私鑰對指令進行加密,然後殭屍主機使用公鑰解密。沒有私鑰,任何人都無法正確加密指令。

網路架構

P2P Incorrect

圖1

大部分人眼中P2P殭屍網路的構造和圖1類似,所有殭屍主機通過IP地址互相連線,互相傳送命令,完全不需要中心伺服器或者域名。很遺憾,這種表述是錯誤的。

那些使用NAT、防火牆,或者代理訪問網路的計算機,無法接受連入的請求,它們只能向外傳送訊息,這會導致大多數殭屍主機無法被另一個直接連線。在傳統殭屍網路中,這根本不是問題,因為殭屍主機都是連線到伺服器的。因此在P2P網路中,我們仍然需要伺服器,只不過形式不同罷了。

P2P Correct

圖2

把那些可以接受連入請求的殭屍主機(沒有使用代理、NAT或防火牆)作為伺服器(通常稱作節點),同時那些不能連入的主機(通常稱作worker,暫譯工作機)將向一個或多個節點發起連線,從而獲取指令(圖2)。儘管這些節點僅僅從技術上可以作為伺服器,但是可以利用它們防止殭屍網路被摧毀。辦法就是:所有的工作機在節點間是分散式連線的,這使它們在某個節點失效時,能夠輕易轉移到另一個節點上。有時關閉所有的節點是一件不切實際的事情,於是P2P殭屍網路得以持續工作。不幸的是,這些節點都是合法的普通計算機,它們可不能像伺服器一樣隨意被我們控制。

每個節點都維護著一個IP列表,它包含所有和自身有相同工作機的節點。然後工作機再獲取這個列表,於是它們就能夠在其中某個節點失效時轉向另一個。在這個階段,數個殭屍主機成為一組,並且連線到許多不同的節點,但整個殭屍網路還無法接受指令。為了使指令能夠抵達網路中各臺主機,需要殭屍主機連線到多個節點並把接受到的指令傳送到其他節點,或者節點之間相互連線同時相互傳遞指令,亦或者把兩者結合起來。

nodes

引導增殖

要將一臺主機擁入殭屍網路的懷抱,它至少需要獲取一個節點的IP地址,這時引導增殖的過程便開始了。殭屍程式裡硬編碼了一系列可提供自身繁衍所需資訊的伺服器(暫譯引導伺服器),當程式第一次在被感染的計算機上執行時,它就會連線到這些伺服器。引導伺服器的工作就是維護一個海量的節點地址,將其中一部分發放到殭屍主機上(把主機引入殭屍網路)。通常來說,引導伺服器使用某種簽名,防止被安全人員劫持,也避擴音供無效的節點地址。

顯然引導伺服器是中心要點,就像傳統殭屍網路一樣,他們可以被破壞,然而這也不算什麼大不了的事。如果所有的引導伺服器在一瞬間被全部拿下,這也不會影響到已經存在的殭屍主機,只是阻止了新殭屍的加入。主控者可以從容地暫停感染新機器,直到他設定好新的引導伺服器。因此這個辦法只能算是一個臨時措施,去攻擊殭屍網路的引導增殖系統意義並不大。

 

拆解殭屍網路


攻擊引導伺服器只是臨時地阻止了網路的感染,而包含數字簽名的指令使得除了主控者以外的人無法操縱殭屍主機,同時節點數量又太多以至於很難同時被擊破,那麼我們還能做什麼呢?

投下慢性毒藥

幾乎所有的P2P殭屍網路都有一個弱點,那就是所有的對等主機會使用相同的執行機制。像之前描述過的那樣,節點主機需要維護包含其他節點的列表,同時共享給工作機,使它們能夠分散式地連線到一系列節點上。如果主控者手動為每個節點提供其他節點的地址,將耗費難以估計的時間,甚至是不可能做到的,因此交給節點自動完成。當一個殭屍節點被認定可以接受連入請求時,節點主機便連線到它,並給它共享一個節點列表。

那麼如果你引入一臺對殭屍網路來說居心叵測的計算機呢,它有條件作為節點主機,並且向其他節點共享一個包含無效IP的列表。很可能效果不是很大,節點會校驗新獲取的IP以確保它們可用。但是既然想到了這點,離成功也就不遠了!

安全人員可以引入許多這樣的“惡意”計算機,並非提供無效的節點IP,而是提供它們各自的IP。資源充足的情況下,“惡意”計算機會成為殭屍網路中重要的一部分,並且把殭屍主機和節點主機分離。通過這樣的方式,可以使工作機只能獲取“惡意”的節點,從而顯著降低它們重新成為殭屍網路一員的可能性。在一定的時間內,“惡意”節點會阻止正常節點傳播命令,於是工作機也無法接收到指令,打了主控者一個措手不及。這個辦法不太可能將所有的工作機分離出來,但已大大削弱了殭屍網路的影響程度。保持“惡意”節點持續執行能夠將更多的主機佔為己有,也時刻監視著那些可能存有“正常”節點IP地址的殭屍主機。

相關文章