使用Wireshark进行DNS协议解析
“?DNS協議格式解析及說明。”
DNS即域名系統(Domain Name System),是用來將域名與IP地址建立映射的協議,通過DNS協議,可以方便記憶。
DNS可基于TCP或UDP,使用53號端口,常見的是使用UDP承載,通常由其他應用層協議(如HTTP、SMTP等)使用,用來將主機名解析為IP地址,應用相當廣泛。
所以,在協議還原的系統中,基本上所有的移動APP的分析都需要先分析DNS。
DNS包含一系列RFC標準,如RFC1034等。
本文對域名及解析過程、DNS報文格式進行說明,并通過Wireshark工具對DNS協議進行抓包分析展示,了解DNS協議報文的格式和解析方法,本文僅限于UDP承載的DNS,基于IPV4。
01
—
域名及解析過程
域名由一系列字母(a~z,不區分大小寫)、數字(0~9)和連接符(-)組成以及點號分隔符組成,總長度不大于255,分隔符隔出的每段相當于一個層次的域名,級別低的在左,級別高的在右,每段長度不大于63。如域名dailyupdate.wangwang.taobao.com,三段域名分別為dailyupdate、wangwang、taobao、com,其中com的級別最高。
相應地,在DNS報文中,一個完整的域名是分成多段的,但沒有使用點號分隔起來,而是使用長度域名的順序,依次出現在數據中。
在報文中,一個域名的格式一般如下圖所示:
如dailyupdate.wangwang.taobao.com這個域名,由4段組成,則報文中的格式為4個長度數據塊,最后以0x00結束。
另外,在報文中,為節約資源,每段域名如果在之前有重復,會被縮寫為兩個字節,其中前兩個比特位為11,之后14個比特位表示重復內容距離DNS協議報文頭的距離,而重復的長度則為到0x00結束,這個特性很多人都沒有注意到,導致很多的DNS解析錯誤或不被解析。
在一個捕包點的報文層面,一個域名到IP的解析總體可分為兩步:
1、目標機向指定的域名服務器發出一個DNS請求報文,報文里攜帶需要查詢的域名;
2、域名服務器向目標機回應一個DNS響應報文,里面包含域名對應的IP地址。
從最后一節對dailyupdate.wangwang.taobao.com進行域名解析的報文中可明顯看出這兩步。當然,實際上一次DNS的查詢經歷了多個迭代查詢的小步,每級域名服務器向上級域名服務器請求,最終得到結果向下級返回,這個過程在一個捕包點的報文解析中是無法體現的,協議分析過程中也不需要特地關心。
02
—
DNS協議報文格式
一次DNS過程包含一對請求報文和響應報文。請求和響應報文有統一的報文格式如下圖:
一個DNS報文分成頭部和正文兩個部分。
頭部的內容共14字節,包括三大類信息:
1、會話標識(2字節):是DNS報文的ID標識,用來確定請求報文和應答響應報文的配對關系,一對請求和應答報文的會話標識字段是相同的,四元組和會話標識一起,可以將DNS應答報文和請求報文一一對應。
2、標志(2字節):每位表示不同的標志含義,按位表示字段如下:
QR:查詢/響應標志,1比特,0為查詢,1為響應。
opcode:查詢響應類型,4比特,0表示標準查詢,1表示反向查詢,2表示服務器狀態請求。
AA:授權回答,1比特,表示該服務器是否為授權的有效服務器,在響應報文中有效,請求中無效。
TC:截斷標志,1比特,1表示超過512字節并已被截斷,0表示沒有發生截斷。
RD:期望遞歸回答標志,1比特,1表示期望。
RA:可用遞歸標志,1比特,響應報文中有效,1表示得到遞歸響應。
zero:全0保留字段,3比特,新版RFC中對后兩位進行了使用,本文忽略。
rcode:返回碼,4比特,0表示沒有差錯,1表示格式錯誤,32表示服務器錯誤,3表示域參照問題,4表示查詢類型不支持,5表示被禁止,其它被保留。
3、數量字段(總共8字節):Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四個區域Queries、Answers、Authorities、Additional records的數目。
在頭部之后,為正文的四大區域,分成兩類:
1、Queries區域,包括數量不等的查詢塊,每塊格式如下:
Name:查詢名,長度不定,且不用填充字節,一般該字段表示要查詢的域名(反向查詢則為IP),格式見yum
域名的每一段之前都有一字節的長度,整個域名結束為0x00。
Type:查詢類型,兩字節,如A,NS,CNAME,PTR等。
Class:查詢類,兩字節,通常為IN(0x0001),表示internet數據。
2、資源記錄(RR)區域,即Answers、Authorities、Additional records三個區域,每個區域均包括數量不等的查詢塊,每塊格式如下:
Name:域名,相當于Queries區域的查詢名字段,二者本質上是相同的,但由于資源記錄區域在Queries區域之后,因此如果域名有重復的段,則該字段內的一段或若干段會使用2個字節的數值來代替,而不是原始的長度和字符串。
例如:
這個報文中的Answers區域,有Name字段與Queries區域的查詢域名完全一致,因此,為兩字節C00C(1100000000001100),最前面的兩個高位是 11,之后的14個字節數值對應為12,剛好指向Queries區域的查詢域名字段。
另外還有部分段重復的情況,可以自行分析,此處不做描述。
Type:查詢類型,兩字節,與Queries區域的查詢類型含義相同。
Class:查詢類,兩字節,通常為IN(0x0001),表示internet數據。
TTL:生存時間,四字節,單位為秒,資源記錄的生存周期,越大表明該資源記錄越穩定。
Data Length:資源數據長度,兩字節,表示后面的資源數據的長度。
Data:資源數據,長度由Data Length值確定。為按Queries區域的要求返回的相關資源記錄的數據。可以是地址或者另一個域名等。
另外Authorities區域即為Wireshark中顯示的Authoritative nameservers區域。
03
—
DNS報文例子
一次DNS請求的過程:
包括請求和響應,二者具備相同的ID。
請求:
DNS請求中含有一個被請求的域名:dailyupdate.wangwang.taobao.com。
響應:
使用Wireshark得到的分析如下:
基本所有的數據段都存在。
在這里,就包含了域名部分重復的例子:
圖中紅框所示即為使用0xC028代替之前出現的com段,但是dailyupdate.wangwang.taobao.com由于在該CNAME的前一部分,則沒有被代替。
對DNS協議的分析就到這里了,DNS流量很常見,大家可以實地抓包分析試試,在Wireshark中全流量抓包后,使用過濾規則“dns”即可將所有DNS報文過濾出來。如果有需要,可以加我共同學習。
長按進行關注。
總結
以上是生活随笔為你收集整理的使用Wireshark进行DNS协议解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Wireshark使用技巧:提取VOIP
- 下一篇: SIP协议分析