洞悉互聯(lián)網(wǎng)前沿資訊,探尋網(wǎng)站營銷規(guī)律
作者:Smileby陌少羽 | 2017-06-09 08:13 |點(diǎn)擊:
一 什么是webshell
“web”的含義是顯然需要服務(wù)器開放web服務(wù),“shell”的含義是取得對服務(wù)器某種程度上操作權(quán)限。webshell常常被稱為匿名用戶(入侵者)通過網(wǎng)站端口對網(wǎng)站服務(wù)器的某種程度上操作的權(quán)限。
簡單理解:webshell就是一個web的頁面,但是它的功能非常強(qiáng)大可以獲得一些管理員不希望你獲得的權(quán)限,比如執(zhí)行系統(tǒng)命令、刪除web頁面、修改主頁等。
webshell中由于需要完成一些特殊的功能就不可避免的用到一些特殊的函數(shù),我們也就可以對著特征值做檢查來定位webshell,同樣的webshell本身也會進(jìn)行加密來躲避這種檢測。
二 webshell長什么樣子
下圖就是一張php webshell的截圖,它的功能還是比較全的,如果你是網(wǎng)站管理員的話肯定是不希望普通用戶獲得下面的權(quán)限的。
Webshell的運(yùn)行流程:hacker -> HTTP Protocol -> Web Server -> CGI。簡單來看就是這樣一個順序:黑客通過瀏覽器以HTTP協(xié)議訪問Web Server上的一個CGI文件。棘手的是,webshell就是一個合法的TCP連接,在TCP/IP的應(yīng)用層之下沒有任何特征(當(dāng)然不是絕對的),只有在應(yīng)用層進(jìn)行檢測。黑客入侵服務(wù)器,使用webshell,不管是傳文件還是改文件,必然有一個文件會包含webshell代碼,很容易想到從文件代碼入手,這是靜態(tài)特征檢測;webshell運(yùn)行后,B/S數(shù)據(jù)通過HTTP交互,HTTP請求/響應(yīng)中可以找到蛛絲馬跡,這是動態(tài)特征檢測。
靜態(tài)檢測通過匹配特征碼,特征值,危險函數(shù)函數(shù)來查找webshell的方法,只能查找已知的webshell,并且誤報率漏報率會比較高,但是如果規(guī)則完善,可以減低誤報率,但是漏報率必定會有所提高。優(yōu)點(diǎn)是快速方便,對已知的webshell查找準(zhǔn)確率高,部署方便,一個腳本就能搞定。缺點(diǎn)漏報率、誤報率高,無法查找0day型webshell,而且容易被繞過。對于單站點(diǎn)的網(wǎng)站,用靜態(tài)檢測還是有很大好處,配合人工,能快速定位webshell,但是如果是一個成千上萬站點(diǎn)的大型企業(yè)呢,這個時候再人肉那工作量可就大了。所以用這樣一種思路:強(qiáng)弱特征。即把特征碼分為強(qiáng)弱兩種特征,強(qiáng)特征命中則必是webshell;弱特征由人工去判斷。加入一種強(qiáng)特征,即把流行webshell用到的特征作為強(qiáng)特征重點(diǎn)監(jiān)控,一旦出現(xiàn)這樣的特征即可確認(rèn)為webshell立即進(jìn)行響應(yīng)。要解決誤報和漏報,就不能拘泥于代碼級別了??梢該Q個角度考慮問題:文件系統(tǒng)。我們可以結(jié)合文件的屬性來判斷,比如apache是noboy啟動的,webshell的屬主必然也是nobody,如果我的Web目錄無緣無故多了個nobody屬主的文件,這里就有問題了。最理想的辦法是需要制度和流程來建設(shè)一個web目錄唯一發(fā)布入口,控制住這個入口,非法進(jìn)來的Web文件自然可以發(fā)現(xiàn)。
筆者基于靜態(tài)檢測的webshell工具
webshell傳到服務(wù)器了,黑客總要去執(zhí)行它吧,webshell執(zhí)行時刻表現(xiàn)出來的特征,我們稱為動態(tài)特征。先前我們說到過webshell通信是HTTP協(xié)議。只要我們把webshell特有的HTTP請求/響應(yīng)做成特征庫,加到IDS里面去檢測所有的HTTP請求就好了。webshell起來如果執(zhí)行系統(tǒng)命令的話,會有進(jìn)程。Linux下就是nobody用戶起了bash,Win下就是IIS User啟動cmd,這些都是動態(tài)特征。再者如果黑客反向連接的話,那很更容易檢測了,Agent和IDS都可以抓現(xiàn)行。Webshell總有一個HTTP請求,如果我在網(wǎng)絡(luò)層監(jiān)控HTTP,并且檢測到有人訪問了一個從沒反問過得文件,而且返回了200,則很容易定位到webshell,這便是http異常模型檢測,就和檢測文件變化一樣,如果非管理員新增文件,則說明被人入侵了。缺點(diǎn)也很明顯,黑客只要利用原文件就很輕易繞過了,并且部署代價高,網(wǎng)站時常更新的話規(guī)則也要不斷添加。還有一個思路利用函數(shù)劫持?;貞浺幌拢覀冋{(diào)試網(wǎng)馬的時候,怎么還原它各種稀奇古怪的加密算法呢,簡單,把eval改成alert就好了。類似的,所以我們可以在CGI全局重載一些函數(shù)(比如ASP.NET的global.asax文件),當(dāng)有webshell調(diào)用的時候就可以發(fā)現(xiàn)異常。已js為例(php,asp等語言思路一樣的,都是保存原函數(shù),然后從新定義原函數(shù),最后在調(diào)用保存的原函數(shù)),比如下面就是把eval重載,還可以彈出個危險提示等,嚇退一些沒經(jīng)驗黑客。
三 webshell檢測有哪些方法
如果你懷疑你的網(wǎng)站被人上傳了webshell或者你需要檢查一下需要上線的代碼中是否被嵌入了shell代碼,就需要對這些文件進(jìn)行掃描,那么有哪些方法可以掃描出這些webshell呢?
下面列舉一下,也就是我們的webshell掃描工具中實現(xiàn)的功能。
1 求文件的重合指數(shù)index of coincidence(縮寫為IC)
首先介紹一下什么是IC?
IC是用來判斷文件是否被加密的一種方法。它的計算公式是這樣的:
Σ(fi * (fi-1))/N(N-1) :fi 代表樣本中某個字母出現(xiàn)的比率,N代表字母出現(xiàn)在樣本中的個數(shù)
通過計算,我們可以得到以下兩個值:
english的IC值為0.0667,
english中一個完全隨機(jī)的字符串的IC值為0.0385
那么這兩個值有什么意義呢?
簡單來說(english),
加密文件的IC值接近0.0385
明文文件的IC值接近0.0667
好了,那么我們就可以計算每個文件的IC值,如果這個文件的IC值接近0.0385,那么我們認(rèn)為它是加密的,而一個web中加密的文件一般就意味著它是個為了逃避檢測的webshell。