作者:
360安全衛士
·
2016/01/05 18:33
Author:王陽東(雲安全研究員)@360資訊保安部
0x00 引子
近期, 部署於360雲平臺(https://cloud.360.cn)的”360天眼威脅感知系統”發現系統告警某合作伙伴剛開通的雲主機存在異常流量,聯合排查後發現有惡意攻擊者利用redis crackit漏洞入侵伺服器並種植了名為unama的惡意程式。 360雲安全研究員 --“王陽東”對此惡意程式進行較為深入的分析,此樣本可能是billgates殭屍網路的一個變種。
0x01 billgates後門簡介
billgates是一個近幾年非常活躍的DDoS殭屍網路,此程式組成的殭屍網路遍及世界。網路中bot節點多是一些存在弱口令或軟體漏洞的linux主機,攻擊者利用ssh爆破、exploit、1day、2day等方式對大量IP進行攻擊嘗試獲得伺服器的控制權,並透過部署殭屍木馬被控端壯大殭屍網路。殭屍網路根據服務端命令可以實現DDoS攻擊、反彈shell等多種操作。
0x02 樣本分析
捕獲到的樣本檔案大小為1223123
位元組,MD5值為EFF1CB4E98BCC8FBCBDCA671D4C4A050
。
透過readelf得到的原始碼檔名共有44個,從原始檔名猜測此程式有較多工作執行緒。
靜態分析後發現此樣本不同部分間的程式碼風格差異較大:main函式的程式碼比較簡單粗糙,而主功能類CManager及附屬類部分卻展現出病毒作者對C++的熟練應用。
A.main函式
初始化操作:
程式使用自定義演算法從.rodata段解密出配置資訊並儲存,獲取程式檔案大小與配置資訊中的對應值進行對比實現簡單的自校驗,然後在父程式路徑中查詢gdb實現反除錯。
呼叫自定義解密函式,獲取硬編碼資料進行拼接,得到如DbSecuritySpt、selinux、getty、/tmp/moni.lod、/tmp/gates.lod等字串並儲存到全域性變數。檢查當前程式路徑確定要執行的功能。 路徑和功能的關係如下:
程式路徑 |
後門種類 |
功能函式 |
主要功能 |
/usr/bin/.sshd |
|
MainMonitor |
Monitor,守護程式 |
未知路徑 (與其它型別不匹配) |
1 |
MainBeikong 安裝等操作,並執行主要功能 |
|
/usr/bin/bsd-port/getty |
2 |
MainBackdoor |
主要功能執行程式 |
/bin/ 、/usr/bin/ 、/usr/sbin/ 下netstat、lsof、ps或ss |
3 |
MainSystool |
執行/usr/bin/dpkgd 下備份的系統工具並過濾輸出資訊 |
若是0,1,2類後門則從硬編碼中拼接一串十六進位制數字符串(其實是兩部分十六進位制數,以大寫字母O分隔,看似一串),
根據後門型別解密對應部分的十六進位制數串,0,1類後門得到的配置是173.254.230.84:3411:1:1:yz:1,
2類後門得到的配置是fk.appledoesnt.com:30000:1:1:yz:1
。用冒號分隔字串得到6個配置項並儲存。
檢測檔名是否是“update_temporary”,若是則執行DoUpdate並退出。
執行對應的功能函式。
MainMonitor(守護程式):
進入daemon,產生pid檔案/tmp/moni.lod
,讀取/tmp/notify.file
內容並儲存,建立執行緒類CThreadMonGates並啟動監視執行緒,主執行緒迴圈sleep掛起。監視執行緒每分鐘判斷一下/tmp/gates.lod
檔案(MainBackdoor功能程式的pid file), 若檔案不存在則複製自身到從notify.file中獲取到的檔案路徑並執行新路徑下的程式。
MainBeikong(程式安裝):
進入daemon模式,呼叫KillChaos結束/tmp/moni.lod
和/tmp/gates.lod
指向的舊程式 (病毒作者搞錯了strcmp的返回值,所以這裡的程式碼並沒有什麼卵用),再次結束/tmp/moni.lod
,結束/tmp/bill.lock
並刪除bill.lock。再次結束/tmp/gates.lod
並設定自身pid檔案。在/etc/init.d
、/etc/rc(1-5).d
等路徑設定S97DbSecuritySpt啟動項。
結束/usr/bin/bsd-port/
下getty.lock和udevd.lock對應的程式,刪除udevd.lock,複製自身到/usr/bin/bsd-port/getty(對應MainBackdoor)
並啟動。將當前程式路徑寫入/tmp/notify.file
(守護程式使用),複製當前檔案到/usr/bin/.sshd
(對應MainMonitor)並啟動。執行MainProcess函式。MainProcess函式包含了木馬的主要功能。
之所以在安裝操作中執行猜測是因為病毒的一處配置錯誤:
由於之前以字母O分隔的兩串hex順序搞反了,導致2類後門(木馬功能主體)得到的是fk.appledoesnt.com這一無效域名,而1類後門(安裝程式)卻能得到173.254.230.84:3411這個有效IP,所以在沒有找到問題原因的情況下在安裝函式最後加入主功能函式(MainProcess)也不失為一種臨時解決方案。
MainSystool(系統工具替換):
獲取當前程式名及引數,呼叫/usr/bin/dpkgd/
下對應的原始系統程式(netstat 、lsof、ps、ss)。從原始系統程式的輸出中過濾掉包含木馬所在目錄、服務端通訊埠等資訊的行。
MainBackdoor(木馬功能主體):
進入daemon,設定pid檔案,以 S99selinux為服務名建立啟動項。移動系統程式ps、ss、netstat、lsof到/usr/bin/dpkgd/
目錄,複製自身到/bin
、/usr/bin
、/usr/sbin
下替換ps、ss、netstat、lsof等系統程式,執行主功能函式MainProcess。
MainProcess函式:
主功能函式MainProcess首先掛起2秒,刪除升級用的臨時檔案(./update_temporary
),根據/etc/resolv.conf
和谷歌dns(8.8.8.8、8.8.4.4)初始化CDNSCache類的例項g_dnsCache
。
初始化g_cnfgDoing
(嘗試讀取conf.n檔案)、g_cmdDoing
(嘗試讀取cmd.n檔案)、g_statBase
類例項,將g_sProvinceDns
中330個IP轉為數字形式存入g_provinceDns
物件。嘗試透過insmod載入當前目錄下的xpacket.ko驅動(未發現此檔案)。從/usr/lib/libamplify.so
中讀取IP存入g_AmpResource
結構(未發現此檔案)。初始化CManager(1076位元組),設定訊號處理函式,無限迴圈sleep。
B.CManager類(畫風突變):
CManager類包含了bot的所有功能,此類擁有很多成員,每個成員實現一定的功能,其主要成員對應列表大致如下:
成員 |
偏移 |
功能 |
vectorIPs |
0x00 |
控制伺服器IP地址(可存在多個) |
CThreadSignaledMessageList |