挖洞經驗 | 看我如何在短時間內對Shopify五萬多個子域名進行劫持
今天我要分享的是5萬多個Shopify平臺子域名劫持漏洞的發現過程。首先,我要說明的是,該漏洞不僅只存在於Shopify平臺系統,還存在其它幾個雲服務平臺系統中。在過去幾周時間裡,我們陸續聯絡了存在漏洞的各家廠商,Shopify平臺的快速反應、認識透徹和持續跟進的處置能力給我們留下了深刻印象。
ofollow,noindex" target="_blank">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 公開漏洞
*參考來源: medium ,clouds編譯,轉載請註明來自FreeBuf.COM。