lxj616 · 2014/07/28 11:45php
from:https://www.virusbtn.com/virusbulletin/archive/2014/07/vb201407-Mayhemhtml
網站甚至整個服務器被感染愈來愈廣泛。一般這種感染被用來竊聽通信,黑帽SEO,盜鏈下載,諸如此類。而且在絕大多數的案例中這種惡意軟件由相對比較簡單的PHP腳本組成。可是在最近的兩年裏,許多更加複雜的惡意軟件家族被發現。Mayhem是一個針對網站服務器的多用途模塊化bot。咱們的團隊研究了這個bot以獲取對其不僅是惡意軟件客戶端的理解,也瞭解了一些它的C&C服務器指令,這容許咱們去搜集一些統計數據。 這篇文章應當被認爲是Malware Must Die團隊以前發表文章1的補充。咱們在2014年4月遭遇了Mayhem bot,而且這篇文章是咱們獨立研究的結果。2是咱們找到的惟一另外關於Mayhem的出版物。在咱們的研究中,咱們也發現Mayhem是一個更大的‘Fort Disco’暴力破解運動(在3被公開)的延續linux
首先,這一部分的惡意軟件表現爲一段PHP腳本。咱們分析了這個PHP病毒釋放器版本的SHA256 hash:b3cc1aa3259cd934f56937e6371f270c23edf96d2c0801 728b0379dd07a0a035.
用VirusTotal分析這段腳本的結果呈如今 表格一 中git
Date | VirusTotal results |
---|---|
2014-06-17 | 3/54 |
2014-06-05 | 3/51 |
2014-06-03 | 3/52 |
2014-04-06 | 1/51 |
2014-03-18 | 1/49 |
表格一 使用VirusTotal檢查 PHP病毒釋放器的結果github
在執行事後,這段腳本kill了全部‘/usr/bin/host’進程,識別系統架構(x64 仍是 x86)以及系統類型(Linux 仍是 FreeBSD),而後釋放一個惡意的動態連接庫命名爲‘libworker.so’。這段代碼也定義了一個變量‘AU’,其中保存了這段腳本被執行的完整URL。這段PHP腳本的第一部分顯示在 圖表一 中web
圖表一 PHP病毒釋放器的第一部分正則表達式
在那以後,這個PHP病毒釋放器建立了一個Shell腳本叫作‘1.sh’,這個腳本的內容如圖表二所述。除此以外,這段腳本也建立了環境變量‘AU’,這和在PHP腳本中定義的那個同樣。算法
圖表二 ‘1.sh’腳本的內容數據庫
而後這個PHP病毒釋放器經過運行命令‘at now -f 1.sh’ 執行了這段SHELL腳本。這個命令添加了一個計劃任務。在執行以後,這個病毒釋放器等待最多5秒鐘的時間,而後就刪除計劃任務。若是執行‘at’命令失敗,這個病毒釋放器就會直接運行‘1.sh’腳本。這部分PHP病毒釋放器的代碼如 圖表三 所示數組
圖表三 PHP病毒釋放器的最後一部分
LD_PRELOAD技術容許第一個載入動態連接庫而且容許它輕易hook到不一樣的函數中。若是在這樣的動態連接庫中一個標準的庫函數被覆寫,那麼這個庫將會攔截全部的對那個函數的調用。這個惡意的樣本包含了它本身實現的‘exit’函數,因此被‘/usr/bin/host’調用時這一個惡意函數替代了原始的函數。 在被hooked的‘exit’函數執行過程當中,調用了一個額外的初始化函數,這個函數的工做流程如 圖表四 所示。在這個初始化過程當中,以下步驟被執行:
• 一個只包含了‘exit’函數的ELF文件被釋放
• 這個進程forks而後子進程運行ELF文件而後結束它的執行
• 父進程執行更多的初始化工做:它試着去鏈接Google DNS 服務(IP 地址是 8.8.8.8),解密而且解析配置文件而後獲取系統的各類參數
圖表四 初始化函數的工做流程
一旦初始化結束,這個動態連接庫文件就被從硬盤上刪除。這個惡意軟件以後試着去打開一個文件即一個隱藏文件系統並映射到內存,而後一個隱藏的文件系統就被初始化了。而後這個進程forks,父進程退出,而後子進程繼續執行。 關於被hooked的‘exit’函數高度抽象的工做流程如 圖表五 所示。成功被執行的運行路線在流程圖上用紅色標識。正如你所見,執行的路線既不是單純父進程或者單純子進程。咱們假設這是一種針對那些在fork後設置了只跟蹤子進程執行或者只跟蹤父進程執行的調試者的反調試技巧。
圖表五 被hooked的‘exit’函數高度抽象的工做流程
在這些步驟以後,子進程(惟一仍然存活的)運行惡意程序的主循環。這個惡意程序將等待配置中設置的時間而後運行作實際工做的函數
這個函數首先創建起一個socket以用來和C&C服務器通信,而後檢查被感染的宿主主機的信息是否自這個有效的session開始,也就是指,自惡意軟件被執行開始,已經被髮送到C&C。若是flag標識信息已經被成功送達C&C服務器,這個惡意軟件發送一個ping數據包,而後接收而且執行C&C命令。
若是這個flag標識信息尚未被成功送達,這個惡意軟件會準備一個包含了‘uname -a’命令輸出,被感染系統的架構信息,的HTTP數據包,以及關於系統用戶執行進程的權限信息。在這個數據包被髮送後,這個惡意軟件讀取C&C的響應而後若是有錯誤產生就會退出這個函數。若是一切都正常,這個惡意軟件更新flag而且試着讀取並執行其餘C&C響應中的命令。 一個高度抽象的的主循環函數工做流程如 圖表六 所示
圖表六 動態連接庫主循環函數高度抽象的工做流程
在工做中,惡意軟件包含了4個列表和2個隊列。一個隊列用於輸入的字符串(從C&C服務器接收的字符串),而後另外一個隊列用於輸出字符串(將被髮送到C&C服務器的字符串)。第一個列表用來存儲插件工做函數的地址,第二個列表存儲在寫到socket以前處理數據的函數地址(用來傳輸數據到C&C的那個),第三個列表用來存儲從socket讀出數據前數據處理函數的地址(從C&C接收到的數據),而且第四個用來存儲將會從字符串隊列中處理數據的函數地址。圖表七展現了這些隊列和列表是怎樣在惡意軟件的工做流程中被使用的
圖表七 數據從C&C服務器讀取時的工做流程
圖表八 展現了惡意軟件處理任務時的工做流程
圖表八 插件處理字符串的工做流程
在C&C服務器與惡意軟件通信時有七種不一樣的命令被用到。這些命令能夠被分紅兩組:輸入指令(C&C 到 bot)和輸出指令(bot 到 C&C)。全部的這些命令都是在HTTP POST請求和響應中發送的,也就是說,輸入指令在HTTP POST請求中傳送,而輸出指令在對POST請求的HTTP響應中傳送。
‘R’指令(輸出)
經過發送這個命令這個惡意軟件通知C&C它已經成功加載而且準備好工做了。若是WEB服務器在root權限下運行,發送給C&C 的‘R’指令格式以下:
R,20130826,<系統架構 - 64 或者 32>,<‘/usr/bin/host’ ELF header EI_OSABI 的值 >,
ROOT,<‘uname -a’命令的輸出>
複製代碼
若是WEB服務器在受限的權限下運行,那麼命令是相同的,可是‘ROOT’取而代之的是getenv(‘AU’)的輸出 – PHP腳本開始執行惡意軟件的URL。若是一切都正常,C&C服務器返回‘R,200’
‘G’指令(輸入)
這個指令是C&C服務器發送給惡意軟件的。這個指令有着以下的格式:
G,<任務ID>
複製代碼
若是這個當前的任務ID與接收的ID不相等,這個惡意軟件將會完成當前運行的任務而且開啓必定數目的新工做線程。工做線程的數目是被‘L’命令設置的 ‘F’指令(輸出) 這個指令用來從服務器上請求文件。若是這個惡意軟件想要請求一個新的文件,它會發送以下的命令:
F,<文件名>,0
複製代碼
若是惡意軟件想要檢查以前獲取的文件是否還有更新的版本,它會發送:
F,<文件名>,<文件的CRC32校驗>
複製代碼
若是文件沒有在C&C服務器上找到,服務器會響應: F,404,<文件名>
若是文件自從被接受以後就沒有被改變,C&C將會響應:
F,304,-
複製代碼
若是新建的或者更新的文件被找到,服務器將會響應:
F,200,<文件名>,<BASE64編碼的文件數據>
複製代碼
在接收到攜帶數據的命令後,這個惡意程序解碼base64而後寫到硬盤上的隱藏文件系統中。而後它試着去肯定接收到的文件是不是個插件。若是這個文件是一個插件,這個惡意程序檢查其存儲在沒有使用的ELF頭部field中的CRC32校驗,而後把這個插件載入內存
‘L’命令(輸入) ‘L’命令被C&C服務器用來配置惡意軟件而且讓它加載一個插件。若是C&C想要配置這個惡意軟件的core模塊,它將會發送:
L,core,<工做線程數目>,<sleep timeout>,<socket timeout>
複製代碼
在接受到這個指令後,這個惡意軟件將會完成全部的工做線程,而後更新工做線程數目,sleep timeout和socket timeout 若是C&C想要惡意軟件裝載一個插件,它將會發送:
L,<插件文件名>,<用逗號分隔的插件參數>
複製代碼
若是這個惡意軟件接受到這個命令而且其餘的插件已經運行,正在運行的插件將會被終止而且將會從隱藏文件系統中把新的插件找出來。若是查找失敗,一個帶着插件的文件將被從C&C經過F指令請求過來。而後這個插件將被加載、初始化、而後運行
‘Q’指令(輸入&輸出) 這個指令被用來從C&C到惡意軟件-反之亦然 傳輸工做數據。若是這個C&C想要添加一個字符串到惡意軟件的處理隊列中,它將會發送: Q,string 全部的這些字符串被加入了惡意軟件的輸入隊列而且將會被正在運行的插件處理。若是這個惡意軟件想要上傳它工做的結果,它將會發送: Q,<插件名稱>, <結果字符串>
而後把這些字符串從它的輸出隊列中刪除
‘P’指令(輸出) 這個指令被這個惡意軟件用來發送它的當前狀態給C&C服務器。這個指令的格式爲:
P,<任務運行的flag>,
‘S’指令(輸入)
若是這個惡意軟件接收到這個指令它將會完成全部當前工做的線程,清空輸入和輸出隊列而且釋放其餘的系統資源。在那以後,它將會準備好處理一個新的任務。 總結 總而言之,這些指令以下所示: 輸出指令: R –回送報告 F – 請求文件 Q – 發送數據 P – 報告狀態 輸入指令: G – 運行新的任務 L – 加載插件 Q – 發送數據 S – 終止當前的任務
動態連接庫在數據段存儲了加密形式的配置信息。解密的key也存儲在數據段中。首先,只有頭8個字節被解密,而後這個惡意軟件檢查後4個字節是否與0xDEADBEEF相等。若是是這樣,那麼頭4個字節表明了加密數據的長度。在這以後,剩下的密文就能夠解密了。圖表九 展現瞭解密算法的僞代碼
圖表九 惡意軟件使用的解密算法
咱們分析了這個算法的代碼而且發現這是一個XTEA4加密算法的實現,32輪的5,操做模式是ECB6,7 圖表十展現瞭解密的配置內容樣本
圖表十 解密的配置內容樣本
咱們分析的全部樣本都有一樣的配置格式,配置的第一部分包含了特殊的flags和指向剩下的配置數組數據的偏移量。解密後的配置格式展示在表格二中
Offset | Size in bytes | Description |
---|---|---|
4 | This field contains the number of eight-byte blocks in the configuration – in other words, the length of the configuration in eight-byte blocks | |
4 | 4 | Special marker 0xDEADBEEF |
8 | 4 | Offset to the C&C URL |
12 | 4 | Sleep time between executions of the main loop function of the malware |
16 | 4 | Size of file mapping for the hidden file system |
20 | 4 | Offset to the name of the file that contains the hidden file system |
表格二 惡意軟件配置的描述
正如在表格二中看到的那樣,一個C&C地址直接定義在了惡意軟件配置中而且沒有使用DGA【譯者注3】
正如以前談到的,這個惡意程序使用了一個隱藏的文件系統來存儲它的文件,這個文件系統由一個在初始化中建立的文件組成。這個隱藏文件系統文件的名稱在配置定義,可是它的名稱一般是‘.sd0’。爲了和這個文件配合使用了一個開源的庫‘FAT 16/32 File System Library’。可是它沒有以原始的版本使用,一些函數被修改來支持加密。每一個block被32輪的XTEA算法ECB模式加密而且每一個加密key隨block不一樣而不一樣 這個隱藏的文件系統被用來存儲插件和包含着待處理字符串的文件:URL的列表,用戶名,密碼,諸如此類。一個文件系統的實例的內容如圖表十一所示:
圖表十一 一個文件系統實例的內容
咱們開發了一個基於開源的{能解密和從這樣的文件系統中提取文件的庫}的簡單的工具
正如以前所提到的,這個惡意軟件具備使用插件的功能。在咱們的研究中咱們發現了8種適用於該bot的不一樣插件。插件和它們的配置文件都存儲在隱藏的文件系統中。這裏描述的全部插件都是該惡意軟件在外面部署使用而被發現的。 插件接口 每個插件導出了一個包含了兩個特殊標記的結構:指向有用的插件函數的指針和一個包含插件名稱的字符串。每一個插件包含至少以下兩個這樣的指針:一個指針指向插件初始化函數和一個指針指向執行「去初始化」的函數。兩個在這結構中的標記都是常量:0xDEADBEEF和一個常量20130826咱們猜想是插件的版本。這樣一種結構的例子如圖表12所示:
圖表十二 一個描述插件結構的示例
基於全部的插件都存儲在隱藏文件系統中的事實,它們都沒有被VirusTotal在檢測時用任何反病毒向量發現 rfiscan.so
SHA256 hash sum: 9efed12a67e5835c73df5882321c4cd2dd2 3e4a571e5f99ccd7ec13176ab12cb
這個插件用來發現具備遠程文件包含漏洞(RFI)的網站站點。在初始化過程當中,這個插件下載了一個列表的pattern模式和一個列表的網站站點來檢查。而後它發送特殊的HTTP請求給站點並試圖包含‘http://www.google.com/humans.txt’而且分析對應的HTTP響應。若是HTTP響應包含了‘we can shake’子串,那麼這個插件確認這個網站具備一個遠程文件包含漏洞。一部分帶有pattern模式的列表在圖表十三中展現
圖表十三 一些被‘rfiscan.so’使用來發現RFI網站的pattern模式
這些結果經過使用‘Q’命令傳送給C&C服務器。這些指令的意義展現在表格三中
Command | Description |
---|---|
Q,rfiscan,
|
An RFI vulnerability has successfully been found |
Q,rfiscan,
|
RFI vulnerabilities haven’t been found |
表格三 對‘rfiscan’插件‘Q’指令的描述
wpenum.so SHA256 hash sum: 9707e7682dd4f2c7850fdff0b0b33a3f499e93513f025174451b503eaeadea88
這個插件被用來窮舉WordPress站點的用戶名。這個插件的工做函數接收一個URL,轉換一下,而後用以下的查詢模板發送HTTP請求 <去掉最後末尾部分的初始查詢>/?author=<用戶 id>
用戶ID範圍設定0到5。若是對應的HTTP響應包含了子串‘Location:’而且目的URL包含了子串‘/author/’那麼用戶名就被從目標URL中提取了。使用‘Q’命令把第一個被發現的用戶傳送給C&C服務器。這些指令的意義如表格四所示
Command | Description |
---|---|
Q,wpenum,
|
Username has successfully been found |
Q,wpenum,
|
No username has been found |
Q,wpenum,
|
Connection failed |
表格四 對‘wpenum’插件‘Q’指令的描述
cmsurls.so
SHA256 hash sum: 84725fb3f68bde780a6349d0419bec39b03c85591e4337c6a02dcaa87b2e4ea3
這個插件的工做函數接收hostname,構造一個HTTP GET 請求組裝‘/wp-login.PHP’查詢,而後在對應的響應中查找子串‘name="log"’。因此這個插件在基於WordPress CMS的站點上查找用戶登陸頁面。而其結果經過‘Q’命令發往C&C。這些指令的含義在表格五中展現
Command | Description |
---|---|
Q,cmsurls,
|
URL for login page has successfully been found |
Q,cmsurls,
|
URL for login page has not been found |
Q,cmsurls,
|
Connection failed |
表格五 對‘cmsurls.so’插件‘Q’命令的描述
bruteforce.so
SHA256 hash sum: 6f96d63ab5288a38e8893043feee668eb6cee7fd7af8ecfed16314fdba4d32a6
這個插件用來暴力破解 基於WordPress和Joomla CMS 創建的站點的密碼。 這個插件不支持HTTPS。在咱們研究的過程當中,咱們發現了被這個插件使用的一個包含着密碼的字典。這個字典包含了17,911個密碼。這些密碼的長度在1到32個符號之間。
bruteforceng.so
SHA256 hash sum: 992c36b2fcc59117cf7285fa39a89386c62a56fe4f0a192a05a379e7a6dcdea6
這個插件也是用來暴力破解站點密碼的,可是不像bruteforce.so,這個插件支持HTTPS,以及正則表達式,而且可以被配置用來暴力破解任何登錄頁面。這樣的一個配置的例子如 圖表十四 所示
圖表十四 一個‘bruteforceng.so’插件配置的示例
咱們分析了這個插件的其餘配置而且發現了它也被用來暴力破解DirectAdmin控制面板的敏感信息
ftpbrute.so SHA256 hash sum: 38ee32e644cb8421a89cbcba9c844a5b482b4524d51f5c10dcb582c3c4ed8101
這個插件被用來暴力破解FTP帳戶
crawlerng.so
SHA256 hash sum: d9d3d93c190e52cc0860f389f9554a86c8c67d56d2f4283356ca7cf5cda178a0
這個插件被用來爬行WEB頁面而且取出有用的信息。從C&C服務器得到一個用來爬的網站列表,以及相似爬行深度的其餘參數。這個插件也支持HTTPS協議而且使用了SLRE 10庫來處理正則表達式。這個插件是很是靈活的,一個對應這個插件的配置文件如圖表十五所示。正如你所見,在這個例子中用這個插件來尋找和採集藥品相關的web頁面。
圖表十五 一個‘crawlerng.so’插件的配置文件
crawlerip.so
SHA256 hash sum: 1fc6a6a98bf854421054254bd504f0b596f01fcb9118a3e525c16049a26e3e11
這個插件與‘crawlerng.so’插件相同,惟一不一樣的地方是這個使用一個IP列表而非URL列表
在咱們的研究中咱們發現3個C&C服務器被用來管理僵屍網絡。咱們想辦法進入其中的兩臺而且取得一些統計數據。對C&C管理面板的一個整體歸納如圖表十六所示。容許用戶給BOT添加任務的界面在圖表十七中展現
圖表十六 (在C&C管理面板顯示的bot列表)
圖表十七 在C&C中其餘任務界面
這兩個C&C服務器共同控制了大約1,400個bot。第一個botnet包含了大約1,100個bot,第二個大約300個bot。在分析的時候,botnet的bot都被用於暴力破解WordPress密碼。一個這種暴力破解任務的圖片如圖表十八所示,而且這些暴力破解任務的結果如圖表十九所示。
圖表十八 在更大的botnet控制面板中的暴力破解任務
圖表十九 一些botnet執行暴力破解任務的結果
botnet中被感染的的服務器服務器地理分佈如圖表二十所示。正如你所見,最高感染比例的國家爲美國,俄羅斯,德國和加拿大。
圖表二十 更大的botnet中被感染的的服務器服務器地理分佈。
藍色越深表明感染的服務器數量越多 第三個C&C服務器也被Malware Must Die 1團隊定位了,而且在咱們分析的時候它已經被關閉了 咱們分析了還在運行的兩臺C&C服務器。除了主頁面,源代碼還包含了額外的兩個PHP腳本:config.php 和 update.php 第一個腳本包含了配置數據:數據庫機密數據,管理面板的密碼MD5,任務的最大斷定時間,bot喚醒時間,諸如此類。這段腳本的一部分如圖表二十一所示
圖表二十一 部分C&C配置的數據
update.php腳本被用來喚醒bot。這段腳本訪問一個閒置的bot而且運行在‘Malware representation’章節提到過的PHP腳本。 咱們也發現C&C服務器支持必定數量的沒有被在外面發現的插件。舉例來講,一個插件利用最近發佈的‘Heartbleed’漏洞而且從有漏洞的服務器上收集信息。一段描述了全部可用插件的代碼如圖表二十二所示
圖表二十二 這段代碼展現了必定數量的咱們沒有在外面發現的插件
C&C使用了MySQL 和 memcached(若是可用)來作數據存儲,可是插件存儲在硬盤上 咱們也發現了C&C腳本的代碼也包含了必定量的安全問題,可是描述這些漏洞超出了這篇文章的範圍
在咱們的分析中,咱們發現了一些在Mayhem和其餘*nix惡意軟件之間的共同特色。這個惡意軟件與‘Trololo_mod’和‘Effusion’ 11 類似 – 兩款分別針對Apache和Nginx服務器的入侵工具。全部這三個惡意軟件家族具備以下的共同點: • 配置使用一樣格式
• 使用ECB模式下的XTEA算法加密
• 0xDEADBEEF標記被普遍用於配置文件以及其餘代碼部分
• 動態連接庫的ELF headers使用一樣方式腐化
儘管缺乏證據,咱們懷疑全部這三個惡意軟件家族都是被同一幫派開發的 結論 在完成這個研究以後,咱們能夠確鑿地說爲*nix web服務器製造的botnets正在變得愈來愈流行,就像惡意軟件的現代化趨勢。爲何會這樣?咱們認爲緣由以下:
• Web 服務器botnets提供了一個獨特的經過流量重定向、盜鏈下載、黑帽SEO,諸如此類 的獲利方式模型
• Web服務器具備良好的在線時間,網絡通道而且比常規的私人電腦性能更好
• 在*nix世界裏,自動更新技術並無被普遍使用,尤爲是對比桌面電腦和智能手機時。絕大多數的網站管理員們和系統管理員們須要手動升級他們的軟件而且測試保證他們的基礎業務正常工做。對於普通的站點,專業地維護很是昂貴而且網站管理員沒有機會這麼作。這意味着對於黑客來講尋找這樣的有漏洞的Web服務器而且將之加入botnet中比較簡單。
• 在*nix世界中,反病毒技術並無普遍應用。不少運營商並不提供主動防護機制或者進程內存檢測模塊。況且,一個普通的網站管理員一般不想花費時間閱讀這種軟件的說明書而且解決可能所以出現的性能問題。
Mayhem是一個很是有趣而且精緻的惡意軟件,其擁有靈活而且複雜的架構。咱們但願咱們的研究能夠幫助安全社區對抗如此的威脅。
咱們但願感謝Fraser Howard 和 Charles McCathie Nevile,他們的評論和建議幫助了咱們改進這篇文章。
http://blog.malwaremustdie.org/2014/05/elf-shared-so-dynamic-library-malware.html.
http://sysadminblog.net/2013/11/fake-wordpress-plug-ins/.
FortDiscoBruteforceCampaign.
http://www.arbornetworks.com/asert/2013/08/fort-disco-bruteforce-campaign/.
Wheeler,D.;Needham,R.CorrectiontoXTEA.
http://www.movable-type.co.uk/scripts/xxtea.pdf.
http://en.wikipedia.org/w/index.PHP?title=XTEA&oldid=558387953.
Wikipedia.Blockciphermodeofoperation. http://en.wikipedia.org/w/index.PHP?title=Block_cipher_mode_of_operation&oldid=582012907.
Schneier,B.AppliedCryptography.JohnWiley&Sons,1996.
http://ultra-embedded.com/fat_filelib.
https://github.com/freeoks/SD0_reader.
http://slre.sourceforge.net/.
Effusion–anewsophisticatedinjectorforNginxwebservers.
https://www.virusbtn.com/virusbulletin/archive/2014/01/vb201401-Effusion.
http://www.linuxjournal.com/article/7795.
0x13 譯者注:
【1】 bot定義:Each such compromised device, known as a "bot", is created when a computer is penetrated by software from a malware (malicious software) distribution(來自http://en.wikipedia.org/wiki/Botnet)
【2】 C&C定義:This server is known as the command-and-control (C&C) server(來自http://en.wikipedia.org/wiki/Botnet)
【3】 DGA定義:Domain generation algorithm(來自 http://en.wikipedia.org/wiki/Domain_generation_algorithm)