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


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

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


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

然后點擊 “Connect existing domain”:

再在其中填寫出可能存在漏洞的對應域名:

點擊“Next” 和 “Verify Connection”:

這之后,會成功跳轉到以下頁面:

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

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

成功連接后的確認:


大規模測試發現
在之前的文章中,我們介紹過使用Rapid7的Sonar和FDNS數據集工具可以很方便地進行一些漏洞測試利用。

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

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