0x00 起因
前幾天的全國(guó)高校網(wǎng)絡(luò)信息安全管理運(yùn)維挑戰(zhàn)賽的DNS101,從上午查資料到結(jié)束踊兜,雖然最終做出來(lái)了,但卻不解其原理队他,遂
開(kāi)啟了對(duì)DNS的學(xué)習(xí)歷程。
0x01 DNS是什么
DNS(Domain Name System峻村,域名系統(tǒng))漱挎,因特網(wǎng)上作為域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使用戶更方便的訪問(wèn)互聯(lián)網(wǎng)雀哨,而不用去記住能夠被機(jī)器直接讀取的IP數(shù)串。通過(guò)主機(jī)名私爷,最終得到該主機(jī)名對(duì)應(yīng)的IP地址的過(guò)程叫做域名解析(或主機(jī)名解析)雾棺。 摘自百度百科
百科的解釋非常直接,但對(duì)于我這種小白來(lái)說(shuō)太過(guò)寬泛衬浑,看了之后有了個(gè)大致的了解捌浩,卻也說(shuō)不清到底是個(gè)啥,我還學(xué)要了解更多工秩。
萬(wàn)一別人問(wèn)起來(lái)至少要吹牛逼吹得高大上一些嘛
0x02 為什么會(huì)有DNS
網(wǎng)絡(luò)通訊大部分都是基于TCP/IP協(xié)議尸饺,而此協(xié)議則是基于IP地址,所以計(jì)算機(jī)在網(wǎng)絡(luò)上進(jìn)行通訊時(shí)只能識(shí)別如1.2.3.4之類(lèi)的IP地址而不能識(shí)別域名助币。由于IP地址不方便記憶浪听,于是需要DNS將輸入的域名“翻譯”成相對(duì)應(yīng)的IP地址,正確訪問(wèn)對(duì)應(yīng)的網(wǎng)頁(yè)眉菱。
0x03 需要知道的一些術(shù)語(yǔ)
域名(Domain Name)
這大概是我們接觸到的DNS最常用方式迹栓,也就是我們通常所說(shuō)的網(wǎng)址如baidu.com,google.com等。
頂級(jí)域名(Top-Level Domain)
又稱(chēng)一級(jí)域名俭缓,分為三類(lèi):一是國(guó)家和地區(qū)頂級(jí)域名(country code top-level domains克伊,簡(jiǎn)稱(chēng)ccTLDs),如cn华坦,jp等愿吹;二是國(guó)際頂級(jí)域名(generic top-level domains,簡(jiǎn)稱(chēng)gTLDs)惜姐,如表示工商企業(yè)的com犁跪,表示網(wǎng)絡(luò)提供商的net,表示非盈利組織的org等歹袁。三是新頂級(jí)域名(New gTLD)如通用的xyz耘拇、代表“紅色”的red、代表“人”的men等一千多種宇攻。
全稱(chēng)域名(FullyQualified Domain Name)
又稱(chēng)完全合格域名惫叛,是指主機(jī)名加上全稱(chēng)路徑,全路徑中列出了序列中所有域成員逞刷〖斡浚可以從邏輯上準(zhǔn)確地表示出主機(jī)在域名樹(shù)中的位置妻熊,也可以說(shuō)全稱(chēng)域名是主機(jī)名的一種完全表示形式。如www.baidu.com,www.google.com等仑最。
IP地址(IP Address)
IP地址用于以數(shù)字(IPv4)或字母數(shù)字(IPv6)的形式唯一地在網(wǎng)絡(luò)上尋址扔役。
一個(gè)IPv4地址是由四個(gè)數(shù)字和三個(gè)將數(shù)字分開(kāi)的冒號(hào)所構(gòu)成如127.0.0.1。隨著全世界越來(lái)越多的設(shè)備和人員上線警医,對(duì)IPv4地址有限且需求達(dá)到頂峰亿胸,于是IPv6應(yīng)運(yùn)而生。IPv6遵循與IPv4相似的原則:允許設(shè)備在其所在的網(wǎng)絡(luò)上被唯一引用预皇,但是尋址語(yǔ)法包含字母侈玄、數(shù)字、字符以增加可用地址的數(shù)量吟温,如fe80::45a8:3bcd:fb46:82b%36序仙。
Zone文件(Zonefile)
Zonefile是一個(gè)包含單個(gè)域的不同記錄的文本文件,文件中每一行都包含特定域的名稱(chēng)以及與其關(guān)聯(lián)的值和類(lèi)型鲁豪。
如在google.com的zonefile中可能存在一行用于解析www并通過(guò)A記錄映射到173.194.34.68(谷歌的ip)潘悼。
記錄(Records)
DNS的記錄是域和相關(guān)數(shù)據(jù)之間的獨(dú)立映射。
- A記錄:又稱(chēng)IP指向爬橡,用戶可以在此設(shè)置子域名并指向到自己的目標(biāo)主機(jī)地址上治唤,從而實(shí)現(xiàn)通過(guò)域名找到服務(wù)器。
指向的目標(biāo)主機(jī)地址類(lèi)型只能使用IP地址糙申。
PTR記錄:指針記錄肝劲,是A記錄逆向記錄,用于將IP地址解析為域名郭宝。
AAAA記錄:IPv6下的A記錄和PTR記錄辞槐,可將一個(gè)域名解析到IPv6地址上,也可以將子域名解析到IPv6地址上粘室。
CNAME記錄:又稱(chēng)別名指向榄檬,用戶可以為主機(jī)設(shè)置一個(gè)別名。如設(shè)置fish.o0O.com指向一個(gè)主機(jī)www.google.com那么以后就能用fish.o0O.com來(lái)代替訪問(wèn)www.google.com了衔统。
CNAME的目標(biāo)主機(jī)地址只能使用主機(jī)名鹿榜,不能使用IP地址;主機(jī)名前不能有任何其他前綴锦爵,如http://等是不被允許的舱殿;A記錄優(yōu)先于CNAME記錄,即如果一個(gè)主機(jī)地址同時(shí)存在A記錄和CNAME記錄险掀,則CNAME記錄不生效沪袭。
- MX記錄:郵箱交換記錄,用于將以改域名為結(jié)尾的電子郵件指向?qū)?yīng)的郵件服務(wù)器以進(jìn)行處理樟氢。如用戶所用的郵件十以域名fish.com結(jié)尾的冈绊,則需要在Zonefile中添加一條MX記錄來(lái)處理所有以@fish.com結(jié)尾的郵件侠鳄。
MX記錄可以使用主機(jī)名或IP地址;MX記錄可以通過(guò)設(shè)置優(yōu)先級(jí)實(shí)現(xiàn)主輔服務(wù)器設(shè)置死宣,“優(yōu)先級(jí)”中的數(shù)字越小表示級(jí)別越高伟恶。也可以使用相同優(yōu)先級(jí)達(dá)到負(fù)載均衡的目的;若在“主機(jī)名”中填入子域名則此MX記錄只對(duì)該子域名生效毅该。
- NS記錄:域名服務(wù)器記錄博秫,用來(lái)表明由哪臺(tái)服務(wù)器對(duì)該域名進(jìn)行解析。如用戶希望由1.2.3.4來(lái)解析fish.o0O.com眶掌,則需要設(shè)置fish.o0O.com的NS記錄挡育。
“優(yōu)先級(jí)”中的數(shù)字越小表示級(jí)別越高;“IP地址/主機(jī)名”中既可以填寫(xiě)IP地址畏线,也可以填寫(xiě)像cat.o0O.com這樣的主機(jī)地址,但必須保證該主機(jī)地址有效良价。如將fish.o0O.com的NS記錄指向到cat.o0O.com寝殴,在設(shè)置NS記錄的同時(shí)還需要設(shè)置cat.o0O.com的指向,否則NS記錄將無(wú)法正常解析明垢;NS記錄優(yōu)先于A記錄蚣常,即如果一個(gè)主機(jī)地址同時(shí)存在NS記錄和A記錄,則A記錄不生效痊银。這里的NS記錄只對(duì)子域名生效抵蚊。
- SOA記錄:起始授權(quán)機(jī)構(gòu)記錄,NS記錄說(shuō)明了有多臺(tái)服務(wù)器在進(jìn)行解析溯革,而SOA記錄則說(shuō)明了在眾多NS記錄中主要服務(wù)器的記錄贞绳。
NS記錄和SOA記錄是任何一個(gè)DNS的Zonefile中都不可或缺的兩條記錄。
SRV記錄:服務(wù)器資源記錄致稀,是在RFC2052中新定義的記錄冈闭,很多老版本的DNS并不支持此記錄。SRV記錄說(shuō)明了一個(gè)服務(wù)器能夠提供什么樣的服務(wù)抖单,域內(nèi)的計(jì)算機(jī)需要依賴(lài)DNS中的SRV記錄來(lái)定位域控制器萎攒。
TXT記錄:為某條記錄設(shè)置說(shuō)明,起注釋的作用矛绘。
此處只列舉了一部分記錄耍休,實(shí)際上還存在DNS還存在很多類(lèi)型的記錄
An Example of Zonefile
$TTL 86400; // specified in seconds, but could be 24h or 1d
$ORIGIN example.com
@ 1D IN SOA ns1.example.com. hostmaster.example.com. (
123456 ; // serial
3H ; // refresh
15 ; // retry
1w ; // example
3h ; // minimum
)
IN NS ns1.example.com
IN NS ns2.example.com // Good practice to specify multiple nameservers for fault-tolerance
IN NS ns1.foo.com // Using external nameservers for fault-tolerance is even better
IN NS ns1.bar.com // And multiple external nameservers is better still!
IN MX 10 mail.example.com // Here, 10 is the highest priority mail server, so is the first to be used
IN MX 20 mail.foo.com // If the highest priority mail server is unavailable, fall back to this one
ns1 IN A 1.2.3.4
ns1 IN AAAA 1234:5678:a1234::12 // A and AAAA records can co-exist happily. Useful for supporting early IPv6 adopters.
ns2 IN A 5.6.7.8
ns2 IN A 1234:5678:a1234::89
mail IN A 1.3.5.7
www IN A 2.4.6.8
sip IN CNAME www.example.com.
ftp IN CNAME www.example.com.
mail IN TXT "v=spf1 a -all"
_sip._tcp.example.com. IN SRV 0 5 5060 sip.example.com.
0x04 DNS如何工作
根服務(wù)器(Root Servers)
DNS樹(shù)的頂端是13個(gè)(從a到m)由ICANN(Internet Corporation for Assigned Names and Numbers)控制的獨(dú)立的根服務(wù)器。目的是處理那些級(jí)別較低的域名服務(wù)器不能充分處理的與頂級(jí)域名相關(guān)的信息請(qǐng)求货矮。根服務(wù)器不會(huì)對(duì)自己無(wú)法處理的域名保存任何記錄羊精,只會(huì)不停地對(duì)請(qǐng)求做出響應(yīng),并把域名解析到最優(yōu)的域名服務(wù)器去進(jìn)行進(jìn)一步處理囚玫。
如我們對(duì)www.google.com的請(qǐng)求直接進(jìn)入根服務(wù)器园匹,根服務(wù)器將解析www.google.com的記錄雳刺,但無(wú)法找到它的地址,根服務(wù)器會(huì)將這個(gè)域名的com部分匹配裸违,并將這個(gè)信息傳遞回來(lái)源處掖桦。
TLD服務(wù)器
接著上一步,一旦對(duì)www.google.com的請(qǐng)求得到回復(fù)供汛,根服務(wù)器就會(huì)代替域名服務(wù)器接受來(lái)自發(fā)送請(qǐng)求的計(jì)算機(jī)的詢問(wèn):www.google.com的地址在哪里枪汪。TLD服務(wù)器將嘗試在其記錄中找到www.google.com的信息,但只能回復(fù)關(guān)于google.com的詳細(xì)信息怔昨。在這一階段雀久,計(jì)算機(jī)會(huì)知道這個(gè)服務(wù)器以com解析,且至少能夠?qū)⒌刂酚成涞侥骋粋€(gè)IP地址趁舀。
域級(jí)域名服務(wù)器(Domain-level Nameservers)
到了這個(gè)階段赖捌,對(duì)www.google.com的請(qǐng)求已經(jīng)被回復(fù)了兩次:第一次由根服務(wù)器不處理任何記錄但知道是需要?dú)w于com處理;再一次由TLD服務(wù)器處理com并且知道google在哪里矮烹。即使如此越庇,我們?nèi)赃€有一個(gè)www未處理,為此奉狈,該請(qǐng)求將傳給google.com的服務(wù)器進(jìn)行解析卤唉。google的服務(wù)器將在其記錄中正確查找到www.google.com,并使用其對(duì)應(yīng)的IP地址進(jìn)行響應(yīng)仁期。
至此桑驱,我們完成了一個(gè)完整的訪問(wèn)請(qǐng)求,看似步驟復(fù)雜跛蛋,實(shí)際上DNS查詢?cè)诙潭處酌胫畠?nèi)就會(huì)完成熬的。
0x05主機(jī)特定的DNS配置(Host-specific DNS Configuration)
也就是我們常說(shuō)的hosts文件,我一直以來(lái)有個(gè)疑問(wèn)為什么裝破解版軟件時(shí)需要改hosts文件赊级,為什么改了hosts文件之后就能夠訪問(wèn)谷歌網(wǎng)站悦析,hosts文件到底是何方神圣?這一節(jié)將從Unix系統(tǒng)的方面說(shuō)一說(shuō)主機(jī)特定的DNS配置此衅,Linux系統(tǒng)和Windows系統(tǒng)類(lèi)似强戴。
/etc/hosts
/etc/hosts具有充當(dāng)本地替代DNS的作用,若用戶想要在特定的計(jì)算機(jī)上覆蓋DNS中的記錄而又不想影響其他用戶使用該記錄挡鞍,則可使用/etc/hosts來(lái)覆蓋DNS骑歹,或者將其作為DNS的備份:若在/etc/hosts中的基礎(chǔ)結(jié)構(gòu)中指定了關(guān)鍵型的hosts,則即使在持有用戶域名的域名服務(wù)器中缺少Zonefile時(shí)也能夠正常解析墨微。
但是/etc/hosts遠(yuǎn)遠(yuǎn)不能DNS的替代品:DNS具有更加豐富的記錄類(lèi)型道媚,而/etc/hosts只能相當(dāng)于眾多記錄中的A記錄。
/etc/hosts大概是長(zhǎng)這個(gè)樣紙滴:
127.0.0.1 localhost
255.255.255.255 broadcasthost
:: 1 localhost
fe80 :: 1% lo0 localhost
192.168.2.2 sql01
192.168.2.3 sql02
192.168.1.10 fish bubble o0O
該文件的前四行是系統(tǒng)自帶的,并在啟動(dòng)時(shí)生效最域。前兩行分別將localhost谴分、127.0.0.1之間和broadcasthost、255.255.255.255之間建立映射镀脂,后面兩行其實(shí)是在IPv6下第一行的等價(jià)物牺蹄。在第四行之后,我們可以指定一個(gè)名稱(chēng)并將其映射到一個(gè)IP地址薄翅。如第五行沙兰,我們將sql01映射到192.168.2.2,這意味著在具有這個(gè)/etc/hosts的主機(jī)上我們可以訪問(wèn)sql01并以192.168.2.2作為響應(yīng)翘魄,第六行同理鼎天。而第七行卻是一個(gè)奇怪的例子,一個(gè)IP地址對(duì)應(yīng)了3個(gè)域名暑竟,當(dāng)以這種方式引用時(shí)(對(duì)于每個(gè)IP地址使用多個(gè)以空格分隔的名稱(chēng))斋射,則可以使用任意指定的域名訪問(wèn)該IP地址,即使用fish但荤,bubble和o0O都是訪問(wèn)192.168.1.10的有效方式罗岖。
0x06 緩存(Caching)
為降低硬件成本、減輕網(wǎng)絡(luò)壓力纱兑,并加快對(duì)常見(jiàn)域名的響應(yīng)速度呀闻,很多客戶機(jī)都會(huì)緩存DNS記錄化借。在Zonefile的SOA記錄中會(huì)指定一個(gè)expiry潜慎,該值將決定Zonefile維持改狀態(tài)的時(shí)間,在此段時(shí)間內(nèi)再起發(fā)起相同的請(qǐng)求就回直接利用緩存解析而不用再向根服務(wù)器發(fā)起解析請(qǐng)求蓖康。
0x07 生存時(shí)間(TTLs)
既然提到了緩存那就不得不提TTL,TTL能使個(gè)別記錄強(qiáng)制到期,從而繞過(guò)SOA記錄中的expiry疏魏。如o0O.com已經(jīng)轉(zhuǎn)移到了一個(gè)新的網(wǎng)絡(luò)主機(jī)照棋,為確保服務(wù)正常運(yùn)行,可通過(guò)減少www和*在o0O.com的Zonefile中的TTL來(lái)實(shí)現(xiàn)切換泳梆。具有合適的高TTL和適當(dāng)?shù)?strong>緩存鳖悠,計(jì)算機(jī)響應(yīng)請(qǐng)求的時(shí)間以及緩存更新記錄的時(shí)間都將大大縮短。
解析域名時(shí)會(huì)最先檢查本地的hosts文件中是否存在該域名的映射關(guān)系优妙,若有則直接調(diào)用該IP地址映射乘综,完成解析。若無(wú)套硼,則查找本地DNS解析器緩存中有無(wú)該域名的映射關(guān)系卡辰,若有也直接返回完成解析,若無(wú)再遵循上文中所說(shuō)的進(jìn)入正常的域名解析流程。
0x08 這次比賽的DNS101
查詢DNS的工具有很多九妈,在這里就說(shuō)一下比賽做題的時(shí)候遇到的dig工具吧反砌。
dig是Unix平臺(tái)自帶的可以用來(lái)查看特定域名服務(wù)器記錄工具,我用到的基本用法為:
dig + 域名 + 記錄類(lèi)型//若不指定記錄類(lèi)型則默認(rèn)為A記錄
-
比賽中直接挖TXT記錄就會(huì)發(fā)現(xiàn)有一條flag-id-[...].flag.src.edu-info.edu.cn的記錄萌朱。
以TXT類(lèi)型進(jìn)行dig -
而如果以ANY的類(lèi)型來(lái)挖宴树,則會(huì)嘗試所有類(lèi)型的記錄,可以發(fā)現(xiàn)在存在一條NSEC記錄解析到n.flag.src.edu-info.edu.cn并且這個(gè)域名存在TXT記錄嚷兔、RRSIG記錄和NSEC記錄森渐。
以ANY類(lèi)型進(jìn)行dig -
繼續(xù)向下挖掘,發(fā)現(xiàn)NSEC記錄中又出現(xiàn)了新的域名冒晰,并且也存在TXT記錄同衣、RRSIG記錄和NSEC記錄。
對(duì)得到的新域名進(jìn)行dig
現(xiàn)在學(xué)了DNS以上相關(guān)知識(shí)后壶运,可以判斷這道題的DNS服務(wù)器那邊的是在Zonefile中以NSEC記錄的方式形成了一個(gè)鏈表將這些域名鏈接起來(lái)耐齐,*.flag.src.edu-info.edu.cn型的域名都有個(gè)TXT記錄提示最終的域名為flag-id-[...].flag.src.edu-info.edu.cn這個(gè)形式的。當(dāng)時(shí)手動(dòng)dig完全不知道原理蒋情,就知道輸完了之后會(huì)得到一個(gè)新域名又繼續(xù)dig埠况,感覺(jué)灰常神奇,為什么有這么多挖不完的域名棵癣。也理解了那些大網(wǎng)站如何實(shí)現(xiàn)域名第一個(gè).前面有那么多種名稱(chēng)辕翰。然后最后吐槽一句,python庫(kù)是真的神奇狈谊,當(dāng)初啥都不知道的時(shí)候只有靠切片來(lái)維持生活喜命,dig到一半輸出格式不同了還切不動(dòng),然后參考浙大表哥們WriteUp中的腳本后河劝。壁榕。。
一萬(wàn)只草泥馬奔騰而過(guò)
- 附上我的腳本以及結(jié)果:
from tqdm import tqdm
import os
import re
rerr = re.compile('NSEC.+flag.src.edu-info.edu.cn')
def execCmd(cmd):
r = os.popen(cmd)
text = r.read()
r.close()
return text
payload = 'dig any what.is.my.flag.src.edu-info.edu.cn'
for i in range(1,10000):
a = execCmd(payload)
rerrrrr = rerr.search(a)
payload=rerrrrr.group(0).replace('NSEC','').lstrip()
print payload
payload='dig any '+payload
- 附上浙大大表哥們的腳本及結(jié)果:
import dns.resolver
url="what.is.my.flag.src.edu-info.edu.cn"
while True:
emm = dns.resolver.query(url,"NSEC")
url=list(emm)[0].next.to_text()
print(url)
- 然后再將得到的flag-id-ztfrneclyudrfq3e6endq5.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz.zzzzzzz.flag.src.edu-info.edu.cn拿去dig得到了flag
flag