LoRexxar's Blog | 信息技术分享

phpmailer RCE漏洞分析

2016/12/28

最近爆出来个CVE-2016-1003,国内人分析了两天发现ying

是国外十几年前发现的漏洞,分析了两天发现影响覆盖越来越严重,现在最新的patch也被绕过了,又爆了新的cve…

朋友的博客

CVE-2016-1003

最早爆出来的版本是这样的

http://seclists.org/oss-sec/2016/q4/750

漏洞详情
https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html

环境,poc,exp相关
https://github.com/opsxcq/exploit-CVE-2016-10033

漏洞有一些基本要求:
1、php version < 5.2.0
2、phpmailer < 5.2.18
3、php 没有安装 pcre(no default)
4、safe_mode = false(default)

漏洞和这个差不多
http://blog.knownsec.com/2016/12/roundcube-1-2-2-远程命令执行漏洞-漏洞分析/

其实问题主要是在mail函数的第五个参数过滤不严明,导致了命令执行。

追踪代码到这里

image_1b52an7jpsoco77r7bsat15i9g.png-69.5kB

图里应该能看到刚才的第四个条件,也就是safe_mode必须关闭。

然后我们去找这里的params

image_1b52arked1oro2ss9ekg0r13l6t.png-90.8kB

跟踪$this->Sender

image_1b52ep27a1ij13241g851kvb1ua41a.png-88.8kB

这里的Sender是address输入的,但经过了一次检验,我们可以看看这个函数
之类有个重要的switch

image_1b52f3fhk1e181tem1v5ejj2qm51n.png-5.8kB

跟踪到下面的noregex

image_1b52f4frf1klcgsks6g1hvo1jmn24.png-26.8kB

这里的cve-2016-10033就是绕过了这部分,但是我们仍需要使$patternselect为noregex,往上看看

image_1b52fi2dae5t1fqg1sbe1iedfam2h.png-76.2kB

这里的条件要求是php 没有安装 pcre,也就是上面的条件。

这样一来,我们就可以任意构造mail函数的第五个参数了,就可以随意开火了…

我们看看exp里的这部分请求

1
name="email"\r\n\r\n\"vulnerables\\\" -OQueueDirectory=/tmp -X/www/backdoor.php server\" @test.com\r\n

这里是利用了sendmail写入log的方式,把log写入了web目录下,成功写入了一个webshell

cve-10045 and bypass pcre正则表达式

仔细思考上面流程,有个关键的问题就是:
image_1b52m2pqb1lbcovj1ldl1rb81tnp2u.png-186.7kB

如果我们能够直接绕过下面的大段正则,我们就可以简化上面的漏洞利用条件,改为

1
2
phpmailer < 5.2.20 (0day)
php safe_mode = false

那么问题来了,怎么分析复杂的正则表达式
https://www.leavesongs.com/PENETRATION/how-to-analyze-long-regex.html

还有好用的正则表达式分析引擎
https://regex101.com

新的cve提交的是这个payload

1
\"attacker\\' -oQ/tmp/ -X%s/phpcode.php  some\"@email.com

我的朋友Hcamael研究了两种

1
2
a. -OQueueDirectory=/tmp/. -X/tmp/shell.php @a.com
() -OQueueDirectory=/tmp/. -X/tmp/shell.php @a.com

github上的exp也修改了新的payload

1
vulnerables\" -OQueueDirectory=/tmp -X/www/backdoor.php server" @test.com

还有p神发的

1
2
a( -X/home/www/backdoor.php -OQueueDirectory=/tmp )@qq.com
“ -X/home/www/backdoor.php -OQueueDirectory=/tmp “@qq.com

phpmailer的修复方式

在今天爆出新的10045 cve后,phpmailer更新了新的patch
image_1b52nsj9b6kmuqn1oab99j1q3j3b.png-97.6kB

这里加入了判断方式,判断过滤过后和过滤前的字符串是否相等。

后来我发现,作者又更新了新的patch,但看聊天记录来看,作者被迫放弃了一部分正常功能,所以怎么修复还需要等等看

https://github.com/PHPMailer/PHPMailer/pull/930

主要问题escapeshellargescapeshellcmd一起处理会出现新的问题,具体可以看我朋友的博客分析

http://0x48.pw/2016/12/28/0x29/#phpmailer_5-2-19_RCE

虽然这个模块在多个cms都有用到,但是在已知的部分cms中,这部分都做了部分处理或者是印象范围较小,危害仍然有待考证

CATALOG
  1. 1. CVE-2016-1003
  2. 2. cve-10045 and bypass pcre正则表达式
  3. 3. phpmailer的修复方式