利用命令注入控制雅虎服务器

  • 内容
  • 相关

我最近专注于雅虎的漏洞奖励计划,并花了不少时间剖解雅虎的聊天软件寻找安全漏洞,但结果并不怎么理想。在我头疼之余,读到一篇另一名参与雅虎漏洞奖励的安全人员Meals发的吐槽。Meals发现了一个可用于在一台雅虎服务器上获得远程代码执行权限的漏洞,并将其原理和利用方法汇报给了雅虎的漏洞奖励部门。但Meals说,雅虎非但没有支付他应得的金钱奖励,反而以他超出了规定的可测试范围为由禁止他继续从事雅虎的奖励计划,使他无法按他的准备继续测试。这激发了我的好奇心– 说不定Meals研究的网站上还存在更多高危漏洞。

在和我朋友Dawgyg商议后,我们决定亲自研究一下Meals在被封前研究的服务器。

步骤一:侦查

Meals所入侵的服务器属于一个被雅虎所收购的子公司,Media Group One。雅虎所列出的Media Group One可测试的范围如下:

*.mediagroupone.de

*.snacktv.de

*.vertical-network.de

*.vertical-n.de

*.fabalista.com

虽然这范围包含了不少域名,但Meals却主要只针对其中的SnackTV的内容管理系统进行了测试,其他的却并未碰触。所以,我和Dawgyg决定研究一下SnackTV的www子域。Dawgyg之前稍微看了一下这个子域的Web应用程序,并发现了几个XSS漏洞。这个Web应用与大多数雅虎的网站不同,一是因为运营它的是个德国公司,二是因为它面向的客户群是一些制片商的开发人员,而不是标准的雅虎用户。

利用命令注入控制雅虎服务器

SnackTV的搜索页面。很明显,这是个用于储存并播放视频的Web应用,但由于注册过程需要管理员人工批准,我们没能获得上传文件的权限。

在Dawgyg忙于调试工具以自动化我们项目的扫描部分时,我花了些时间学习怎么使用这个Web应用。了解如何正规使用一个程序通常是理解它不该被如何操作的先决条件;而漏洞往往藏匿于开发者没有考虑到的用户操作中。

步骤二:扫描

