2016年3月15日 星期二

b114df8faf9f9defeb2b27e3afdd3249分析

前陣子分析了一個在FreeBSD上的Malware,應該是Web有漏洞被打進去然後掛馬的,而且故意取名跟某支程式一模一樣的名字

檔案的Hash
MD5: b114df8faf9f9defeb2b27e3afdd3249
SHA1: 3041f7461c78db46063dc3dead1cc4c13dc7573f
SHA256: 9a0bae7a8bbb9047f91cebbf3f9e93d6d3ba7ee7ba24d60f6f0644c0cb87540c


這支檔案是個64位元的ELF可執行檔案格式,跑在FreeBSD上,被strip
ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 9.1, stripped

連結兩個shared library
libutil.so.9
libc.so.7


因為檔案被strip過,除了連結外部函數庫以外的函數名的符號全都被去除掉了,所以辨識不出原本的函數名分別叫甚麼
只能後面經過人工分析去判斷各個函數分別做了甚麼事來重新命名可能的函數名。


程式的入口點是在0x401540,不過看起來雖然是最早的進入點,但不是main函數,似乎是GNU C Compiler__attribute__((constructor))機制,讓它可以在執行main之前執行它想插入的程式碼。

大致上是處理執行檔的檔名參數環境變數,還有用atexit設置程式離開時要做的事,基本上不是甚麼重點。

0x40f230的地方就是真正的main函數了,也可以看到分支或呼叫的圖比較多變化一點
main函數一開始搭配signal()fork()setsid()來做個簡單的daemon guard來常駐於系統中。
中間部分是資料解密還原的部分,它先進去某個做xor動作的wrapper function已被我們重新命名為xor_decode)把很長一段的資料做xor還原,接著在offset 0x617442以及offset 0x617440的地方各把兩個bytes的資料做迴旋。

(xor_decode函數做的事情)

XOR key0xAE,我們可以寫個script來跑出結果
第一段解密完後的結果是Hello378,後面還有很多被解密的資料,包括domain name,我們就不一一列出來。

不確定Hello378這個字串在這支程式裡本身有沒有甚麼實質用途,出現的意義不明,可能是攻擊者做記號的一個特徵。

因為已經經過解碼過後了,我們可以得知在資料段的變數name的明文是otzo.zzux.com。因為圖太大了,詳細就沒有全部列出來,它大概做的就是連到otzo.zzux.com取得C2 serverip然後做傳統惡意程式很常見的反向連線。

otzo.zzux.com是一個註冊在Dynamic DNS域名供應商changeip.com這家底下的,因為攻擊者的ip可能會變,所以他們利用DDNS來更新ip來反向連線。

因為整個binary還是有很多特別的字串,甚至是debugassert訊息沒有拿掉,所以我們可以在網路上查到他有用到一個叫做BigDigitshttp://www.di-mgt.com.au/bigdigits.html的函數庫,用在這個惡意程式的加密演算法上面。我們可以試著交叉參考來還原出一些被去掉的函數名,大概都不是重點,不過可以過濾掉不是我們要的部分:
粗略

看到一段特別存好幾個特別資料的函數,丟Google查,原來是SHA1加密演算法會用到的初始化變數種子,所以我們就暫時把它命名為getDigest()

反查DNS可以查到它的IP220.67.200.23
經查是來自韓國,而且曾經有過惡意行為紀錄,所以有在一些黑名單內。
這部機器是屬於韓國的朝鮮大學裡的,可能只是跳板中繼站。

某段函數裡面有0x360x5c,應該是類似SHA加密演算法家族的演算法特徵

雖然ELF不像PE格式一樣可以萃取出編譯器編譯出執行檔的timestamp,可是我們可以dump.comment section來看一些可能可以提供資訊的資料,像是開發環境的系統版本與編譯器版本之類的,可以拿來當作參考寫這支惡意程式的攻擊者大概是甚麼時間開發這支程式的。

呼叫pseudo terminal的相關的一些函數來建立起通道讓它可以在shell上操作。

有機會設定兩個環境變數,分別是HISTFILETERM,會透過攻擊者的那方傳來的資料設定值。

會透過execl呼叫sh帶入攻擊者傳來的shell指令然後執行。

會判斷C2 command中是否帶有getput,分別會呼叫攻擊者實作的上傳檔案和下載。

libnet.so似乎不是真的libnet.so,應該是偽裝做讀寫的動作,應該是透過攻擊者傳過來的檔案然後讀入資料並當作產生RSA Key的種子。

其實還有另一支程式,應該是搭配一組的,不過應該這支才是重點,所以就稍微分析了一下這支。

沒有留言:

張貼留言