◆王亞麗
(62101部隊 湖北 430010)
webshell查殺逃逸技術研究
◆王亞麗
(62101部隊 湖北 430010)
對于webshell查殺來說,查殺的難點是腳本語言靈活多樣,同樣的數據可以通過多種方式來呈現,使得webshell變異方式靈活多樣,對webshell查殺尤其是靜態查殺提出了一定的挑戰。本文以收集的PHP webshell為例進行分析,總結樣本中使用的逃逸技術,得到的結果為webshell查殺引擎的設計提供了借鑒。
webshell查殺;webshell變異;逃逸技術
攻擊者通過應用漏洞或者系統漏洞植入webshell文件后,可以進行信息竊取、商業勒索,組建僵尸網絡等[1],被植入webshell能否被及時發現,在很大程度上決定了危害的程度。
目前webshell檢測方式主要分為源碼靜態檢測、動態檢測、基于日志的檢測。源碼靜態檢測由于對服務器性能消耗低,檢測速度快,因而使用更為廣泛。針對目前的檢測方式,webshell普遍存在變異以期逃避檢測。由于地下交流等,使得一旦攻擊者發現了一種逃逸方式,這種逃逸方式很快就會在攻擊者間擴算,使得危害性迅速增加。因此分析與總結已有的webshell逃逸方式,提升檢測引擎對新變異webshell的檢測能力具有重要意義。
目前webshell檢測既有webshell運行前的靜態檢測,運行時的動態檢測[2],也有運行后的基于日志的檢測技術[2]。
1.1 webshell靜態檢測
webshell靜態檢測指利用源碼運行前所能得到的信息,如文件的創建事件、修改時間、文件的權限、源碼本身等進行檢測的技術。
目前webshell靜態檢測技術可以細分為:①特征值檢測;②模式匹配檢測;③webshell源碼特征檢測;④webshell非源碼特征檢測。
1.2 webshell動態檢測技術
webshell動態檢測技術主要分為:基于流量的webshell檢測、基于文件執行動態監控的webshell檢測。
1.2.1 基于流量的webshell檢測
通常情況下webshell文件主要通過文件上傳漏洞上傳到Web服務器,通過遠程文件包含,或者其他系統漏洞動態生成。不論最終的webshell文件是在Web服務器上,利用遠程文件包含漏洞放在其他服務器上,webshell文件的文件名后綴是否是相應的腳本文件名后綴(服務器存在解析漏洞時,文件名后綴可以不是腳本文件名后綴),最終webshell在服務器上執行都會產生相應的流量。通過對流量進行相應的分析即可進行相應的檢測。
1.2.2 基于文件執行的webshell動態檢測
webshell文件動態執行監控:主要是監控腳本執行行為,判斷是否執行了相應的危險操作來進行判斷,進一步判斷是否為webshell。腳本所在環境既可以是真實環境,也可以是蜜罐環境。根據動態的執行行為,結合webshell的訪問特征(IP、User-Agent、cookie)、訪問路徑、訪問的時間序列與操作,可以有效識別隱藏的惡意行為。
1.3 webshell日志檢測
對日志進行統計分析,能夠得到訪問頻率、功能頁面或者特定功能被請求的次數,能提取出訪問請求中相應的字段。利用相應的檢測模型(如信息熵等),可以判斷出用戶發送相應請求中請求字段是否異常、請求返回的信息是否是webshell響應的特征、請求的行為是否異常。
由于大部分Web 服務器都會部署一定的webshell查殺軟件,因此目前很多webshell都會進行一定的變異以躲過查殺。變異主要通過調用編碼解碼函數、加密解密函數、字符串操作函數、使用隱藏位置傳遞參數以及對文件進行混淆。目前webshell逃逸技術主要可分為兩種:隱蔽位置傳遞荷載和構造法繞過檢測。
2.1 隱蔽位置傳遞荷載
通常大部分的HTTP請求都通過請求中的GET、POST、Cookie傳遞數據,因此幾乎所有的WAF與webshell查殺軟件都會對這些常見位置中的數據進行分析。當查殺軟件對其他字段的內容沒有進行掃描時,攻擊者即可利用這些字段傳遞荷載。如利用User-Agent 字段實現荷載傳遞:

其他的字段還有“Accept-Language”、“Accept-Encoding”、“Referer”等字段。此外,還可以將webshell相應的數據放在其他類型的文件的描述信息中。如圖片的exif信息,包含以下字段Manufacturer、Model、software、Data and time、Flash信息等等。這些附加信息對圖片的顯示沒有影響,但卻可以作為載體隱藏一定的信息。如下代碼將特定數據隱藏于圖片的exif信息中。

2.2 構造法繞過檢測
通常如果直接將需要執行的命令傳入system、eval等函數很容易被webshell檢測軟件查殺。一般的檢測軟件會過濾 system、passthru這樣的字符串,這時可以用構造法繞過關鍵字檢測。構造法的本質是PHP中每一個字符都對應一個二進制值,對每個字符可以使用數值計算得到,同時對函數名可以使用字符串拼接動態生成函數名,從而避免出現敏感關鍵字。如“$__=("#"^"|");$__=("."^"~");$__=("/"^"`");$__=("|"^"/");$__=("{"^"/ ");”這四條語句分別可生成字符“_”、“P”、“O”、“S”、“T” , 因此“("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/")”可得到字符串“_POST”。這一類繞過措施,函數名動態構造得到動態調用是其最明顯的特征。由于動態函數調用在正常腳本文件中也存在,單純的字符串匹配并不能確定執行的函數,因此動態函數調用只能作為Webshell的一個特征。
webshell變異方式多種多樣,但幾乎絕大多數都可以歸為以上幾類,變異形式通常為多種方式的靈活使用。不同的逃逸技術有不同的使用場景。隱蔽位置傳遞荷載利用檢測引擎中未考慮的位置傳遞荷載,這種在檢測引擎中使用污點分析技術可以相對容易地檢測出來。
對于動態執行監控,通常也需要結合污點分析或者靜態分析確定出代碼可疑位置,結合實際的行為確定是否為webshell。動態執行監控,webshell本身也可以進行一定的檢測,使得存在特定的動態監控時不表現惡意行為,從而躲避檢測。
webshell檢測與逃逸本身就是相互博弈的過程。除去隱藏位置傳遞荷載法,其余的逃逸方法都會使代碼的數據流更加復雜,污點分析時的污點傳播路徑更加復雜。可以預見,不久的將來webshell將會更加復雜,使得污點分析的難度更大。正常的程序中,數據的變換通常都具有一定的實際意義,不會單純為了變換而變換(如多個字符串的直接拼接在正常程序中可能直接以字符串常量的形式存在)。Webshell的各種逃逸技術越復雜,數據流就越復雜,與正常的程序代碼在數據流復雜度與對數據的操作行為上會有比較大的差異,數據流復雜度與對數據的操作(主要是數據變換操作)序列可能會是未來檢測webshell考慮的一個重要方向。
[1]Web Shells-Threat Awareness and Guidance [EB/OL].2017-01-31.https://www.us-cert.gov/ncas/alerts/TA1 5-314A.
[2]杜海章,方勇. PHP Webshell實時動態檢測[J].網絡安全技術與應用,2014.