作者:風流@逢魔安全實驗室
一、背景介紹
方程式泄漏的幾波樣本雖然大都已是好些年前人家就在用的,但是時至今日我們再分析這些樣本,所涉及的技術細節、攻擊方法、思維和角度還是令人嘆為觀止,更有包括像Eternal系列的漏洞更是直接帶來了巨大的影響。其中有一個泄漏了方程式本身ip的樣本引得全球安全研究人員所注意,但目前公開的都是關于對該樣本的猜想,并無技術分析。該樣本是一個專門針對vBulletin論壇系統的功能遠控工具,FormSec將在本文當中對該樣本進行詳細的技術分析和APT攻擊解讀。
vBulletin是一個強大,靈活并可完全根據自己的需要定制的論壇程序套件,在全球范圍內使用都非常廣泛,很多大型論壇都選擇vBulletin作為自己的社區。
二、Funnelout樣本分析
樣本來源:
-
Original file: https://mega.nz/#!zEAU1AQL!oWJ63n-D6lCuCQ4AY0Cv_405hX8kn7MEsa1iLH5UjKU
-
Passphrase:
CrDj"(;Va.*NdlnzB9M?@K2)#>deB7mN (as disclosedby the ShadowBrokers, source)
該功能遠控名為FUNNELOUT共涉及四個版本,各版本功能基本一致,適用時間范圍大概08年至13年之間,而且根據現有的分析結果來看,該工具和vBulletin系統的結合度非常高,利用的核心原理就是vBulletin框架加載template時的特殊邏輯,可以推斷如果vBulletin的版本更新中框架不做大的調整,該工具就一直適用,可能現在已經有了更新的版本。

這里我們挑選v4.1.0.1版本進行分析。腳本運行環境需要perl支持,直接運行該腳本會展示出該工具的使用方法,其中包括數據庫的連接方法、后門操作及其他可自定義參數等。

數據庫連接分為兩種,一種是直接通過定義數據庫連接的相關參數進行數據庫訪問,包括數據庫的ip地址、端口、vbulletin庫名、用戶名、密碼等,在mysql可遠程訪問時可以通過這種方法連接至數據庫進行遠程控制;另一種方式就是腳本直接讀取vBulletin的數據庫配置文件config.php進行解析,獲取host、port、dbuser、dbpass、dbname等再進行數據庫連接,當然可能是在應用服務器上執行,也可能是將配置文件拖回來后本地解析再遠程訪問等情況。
對于遠程控制的op選項大概分為backdoor、proxy及tag三大功能,其他都是圍繞這三點的植入、清除和查看統計等功能,從其命名上也能猜的出來。
接下來我們對這三大塊核心功能操作進行分析解讀。
01 Backdoor功能分析
door功能的實現比較簡單粗暴,這里首先看一下door功能的實現代碼,可以看出是直接將一句話后門經過base64編碼后放在了數據庫當中,默認拼接到了template表的footer template當中。

接下來進行復現,運行腳本指定door將后門插入到數據庫當中。

通過showDoor可以看出后門代碼通過base64已經拼接在template當中。

回過頭來我們再看看vBulletin的代碼,為什么會這樣設置后門。
vBulletin的整個框架實現就將需要調用的各種template放在了數據庫當中,當調用時會從template表中取出并eval執行,腳本的開發者正是利用了這個邏輯進行后門植入。比如說這里的door的實現,vBulletin的global.php中含有對header和footer模板的調用,funnelout默認是將proxy和door的后門代碼植入到了這兩個template表當中,如下圖所示template代碼被取出執行,其中包含的后門代碼也被一并執行。

因此vBulletin論壇的維護人員若是在應用服務器進行惡意代碼查殺肯定是無效的,只有進行數據庫安全審計才可能觸發告警,畢竟還要看是否有相關規則,這也就是該后門的厲害之處。
當然所有包含global.php的頁面都可以觸發后面執行,只需要將需要執行的代碼放在請求頭的Referrer自定義屬性當中即可。

02 Proxy功能分析
funnelout的Proxy實現原理與door一致,不過proxy的代碼相對復雜一些,proxy有一套模板代碼,腳本使用者可以根據實際環境定義代理要訪問的host及path等,最后生成特定的proxy代碼。

接下來進行proxy功能復現,使用proxy時需要指定tag,我們根據代碼構造一個簡單的tag并插入

