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


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

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


在該過程中,如果我們開啟了Burp抓包的話,可以看到一個發(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”})
這種方式,能簡單測試某個商店名稱是否可注冊。為此,可以寫個小腳本來跑跑,我們的腳本可點此下載。
該場景中,我們以之前我們注冊的商店名buckhacker來做演示。如果這個過程中,我們發(fā)現(xiàn)某個商店名稱是可繼續(xù)注冊的,那么,我們只需在Shopify管理面板中去連接它即可。也就是在如下管理后臺中的 “Online Store” 下點擊 “Domains”:

然后點擊 “Connect existing domain”:

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

點擊“Next” 和 “Verify Connection”:

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

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

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

成功連接后的確認:


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

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

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