天天看點

DNS反向查詢

DNS反向查詢是什麼

DNS反向查詢大概的一個定義就是:

從 IP 位址擷取 PTR 記錄。也就是說,通過使用一些網絡工具可以将 IP 位址轉換為主機名。 實際上,PRT 代表 POINTER,在 DNS 系統有唯一性,将 IP 位址與規範化的主機名聯系起來。PTR 記錄其實是 NDS 系統的一部分,但是由專門的區域檔案組成的,使用的是傳統的 in-addr.arpa 格式。

最簡單的了解就是使用一個線上服務來查詢一個IP對應的域名服務

​​​

DNS反向查詢

​​

原理就是 dig -x ip

➜  ~ dig -x 192.30.252.153

...

;; ANSWER SECTION:
153.252.30.192.in-addr.arpa. 3505 IN    PTR    lb-192-30-252-153-iad.github.com.

...      

反向查詢的一個應用,是可以防止垃圾郵件,即驗證發送郵件的IP位址,是否真的有它所聲稱的域名,如果反向查詢和聲稱不一緻,那麼就可以認為有風險。

注意:

反向查詢是根據一個資源記錄查詢域名,不一定是IP。這個資源記錄可能是A記錄,也可能是CNAME記錄或者MX記錄(見“DNS開源伺服器BIND最小配置詳解”),而PTR記錄用于從IP位址反查域名。

DNS反向查詢的使用場景

  • rDNS的最初用途:通過traceroute,ping和SMTP電子郵件的“Received:”跟蹤标題字段進行網絡故障排除,網站跟蹤使用者(特别是在Internet論壇上)等。
  • 一種電子郵件反垃圾郵件技術:檢查rDNS中的域名是否可能來自撥号使用者,或動态配置設定的位址不太可能被合法郵件伺服器使用。這些IP位址的所有者通常會為其配置設定通用的rDNS名稱,例如“1-2-3-4-dynamic-ip.example.com”。一些反垃圾郵件過濾器假設來自這些位址的電子郵件可能是垃圾郵件,并可能拒絕連接配接。
  • 向确認反向DNS(FCrDNS)驗證可以建立驗證的形式示出了域名的所有者,并且已經在給定IP位址的伺服器的所有者之間的關系有效。雖然不是很正全面,但這種驗證足夠強大,經常用于白名單目的,因為垃圾郵件制造者和釣魚者在使用僵屍計算機僞造域記錄時通常無法實作前向驗證。
  • 系統日志記錄或監視工具通常會接收僅由IP位址指定的相關裝置的條目。為了提供更多可用的資料,這些程式通常在寫入日志之前執行反向查找,進而寫入名稱而不是IP位址。

從使用場景中也能發現這個技術點也是攻守雙方博弈的戰場,防守方通過反向查詢來确認攻擊方的資訊,而攻擊方為了隐藏自己的資訊,也會讓反向查詢得到的域名并不是真實的,因為攻擊者會在反向查找的記錄中插入僞造的資料,達到迷惑的作用。

實驗

為了加強了解,我寫了段py代碼來幫助了解

import sys
import socket

try:
    # gethostbyaddr的作用是通過IPv4的位址來擷取主機資訊,并放在hostent結構體中
    result = socket.gethostbyaddr(sys.argv[1])

    # 顯示查找到的主機名
    print("Primary hostname: " + result[0])

    # 顯示還傳回的可用位址清單
    print("Addresses: ")
    for item in result[2]:
        print("           " + item)
except socket.error as e:
    print("Failed to look up hostname:", e)      

運作:查詢 127.0.0.1 ,得到了域名

(python3) ➜  dns_anti_found python foundip.py 127.0.0.1      
Primary hostname: localhost
Addresses: 
           127.0.0.1      

運作:查詢百度的ip 115.239.211.110,發現是Unknown host

(python3) ➜  dns_anti_found python foundip.py 115.239.211.110
Failed to look up hostname: [Errno 1] Unknown host      

我猜測,不是每一個IP位址都存在反向的映射(事實上很多IP位址就沒有對應的域名),後面查了一下,發現這個猜測是錯誤的,

手動在/etc/hosts下增加一下映射

​​​

DNS反向查詢

​​​發現域名可以查詢出來了

​​

DNS反向查詢

​​

查詢網上資料之後,得出結論,要使用socket.gethostXxx( )函數,本地要有反向解析的服務。如果你使用的不是伺服器,是沒有反向解析服務的,如果你使用本地電腦,肯定沒有域名解析服服務。那麼 本地的/etc/hosts就會提供DNS服務。你添加上記錄,那麼能查詢出來,你沒添加上去,那麼就什麼都沒有,隻能報錯了。

參考#

​​https://www.dnsqueries.com/zh/reverse_lookup.php​​