插入代理后可以使用對應的showProxy查看header template的內容,和door一樣已經過base64編碼后拼接在了數據庫當中

我們看一下被植入base64解碼后的proxy代碼,如下圖所示我已經在代碼中進行了一些標注來方便大家理解代碼,大概邏輯就是獲取到了代理需要請求的內網web服務host,并封裝出一個請求包來向內網web服務器發送通過匹配的url請求,可以是get請求也可以post請求,postdata就是向vbulletin請求提交的data。

可以看出其中將64.38.3.50加入了黑名單中,在這里的具體意義還不確定,但可以確定這是攻擊者所操作的一臺server,威脅情報中也關聯到很多和這個ip有關的方程式樣本。

最后proxy的復現情況如下,但是這里說的proxy不能說是完全意義上的代理,更有點像ssrf的那種意思

03 Tag功能分析
Tag代碼大體上分為兩種,第一種是在建立代理時,腳本會自動加一個proxytag,我們可以使用findAll查看,默認是植入在navbar template當中。

生成的Tag代碼大致如下,相對復雜一些,可以發現tag代碼和vBulletin代碼高度融合,同樣的我也在在代碼當中加了一些注釋方便大家理解,有興趣的同學可以自己調試一下。tag代碼的主要用途就是經過一些條件判斷后觸發page view,比較有意思的是tag代碼要觸發show page必須在第一次標記用戶后的一天內,超過一天就無效了,只能進行reset,有點自毀程序的意思,并且在第一次標記用戶后會產生一個默認為0-6的隨機數,隨機數隨訪問次數遞減,直至為0時才會觸發通過iframe標簽觸發pageview,觸發后該數值會再次減1到-1,并返回用戶已被標記等待重置,但該功能在這里的意圖目前尚不清楚。

看一下proxytag的復現過程
某vb論壇用戶登錄后訪問了類似鏈接查看私信內容:
http://127.0.0.1:8888/vbulletin/private.php?do=showpm&pmid=14
黑客可以通過showTagged可以查看到當前已被標記用戶,并在該用戶第一次訪問時產生隨機數4

也就是在該用戶訪問該頁面4次后觸發page view,發送攜帶當前用戶名的hex編碼的請求。猜測可能是用于標記特定用戶再發起針對性攻擊。

再次使用showTagged查看發現該用戶已被標記并等待重置

第二種則是使用tag命令直接插入的tag代碼,這里要細分的話也可以按照是否使用nohttp分為兩類,可以從代碼上看出它們的區別

對Tag進行了一個總結

這里不使用 –nohttp進行功能復現,同樣是通過base64加密后放在了navbar template中

當論壇用戶訪問時觸發page view

到這里tag功能基本完成分析,我們在網上找到了一個被公開的攻擊痕跡,根據以上分析,這里應該是tag的第三種情況

其中涉及的域名technology-revealed.com,歷史解析記錄也有很多國家。

另外需要注意的是在tag代碼中發現了兩個特殊的md5,腳本會校驗被標記用戶的用戶名是否與這兩個md5相同
84b8026b3f5e6dcfb29e82e0b0b0f386 Unregistered (EN)
e6d290a03b70cfa5d4451da444bdea39 dbedd120e3d3cce1 (AR)
還有代碼中排除標記了來自特殊地域的ip地址
if(preg_match('/^(64.38.3.50|195.28.|94.102.|91.93.|41.130.|212.118.|79.173.|85.159.|94.249.|86.108.)/',IPADDRESS)){
return "";
}
除了之前提到的唯一確定ip——64.38.3.50,其余ip段涉及到約旦、土耳其和埃及等國家和地區。
最后根據以上信息,我們猜測technology-revealed.com為方程式所操控的服務器,它可以用來接收一些來自敏感話題討論論壇的特殊地區用戶的標記信息,從中可以篩選出特定目標,進行定點攻擊,包括可以從vBulletin 訪問日志中收集用戶ip地址,數據庫中收集用戶密碼信息等,再配合其他方式進行水坑攻擊,比如再次利用vBulletin template進行掛馬,還有方程式的其他漏洞足以完成后續攻擊,拓廣戰果。當然以上只是我對APT攻擊環節中tag利用的猜想,具體的可能只有方程式自己人知道了。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/517/
暫無評論