對 *nix WEB伺服器的一個隱藏威脅

wyzsk發表於2020-08-19
作者: lxj616 · 2014/07/28 11:45

from:https://www.virusbtn.com/virusbulletin/archive/2014/07/vb201407-Mayhem

0x01 簡介


網站甚至整個伺服器被感染越來越普遍。通常這種感染被用來竊聽通訊,黑帽SEO,盜鏈下載,諸如此類。並且在絕大多數的案例中這種惡意軟體由相對比較簡單的PHP指令碼組成。但是在最近的兩年裡,許多更加複雜的惡意軟體家族被發現。Mayhem是一個針對網站伺服器的多用途模組化bot。我們的團隊研究了這個bot以獲取對其不只是惡意軟體客戶端的理解,也瞭解了一些它的C&C伺服器指令,這允許我們去搜集一些統計資料。 這篇文章應當被認為是Malware Must Die團隊之前發表文章1的補充。我們在2014年4月遭遇了Mayhem bot,並且這篇文章是我們獨立研究的結果。2是我們找到的唯一另外關於Mayhem的出版物。在我們的研究中,我們也發現Mayhem是一個更大的‘Fort Disco’暴力破解運動(在3被公開)的延續

0x02 惡意軟體展示


首先,這一部分的惡意軟體表現為一段PHP指令碼。我們分析了這個PHP病毒釋放器版本的SHA256 hash:b3cc1aa3259cd934f56937e6371f270c23edf96d2c0801 728b0379dd07a0a035. 用VirusTotal分析這段指令碼的結果呈現在 表格一 中

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病毒釋放器的結果

在執行過後,這段指令碼kill了所有‘/usr/bin/host’程式,識別系統架構(x64 還是 x86)以及系統型別(Linux 還是 FreeBSD),然後釋放一個惡意的動態連結庫命名為‘libworker.so’。這段程式碼也定義了一個變數‘AU’,其中儲存了這段指令碼被執行的完整URL。這段PHP指令碼的第一部分顯示在 圖表一 中

Figure 1. First part of the PHP dropper.

圖表一 PHP病毒釋放器的第一部分

在那之後,這個PHP病毒釋放器建立了一個Shell指令碼叫做‘1.sh’,這個指令碼的內容如圖表二所述。除此之外,這段指令碼也建立了環境變數‘AU’,這和在PHP指令碼中定義的那個一樣。

Figure 2. The contents of the ‘1.sh’ script.2.

圖表二 ‘1.sh’指令碼的內容

然後這個PHP病毒釋放器透過執行命令‘at now -f 1.sh’ 執行了這段SHELL指令碼。這個命令新增了一個計劃任務。在執行之後,這個病毒釋放器等待最多5秒鐘的時間,然後就刪除計劃任務。如果執行‘at’命令失敗,這個病毒釋放器就會直接執行‘1.sh’指令碼。這部分PHP病毒釋放器的程式碼如 圖表三 所示

enter image description here

圖表三 PHP病毒釋放器的最後一部分

0x03 動態連結庫初始化


LD_PRELOAD技術允許第一個載入動態連結庫並且允許它輕易hook到不同的函式中。如果在這樣的動態連結庫中一個標準的庫函式被覆寫,那麼這個庫將會攔截所有的對那個函式的呼叫。這個惡意的樣本包含了它自己實現的‘exit’函式,所以被‘/usr/bin/host’呼叫時這一個惡意函式替代了原始的函式。 在被hooked的‘exit’函式執行過程中,呼叫了一個額外的初始化函式,這個函式的工作流程如 圖表四 所示。在這個初始化過程中,如下步驟被執行:

• 一個只包含了‘exit’函式的ELF檔案被釋放

• 這個程式forks然後子程式執行ELF檔案然後結束它的執行

• 父程式執行更多的初始化工作:它試著去連線Google DNS 服務(IP 地址是 8.8.8.8),解密並且解析配置檔案然後獲取系統的各種引數

enter image description here

圖表四 初始化函式的工作流程

一旦初始化結束,這個動態連結庫檔案就被從硬碟上刪除。這個惡意軟體之後試著去開啟一個檔案即一個隱藏檔案系統並對映到記憶體,然後一個隱藏的檔案系統就被初始化了。然後這個程式forks,父程式退出,然後子程式繼續執行。 關於被hooked的‘exit’函式高度抽象的工作流程如 圖表五 所示。成功被執行的執行路線在流程圖上用紅色標識。正如你所見,執行的路線既不是單純父程式或者單純子程式。我們假設這是一種針對那些在fork後設定了只跟蹤子程式執行或者只跟蹤父程式執行的除錯者的反除錯技巧。

Figure 5. High-level workflow of the hooked ‘exit’ function.

圖表五 被hooked的‘exit’函式高度抽象的工作流程

在這些步驟之後,子程式(唯一仍然存活的)執行惡意程式的主迴圈。這個惡意程式將等待配置中設定的時間然後執行做實際工作的函式

0x04 主迴圈函式


這個函式首先建立起一個socket以用來和C&C伺服器通訊,然後檢查被感染的宿主主機的資訊是否自這個有效的session開始,也就是指,自惡意軟體被執行開始,已經被髮送到C&C。如果flag標識資訊已經被成功送達C&C伺服器,這個惡意軟體傳送一個ping資料包,然後接收並且執行C&C命令。

如果這個flag標識資訊還沒有被成功送達,這個惡意軟體會準備一個包含了‘uname -a’命令輸出,被感染系統的架構資訊,的HTTP資料包,以及關於系統使用者執行程式的許可權資訊。在這個資料包被髮送後,這個惡意軟體讀取C&C的響應然後如果有錯誤產生就會退出這個函式。如果一切都正常,這個惡意軟體更新flag並且試著讀取並執行其他C&C響應中的命令。 一個高度抽象的的主迴圈函式工作流程如 圖表六 所示

enter image description here

圖表六 動態連結庫主迴圈函式高度抽象的工作流程

在工作中,惡意軟體包含了4個列表和2個佇列。一個佇列用於輸入的字串(從C&C伺服器接收的字串),然後另一個佇列用於輸出字串(將被髮送到C&C伺服器的字串)。第一個列表用來儲存外掛工作函式的地址,第二個列表儲存在寫到socket之前處理資料的函式地址(用來傳輸資料到C&C的那個),第三個列表用來儲存從socket讀出資料前資料處理函式的地址(從C&C接收到的資料),並且第四個用來儲存將會從字串佇列中處理資料的函式地址。圖表七展示了這些佇列和列表是怎樣在惡意軟體的工作流程中被使用的 enter image description here

圖表七 資料從C&C伺服器讀取時的工作流程

enter image description here

圖表八 展示了惡意軟體處理任務時的工作流程

圖表八 外掛處理字串的工作流程

0x05 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>,

相關文章