我們得到的是一套根DNS服務器列表,下面我們就用根DNS服務器查詢infosecinstitute.com域名。具體操作方法如下圖所示:
這里我們獲得的是一套用于.com域驗證的域名服務器列表。請注意點(.)被放在com后方。這就使我們的查詢內容成為一個正式域名(簡稱FQDN)。接著我們利用這些域名服務器再進行一次查詢。
現(xiàn)在我們得到了infosecinstitute.com的驗證域名服務器列表(即上圖中的ns1.pairnic.com以及ns2.pairnic.com)。下面我們對這些域名服務器發(fā)起查詢,以獲取infosecinstitute.com的IP地址。
現(xiàn)在在應答部分我們能夠看到infosecinstitute.com的IP地址為216.92.251.5。任務完成!
通過我們自定義的DNS服務器進行查詢并獲取不同記錄也是可行的。在下圖中,我們將使用DIG命令向谷歌的DNS服務器(8.8.8.8)發(fā)起查詢,以搜索infosecinstitute.com的地址記錄。
基本上是指提供給DNS查詢的特定記錄的有效時間。如果我們再次重復以上查詢過程,可以看到現(xiàn)在TTL的有效時間已經(jīng)減少至3503。
當某個域被認定為惡意的情況下,它從全局域名空間中被清除掉的過程基本上分為兩個步驟。首先是從TLD服務器中清除對應記錄,接下來是等待其TTL在所有DNS服務器中的有效時間耗盡。
要確定某個域名的IP地址,需要了解的一大重點是該域的授權數(shù)據(jù)。授權數(shù)據(jù)中包含了域的NS記錄及其對應的A記錄,也就是域名服務器的IP地址。授權數(shù)據(jù)同樣擁有一條特定TTL,可以告訴我們授權數(shù)據(jù)將于何時進入緩存。在下圖中,我會向TLD服務器發(fā)送.com查詢,以獲取一條并不存在的子域地址。反饋回來的信息包含驗證部分以及附加部分,內容則涵蓋了指定域的NS記錄以及對應域名服務器的IP地址(即A記錄)。
讓我們來看看這個實例。我將在自己的網(wǎng)站中創(chuàng)建一個名為infosec.seraching-eye.com的子域。
完成之后,讓我們使用特定開放式DNS服務器8.8.8.8(即OpenDNS)來查詢這個新域。
我們仍然可以在應答部分看到響應結果。同樣,我們可以看到其中包含一個特定的TTL值:14399。授權數(shù)據(jù)現(xiàn)在已經(jīng)進入該服務器的緩存,因此我們再接再厲,清除剛剛建立的子域。
正如大家所見,子域inforsec.searching-eye.com已經(jīng)被成功刪除?,F(xiàn)在讓我們再進一步,再向同樣的DNS服務器發(fā)起針對子域inforsec.searching-eye.com的查詢指令。
令人驚訝的是,我們仍然收到了響應。
這是因為目前谷歌的DNS服務器緩存中仍然保留著查詢記錄。正如我們所見,TTL有效時間已經(jīng)縮短至12790。至于響應存在的原因,相信大家也能夠推斷出來:由于我們在子域存在的時候曾經(jīng)向該DNS服務器發(fā)出過查詢指令,因此相應授權數(shù)據(jù)就一直存在于該服務器的緩存中。
現(xiàn)在,我們要向自己的默認DNS服務器發(fā)起同樣的子域查詢指令。
根據(jù)上圖所示,我們沒有得到響應。這是因為由于我們的默認DNS服務器中并不具備相應緩存記錄,所以服務器將遍歷整個DNS層次結構,希望找到我們所查詢子域的IP地址。而一旦遍歷過程到達頂級域名(即.com)處,服務器會發(fā)現(xiàn)此記錄并不存在,最終也就不會返回任何結果。
漏洞
此漏洞由特定DNS服務器中的DNS緩存更新策略所引發(fā)。正如前文中所討論,某個域可以通過從TLD中刪除并耗盡全部DNS服務器中授權數(shù)據(jù)有效時間的方式從全局域名空間中徹底被清除。但只要能夠延長授權數(shù)據(jù)的TTL,例如使其永遠不歸零,那么這個域將始終處于可解析狀態(tài)。
請注意,并不是所有DNS服務器都存在此類漏洞。不過根據(jù)論文的闡述,此漏洞在大多數(shù)DNS服務器中都能輕松找到,因為這些服務器并沒有嚴格執(zhí)行緩存更新的邏輯要求。
第一步是注冊一個域名服務器。一般來說這種服務可以由我們的域名服務供應商提供。我希望自己的域名服務器采用xyz.mydomain.com的形式,而非xyz.hostingcompany.com的形式。請注意,我們提供的IP地址必須是一個有效的域名服務器IP。
一旦域名服務器注冊完成,我們就要按照下圖所示將其設置為自己的域名服務器。
根據(jù)下圖所示,我們已經(jīng)可以確定testns.searching-eye.com徹底設置完成。這套新的域名服務器可以用來查詢那些并不存在的子域。
接下來我們創(chuàng)建另一個名為ghost.searching-eye.com的子域。
這一步工作完成后,我們選取某個特定DNS服務器(當然要選那些存在漏洞的)并通過它查詢這個子域。
現(xiàn)在我們可以確定授權數(shù)據(jù)已然進入DNS服務器的緩存當中。乘勝追擊,刪除新建的子域。目前授權數(shù)據(jù)的TTL應該還存在,但處于不斷減少之中。因為我們知道授權數(shù)據(jù)包含著域的NS記錄以及域名服務器的A記錄,因此它可以表示如下:
在子域被刪除一段時間之后,授權數(shù)據(jù)可能如下圖所示:
下一步是改變域名服務器的名稱,比如改成test2.searching-eye.com。使用與之前同樣的DNS服務器(4.2.2.4),我們向其查詢域名服務器的A記錄,即test2.searching-eye.com。
解析程序將觀察授權數(shù)據(jù)并向testns.searching-eye.com的IP地址發(fā)送查詢指令,但此時該IP地址已經(jīng)被test2.searching-eye.com所占用。接著解析程序會返回域名服務器的IP地址,但它也將同時發(fā)現(xiàn)存在一個新的域名服務器(因為服務器名稱已經(jīng)經(jīng)過改動),最終結果是它會用新服務器覆蓋掉原有的緩存內容(不同的DNS服務器可能使用不同的緩存更新邏輯機制)。在緩存內容被覆蓋之后,授權數(shù)據(jù)將如下圖所示(前提是DNS服務器并沒有嚴格遵循緩存更新邏輯,也就是說本文所討論的漏洞在該服務器中確實存在):
請注意,新的授權數(shù)據(jù)被賦予了新的TTL值。如果多次重復上述過程,那么就能夠避免該TTL歸零(當然有某些特殊情況下,該值在很長一段時間后仍然會歸零,詳細情況請閱讀文章結尾提供的論文鏈接)。
為了讓這種攻擊模式大范圍起效,攻擊者必須向盡可能多的漏洞DNS服務器發(fā)送查詢指令,旨在盡量避免授權數(shù)據(jù)的TTL有效時間耗盡。由于眾多DNS服務器的緩存中仍然保留著授權數(shù)據(jù),因此攻擊者就能夠讓自己的惡意域始終有IP地址可用,進而使更多用戶順利訪問進來。
如何檢測幽靈域名
幽靈域名是指那些已經(jīng)被從TLD服務器中刪除,但卻仍然可被DNS服務器所解析的域。其出現(xiàn)的原因分以下兩種:
對應域授權數(shù)據(jù)的TTL值尚未耗盡。請注意,如果對象域的TTL不會被刷新,那么則不應將其視為幽靈域名。
授權數(shù)據(jù)的TTL值利用DNS服務器漏洞進行不斷刷新。
下面是一些頗具指導意義的辦法,以幫助大家揪出幽靈域名。
在域中通過遍歷DNS分層結構的方式執(zhí)行DNS查詢,即本文中“DNS查詢”章節(jié)中的內容。
利用特定DNS服務器對某個域的A記錄發(fā)起查詢。
如果DNS查詢步驟無法給出回應,但卻能通過使用特定DNS服務器得到查詢結果,那么目標域很可能屬于幽靈域。我們無法確定得出確切結論,因為很可能這種現(xiàn)象是由于授權數(shù)據(jù)的TTL尚未耗盡所造成(當然也不排除其中存在TTL重置活動)。所以,目前最大的難題就是界定哪些屬于幽靈域而哪些不是。
以下步驟可能具有一定輔助作用:
記錄目錄授權數(shù)據(jù)的TTL值。
等待域TTL值剩余時間耗盡,并再次發(fā)起查詢。如果該DNS服務器仍然能夠解析目標域,那么我們可以肯定該域為幽靈域。
綜述
在這篇文章中,我們就論文中公布的漏洞展開討論。歸納來說,就是通過非法更新DNS服務器緩存的方式,人為刷新特定域授權數(shù)據(jù)的TTL值。這意味著該域在被從TLD服務器中清除后,仍然可以長期處于可解析狀態(tài)。其后我們又討論了一些方法,用于界定某個特定域是否屬于幽靈域。
參考文獻
1.幽靈域名:被消除后仍可解析
https://www.isc.org/files/imce/ghostdomain_camera.pdf
2.DNS攻擊(從入門到精通)
http://resources.infosecinstitute.com/dns-hacking/