发布日期:2022/03/09
引言
俗話說得好,80后用菜刀,90后用蟻劍,95后用冰蝎和哥斯拉。本文主要是對這四個主流的并具有跨時代意義的Webshell管理工具進行流量分析和檢測。
注:本文均以phpshell連接為例進行研究分析,畢竟“php是世界上最好的語言”
① 中國菜刀(chopper)
中國菜刀是一款專業(yè)的網(wǎng)站管理軟件,用途廣泛,使用方便,小巧實用。只要支持動態(tài)腳本的網(wǎng)站,都可以用中國菜刀來進行管理。主流有2011版本,2014版本和2016版本。
2011和2014版本:
特征:
a(密碼)參數(shù):值為執(zhí)行的函數(shù)加上對pyload的base64解
Z0參數(shù):base64加密的payload,
Z1參數(shù):shell存在的位置
識別:
(1)執(zhí)行函數(shù):@eval,@assert 等;
(2)base64_decode($_POST[Z0]),$_GET,$_REQUEST
(3)截取參數(shù)z0,進行base64_decode后 ,
@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0)等
2016版本:
較于早版本做了一些混淆
識別"ass"."ert" "ev"."Al "Ba"."SE6"."4_dEc"."OdE
② 蟻劍4.0.3
中國蟻劍是一款開源的跨平臺網(wǎng)站管理工具,它主要面向于合法授權(quán)的滲透測試安全人員以及進行常規(guī)操作的網(wǎng)站管理員。是一款非常優(yōu)秀的webshell管理工具。開發(fā)版本針對有一定編程基礎(chǔ)的開發(fā)者,你可以根據(jù)閱讀文檔或者分析源碼了解熟悉整個應(yīng)用的執(zhí)行流程,然后便可隨意對代碼進行修改增強個性化自定義,真正打造出屬于自己的一把寶劍!
PHP WEBSHELL基本操作連接所發(fā)的包如下:
傳輸?shù)膬?nèi)容為:
主要獲取了服務(wù)端當(dāng)前目錄、根目錄、系統(tǒng)和當(dāng)前用戶名等信息,輸入到緩沖區(qū)再由$output變量接收,通過隨機字符作為開始結(jié)束符定位變量輸出位置。
默認使用的情況下data僅進行url編碼,特征很明顯,data中含有@ini_set("display_errors", "0");@set_time_limit(0); header中含有antSword字眼,由于蟻劍的源碼是和菜刀的一樣,所以在默認情況下特征十分明顯。但是蟻劍的個性化十分的明顯,可以對其進行改造。
PHP WEBSHELL基本操作連接所發(fā)的包如下:
2.1 自帶的編碼器和解碼器
自帶的編碼器和解碼器,編碼器的作用是傳輸?shù)臅r候加密,解碼器的作用是使返回的包帶的值也是加密的
自帶編碼器發(fā)出的包:格式為:pwd=編碼方式['xxx']&xxx=內(nèi)容
至此我們可以分析常規(guī)攔截:
(1)檢測流量包中的編碼方式
(2)檢測必須傳輸?shù)膬?nèi)容,比如:@ini_set等字眼,不僅是明文,這些字眼的各種編碼形式也可以攔。編碼識別:只要原始數(shù)據(jù)不變,編碼都是固定的映射,例如只檢查ini_set("display_errors", "0") ,aW5pX3NldCgiZGlzcGxheV9lcnJvcnMiLCAiMCIp(base64) ,vav_frg("qvfcynl_reebef", "0") (rot13) …
(3)蟻劍自帶的header
針對以上明顯特征,蟻劍有自定義編碼器,自定義header,自定義分隔符……修改明顯特征以繞過檢測
2.2 自定義header
建議直接在文件modules/request.js中修改相應(yīng)的參數(shù)值,將其修改成常用的useragent,項目路徑下的.modules/update.js也需要修改。也可以在每次連接時添加自定義header頭。
2.3 自定義編碼
在自定義編碼器中可以將加密的函數(shù)名隱去,分區(qū)傳遞,加入干擾字符等。
(1)自定義的base64編碼:
在編碼的同時也可以改變包的格式,使用multipart發(fā)包進行混淆,很多waf出于對業(yè)務(wù)性能影響,一般會把 multipart/form-data 這種多用來上傳文件的傳輸方式檢測關(guān)閉掉。不然攻擊者一直給你發(fā)大文件,一直損耗WAF的性能,拖垮業(yè)務(wù)。也可以使用分塊傳輸。
可以注意到,很多簡單的編碼器他的參數(shù)都是_0x.....=加密字符串,可以作為一個弱特征檢測。
(2)自定義hex:
檢測識別
xxx= 40696e695f7365742822646973706c61795f6572726f7273222c2022302229或者更短。
(3)rsa靜態(tài)密鑰(僅支持php):
分區(qū)塊加密,并且會有分隔符,每個區(qū)塊的長度一致,RSA是分組加密算法,分組大小可以根據(jù)密鑰的大小而改變,然而密鑰是蟻劍自動生成的,所以每區(qū)塊長度一定是172字節(jié),也就是之前的80字符base64加密的長度。且生成的密鑰是有很大的相似性的,也可以加強對shell的檢測。
但這也是弱特征,這樣的加密數(shù)據(jù)包已經(jīng)是沒法解密了,那我們來看一下執(zhí)行命令:
執(zhí)行命令的時候會多幾個參數(shù),且這幾個參數(shù)的值僅僅是通過base加密的,一個是執(zhí)行方式:cmd,一個是執(zhí)行的命令:whoami,在\source\core\base.js中有對這串字符的加密,這個是蟻劍把命令獨立于php語句傳輸。
處理方法:
①可在編碼器中通過遍歷將每個參數(shù)進行加密,也可在每個參數(shù)中加入混淆的字符串,在接收處理的時候刪除即可,參考方法:http://www.feidao.site/wordpress/?p=4495#1webshell。
②在該處編寫自己的加密方法,然后將\source\core\php\template文件夾內(nèi)的js文件做對應(yīng)修改
(4)AES動態(tài)密鑰:
要求站點支持openssl,默認是不開啟的。密鑰可以訪問網(wǎng)站時截取session或者截取其他的進行加密,做到動態(tài)key。當(dāng)然,攔截的waf也可以學(xué)習(xí)這個方法,最后密鑰都是自己添加成硬編碼也不是不可。
AES加密后流量包基本就不能夠檢測出來了,執(zhí)行其他命令時也需同上述操作一樣,遍歷將其他參數(shù)進行加密,但多次請求同一個包且參數(shù)相同參數(shù)值開頭相同也能夠算是一個弱特征。
(5)請求包成功加密,很多waf會選擇連接返回包,返回包是明文的,包含了很多關(guān)鍵字,例如[s][E]或者是其他敏感的詞匯,所以解碼器也隨之出現(xiàn),解碼器和之前的加密方式以及防范方式多很相似,就不一一贅述了。
2.4 蟻劍市場自帶的插件
蟻劍的市場中也有很多一鍵繞過的插件,這里就不再進行研究。
③ 冰蝎3.0 Beta 9
冰蝎3.0 和v2.1相比,最重要的變化就是“去除動態(tài)密鑰協(xié)商機制,采用預(yù)共享密鑰,全程無明文交互,密鑰格式為md5("admin")[0:16];冰蝎的默認密鑰為“e45e329feb5d925b”,正常連接發(fā)包如下(連接為兩個流量包,全文加密):
明文:
明文:
密文的加密方式為先將傳遞數(shù)據(jù)base64加密,再將其進行AES加密,由于新版本中取消了動態(tài)密鑰交互過程,加密的密鑰被寫死在shell中,如果是不改密碼直接使用默認的shell,檢測是可以進行解密檢測敏感字符的,比如:error_reporting(0) ,phpinfo()等。
如果密碼交互失敗,冰蝎會進行常規(guī)密鑰交互階段,而且由于密碼錯誤,shell中獲取內(nèi)容失敗,會爆出目錄文件錯誤提示。
如果攻擊者改了密碼,密文便無法監(jiān)測,可以從header頭入手,首先是user-agent,內(nèi)置的25個ua請求頭,不自定義的話太老,可以在其源碼constants.class中自行更改。
初始化的Accept,Accept-Language,Content-type這三個的值也是一個固定值,且Content-type為小寫t,這也可以作為一個監(jiān)測點。
具體值如下:
"Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
"Accept-Language", "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
"Content-type", "application/x-www-form-urlencoded"
或者
"Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
"Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"
"Content-type", "application/x-www-form-urlencoded"
其次為referer:連接的兩個包referer中的文件名都是隨機生成的,但文件名是純大寫或者是純小寫,可作為一個弱特征檢測。
Cookie:冰蝎的機制是需要從set-cookie中去取值,所以在發(fā)包中即使是有了cookie,他的接收包中都會有setcookie,除去第一個包沒有。
經(jīng)測試可以發(fā)現(xiàn)在點擊虛擬終端時會連續(xù)發(fā)17個包,發(fā)包長度不一樣但是這17個包的接收長度一模一樣。攔截大量發(fā)包。
連接成功后不操作,冰蝎會每5-8分鐘(大概率是5分鐘)發(fā)一個測試包是否存活。
在連接時冰蝎發(fā)的兩個包,盡管現(xiàn)在較于2.0修改了length,但是在接收包中可以看到,第一個連接包是比較小的,控制在5000以下,后一個包大概是在17W或者18W左右,原因是因為后一個包會加載phpinfo()等界面內(nèi)容作為主頁,導(dǎo)致返回的長度很長。
④ 哥斯拉v4.0.1
哥斯拉號稱全部類型的shell均可繞過市面所有靜態(tài)查殺、流量加密可繞過市面全部WAF,且自帶眾多插件。支持對載荷進行AES等各種加密,支持自定義Http頭,支持內(nèi)存shell,提供豐富的Webshell功能。 哥斯拉客戶端運行在Java平臺上,通過調(diào)用Java庫產(chǎn)生TLS流量。
哥斯拉生成phpshell文件,存在默認密碼和密鑰:
phpshell有三種編碼方式:
EVAL_XOR_BASE64編碼連接特征很明顯,經(jīng)過url解碼后,pass=eval(base64_decode... 攔截明顯的木馬特征即可。
XOR_BASE64編碼方式第一個包形式為pass=加密數(shù)據(jù),無法檢測:(XOR_RAW與其類似,不再單獨分析)
經(jīng)分析,哥斯拉連接時會有一個握手機制。其內(nèi)容是固定的(加密前),響應(yīng)也是固定的(加密前)。且加密中未填充隨機長度字符。故在默認密碼和密鑰的情況下,內(nèi)容固定,可以檢測該握手機制包中的請求體和響應(yīng)體:DlMRWA1cL1gOVDc2MjRhRwZFEQ%3D%3D
11cd6a8758984163fL1tMGI4YTljO/79NDQm7r9PZzBiOA==6c37ac826a2a04bc
注:密鑰改變,base加密字符串改變,密碼改變,md5加密字符串改變。
如果密碼和密鑰不是默認,可以檢測響應(yīng)體的長度以及構(gòu)成要素:前后為16位md5值,中間為32位加密字符串。
哥斯拉頁面配置中header中有三個固定值,user-agent,accept,accept-language。該弱特征也可作為檢測。