利用ImageMagick命令執(zhí)行漏洞拿下Facebook四萬(wàn)美元獎(jiǎng)金

前言
我相信很多人都知道ImageMagick和它存在的漏洞,這個(gè)漏洞發(fā)現(xiàn)于2016年四月底,同時(shí),由于許多插件都依賴于這個(gè)ImageMagick庫(kù),因此,這個(gè)漏洞的影響范圍很大。有證據(jù)表明,關(guān)于這個(gè)漏洞的信息,發(fā)現(xiàn)它的研究人員是知道的,ImageMagick開(kāi)發(fā)團(tuán)隊(duì)的人也知道,但是,糟糕的是,一些其它的人(壞人)也知道了這個(gè)漏洞,在2016年5月3日,在互聯(lián)網(wǎng)上發(fā)現(xiàn)了這個(gè)漏洞的POC。許多研究人員發(fā)現(xiàn)了這個(gè)問(wèn)題,而且應(yīng)用程序還沒(méi)有及時(shí)更新。但由于一些未知的原因,我不在其中,但這是在5月份。
漏洞分析
直到十月的一個(gè)星期六,我對(duì)一些大的服務(wù)(不是Facebook)進(jìn)行了測(cè)試,當(dāng)時(shí)一些重定向讓我關(guān)注到了Facebook。這是一個(gè)《分享到Facebook》對(duì)話框:
鏈接是:
https://www.facebook.com/dialog/feedapp_id=APP_ID&link=link.example.tld&picture=http%3A%2F%2Fattacker.tld%2Fexploit.png&name=news_name&caption=news_caption&description=news_descriotion&redirect_uri=http%3A%2F%2Fwww.facebook.com&ext=1476569763&hash=Aebid3vZFdh4UF1H
大家可以看到,如果我們仔細(xì)看,我們可以看到在URL中有一個(gè)“picture”參數(shù)。但是在上面提到的頁(yè)面內(nèi)容中,這并不是圖片URL,例如:

https://www.google.com/images/errors/robot.png
變成了:
https://external.fhen11.fna.fbcdn.net/safe_image.phpd=AQDaeWq2Fn1Ujs4P&w=158&h=158&url=https%3A%2F%2Fwww.google.com%2Fimages%2Ferrors%2Frobot.png&cfs=1&upscale=1&_nc_hash=AQD2uvqIgAdXgWyb
我首先考慮到了一些關(guān)于SSRF的問(wèn)題。但是測(cè)試顯示,這個(gè)URL中的參數(shù)請(qǐng)求來(lái)自于31.13.97.*網(wǎng)絡(luò),通過(guò)“facebookexternalhit/1.1”參數(shù),如下:
它看起來(lái)像獨(dú)立服務(wù)器的正常請(qǐng)求。我開(kāi)始深入挖掘。在對(duì)這個(gè)參數(shù)進(jìn)行一些測(cè)試后,我很失望,沒(méi)有一個(gè)成功,ImageTragick是最后一點(diǎn)希望。如果你不熟悉這個(gè)問(wèn)題或有點(diǎn)懶惰,這里有一POC鏈接。下面是一個(gè)簡(jiǎn)單的exploit.png載荷:
但是當(dāng)我監(jiān)聽(tīng)端口時(shí),什么也沒(méi)發(fā)現(xiàn):
![]()
不過(guò),如果有一些防火墻限制呢?-我問(wèn)我自己。
好吧,通常一些公司會(huì)過(guò)濾正常的請(qǐng)求,但是不會(huì)過(guò)濾DNS,讓我們?cè)僭囈粋€(gè)載荷:
結(jié)果是:
這個(gè)IP是誰(shuí)的呢?看下圖:
![]()
成功了!
讓我們總結(jié)一下,應(yīng)用程序的工作流程是:
獲得“picture”參數(shù),并向它發(fā)出請(qǐng)求,這個(gè)請(qǐng)求是正常的,沒(méi)有漏洞。
收到一個(gè)圖片,這個(gè)圖片經(jīng)過(guò)了converter的轉(zhuǎn)換,而它使用了有漏洞的ImageMagick庫(kù)。
說(shuō)實(shí)話,我試圖找到一個(gè)通用的方法來(lái)利用這個(gè)HTTP請(qǐng)求,但是經(jīng)過(guò)簡(jiǎn)短的測(cè)試后,我發(fā)現(xiàn)所有向外的端口都被關(guān)閉了,我花了很長(zhǎng)的時(shí)間去找一個(gè)能打開(kāi)的,沒(méi)有成功,我需要找到另一種能讓POC有效的方法。
載荷:
回應(yīng)是:
下面是“id”返回的信息:
為了充分證明存在這個(gè)漏洞,我給Facebook安全團(tuán)隊(duì)提供了“cat/proc/version”的結(jié)果,在這里我就不公布它的結(jié)果了。
根據(jù)Facebook負(fù)責(zé)任的漏洞披露政策,我沒(méi)有進(jìn)行更深的研究。
我和Facebook安全團(tuán)隊(duì)的Neal研究員討論了最初的報(bào)告,“cat/proc/version | base64”可能更好,同時(shí),一些更深層次的研究表明,“base32”在包括DNS隧道的各種技術(shù)中是比較常用的(請(qǐng)看:https://www.sans.org/reading-room/whitepapers/dns/detecting-dns-tunneling-34152)。
我很高興成為攻破Facebook的人之一。
時(shí)間線
- 16 Oct 2016, 03:31 am: 初始報(bào)告;
- 18 Oct 2016, 05:35 pm: Neal向我要使用的POC;
- 18 Oct 2016, 08:40 pm: 我發(fā)送了一個(gè)POC并提供了額外的信息;
- 18 Oct 2016, 10:31 pm: Neal確認(rèn)了漏洞;
- 19 Oct 2016, 12:26 am: Neal說(shuō)正在修復(fù)漏洞;
- 19 Oct 2016, 02:28 am: Neal通知我說(shuō)漏洞已經(jīng)修復(fù);
- 19 Oct 2016, 07:49 am: 我回答說(shuō),確認(rèn)漏洞修補(bǔ),并要求披露時(shí)間表;
- 22 Oct 2016, 03:34 am: 尼爾回答披露時(shí)間表;
- 28 Oct 2016, 03:04 pm: 4萬(wàn)美元的獎(jiǎng)勵(lì)發(fā)放;
- 16 Dec 2016: 披露批準(zhǔn);


