我和Dawgyg在渗透一个新程序时都会在后台运行一些用于收集更多程序信息的工具。两个我常用的脚本是“subbrute”(https://github.com/TheRook/subbrute)和“dirsearch”(https://github.com/maurosoria/dirsearch),它们可以自动识别安全漏洞和潜在的可被攻击的内容。学习掌握这些工具对于任何渗透测试工程师都是十分有帮助的。

我们起初的进展并不顺利;在运行了这些工具一段时间后我们获得多是一些无关紧要的输出。大多数内容都是些影响微乎其微并难以被利用的安全错误,比如访问“.htpasswd”文件时服务器返回标准的HTTP403错误而不是个统一的错误处理页(服务器设置泄露)、“/admin”页面指向管理员登陆页面(更易被发现,导致暴力破解)等。但最终dirsearch并没让我们失望:通过使用一个非常长的网站常见文件名字典为词库,dirsearch的暴力搜索找到了一个服务器上的有趣文件。

这个文件名为“getImg.php”,位于“imged”文件夹内(http://snacktv.de/imged/getImg.php)。

它是个PHP文件,根据GET参数返回内容,不过我们不知道它接受什么参数名和参数值。举个例子,GET参数的运行原理如下:

http://example.com/supersecret.php (无参数)– 500 内部服务器错误

http://example.com/supersecret.php?test=1 (错误参数)– 500 内部服务器错误

http://example.com/supersecret.php?page=index&post=1 (正确参数)– 200 OK… <

p>我是如何入侵美国白宫的 – <b>最高机密</b></p>

我们要做的就是摸索出服务器接收的参数,但这说着比做着简单。继续使用暴力破解是一个办法,但消耗的时间成本太高,实属下策。幸运的是,在用谷歌搜索了一会儿后,我们发现了一些调用这个PHP文件的链接,链接里包含了参数 。通过研究这些链接,我们得知:

1. “getImg.php”文件用于修改指定的图片文件。它通过GET参数“imageurl”接收一个图片的链接,并根据其他参数会对其进行修改,最后返回修改好的图片。

2. 这些参数与我们见过的一个名为ImageMagick的图片处理程序接受的参数很相似,所以这个文件很可能在服务器后台调用ImageMagick来实现它的功能。

步骤三:获取权限

ImageMagick程序的某些版本存在一个严重的远程执行代码漏洞,被人们戏称为“ImageTragick”(程序原名是“图片魔法”,这里被人改了两个字母恶搞为“图片悲剧”;漏洞详细内容在https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-3714记载)。我们决定先尝试几个利用这个漏洞的攻击载荷。

(译者注:这里作者说的可能不够详细。我大概看了一下这个漏洞,稍微解释一下原理。ImageMagick可以通过调用外部的库和程序来实现额外功能,比如通过调用system库从命令行运行wget程序来下载网络上的图片。在调用时,ImageMagick会把相关变量传递给调用的库和程序,但它并不会在传递前对变量进行编码或过滤。如果这个变量被用户控制,则可能在ImageMagick调用外部程序时注入恶意代码。

举个简易化的例子,比如ImageMagick通过system库运行wget下载用户指定的网络图片文件。用户输入https://example.com/1.jpg,则ImageMagick调用的指令如下:

wget "https://example.com/1.jpg” //wget 是个用于下载网页等网络文件的命令行程序;这个指令会把位于https://example.com/1.jpg的图片下载至当前文件夹。

如果用户在提供的链接里注入代码,则可以控制服务器。用户输入https://example.com/1.jpg/1.jpg”; rm -rf /“,则ImageMagick调用的指令如下:

wget “https://example.com/1.jpg”; rm-rf /“”//在下载位于https://example.com/1.jpg的图片后,这个指令会把服务器上所有文件和文件夹递归式删除。

我和Dawgyg花了不少时间制作藏有攻击载荷的文件。由于ImageMagick不对接收的文件内容进行任何编码或过滤,所以我们只需在合适的位置注入代码并让服务器运行它就能夺取服务器的控制权了。我们一开始的思路是把含有攻击载荷的图片链接嵌入在一个XML页面上,这样ImageMagick通过调用其他程序访问这个链接时就会执行我们的恶意代码。这是漏洞发现者所公布的利用这个漏洞的手法,不过在SnackTV上并没有成功。后来事实证明这个方向是正确的,不过需要一些调整。我们太依赖于漏洞发现者使用的方法了,反而漏看了最简单的注入方法。

以下是我们一开始尝试的嵌有恶意代码的XML文件;我们把它存在了一个自己的网站上,并把URL作为imageurl参数的值提供给了getImg.php。

<?xmlversion="1.0"standalone="no"?>

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>

<svgwidth="640px"height="480px"version="1.1"xmlns="http://www.w3.org/2000/svg"; xmlns:xlink= "http://www.w3.org/1999/xlink";>

<imagexlink:href="https://example.com/image.jpg&quot;|ls &quot;-la"x="0"y="0"height="640px"width="480px"/> </svg>

请注意xlink:href的值,里面嵌有“恶意”代码。按照我们当时的想法,在我们访问getImg.php后,ImageMagick会通过调用类似wget的程序访问我们的恶意网页并试图下载image标签里的图片文件;在试图下载图片文件时,我们的代码就会被执行。可惜,这个方法没能成功。

这导致我们当时错误地判断服务器应该不被这个漏洞所影响,或者也许运行的服务根本就不是ImageMagick。这不仅让我们有些气馁。稍作休整后,我和Dawgyg暂时转移了目标,转而攻击网站的其他部分。

截止凌晨三点半,我们只找到了几个储存型XSS漏洞、HTTP 401响应注入(通过提供一个需要登陆的第三方网页骗取用户名密码)、和其他一些常见的服务器设置错误,但这些漏洞都不算严重。一般来说,这种对公司商业运作影响甚微的漏洞奖金都很低,所以很多时候不值得耗费时间继续研究。

最后我们还是回到了之前的命令注入漏洞,并开始重新从头思考这个问题。也许雅虎服务器对于下载图片的实现与我们之前的预想不同。也许注入点不位于XML页面里的图片链接里,而位于提供给imageurl参数的链接里。我该使用什么攻击载荷来验证这个想法呢?

在浏览器中,我把imageurl参数值改为仅仅一个双引号,并发送给了服务器,而结果却大出我所料。

请求

GET /imged/getImg.php?imageurl=" HTTP/1.1

Host: snacktv.de

Connection: close

Upgrade-Insecure-Requests: 1

响应

默认设置下,图片的格式由图片文件开头的魔法数字判定。

如果想指定一个特定的图片格式,请在文件名前添加图片格式和冒号(如jpg:image)…

…或将图片格式标明于文件名后缀(如image.jpg)。若想使用标准输入或输出,则请在文件名的位置输入"-"。

啊?不会吧!运行的服务的确是ImageMagick。我的输入好像影响了程序的运行,使其返回了错误信息。但这个错误信息的不像来源于这个 Web应用。难道是服务器命令行返回的错误?值得继续研究…

请求

GET /imged/getImg.php?imageurl=";ls HTTP/1.1

Host: snacktv.de

Connection: close

Upgrade-Insecure-Requests: 1

响应

默认设置下,图片的格式由图片文件开头的魔法数字判定。

如果想指定一个特定的图片格式,请在文件名前添加图片格式和冒号(如jpg:image)…

…或将图片格式标明于文件名后缀(如image.jpg)。若想使用标准输入或输出,则请在文件名的位置输入”-“。

[为保护服务器隐私,编辑掉]

[编辑]

index.php

getImage.php

[编辑]

[编辑]

成功了。可以看到,在错误信息的后面我们收到了注入的ls指令的输出。在Linux类系统的命令行中,可以通过分号在同一行输入多个指令,这对命令注入来说非常有帮助。

到这一步,我已经难以抑制自己的激动了。这是我参与漏洞奖励以来第一次发现并利用了一个命令注入漏洞。在此之前,其实我一直天真地以为这种既易防范又极为严重的安全漏洞在现实中很难出现,但这次经历完全改变了我的观点。

尾声

怎么这就结束了?

哈哈,难不成你以为这里还会有我真的夺取这台服务器控制权的过程?我可是白帽黑客,这种事要点到为止,是时候上报给雅虎了。在确认了这个漏洞后,我立即将它通过HackerOne(一个著名漏洞奖励平台;白帽黑客们通过这个平台联络各开放漏洞奖励的公司)联系了雅虎。雅虎在24小时内给了我回复,并在回复后的6小时内修复了这个漏洞。

这次渗透SnackTV的经历让我深刻体会到了当今网络安全知识普及的不足。目标服务器因为没有采用常规设置,所以这个漏洞不能通过漏洞开发者提供的攻击方法利用。但是这个应用从原理上还是存在这个漏洞的,但管理员却没能发现这点。我们也正是利用了这个疏忽,通过调试出符合SnackTV服务器设置的攻击载荷夺去了服务器的控制权。

当遇到看似不可解决的难题时,最好的办法也许就是退回第一步,从零开始重新思考攻击方式。服务器接收哪些字符?屏蔽哪些字符?输入的最大长度是多少?返回的页面有哪些变化?

在雅虎聊天软件的泥潭中无果挣扎了这么久,能短时间在这个新平台上发现如此有趣的高危漏洞的确使人心旷神怡。最后还是要特别感谢一下我的好哥们Dawgyg,谢谢他愿意花自己的空闲时间帮我研究这个漏洞。

雅虎给予的奖励:$3000

CVSS分数:9.9

原作者:Sam Curry

原文:http://samcurry.net/how-i-couldve-taken-over-the-production-server-of-a-yahoo-acquisition-through-command-injection/

本文由 看雪翻译小组 buusc 编译

本文标签:

版权声明:若无特殊注明,本文皆为《舜哥哥吖》原创,转载请保留文章出处。

本文链接:利用命令注入控制雅虎服务器 - http://www.shungg.cn/post/139

发表评论

电子邮件地址不会被公开。 必填项已用*标注