之前曾經提到 OSI 的架構。是否對於第三層 (TCP/UDP等) 有印象?
在第三層中,「網路表頭」是記載 IP,而不是對方的網域。
DNS 伺服器負責將人類容易記得的「網域名稱」(如 evsfy.com
)轉換成 IP 地址。如果某一台伺服器並不知道那個網域名字是對應哪個 IP,它會想辦法去問另一台伺服器。通常伺服器會將每一組 IP-網域 的對應關係做一個短時間的快取。所以,如果 DNS 伺服器先前被問到一組不知道的紀錄,它會先去問別台,之後短時間內就不用再問一次了。
DNS 紀錄有好幾種,這邊解說一下常見的 DNS 紀錄種類。
DNS Spoofing 是指「偽造 DNS 紀錄」,而比較常聽到的是「DNS 快取污染」(DNS Cache Poisoning)。
跟 ARP 一樣,DNS 若讀到一組不正確的紀錄,那他就會被影響到,而且還會把這筆不正確的紀錄告訴別人。然後一段時間內,被影響到的 DNS 伺服器都會給出不正確的資訊。
由於 DNS 是樹狀結構,所以 DNS 快取污染會影響到附近的 DNS 伺服器。
要進行 DNS 快取污染,要先從 DNS 服務軟體的漏洞來著手。正常的狀況下,DNS 伺服器問別人資訊時,都要先驗證「這筆資訊是不是合理的」(如使用 DNSSEC,下面會解釋)。
DNS 快取污染,主要的影響是會將使用者導向不正確的站台。
例如說某國家把 Google 的域名做了 DNS 快取污染,連線到某個國家的主機上,並在這個主機上架一個很像 Google 的網站,一般人通常也不會發現。攻擊方也可以用這招來做釣魚攻擊,或是配合某些已知的 0-day 漏洞來攻擊使用者。
有幾種可能的攻擊方式。
以下我們都猜測被攻擊方(正常的 DNS 伺服器)不能或不會做驗證,這邊純粹是解釋過程。
我們這邊假設幾點:
attacker.here
,IP 1.1.1.1
target.here
如果這次的攻擊是針對「污染 A 記錄本身」,對話流程大概是這樣:
被攻擊方收到一個請求,需要解析 attacker.here
。不過被攻擊方並不知道這個網域,所以他要去問別人。
他會和另一台伺服器這樣問「attacker.here
的位置是啥?」
attacker.here. IN A
假設另一台伺服器是攻擊者,他便會這樣回應:
Answer:
(no response)
Authority section:
attacker.here. 3600 IN NS ns.target.here.
Additional section:
ns.target.here. IN A 1.1.1.1
這個意思是:
attacker.here
是指向 ns.target.here
ns.target.here
是對到 1.1.1.1
假設被攻擊方完全不做檢查,那麼,被攻擊方就會把這個結果做快取,然後每個人問他 attacker.here
,他都會回 1.1.1.1
(即使他的 IP 根本不是這個)。
基本上,DNS 快取污染的防禦都是,都是「不要那麼相信對方跟你講的話」,以及「不要理會你沒問的東西」。
其中一種方式,是使用 HTTPS 的數位簽章來解決掉偽造主機的問題。
另一種是下一篇會提到的,目前常見的防禦方式「DNSSEC」。