由一道題目引發的DNS學習筆記

0x00 起因

前幾天的全國高校網絡信息安全管理運維挑戰賽DNS101,從上午查資料到結束,雖然最終做出來了,但卻不解其原理,遂
開啟了對DNS的學習歷程。


0x01 DNS是什么

DNS(Domain Name System,域名系統),因特網上作為域名和IP地址相互映射的一個分布式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。通過主機名,最終得到該主機名對應的IP地址的過程叫做域名解析(或主機名解析)。 摘自百度百科

百科的解釋非常直接,但對于我這種小白來說太過寬泛,看了之后有了個大致的了解,卻也說不清到底是個啥,我還學要了解更多。萬一別人問起來至少要吹牛逼吹得高大上一些嘛


0x02 為什么會有DNS

網絡通訊大部分都是基于TCP/IP協議,而此協議則是基于IP地址,所以計算機在網絡上進行通訊時只能識別如1.2.3.4之類的IP地址而不能識別域名。由于IP地址不方便記憶,于是需要DNS將輸入的域名“翻譯”成相對應的IP地址,正確訪問對應的網頁。


0x03 需要知道的一些術語

域名(Domain Name)

這大概是我們接觸到的DNS最常用方式,也就是我們通常所說的網址如baidu.com,google.com等。

頂級域名(Top-Level Domain)

又稱一級域名,分為三類:一是國家和地區頂級域名(country code top-level domains,簡稱ccTLDs),如cnjp等;二是國際頂級域名(generic top-level domains,簡稱gTLDs),如表示工商企業的com,表示網絡提供商的net,表示非盈利組織的org等。三是新頂級域名(New gTLD)如通用的xyz、代表“紅色”的red、代表“人”的men等一千多種。

全稱域名(FullyQualified Domain Name)

又稱完全合格域名,是指主機名加上全稱路徑,全路徑中列出了序列中所有域成員??梢詮倪壿嬌蠝蚀_地表示出主機在域名樹中的位置,也可以說全稱域名是主機名的一種完全表示形式。如www.baidu.com,www.google.com等。

IP地址(IP Address)

IP地址用于以數字(IPv4)或字母數字(IPv6)的形式唯一地在網絡上尋址。
一個IPv4地址是由四個數字和三個將數字分開的冒號所構成如127.0.0.1。隨著全世界越來越多的設備和人員上線,對IPv4地址有限且需求達到頂峰,于是IPv6應運而生。IPv6遵循與IPv4相似的原則:允許設備在其所在的網絡上被唯一引用,但是尋址語法包含字母、數字、字符以增加可用地址的數量,如fe80::45a8:3bcd:fb46:82b%36。

Zone文件(Zonefile)

Zonefile是一個包含單個域的不同記錄的文本文件,文件中每一行都包含特定域的名稱以及與其關聯的值和類型。
如在google.com的zonefile中可能存在一行用于解析www并通過A記錄映射到173.194.34.68(谷歌的ip)。

記錄(Records)

DNS的記錄是域和相關數據之間的獨立映射。

  • A記錄:又稱IP指向,用戶可以在此設置子域名并指向到自己的目標主機地址上,從而實現通過域名找到服務器。

指向的目標主機地址類型只能使用IP地址

  • PTR記錄指針記錄,是A記錄逆向記錄,用于將IP地址解析為域名。

  • AAAA記錄:IPv6下的A記錄PTR記錄,可將一個域名解析到IPv6地址上,也可以將子域名解析到IPv6地址上。

  • CNAME記錄:又稱別名指向,用戶可以為主機設置一個別名。如設置fish.o0O.com指向一個主機www.google.com那么以后就能用fish.o0O.com來代替訪問www.google.com了。

CNAME的目標主機地址只能使用主機名,不能使用IP地址;主機名前不能有任何其他前綴,如http://等是不被允許的;A記錄優先于CNAME記錄,即如果一個主機地址同時存在A記錄CNAME記錄,則CNAME記錄不生效。

  • MX記錄郵箱交換記錄,用于將以改域名為結尾的電子郵件指向對應的郵件服務器以進行處理。如用戶所用的郵件十以域名fish.com結尾的,則需要在Zonefile中添加一條MX記錄來處理所有以@fish.com結尾的郵件。

MX記錄可以使用主機名或IP地址;MX記錄可以通過設置優先級實現主輔服務器設置,“優先級”中的數字越小表示級別越高。也可以使用相同優先級達到負載均衡的目的;若在“主機名”中填入子域名則此MX記錄只對該子域名生效。

  • NS記錄域名服務器記錄,用來表明由哪臺服務器對該域名進行解析。如用戶希望由1.2.3.4來解析fish.o0O.com,則需要設置fish.o0O.com的NS記錄。

