最新版本的ModSecurity增加了ssdeep檢測webshell的接口,于是猛地回憶起搞客戶端安全(游戲安全)的時候買過一本書《惡意軟件分析訣竅與工具箱-對抗“流氓”軟件的技術與利器》,這本書就提到了用ssdeep來查找惡意軟件(webshell是惡意軟件的一種,安全領域是互通的嘛)。本文介紹如何使用它來檢測webshell。
一 、安裝ssdeep
下載ssdeep并安裝 http://ssdeep.sourceforge.net/
tar zxvf ssdeep-2.12.tar.gz
cd ssdeep-2.12
./configure
make
make install
二、識別webshell實例
接下來我們下載一個webshell,試一試如何使用ssdeep來識別webshell
以b374k.php為例
首先獲得webshell b374k.php的ssdeep hash(fuzzy hashing)值,并存儲到b37_hashs.txt文件中
ssdeep -b webshell/b374k.php >b37_hashs.txt
cat b37_hashs.txt
ssdeep,1.1–blocksize:hash:hash,filename
384:UsaSwsF3RtJhwhxY5janx0Rig5xJx52FRsBU0ipgFHF3xR:44snx0Rig5x752EBUxpc5,"b374k.php"
然后使用這個值來獲得相似度,相似度為100(當然啦,因為沒有做任何修改)
ssdeep -bm b37_hashs.txt webshell/b374k.php
b374k.php matches b37_hashs.txt:b374k.php (100)
為了方便理解,我們拿ssdeep與md5做類比
md5 webshell/b374k.php
MD5 (webshell/b374k.php) = b8d3f0f9ad8b1083f24072f8cfe13e04
我們知道對文件取md5值是用于驗證文件的完整性的,因為它對任意的修改都能感受到(hash碰撞小概率事件除外),而ssdeep則用于計算文件相似度,它是通過計算上下文相關的分段hash值(fuzzy hashing)來判斷文件相似度的。在識別webshell的場景中,我們可以先獲取樣本的ssdeep hash值,然后設置相似度范圍,來識別同一系列的變形shell。想想一個小白黑客獲得一個好用的webshell后,第一件事會干嘛?肯定是改變登錄賬號密碼。
cp webshell/b374k.php webshell/b374k.php.bak
vim webshell/b374k.php.bak
ssdeep檢測webshell – 碳基體 – 碳基體
想雁過留痕的,估計還會改webshell的title等文本來標記到此一游。
ssdeep檢測webshell – 碳基體 – 碳基體
ssdeep檢測webshell – 碳基體 – 碳基體
心思稍微重點的想繞過WAF的童鞋,說不定還會修改cookie中的關鍵字,例如批量替換cookie txtauth關鍵字。
ssdeep檢測webshell – 碳基體 – 碳基體
修改完畢后,分別用md5與ssdeep來看發生了什么。
md5 webshell/b374k.php.bak
MD5 (webshell/b374k.php.bak) = b8d3f0f9ad8b1083f24072f8cfe13e04
md5值發生了變化,說明webshell文本內容發生了變化;接著使用ssdeep來查看修改后的webshell的相似度
ssdeep -bm b37_hashs.txt webshell/*
b374k.php matches b37_hashs.txt:b374k.php (100) #原始webshell
b374k.php.bak matches b37_hashs.txt:b374k.php (97)#修改了登錄賬號與作者標記
b374k.php.bak2 matches b37_hashs.txt:b374k.php (88)#修改了登錄賬號、作者標記、cookie特征
最后,我們選擇一個合適的相似度來判斷是否為webshell(真實場景中,調參找到合適的閾值才是考驗人的活…)。
例如,只篩選相似度90以上的
ssdeep -t 90 -bm b37_hashs.txt webshell/*
b374k.php matches b37_hashs.txt:b374k.php (100)
b374k.php.bak matches b37_hashs.txt:b374k.php (97)
三、擴展
除了使用ssdeep來查找相似的惡意軟件(靜態文本),我們還可以逆向思維,根據相似度來判斷混在正常進程中的惡意進程,依據是進程在運行時由于變量變化而發生的變動是輕微的,而代碼被加殼后的的變化是相當顯著的,例如UPX加殼會使相似度瞬降到0%。