天天看點

淺談webshell檢測方法

一  什麼是webshell

“web”的含義是顯然需要伺服器開放web服務,“shell”的含義是取得對伺服器某種程度上操作權限。webshell常常被稱為匿名使用者(入侵者)通過網站端口對網站伺服器的某種程度上操作的權限。

簡單了解:webshell就是一個web的頁面,但是它的功能非常強大可以獲得一些管理者不希望你獲得的權限,比如執行系統指令、删除web頁面、修改首頁等。

webshell中由于需要完成一些特殊的功能就不可避免的用到一些特殊的函數,我們也就可以對着特征值做檢查來定位webshell,同樣的webshell本身也會進行加密來躲避這種檢測。

二  webshell長什麼樣子

下圖就是一張php webshell的截圖,它的功能還是比較全的,如果你是網站管理者的話肯定是不希望普通使用者獲得下面的權限的。

淺談webshell檢測方法

三   webshell檢測有哪些方法

如果你懷疑你的網站被人上傳了webshell或者你需要檢查一下需要上線的代碼中是否被嵌入了shell代碼,就需要對這些檔案進行掃描,那麼有哪些方法可以掃描出這些webshell呢?

下面列舉一下,也就是我們的webshell掃描工具中實作的功能。

1 求檔案的重合指數index of coincidence(縮寫為IC)

首先介紹一下什麼是IC?

淺談webshell檢測方法

IC是用來判斷檔案是否被加密的一種方法。它的計算公式是這樣的:

通過計算,我們可以得到以下兩個值:

english的IC值為0.0667,
english中一個完全随機的字元串的IC值為0.0385
           

那麼這兩個值有什麼意義呢?

簡單來說(english),

加密檔案的IC值接近0.0385

明文檔案的IC值接近0.0667

好了,那麼我們就可以計算每個檔案的IC值,如果這個檔案的IC值接近0.0385,那麼我們認為它是加密的,而一個web中加密的檔案一般就意味着它是個為了逃避檢測的webshell。

2   求資訊熵

    資訊熵是一個數學上頗為抽象的概念,在這裡不妨把資訊熵了解成某種特定資訊的出現機率(離散随機事件的出現機率)。一個系統越是有序,資訊熵就越低;反之,一個系統越是混亂,資訊熵就越高。資訊熵也可以說是系統有序化程度的一個度量。

    熵是從整個集合的統計特性來考慮的,它從平均意義上來表征信源的總體特征,其公式為:

淺談webshell檢測方法

如果有一個系統S記憶體在多個事件S = {E1,…,En}, 每個事件的機率分布 P = {p1, …, pn},則每個事件本身的訊息為

(對數以2為底,機關是位元(bit))

(對數以e為底,機關是納特/nats)

如英語有26個字母,假如每個字母在文章中出現次數平均的話,每個字母的訊息量為

而漢字常用的有2500個,假如每個漢字在文章中出現次數平均的話,每個漢字的資訊量為

整個系統的平均消息量為

是以我們可以求每個檔案的資訊熵值,值越大,為webshell的可能性越高。

3、求檔案中的最長單詞

    求一個檔案中的最長單詞是多長,比較異常的長單詞是很可疑的。如下面的第一位的有84070,毫無疑問他是加密後的一整串字元串,極有可能是webshell

4、檔案的可壓縮比

檔案的壓縮比=壓縮檔案後的大小/檔案的原始大小。

那麼什麼樣的檔案的壓縮比比較大呢?這就要說到壓縮算法的本質:

壓縮的實質,在于消除特定字元分布上的不均衡,通過将短碼配置設定給高頻字元,而長碼對應低頻字元實作長度上的優化。

做了個簡單的實驗:将一個txt檔案中填充了一堆的a字元,總大小為345KB,用7z壓縮後為1K

淺談webshell檢測方法

那麼我們是否可以這樣了解,由base64編碼過的檔案,消除了非ascii的字元,這樣實際上base64編碼過的檔案的字元就會表現為更小的分布的不均衡,壓縮比就會變大。

5、特征值比對

這裡提到的特征值比對分為2個部分:第一個是比對特征函數和代碼,也就是說webshell中會用到的而一般檔案不會用到的函數和代碼。第二個是指比對特定webshell中的特征值。

第一種情況我們需要對這些函數和特征代碼做整理,然後與檔案進行比對。

第二種情況需要收集出現過的webshell,将其中的特征碼提取出來。目前已知的庫位500個webshell的特征庫,可以準确識别99%的已知的webshell。

6、檔案屬性

第一種:在web伺服器中,檔案一般的建立時間是幾種的,如果某些檔案的建立時間比較異常,那麼它就有可能是webshell。

第二種:在web攻擊過程中,有一種手法是利用mysql到出一句話木馬到web目錄中,那麼這個導出的檔案有其特殊性,所有導出的檔案的權限都是666.那麼我可以這麼認定,權限為666的檔案有可能是webshell。

四 樸素貝葉斯模型

以上幾種方法都有其準确率和誤報情況,經過測試,每個方法都能檢測出一部分webshell并且存在着一定程度的誤報,那麼如何将他們的檢測結果整合起來,來更準确的判定一個檔案是否webshell?

由于我們的檢測方法基本上是離散的,是以考慮使用樸素貝葉斯模型。

首先用數學語言描述一下我們的問題:

一個檔案的檢測結果有兩種:是webshell和不是wenshell。那麼檢測結果是webshell的機率我們用P(y=1)來表示,檢測結果不是webshell的機率我們用P(y=0)來表示。

假設我們的檢測方法有5種,那麼x = [x1,x2,x3,x4,x5].

假設我們檢測一個檔案後各個檢測方法的結果為:x1 = 1,x2=0,x3=0,x4=0,x5=1

那麼我們的目的是計算出P(y=1|x)和P(y=0|x)。也就是計算出該檔案是webshell和不是webshell的機率各是多少,機率更大的我們就做為最終結果。

下面我們推演一下:

首先是貝葉斯公式為:

淺談webshell檢測方法

那麼我們需要的P(y=1|x)為:

淺談webshell檢測方法

由于P(y=1|x)和P(y=0|x)中的分母都是一樣的,是以我們隻要求出分子進行比較,那個值比較大就取那個值。

現在我們未知的值為p(x1=1|y=1),p(x2=0|y=1),p(x3=0|y=1),p(x4=0|y=1),p(x5=1|y=1),p(y=1)

這些值應該如何得到呢?

首先我們需要一個樣本,樣本中大量的web檔案,其中混有各種webshell,這些标簽我們是可以确定的,那麼下面我們要做的就是利用程式對這些樣本進行檢測,根據檢測結果計算出我們需要的值,比如:

p(x1=0|y=1):它代表的意思就是檢測的檔案是webshell,利用x1檢測方法的檢測結果為0(不是webshell)

如果結果為P(y=1|x)>P(y=0|x),我們就判定該檔案是webshell。

工具回頭會在FB釋出,敬請期待。

繼續閱讀