走近科學:如何一步一步解碼複雜的惡意軟體
寫在前面的話
在檢測網站安全性的過程中,最麻煩的一部分工作就是要確保我們能夠找出網站中所有已存在的後門。絕大多數情況下,攻擊者會在網站各種不同的地方注入惡意程式碼,並以此來增加再次感染該網站的成功率以及儘可能久地實現持續感染。
雖然我們之前已經給大家介紹過數百種後門以及相應的影響,但今天我們想跟大家更加深入地討論一些關於惡意軟體的分析技術,即如何解碼複雜的高階惡意軟體。
本文所分析的惡意軟體感染樣例早在幾個月前就已經出現了,但是受這種惡意軟體變種所感染的網站(例如WordPress和Joomla等CMS)數量卻一直在增加。
惡意軟體
成功感染目標網站之後,攻擊者可能會進行注入後門和Web Shell、以及新增偽造的管理員使用者等惡意操作。一般來說,攻擊者都會採用一種或多種技術來隱藏自己的惡意程式碼,例如編碼、加密和混淆等等。
請大家先看下面給出的程式碼段。其中,攻擊者同時使用上面舉例的三種技術。接下來,我們會一步一步地告訴大家如何對這段程式碼進行解碼和分析。
原始的惡意軟體程式碼段:
簡化程式碼
在解碼過程中,最重要的是要理解程式碼的邏輯結構。為此,我們使用了PHP Beautifier來將之前的程式碼段轉換成了下圖所示的格式:
雖然目前為止程式碼仍然是不可讀的,但是我們現在至少已經瞭解了程式碼的程式設計邏輯架構。
攻擊者一開始聲明瞭一個名叫”$hc7e1d20”的變數,而這個變數是沒有任何實際意義的。根據我們的經驗來看,這個變數的值(406)可能是攻擊者用來標識惡意軟體變種版本的。
除此之外,還有一些全域性變數也對我們理解程式碼不會提供任何幫助,我們可以直接忽略它們。
這個惡意軟體樣本基本上使用的是字元/字串修改技術,攻擊者在變數中存放了很多十六進位制字元,然後再將它們編譯成不同的變數。
第一個樣例如下:
這段程式碼可以直接通過下面的bash命令來進行轉譯:
$ echo -e"x47x4cx4fBx41x4cx53"
GLOBALS
$ php -r 'echo"x47x4cx4fBx41x4cx53";'
GLOBALS
這個值(${GLOBALS}[‘tbb6a’])似乎使用了某些特殊字元來防止被轉譯,但是惡意軟體最終似乎並沒有使用這個值。現在,我們就可以建立一個簡單的PHP指令碼,然後自動化地打印出所有的變數以及相應的值。
查詢和替換
得到這些資訊之後,我們就可以使用查詢和替換功能了。
第一個變數如下:
我們可以得到下面的轉譯結果:
為了增加程式碼的可讀性,我們將’be10eb436’替換成了’arr’(因為它被宣告為了一個array()),然後我們繼續對字元進行轉譯。
幾分鐘之後,我們得到了如下所示的程式碼:
現在一切已經更加明朗了,接下來我們還要對程式碼進行一些調整。其中,前幾個變數可以直接替換成下列形式:
$arr['l0e6'] = ‘chr’;
$arr['ac6c24d1'] = ‘ord’;
$arr['s8bb921e'] = ‘strlen’;
將程式碼種各個變數和值調整到相應位置之後,我們就得到了上述程式碼中的第一個函式:
惡意目的
替換了所有的函式以及變數之後,我們就可以得到如下所示的程式碼段了:
得到了完整並且可讀的惡意程式碼之後,我們發現了幾個有意思的地方:
1. 其中有一個名叫l3f5() 的函式,該函式負責通過按位異或計算來執行加密和解密操作。 2. 函式 q057860()採用了兩層異或加密/解密計算。 a) 第一層計算中,金鑰是一個預定義的常量: ($w158 = ‘2cef0f87-62fe-4bb9-a1de-4dc009e818ea’;)。 b) 第二層所使用的金鑰來自於POST引數或HTTP coockie。 c) 這個函式主要用來對經過加密的序列化資料進行解碼。其中,序列化資料是攻擊者通過cookie或POST引數傳遞給惡意指令碼的。 3. 解碼資料可能包含: a) 可執行的PHP程式碼。 b) 提供關於後門和PHP版本資訊的命令。
總結
現在網上有很多不同型別的惡意軟體,但並非所有的惡意軟體都是直接通過指令碼來執行惡意命令的。比如說在這個樣本中,它可以通過$_POST或$_COOKIE請求來接收任意命令,而Web伺服器預設是不會記錄這種行為的。
為了防止網站被惡意軟體所感染,我們強烈建議管理員採用類似檔案完整性監測以及Web應用防火牆(WAF)等安全措施。除此之外,我們還建議管理員定期檢查網站的日誌記錄以儘早地發現可疑行為。