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