
今天我要分享的是5萬多個(gè)Shopify平臺子域名劫持漏洞的發(fā)現(xiàn)過程。首先,我要說明的是,該漏洞不僅只存在于Shopify平臺系統(tǒng),還存在其它幾個(gè)云服務(wù)平臺系統(tǒng)中。在過去幾周時(shí)間里,我們陸續(xù)聯(lián)系了存在漏洞的各家廠商,Shopify平臺的快速反應(yīng)、認(rèn)識透徹和持續(xù)跟進(jìn)的處置能力給我們留下了深刻印象。
Shopify 是一個(gè)面向中小型企業(yè)的多渠道電商服務(wù)平臺,它集建站、銷售和宣傳服務(wù),幫助用戶通過線上網(wǎng)店或社交媒體隨時(shí)隨地銷售產(chǎn)品,Shopify 為全球 60 多萬商家提供了線上服務(wù),在高峰期每秒處理 8 萬個(gè)請求。
Shopify的子域名劫持漏洞
在Shopify的域名測試中,如果遇到以下兩種網(wǎng)頁響應(yīng),那么目標(biāo)網(wǎng)站就可能存在子域名劫持漏洞:


那接下來,如何來確定是否真的存在漏洞呢?
首先,需要來看兩種DNS記錄信息:
一種是網(wǎng)頁應(yīng)用名稱映射,也就是myshopname.myshopify.com的域名別名記錄;
另外就是看DNS映射,也就是shops.myshopify.com的域名別名記錄。
當(dāng)然,還有其它方法,我們在此不作詳解。我們就來認(rèn)真看看以上兩種DNS記錄信息。
網(wǎng)頁應(yīng)用名稱映射
該例子中,我們可以為指向buckhacker.shopify.com的shop.buckhacker.com映射設(shè)置一條別名記錄(CNAME)。以下是對shop.buckhacker.com的nslookup信息:

如果在Shopify記錄中,商店名稱(像這里的buckhacker)未被注冊認(rèn)領(lǐng)(claim),那么,我們可以注冊認(rèn)領(lǐng)它,然后進(jìn)行子域名劫持測試。那如何知道某個(gè)商店名稱是否被注冊認(rèn)領(lǐng)(claim)了呢?
在Shopify賬號注冊階段,需要強(qiáng)制填寫你的商店名稱(Store Name),填寫之后,那么Shopify將會把這個(gè)Store Name分配為其免費(fèi)的二級域名地址,如你填寫的Store Name是bag,其二級域名就是http://bag.myshopify.com。在這里,如果你填寫的商店名稱是被別人注冊過的,那么,系統(tǒng)會有提示。就像以下兩種不可用和可用的商店名稱注冊狀態(tài):


在該過程中,如果我們開啟了Burp抓包的話,可以看到一個(gè)發(fā)往 REST API的請求,以下兩種操作分別對應(yīng)了兩種響應(yīng)信息:
#1 Unavailable ({“status”:”unavailable”,”message”:null,”host”:”buckhacker.myshopify.com”})
#2 Available ({“status”:”available”,”message”:null,”host”:”buckhacker2.myshopify.com”})
這種方式,能簡單測試某個(gè)商店名稱是否可注冊。為此,可以寫個(gè)小腳本來跑跑,我們的腳本可點(diǎn)此下載。
該場景中,我們以之前我們注冊的商店名buckhacker來做演示。如果這個(gè)過程中,我們發(fā)現(xiàn)某個(gè)商店名稱是可繼續(xù)注冊的,那么,我們只需在Shopify管理面板中去連接它即可。也就是在如下管理后臺中的 “Online Store” 下點(diǎn)擊 “Domains”:

然后點(diǎn)擊 “Connect existing domain”:

再在其中填寫出可能存在漏洞的對應(yīng)域名:

點(diǎn)擊“Next” 和 “Verify Connection”:

這之后,會成功跳轉(zhuǎn)到以下頁面:

到了這步,就完成了Shopify的一個(gè)子域名劫持測試了。這種情況下,存在漏洞的原因就是,這條別名記錄是存在的,而且商店名稱是可注冊的,這樣子域名劫持漏洞很少見,因?yàn)槟忝鎸Φ哪繕?biāo)是Shopify賬號注冊時(shí)要填寫的商店名稱,所以,其前提是,需要原來用戶對之前的賬戶完全刪除或執(zhí)行域名變更,才有可能存在子域名劫持漏洞。經(jīng)過調(diào)查,我們發(fā)現(xiàn)大約有2%的Shopify網(wǎng)站存在這樣的錯(cuò)誤配置問題。DNS映射
在這個(gè)例子中,存在子域名指向shops.myshopify.com的一條CNAME記錄,如:

這算是Shopify上常見的子域名劫持情況了,這種配置下,我們可以創(chuàng)建一個(gè)可注冊的商店名,再按照像前述的測試方式,在Shopify管理后臺中去連接管理其對應(yīng)的域名。以下是其操作方式,如在我的后臺中去連接sales.buckhacker.com:

成功連接后的確認(rèn):


大規(guī)模測試發(fā)現(xiàn)
在之前的文章中,我們介紹過使用Rapid7的Sonar和FDNS數(shù)據(jù)集工具可以很方便地進(jìn)行一些漏洞測試?yán)谩?/span>

Rapid7的FDNS數(shù)據(jù)集中包含了大量的CNAMES記錄,所以,其實(shí)我們要做的就是在這個(gè)數(shù)據(jù)集中尋找CNAME指向shop.myshopify.com或者myshopname.shopify.com的子域名,圍繞這兩個(gè)域名的相關(guān)記錄,再深入檢查是否存在子域名劫持漏洞。

所有的漏洞測試步驟都可用一條命令來實(shí)現(xiàn):
zcat $FDNS_DATASET | strings | grep shopify.com | cut -d “\”” -f 8 | grep -v “shopify.com” | while read subdomain; do python3 ShopifySubdomainTakeoverCheck.py $subdomain; done
這里,我們要解釋一下,雖然存在其它子域名劫持漏洞的發(fā)現(xiàn)工具,但我們還是自行開發(fā)了這個(gè)工具來做測試,原因在于,其它工具都是基于Shopify的錯(cuò)誤響應(yīng)頁面來檢測的,這樣會導(dǎo)致大量誤報(bào),在這些大量誤報(bào)中僅有小部分是存在子域劫持漏洞的。我們的腳本和方式雖然簡單,但執(zhí)行了三種檢查,即錯(cuò)誤響應(yīng)頁面檢查、CNAME記錄檢查和 REST API請求檢查 ,最終運(yùn)行結(jié)果相對于更加準(zhǔn)確。
如果按照2017年版本的FDNSv2數(shù)據(jù)集來跑,最終的檢測結(jié)果非常之多:大約有超過55,000個(gè)Shopify子域名存在子域名劫持漏洞。然后,從這些結(jié)果中,我們就可以對照數(shù)據(jù)來判斷其它廠商的相關(guān)域名是否中招了。當(dāng)然了,這種類似的漏洞檢測方式,也可以適用于對其它域名注冊提供商的檢查。
總結(jié)
這種方式的檢測手段,可以大概了解某個(gè)目標(biāo)廠商存在的子域名劫持漏洞情況。在云服務(wù)時(shí)代,除了傳統(tǒng)的進(jìn)程和堆棧的系統(tǒng)漏洞研究之外,還需要一些新的漏洞研究方法,提高思維高度寬度。抽象點(diǎn)說,整個(gè)云服務(wù)平臺就是一個(gè)廣泛的操作系統(tǒng)。
漏洞上報(bào)進(jìn)程
2018.8.21 通過HackerOne將漏洞上報(bào)給Shopify
2018.8.21 Shopify初步響應(yīng)
2018.8.23 Shopify后續(xù)反饋
2018.9.10 公開漏洞
|