温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何通过WebPageTest服务0day漏洞实现Mozilla AWS环境远程代码执行

发布时间:2021-12-18 14:47:01 来源:亿速云 阅读:195 作者:柒染 栏目:安全技术

这篇文章将为大家详细讲解有关如何通过WebPageTest服务0day漏洞实现Mozilla AWS环境远程代码执行,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Assetnote CS安全团队在分析Mozilla AWS云服务网络环境攻击面时,发现了部署于其中的网络性能测试工具WebPageTest存在一个0day漏洞,利用该漏洞最终实现了对Mozilla AWS服务器的远程代码执行(RCE)。

WebPageTest介绍

WebPageTest是一款开源的Web前端性能分析工具,其有在线版本和本地搭建版本两种,能针对特定网站提供免费的性能评测,支持IE和Chrome浏览器,它会模拟使用真正的浏览器(IE和Chrome)连接速度,从全球多个地点运行免费网站速度测试。可以运行简单的测试或执行高级测试,包括多步骤事务、视频捕获、内容阻塞等等。还将依据测试结果提供丰富的诊断信息,包括资源加载瀑布图,页面速度优化检查和改进建议,会给每一项内容一个最终的评级。企业或组织可以下载    开源版本搭建内部测试站点,对内部网站进行性能测试分析。

在内网部署的WebPageTest服务中,可以通过修改其中的settings.ini文件来启用一些基本的用户名密码验证,所以还是建议对此进行配置,以便阻止一些匿名用户的登录访问。    

在Assetnote CS安全团队评估的很多内网WebPageTest服务中,都缺乏基本的用户验证措施,所以,可能产生的结果就是,攻击者可以利用WebPageTest的一系列性能测试工具,来发起SSRF(服务端请求伪造)攻击,实现对目标内网资源的访问获取。

漏洞概况

2017年11月,Assetnote CS安全团队在对Mozilla的AWS(亚马逊云服务)环境测试过程中,发现了以下两个网络资产:

wpt-vpn.stage.mozaws.net

wpt1.dev.mozaws.net

这两个网络资产都属Mozilla AWS环境中的WebPageTest服务测试实例,而且,Mozilla AWS环境中部署的WebPageTest服务没有任何基本的用户名密码验证措施,在与白帽Mathias的合作下,我们对其中部署的WebPageTest服务进行了源码分析,经过数个小时的测试,我们就发现了一个可以导致远程代码执行(RCE)的攻击链。

由于在当时这算是一个0day漏洞,所以,我们及时与Mozilla公司和WebPageTest团队进行了沟通协商,修复了这个漏洞。在2018年1月17日的修复版本中可以看到其中提交的commit信息。

漏洞发现利用

在WebPageTest的源码中,首先引起我们注意的是/www/work/workdone.php脚本具备的上传和解压任意zip文件功能,该php脚本文件包含了限制127.0.0.1之外的访问源逻辑,代码如下(第110行): 

...!strcmp($_SERVER['REMOTE_ADDR'], "127.0.0.1")...

同样在这个php文件中,我们发现了另外一个危险之处,那就是上传任意zip文件并解压至一个已知位置的逻辑,代码如下(第133-136行):

if (isset($_FILES['file']['tmp_name'])) {  ExtractZipFile($_FILES['file']['tmp_name'], $testPath);  CompressTextFiles($testPath);}

基于以上代码逻辑,如果我们能把IP伪装为127.0.0.1,那么是不是就可以通过它们来实现服务端代码执行了呢?但是,事实没有我们想得这么简单,在/www/work/workdone.php中的第321行,还存在这么一个方法函数:

SecureDir($testPath);

SecureDir方法函数的代码定义在/www/common_lib.inc文件的第2322 - 2347行:

/*** Make sure there are no risky files in the given directory and make everything no-execute** @param mixed $path*/function SecureDir($path) {    $files = scandir($path);    foreach ($files as $file) {        $filepath = "$path/$file";        if (is_file($filepath)) {            $parts = pathinfo($file);            $ext = strtolower($parts['extension']);            if (strpos($ext, 'php') === false &&                strpos($ext, 'pl') === false &&                strpos($ext, 'py') === false &&                strpos($ext, 'cgi') === false &&                strpos($ext, 'asp') === false &&                strpos($ext, 'js') === false &&                strpos($ext, 'rb') === false &&                strpos($ext, 'htaccess') === false &&                strpos($ext, 'jar') === false) {                @chmod($filepath, 0666);            } else {                @chmod($filepath, 0666);    // just in case the unlink fails for some reason                unlink($filepath);            }        } elseif ($file != '.' && $file != '..' && is_dir($filepath)) {            SecureDir($filepath);        }    }}

它会检查过滤掉一些危险的文件,并确保无任何文件的执行操作,由于它在之后后续的代码流中才出现,因此就存在一种可利用的竞争条件(Race Condition ),即解压到web服务器的PHP文件在被过滤删除之前可被短暂地访问到。    

在我们构造的攻击链中,其前提条件非常简单,由于在目标资产wpt-vpn.stage.mozaws.net的WebPageTest服务中,执行Traceroute命令后,我们可以获取到WebPageTest生成的一个有效 test ID,有了这个ID号就比较好办了。比如,我们在其中执行执行对https://google.com的Traceroute命令:

如何通过WebPageTest服务0day漏洞实现Mozilla AWS环境远程代码执行之后,WebPageTest服务会跳转到一个包含test ID的性能测试结果URL页面去:

http://wpt-vpn.stage.mozaws.net/result/171124_GW_9/

这里,171124_GW_9为test ID。

到此,我们还差着127.0.0.1 IP伪造这一步,如果这步能成功,就能有效访问到workdone.php文件,发起命令执行了。

经过分析,我们在 /www/common.inc 文件中的第70行发现了以下代码逻辑:

if (isset($_SERVER["HTTP_FASTLY_CLIENT_IP"]))

  $_SERVER["REMOTE_ADDR"] = $_SERVER["HTTP_FASTLY_CLIENT_IP"];

从这个代码段中可以发现,我们能通过发送请求的方式,把 FASTLY-CLIENT-IP 请求头设置为127.0.0.1,从而实现以远程用户身份任意更改 $_SERVER["REMOTE_ADDR"]的IP地址。

综上所述,我们可以设置两个Burp Intruder 攻击扩展来实现最终的服务端代码执行。其中一个Burp Intruder用来实现上传一个恶意的zip文件,另外一个Burp Intruder用来访问解压过后存在于目标系统中的php文件。我们对上述竞争条件的利用,最大Burp Intruder线程数为200。

如何通过WebPageTest服务0day漏洞实现Mozilla AWS环境远程代码执行

但好在有高速请求插件Turbo Intruder的帮助下,我们的漏洞利用链就比较稳定了。最终,我们在Mozilla    AWS网络环境中成功实现了服务端代码执行。如下,我们在wpt-vpn.stage.mozaws.net中实现了对phpinfo() 的调用读取:    

如何通过WebPageTest服务0day漏洞实现Mozilla AWS环境远程代码执行

关于如何通过WebPageTest服务0day漏洞实现Mozilla AWS环境远程代码执行就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI