1. 程式人生 > 其它 >以針對Yahoo! 的安全測試為例講解如何高效的進行子域名收集與篩選

以針對Yahoo! 的安全測試為例講解如何高效的進行子域名收集與篩選

平常我在Hackerone平臺上尋找新目標時,常常會關注廠商響應資訊,如果廠商響應越積極我就越感興趣。相對於響應資訊很少的廠商而言,我們更能從中摸索到問題的本質。換句話說,即越是大廠越是容易挖到漏洞。不信?今天就拿Yahoo!練手。

預測

眾所周知Yahoo!是一個國際性的大廠,所以我預計其擁有大量子域名,路徑以及重定向頁面。從何處下手呢?我常使用Sublister及Fierce進行列舉/爆破子域名。我希望能夠利用這些工具找到被遺忘,配置錯誤的或者還在使用舊版軟體執行的子域名。使用Subliste3r我獲得了超過9000條子域名資訊,如何進行檢查呢?

Semi - 自動化搜尋

我不信這9000多條子域名中沒有一個存在漏洞的。開啟Sublist3r掃描結果,手動刪除一些無效及重複子域名。雖然我沒有進行很細緻的檢查,但仍舊還有7000多條記錄。接下來進行這些記錄進行排序,使用Nmap以更容易解析的XML方式輸出結果。

nmap -sS -p80,443 -iL nmap_input.txt -oX nmap_output

輸出XML樣例:

<hostnames>
<hostname name=”start.producersdesktop.yahoo.com” type=”user”/>
<hostname name=”proxy.publish.bf1.yahoo.com” type=”PTR”/>
</hostnames>
<ports><port protocol=”tcp” portid=”80"><state state=”closed” reason=”reset” reason_ttl=”42"/><service name=”http” method=”table” conf=”3"/></port>
</ports>
<times srtt=”148262" rttvar=”148262" to=”741310"/>
</host>

我們只能掃描Nmap命令中指定的埠,對我來說掃描結果中最有用的引數為state以及hostname name。我相信hostname name就是DNS記錄,就我以往的經驗而言,這裡有時可能會是你的ISP地址,這時你就該考慮該站點是否有進行解析的問題。我們這裡的基數比較大,扔幾百條記錄出去影響也不大。為此我寫了一個指令碼,根據主機名的name引數決定是否刪除該XML條目。

import xmltree
def removeHostname():
   for host in root.iter('host'):
        for elem in host.iter():
            if 'name' in elem.attrib and elem.attrib['name'] == 'ISP_redir_site':
                root.remove(host)
tree.write('output.xml')

至此獲得所有開放80埠的子域名,接下來可以使用Nmap掃描這些子域名的HTML標題( — script http-title),並且再次對所得資料進行除重。Yahoo!這個國際性大廠設有多語言站點,比如:

ru.search.yahoo.com 
br.search.yahoo.com 
de.stars.yahoo.com

接下來我們便是要清除這些明顯的子域名,在最後獲得的子域名中依舊有700條記錄。

枯燥的研究

接下來就是花時間仔細檢測剩下的子域名記錄了。由於不知道這些子域名之間是否還存在著共同點,所以只能手工一個一個的來測試了。測試一段時間之後,我發現某些子域名存在相似點以及可重複性。開啟http://yvap.query.yahoo.com/我才發現其屬於YQL內部主機,同樣的我在http://ygh-app.media.yahoo.com/也觀察到這個資訊。

YQL (Yahoo! Query Language)內部主機

Beaker

深入探究

http://yvap.query.yahoo.com/v1/test/js/console_ajax.js中的JavaScript程式碼之外,我沒有發現任何有趣的資訊。這裡不止一個內部主機,但是不是出於關閉狀態就是下面截圖這個樣子。

鎖著的內部YQL主機YQL的示例查詢如下:

https://query.yahooapis.com/v1/public/yql?q=show%20tables&diagnostics=true

我嘗試使用該方法來重置鎖著的主機,意思即是雖然主面板顯示內部主機是無法訪問,但你仍然可以通過URL提交查詢。將列表中的子域名一個一個的拿來檢測,其中大部分都能執行show tables命令。在向廠商報告問題之後我想繼續深入下去,結果發現該頁面可任意訪問在http://ygh-app.media.yahoo.com我發現用於測試的Beaker站點,老實說這還是我第一次處理這種情況。經過檢測發現了另一個洩露的資訊。

總結

這並不是一個革命性的方法,但相交其他方式會快一點,準確一點,耗費時間更少一點。在兩個星期前我發現一個名為Aquatone的工具將所用到的指令碼都整合到一起了。

時間軸

5月10日 - 向HackerOne平臺報告 5月11日 - Yahoo!響應YQL主機的問題之前已經有報告過,但第二個問題是最新報告 5月12日 - 我提出可以向YQL主機發送查詢請求的可能 5月18日 - 答覆這是有意的行為 6月 2日 - 獲取獎金