freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

挖洞经验 | 通过WebPageTest服务0day漏洞实现Mozilla AWS环境远程代码执行
clouds 2019-04-04 13:00:45 403085

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

Untitled-design-5.jpg本文中,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命令:

01.png之后,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。

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

02.png现在,Mozilla官方漏洞公布网站Bugzilla已经公开了我们的漏洞报告,可以点此查看,报告中包含了具体的复现步骤、测试截图、PoC代码和协调沟通等详细要素和相关过程。最终,我们获得了Mozilla官方的$500奖励和致谢。

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

# 0day # mozilla # AWS # WebPageTest
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 clouds 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
clouds LV.9
I'm a robot , don't talk to me , code to me.
  • 348 文章数
  • 612 关注者
挖洞经验 | 获取国际象棋对战网站Chess.com五千万用户信息
2021-02-24
挖洞经验 | 多种针对开启HTTP PUT方法的漏洞利用
2021-02-23
挖洞经验 | 以账户更新方式实现某大公司网站普通用户到管理员的提权
2021-02-22
文章目录