“優先級”中的數字越小表示級別越高;“IP地址/主機名”中既可以填寫IP地址,也可以填寫像cat.o0O.com這樣的主機地址,但必須保證該主機地址有效。如將fish.o0O.com的NS記錄指向到cat.o0O.com,在設置NS記錄的同時還需要設置cat.o0O.com的指向,否則NS記錄將無法正常解析;NS記錄優先于A記錄,即如果一個主機地址同時存在NS記錄A記錄,則A記錄不生效。這里的NS記錄只對子域名生效。

  • SOA記錄起始授權機構記錄,NS記錄說明了有多臺服務器在進行解析,而SOA記錄則說明了在眾多NS記錄中主要服務器的記錄。

NS記錄SOA記錄是任何一個DNS的Zonefile中都不可或缺的兩條記錄。

  • SRV記錄服務器資源記錄,是在RFC2052中新定義的記錄,很多老版本的DNS并不支持此記錄。SRV記錄說明了一個服務器能夠提供什么樣的服務,域內的計算機需要依賴DNS中的SRV記錄來定位域控制器。

  • TXT記錄:為某條記錄設置說明,起注釋的作用。

此處只列舉了一部分記錄,實際上還存在DNS還存在很多類型的記錄

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如何工作

根服務器(Root Servers)

DNS樹的頂端是13個(從a到m)由ICANN(Internet Corporation for Assigned Names and Numbers)控制的獨立的根服務器。目的是處理那些級別較低的域名服務器不能充分處理的與頂級域名相關的信息請求。根服務器不會對自己無法處理的域名保存任何記錄,只會不停地對請求做出響應,并把域名解析到最優的域名服務器去進行進一步處理。

如我們對www.google.com的請求直接進入根服務器根服務器將解析www.google.com記錄,但無法找到它的地址,根服務器會將這個域名的com部分匹配,并將這個信息傳遞回來源處。

TLD服務器

接著上一步,一旦對www.google.com的請求得到回復,根服務器就會代替域名服務器接受來自發送請求的計算機的詢問:www.google.com的地址在哪里。TLD服務器將嘗試在其記錄中找到www.google.com的信息,但只能回復關于google.com的詳細信息。在這一階段,計算機會知道這個服務器以com解析,且至少能夠將地址映射到某一個IP地址

域級域名服務器(Domain-level Nameservers)

到了這個階段,對www.google.com的請求已經被回復了兩次:第一次由根服務器不處理任何記錄但知道是需要歸于com處理;再一次由TLD服務器處理com并且知道google在哪里。即使如此,我們仍還有一個www未處理,為此,該請求將傳給google.com的服務器進行解析。google的服務器將在其記錄中正確查找到www.google.com,并使用其對應的IP地址進行響應。

至此,我們完成了一個完整的訪問請求,看似步驟復雜,實際上DNS查詢在短短幾秒之內就會完成。


0x05主機特定的DNS配置(Host-specific DNS Configuration)

也就是我們常說的hosts文件,我一直以來有個疑問為什么裝破解版軟件時需要改hosts文件,為什么改了hosts文件之后就能夠訪問谷歌網站,hosts文件到底是何方神圣?這一節將從Unix系統的方面說一說主機特定的DNS配置,Linux系統和Windows系統類似。

/etc/hosts

/etc/hosts具有充當本地替代DNS的作用,若用戶想要在特定的計算機上覆蓋DNS中的記錄而又不想影響其他用戶使用該記錄,則可使用/etc/hosts來覆蓋DNS,或者將其作為DNS的備份:若在/etc/hosts中的基礎結構中指定了關鍵型的hosts,則即使在持有用戶域名的域名服務器中缺少Zonefile時也能夠正常解析。
但是/etc/hosts遠遠不能DNS的替代品:DNS具有更加豐富的記錄類型,而/etc/hosts只能相當于眾多記錄中的A記錄
/etc/hosts大概是長這個樣紙滴:

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

