域名漏洞:以DNS服務(wù)器邏輯性為突破口的安全威脅
譯文所謂DNS,是一套將人類可讀的域名轉(zhuǎn)化為計(jì)算機(jī)可識(shí)別IP地址的命名系統(tǒng)。每當(dāng)一條尚不存在于解析器緩存中的域名查詢請(qǐng)求出現(xiàn),這一轉(zhuǎn)化過(guò)程就會(huì)在從根服務(wù)器到頂級(jí)域名(例如.com型域名)的整個(gè)DNS層級(jí)體系中走上一遍。接下來(lái)頂級(jí)域名(簡(jiǎn)稱TLD)會(huì)把能夠向我們提供所需IP地址的已授權(quán)域名服務(wù)器找到,并將相關(guān)信息提交回來(lái)。在我們從域名服務(wù)器獲取到對(duì)應(yīng)的域名信息之后,結(jié)果將帶著一個(gè)特定的TTL值(即有效時(shí)間值)進(jìn)入DNS解析程序緩存,最終在有效期結(jié)束時(shí)被清出。
有些時(shí)候,某個(gè)域會(huì)被認(rèn)定為惡意對(duì)象并遭到清除。出現(xiàn)這種情況的原因可謂多種多樣,例如惡意軟件傳播、釣魚感染等。一般來(lái)說(shuō),防止用戶對(duì)某個(gè)域發(fā)起訪問(wèn)的常見方式是將該域從TLD服務(wù)器中刪除。然而這還不足以徹底消除安全隱患,因?yàn)橛蛉匀荒軌蛟俅斡山馕龀绦蚪馕?,并在下一次TTL過(guò)期之前始終處于可用狀態(tài)。通常情況下這算不得什么大問(wèn)題,因?yàn)門TL值生效時(shí)間本身就很短,所以攻擊型域的存在時(shí)間可能只有數(shù)秒或者數(shù)分鐘。
在本文中,我們將討論近來(lái)存在于大多數(shù)DNS服務(wù)器中的DNS漏洞。此漏洞是由江堅(jiān)、梁津津、李康、李軍、段海心以及吳建平等多位研究人員共同發(fā)現(xiàn)的。點(diǎn)擊此處可以查看他們的研究論文。
該漏洞的突破口在于某些DNS服務(wù)器中的緩存更新邏輯缺口。此漏洞允許緩存以特定方式被改寫,進(jìn)而導(dǎo)致某個(gè)特定域?qū)⒃诰彺嬷袚碛性丛床粩嗟腡TL授權(quán)數(shù)據(jù),且TTL值不受有效時(shí)間所限。這樣一來(lái),即使該域被從TLD服務(wù)器中清出,也仍然會(huì)一直處于可解析狀態(tài)。此種類型的域如今有了自己的名號(hào):幽靈域名(即Ghost Domain Name)。
DNS基礎(chǔ)知識(shí)
首先,讓我們先來(lái)了解DNS解析工作是如何進(jìn)行的。
比如說(shuō),用戶打開瀏覽器并在地址欄中輸入infosecinstitute.com內(nèi)容。這時(shí)用戶操作系統(tǒng)中的DNS解析程序就會(huì)運(yùn)作起來(lái),嘗試為該域名找出對(duì)應(yīng)的IP地址。解析程序首先會(huì)檢查本地緩存,以確認(rèn)該查詢域名是否在緩存中存在記錄。緩存中通常保存著最近一段時(shí)間內(nèi)用戶使用過(guò)的IP地址與主機(jī)名稱映射,這樣解析程序就不必重復(fù)再重復(fù)地為同一個(gè)域名多次獲取IP地址。如果解析程序在緩存中無(wú)法找到對(duì)應(yīng)的IP地址,那么接下來(lái)它就要向DNS服務(wù)器發(fā)送請(qǐng)求,檢查是否存在該域名的記錄。DNS服務(wù)器通常由我們的網(wǎng)絡(luò)服務(wù)供應(yīng)商(簡(jiǎn)稱ISP)提供,當(dāng)然大家也可以為自己進(jìn)行手動(dòng)選擇。如果此時(shí)仍然查找不到記錄,解析程序就會(huì)向不同的域名服務(wù)器發(fā)送循環(huán)DNS查詢,以期找到所查域名。當(dāng)IP地址被尋獲時(shí),解析程序會(huì)在將地址發(fā)回用戶端的同時(shí)保存在緩存中,以方便今后的使用。
#p# 深入了解DNS查詢
理解DNS查詢的工作原理非常重要。要完成查詢,我們需要由根服務(wù)器出發(fā)、直到頂級(jí)域名為止,行遍整個(gè)DNS層級(jí)體系。打開Backtrack終端(大家也可以使用自己喜歡的其它發(fā)行版)并輸入“dig”。屏幕上的顯示結(jié)果如下所示:
我們得到的是一套根DNS服務(wù)器列表,下面我們就用根DNS服務(wù)器查詢infosecinstitute.com域名。具體操作方法如下圖所示:
這里我們獲得的是一套用于.com域驗(yàn)證的域名服務(wù)器列表。請(qǐng)注意點(diǎn)(.)被放在com后方。這就使我們的查詢內(nèi)容成為一個(gè)正式域名(簡(jiǎn)稱FQDN)。接著我們利用這些域名服務(wù)器再進(jìn)行一次查詢。
現(xiàn)在我們得到了infosecinstitute.com的驗(yàn)證域名服務(wù)器列表(即上圖中的ns1.pairnic.com以及ns2.pairnic.com)。下面我們對(duì)這些域名服務(wù)器發(fā)起查詢,以獲取infosecinstitute.com的IP地址。
#p# 現(xiàn)在在應(yīng)答部分我們能夠看到infosecinstitute.com的IP地址為216.92.251.5。任務(wù)完成!
通過(guò)我們自定義的DNS服務(wù)器進(jìn)行查詢并獲取不同記錄也是可行的。在下圖中,我們將使用DIG命令向谷歌的DNS服務(wù)器(8.8.8.8)發(fā)起查詢,以搜索infosecinstitute.com的地址記錄。
基本上是指提供給DNS查詢的特定記錄的有效時(shí)間。如果我們?cè)俅沃貜?fù)以上查詢過(guò)程,可以看到現(xiàn)在TTL的有效時(shí)間已經(jīng)減少至3503。
當(dāng)某個(gè)域被認(rèn)定為惡意的情況下,它從全局域名空間中被清除掉的過(guò)程基本上分為兩個(gè)步驟。首先是從TLD服務(wù)器中清除對(duì)應(yīng)記錄,接下來(lái)是等待其TTL在所有DNS服務(wù)器中的有效時(shí)間耗盡。
要確定某個(gè)域名的IP地址,需要了解的一大重點(diǎn)是該域的授權(quán)數(shù)據(jù)。授權(quán)數(shù)據(jù)中包含了域的NS記錄及其對(duì)應(yīng)的A記錄,也就是域名服務(wù)器的IP地址。授權(quán)數(shù)據(jù)同樣擁有一條特定TTL,可以告訴我們授權(quán)數(shù)據(jù)將于何時(shí)進(jìn)入緩存。在下圖中,我會(huì)向TLD服務(wù)器發(fā)送.com查詢,以獲取一條并不存在的子域地址。反饋回來(lái)的信息包含驗(yàn)證部分以及附加部分,內(nèi)容則涵蓋了指定域的NS記錄以及對(duì)應(yīng)域名服務(wù)器的IP地址(即A記錄)。
讓我們來(lái)看看這個(gè)實(shí)例。我將在自己的網(wǎng)站中創(chuàng)建一個(gè)名為infosec.seraching-eye.com的子域。
完成之后,讓我們使用特定開放式DNS服務(wù)器8.8.8.8(即OpenDNS)來(lái)查詢這個(gè)新域。

