最近爆出来个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函数的第五个参数过滤不严明,导致了命令执行。
追踪代码到这里
图里应该能看到刚才的第四个条件,也就是safe_mode必须关闭。
然后我们去找这里的params
跟踪$this->Sender
这里的Sender是address输入的,但经过了一次检验,我们可以看看这个函数
之类有个重要的switch
跟踪到下面的noregex
这里的cve-2016-10033就是绕过了这部分,但是我们仍需要使$patternselect为noregex,往上看看
这里的条件要求是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正则表达式
仔细思考上面流程,有个关键的问题就是:
如果我们能够直接绕过下面的大段正则,我们就可以简化上面的漏洞利用条件,改为
1 | phpmailer < 5.2.20 (0day) |
那么问题来了,怎么分析复杂的正则表达式
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 | a. -OQueueDirectory=/tmp/. -X/tmp/shell.php .com |
github上的exp也修改了新的payload
1 | vulnerables\" -OQueueDirectory=/tmp -X/www/backdoor.php server" .com |
还有p神发的
1 | a( -X/home/www/backdoor.php -OQueueDirectory=/tmp ) .com |
phpmailer的修复方式
在今天爆出新的10045 cve后,phpmailer更新了新的patch
这里加入了判断方式,判断过滤过后和过滤前的字符串是否相等。
后来我发现,作者又更新了新的patch,但看聊天记录来看,作者被迫放弃了一部分正常功能,所以怎么修复还需要等等看
https://github.com/PHPMailer/PHPMailer/pull/930
主要问题escapeshellarg
和escapeshellcmd
一起处理会出现新的问题,具体可以看我朋友的博客分析
http://0x48.pw/2016/12/28/0x29/#phpmailer_5-2-19_RCE
虽然这个模块在多个cms都有用到,但是在已知的部分cms中,这部分都做了部分处理或者是印象范围较小,危害仍然有待考证