該文件的前四行是系統自帶的,并在啟動時生效。前兩行分別將localhost、127.0.0.1之間和broadcasthost、255.255.255.255之間建立映射,后面兩行其實是在IPv6下第一行的等價物。在第四行之后,我們可以指定一個名稱并將其映射到一個IP地址。如第五行,我們將sql01映射到192.168.2.2,這意味著在具有這個/etc/hosts的主機上我們可以訪問sql01并以192.168.2.2作為響應,第六行同理。而第七行卻是一個奇怪的例子,一個IP地址對應了3個域名,當以這種方式引用時(對于每個IP地址使用多個以空格分隔的名稱),則可以使用任意指定的域名訪問該IP地址,即使用fish,bubbleo0O都是訪問192.168.1.10的有效方式。


0x06 緩存(Caching)

為降低硬件成本、減輕網絡壓力,并加快對常見域名的響應速度,很多客戶機都會緩存DNS記錄。在ZonefileSOA記錄中會指定一個expiry,該值將決定Zonefile維持改狀態的時間,在此段時間內再起發起相同的請求就回直接利用緩存解析而不用再向根服務器發起解析請求。


0x07 生存時間(TTLs)

既然提到了緩存那就不得不提TTL,TTL能使個別記錄強制到期,從而繞過SOA記錄中的expiry。如o0O.com已經轉移到了一個新的網絡主機,為確保服務正常運行,可通過減少www和*在o0O.comZonefile中的TTL來實現切換。具有合適的高TTL和適當的緩存,計算機響應請求的時間以及緩存更新記錄的時間都將大大縮短。

解析域名時會最先檢查本地的hosts文件中是否存在該域名的映射關系,若有則直接調用該IP地址映射,完成解析。若無,則查找本地DNS解析器緩存中有無該域名的映射關系,若有也直接返回完成解析,若無再遵循上文中所說的進入正常的域名解析流程。


0x08 這次比賽的DNS101

查詢DNS的工具有很多,在這里就說一下比賽做題的時候遇到的dig工具吧。

dig是Unix平臺自帶的可以用來查看特定域名服務器記錄工具,我用到的基本用法為:

dig + 域名 + 記錄類型//若不指定記錄類型則默認為A記錄
  • 比賽中直接挖TXT記錄就會發現有一條flag-id-[...].flag.src.edu-info.edu.cn記錄。

    以TXT類型進行dig

  • 而如果以ANY的類型來挖,則會嘗試所有類型的記錄,可以發現在存在一條NSEC記錄解析到n.flag.src.edu-info.edu.cn并且這個域名存在TXT記錄、RRSIG記錄NSEC記錄。

    以ANY類型進行dig

  • 繼續向下挖掘,發現NSEC記錄中又出現了新的域名,并且也存在TXT記錄RRSIG記錄NSEC記錄。

    對得到的新域名進行dig

現在學了DNS以上相關知識后,可以判斷這道題的DNS服務器那邊的是在Zonefile中以NSEC記錄的方式形成了一個鏈表將這些域名鏈接起來,*.flag.src.edu-info.edu.cn型的域名都有個TXT記錄提示最終的域名為flag-id-[...].flag.src.edu-info.edu.cn這個形式的。當時手動dig完全不知道原理,就知道輸完了之后會得到一個新域名又繼續dig,感覺灰常神奇,為什么有這么多挖不完的域名。也理解了那些大網站如何實現域名第一個.前面有那么多種名稱。然后最后吐槽一句,python庫是真的神奇,當初啥都不知道的時候只有靠切片來維持生活,dig到一半輸出格式不同了還切不動,然后參考浙大表哥們WriteUp中的腳本后。。。一萬只草泥馬奔騰而過

  • 附上我的腳本以及結果:
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
失敗
  • 附上浙大大表哥們的腳本及結果:
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

菜雞拙見,望路過大佬們指正。


0x09 參考資料

DNS 101
常用域名記錄解釋
DNS原理及其解析過程
域名配置Zone文件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • DNS(Domain Name System,域名系統),因特網上作為域名和IP地址相互映射的一個分布式數據庫,能...
    一直在努力hard閱讀 4,678評論 3 19
  • 1. 概述 在網絡環境中一般用戶只需要在瀏覽器中輸入url如www.sunny.com就可以到對應服務器獲取相應的...
    ghbsunny閱讀 2,957評論 0 7
  • 目錄: 一些基本概念主機名DNS名稱解析DNS 解析的后端存儲名稱解析總結 大規模域名解析的體系架構DNS 解析需...
    C86guli閱讀 12,533評論 3 34
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • 「交錯軌跡轉眼即去,正如我愛你」 粗心字句,不經意掠過的余光,你無意間出現,恰恰好戳中我心頭最軟處。恍惚時間在腦海...
    喵記幾閱讀 361評論 0 0