#p# 我們?nèi)匀豢梢栽趹?yīng)答部分看到響應(yīng)結(jié)果。同樣,我們可以看到其中包含一個(gè)特定的TTL值:14399。授權(quán)數(shù)據(jù)現(xiàn)在已經(jīng)進(jìn)入該服務(wù)器的緩存,因此我們?cè)俳釉賲?,清除剛剛建立的子域?nbsp;
正如大家所見,子域inforsec.searching-eye.com已經(jīng)被成功刪除。現(xiàn)在讓我們?cè)龠M(jìn)一步,再向同樣的DNS服務(wù)器發(fā)起針對(duì)子域inforsec.searching-eye.com的查詢指令。
令人驚訝的是,我們?nèi)匀皇盏搅隧憫?yīng)。
這是因?yàn)槟壳肮雀璧腄NS服務(wù)器緩存中仍然保留著查詢記錄。正如我們所見,TTL有效時(shí)間已經(jīng)縮短至12790。至于響應(yīng)存在的原因,相信大家也能夠推斷出來(lái):由于我們?cè)谧佑虼嬖诘臅r(shí)候曾經(jīng)向該DNS服務(wù)器發(fā)出過(guò)查詢指令,因此相應(yīng)授權(quán)數(shù)據(jù)就一直存在于該服務(wù)器的緩存中。
現(xiàn)在,我們要向自己的默認(rèn)DNS服務(wù)器發(fā)起同樣的子域查詢指令。
根據(jù)上圖所示,我們沒(méi)有得到響應(yīng)。這是因?yàn)橛捎谖覀兊哪J(rèn)DNS服務(wù)器中并不具備相應(yīng)緩存記錄,所以服務(wù)器將遍歷整個(gè)DNS層次結(jié)構(gòu),希望找到我們所查詢子域的IP地址。而一旦遍歷過(guò)程到達(dá)頂級(jí)域名(即.com)處,服務(wù)器會(huì)發(fā)現(xiàn)此記錄并不存在,最終也就不會(huì)返回任何結(jié)果。
#p# 漏洞
此漏洞由特定DNS服務(wù)器中的DNS緩存更新策略所引發(fā)。正如前文中所討論,某個(gè)域可以通過(guò)從TLD中刪除并耗盡全部DNS服務(wù)器中授權(quán)數(shù)據(jù)有效時(shí)間的方式從全局域名空間中徹底被清除。但只要能夠延長(zhǎng)授權(quán)數(shù)據(jù)的TTL,例如使其永遠(yuǎn)不歸零,那么這個(gè)域?qū)⑹冀K處于可解析狀態(tài)。
請(qǐng)注意,并不是所有DNS服務(wù)器都存在此類漏洞。不過(guò)根據(jù)論文的闡述,此漏洞在大多數(shù)DNS服務(wù)器中都能輕松找到,因?yàn)檫@些服務(wù)器并沒(méi)有嚴(yán)格執(zhí)行緩存更新的邏輯要求。
第一步是注冊(cè)一個(gè)域名服務(wù)器。一般來(lái)說(shuō)這種服務(wù)可以由我們的域名服務(wù)供應(yīng)商提供。我希望自己的域名服務(wù)器采用xyz.mydomain.com的形式,而非xyz.hostingcompany.com的形式。請(qǐng)注意,我們提供的IP地址必須是一個(gè)有效的域名服務(wù)器IP。
一旦域名服務(wù)器注冊(cè)完成,我們就要按照下圖所示將其設(shè)置為自己的域名服務(wù)器。
根據(jù)下圖所示,我們已經(jīng)可以確定testns.searching-eye.com徹底設(shè)置完成。這套新的域名服務(wù)器可以用來(lái)查詢那些并不存在的子域。
接下來(lái)我們創(chuàng)建另一個(gè)名為ghost.searching-eye.com的子域。
這一步工作完成后,我們選取某個(gè)特定DNS服務(wù)器(當(dāng)然要選那些存在漏洞的)并通過(guò)它查詢這個(gè)子域。
#p# 現(xiàn)在我們可以確定授權(quán)數(shù)據(jù)已然進(jìn)入DNS服務(wù)器的緩存當(dāng)中。乘勝追擊,刪除新建的子域。目前授權(quán)數(shù)據(jù)的TTL應(yīng)該還存在,但處于不斷減少之中。因?yàn)槲覀冎朗跈?quán)數(shù)據(jù)包含著域的NS記錄以及域名服務(wù)器的A記錄,因此它可以表示如下:
在子域被刪除一段時(shí)間之后,授權(quán)數(shù)據(jù)可能如下圖所示:
下一步是改變域名服務(wù)器的名稱,比如改成test2.searching-eye.com。使用與之前同樣的DNS服務(wù)器(4.2.2.4),我們向其查詢域名服務(wù)器的A記錄,即test2.searching-eye.com。
解析程序?qū)⒂^察授權(quán)數(shù)據(jù)并向testns.searching-eye.com的IP地址發(fā)送查詢指令,但此時(shí)該IP地址已經(jīng)被test2.searching-eye.com所占用。接著解析程序會(huì)返回域名服務(wù)器的IP地址,但它也將同時(shí)發(fā)現(xiàn)存在一個(gè)新的域名服務(wù)器(因?yàn)榉?wù)器名稱已經(jīng)經(jīng)過(guò)改動(dòng)),最終結(jié)果是它會(huì)用新服務(wù)器覆蓋掉原有的緩存內(nèi)容(不同的DNS服務(wù)器可能使用不同的緩存更新邏輯機(jī)制)。在緩存內(nèi)容被覆蓋之后,授權(quán)數(shù)據(jù)將如下圖所示(前提是DNS服務(wù)器并沒(méi)有嚴(yán)格遵循緩存更新邏輯,也就是說(shuō)本文所討論的漏洞在該服務(wù)器中確實(shí)存在):
請(qǐng)注意,新的授權(quán)數(shù)據(jù)被賦予了新的TTL值。如果多次重復(fù)上述過(guò)程,那么就能夠避免該TTL歸零(當(dāng)然有某些特殊情況下,該值在很長(zhǎng)一段時(shí)間后仍然會(huì)歸零,詳細(xì)情況請(qǐng)閱讀文章結(jié)尾提供的論文鏈接)。
為了讓這種攻擊模式大范圍起效,攻擊者必須向盡可能多的漏洞DNS服務(wù)器發(fā)送查詢指令,旨在盡量避免授權(quán)數(shù)據(jù)的TTL有效時(shí)間耗盡。由于眾多DNS服務(wù)器的緩存中仍然保留著授權(quán)數(shù)據(jù),因此攻擊者就能夠讓自己的惡意域始終有IP地址可用,進(jìn)而使更多用戶順利訪問(wèn)進(jìn)來(lái)。
#p# 如何檢測(cè)幽靈域名
幽靈域名是指那些已經(jīng)被從TLD服務(wù)器中刪除,但卻仍然可被DNS服務(wù)器所解析的域。其出現(xiàn)的原因分以下兩種:
對(duì)應(yīng)域授權(quán)數(shù)據(jù)的TTL值尚未耗盡。請(qǐng)注意,如果對(duì)象域的TTL不會(huì)被刷新,那么則不應(yīng)將其視為幽靈域名。
授權(quán)數(shù)據(jù)的TTL值利用DNS服務(wù)器漏洞進(jìn)行不斷刷新。
下面是一些頗具指導(dǎo)意義的辦法,以幫助大家揪出幽靈域名。
在域中通過(guò)遍歷DNS分層結(jié)構(gòu)的方式執(zhí)行DNS查詢,即本文中“DNS查詢”章節(jié)中的內(nèi)容。
利用特定DNS服務(wù)器對(duì)某個(gè)域的A記錄發(fā)起查詢。
如果DNS查詢步驟無(wú)法給出回應(yīng),但卻能通過(guò)使用特定DNS服務(wù)器得到查詢結(jié)果,那么目標(biāo)域很可能屬于幽靈域。我們無(wú)法確定得出確切結(jié)論,因?yàn)楹芸赡苓@種現(xiàn)象是由于授權(quán)數(shù)據(jù)的TTL尚未耗盡所造成(當(dāng)然也不排除其中存在TTL重置活動(dòng))。所以,目前最大的難題就是界定哪些屬于幽靈域而哪些不是。
以下步驟可能具有一定輔助作用:
記錄目錄授權(quán)數(shù)據(jù)的TTL值。
等待域TTL值剩余時(shí)間耗盡,并再次發(fā)起查詢。如果該DNS服務(wù)器仍然能夠解析目標(biāo)域,那么我們可以肯定該域?yàn)橛撵`域。
綜述
在這篇文章中,我們就論文中公布的漏洞展開討論。歸納來(lái)說(shuō),就是通過(guò)非法更新DNS服務(wù)器緩存的方式,人為刷新特定域授權(quán)數(shù)據(jù)的TTL值。這意味著該域在被從TLD服務(wù)器中清除后,仍然可以長(zhǎng)期處于可解析狀態(tài)。其后我們又討論了一些方法,用于界定某個(gè)特定域是否屬于幽靈域。
參考文獻(xiàn)
1.幽靈域名:被消除后仍可解析
https://www.isc.org/files/imce/ghostdomain_camera.pdf
2.DNS攻擊(從入門到精通)
http://resources.infosecinstitute.com/dns-hacking/
原文鏈接:
http://resources.infosecinstitute.com/ghost-domain-names/





































