DNS欺騙
出自 MBA智库百科(https://wiki.mbalib.com/)
目錄 |
DNS欺騙是指攻擊者冒充功能變數名稱伺服器的一種欺騙行為。攻擊者通過入侵DNS伺服器、控制路由器等方法把受害者要訪問的目標機器功能變數名稱對應的IP解析為攻擊者所控制的機器,這樣受害者原本要發送給目標機器的數據就發到了攻擊者的機器上,這時攻擊者就可以監聽甚至修改數據,從而收集到大量的信息。如果攻擊者只是想監聽雙方會話的數據,他會轉發所有的數據到真正的目標機器上,讓目標機器進行處理,再把處理結果發回到原來的受害者機器;如果攻擊者要進行徹底的破壞,他會偽裝目標機器返回數據,這樣受害者接收處理的就不再是原來期望的數據,而是攻擊者所期望的了。例如讓DNS伺服器解析銀行網站的IP為自己機器IP,同時在自己機器上偽造銀行登錄頁面,那麼受害者的真實賬號和密碼就暴露給入侵者了。
DNS欺騙原理[1]
儘管DNS在互聯網中扮演著如此重要的角色,但是在設計DNS協議時,設計者沒有考慮到一些安全問題,導致了DNS的安全隱患與缺陷。
DNS欺騙就是利用了DNS協議設計時的一個非常嚴重的安全缺陷。
首先欺騙者向目標機器發送構造好的ARP應答數據包,ARP欺騙成功後,嗅探到對方發出的DNS請求數據包,分析數據包取得ID和埠號後,向目標發送自己構造好的一個DNS返回包,對方收到DNS應答包後,發現ID和埠號全部正確,即把返回數據包中的功能變數名稱和對應的IP地址保存進DNS緩存表中,而後來的當真實的DNS應答包返回時則被丟棄。
假設嗅探到目標靶機發出的DNS請求包有以下內容:
Source address : 192.168.1.57
Destination address : ns.baidu.com
Source port : 1234
Destination port : 53 (DNS port)
Data : www.baidu.com
我們偽造的DNS應答包如下:
Source address : ns.baidu.com
Destination address : 192.168.1.57
Source port : 53 (DNS port)
Destination port : 1234
Data : www.baidu.com 192.168.1.59
目標靶機收到應答包後把功能變數名稱以及對應IP保存在了DNS緩存表中,這樣www.baidu.com的地址就被指向到了192.168.1.59上。
Hosts文件是一個用於存儲電腦網路中節點信息的文件,它可以將主機名映射到相應的IP地址,實現DNS的功能,它可以由電腦的用戶進行控制。
Hosts文件的存儲位置在不同的操作系統中並不相同,甚至不同Windows版本的位置也不大一樣:
Windows NT/2000/XP/2003/Vista/win7:預設位置為%SystemRoot%\system32\drivers\etc\,但也可以改變。
有很多網站不經過用戶同意就將各種各樣的插件安裝到你的電腦中,其中有些說不定就是木馬或病毒。對於這些網站我們可以利用Hosts把該網站的功能變數名稱映射到錯誤的IP或本地電腦的IP,這樣就不用訪問了。在WINDOWSX系統中,約定127.0.0.1為本地電腦的IP地址, 0.0.0.0是錯誤的IP地址。
如果,我們在Hosts中,寫入以下內容:
127.0.0.1 # 要屏蔽的網站 A
0.0.0.0 # 要屏蔽的網站 B
這樣,電腦解析功能變數名稱 A和 B時,就解析到本機IP或錯誤的IP,達到了屏蔽網站A 和B的目的。
DNS劫持又稱功能變數名稱劫持,是指在劫持的網路範圍內攔截功能變數名稱解析的請求,分析請求的功能變數名稱,把審查範圍以外的請求放行,否則返回假的IP地址或者什麼都不做使請求失去響應,其效果就是對特定的網路不能反應或訪問的是假網址。
由於功能變數名稱劫持往往只能在特定的被劫持的網路範圍內進行,所以在此範圍外的功能變數名稱伺服器(DNS)能夠返回正常的IP地址,高級用戶可以在網路設置把DNS指向這些正常的功能變數名稱伺服器以實現對網址的正常訪問。所以功能變數名稱劫持通常相伴的措施——封鎖正常DNS的IP。
如果知道該功能變數名稱的真實IP地址,則可以直接用此IP代替功能變數名稱後進行訪問。比如訪問百度,你可以直接用百度IP(202.108.22.5)訪問。
簡單的說就是把你要去的地址攔截下來,給你一個錯誤的地址,或者告訴你你要去的地方去不了,人為的導致你無法到達目的地,一般用於對一些不良網站的封殺或是一些黑客行為。
1、DNS欺騙
在DNS的緩存還沒有過期之前,如果在DNS的緩存中已經存在的記錄,一旦有客戶查詢,DNS伺服器將會直接返回緩存中的記錄.
下麵我們來看一個例子:
一臺運行著unix的Internet主機,並且提供rlogin服務,它的IP地址為123.45.67.89,它使用的DNS伺服器(即/etc/resolv.conf中指向的DNS伺服器)的IP地址為98.76.54.32,某個客戶端(IP地址為38.222.74.2)試圖連接到unix主機的rlogin埠,假設unix主機的/etc/hosts.equiv文件中使用的是dns名稱來允許目標主機的訪問,那麼unix主機會向IP為98.76.54.32的DNS伺服器發出一個PTR記錄的查詢:
123.45.67.89 -> 98.76.54.32 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: 2.74.222.38.in-addr.arpa PTR
IP為98.76.54.32的DNS伺服器中沒有這個反向查詢域的信息,經過一番查詢,這個DNS伺服器找到38.222.74.2和38.222.74.10為74.222.38.in-addr.arpa.的權威DNS伺服器,所以它會向38.222.74.2發出PTR查詢:
98.76.54.32 -> 38.222.74.2 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: 2.74.222.38.in-addr.arpa PTR
請註意,38.222.74.2是我們的客戶端IP,也就是說這台機子是完全掌握在我們手中的.我們可以更改它的DNS記錄,讓它返回我們所需要的結果:
38.222.74.2 -> 98.76.54.32 [Answer]
NQY: 1 NAN: 2 NNS: 2 NAD: 2
QY: 2.74.222.38.in-addr.arpa PTR
AN: 2.74.222.38.in-addr.arpa PTR trusted.host.com
AN: trusted.host.com A 38.222.74.2
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10
當98.76.54.32的DNS伺服器收到這個應答後,會把結果轉發給123.45.67.98,就是那台有rlogin服務的unix主機(也是我們的目標 :) ),並且98.76.54.32這台DNS伺服器會把這次的查詢結果緩存起來.
這時unix主機就認為IP地址為38.222.74.2的主機名為trusted.host.com,然後unix主機查詢本地的/etc/hosts.equiv文件,看這台主機是否被允許使用rlogin服務,很顯然,我們的欺騙達到了.
在unix的環境中,有另外一種技術來防止這種欺騙的發生,就是查詢PTR記錄後,也查詢PTR返回的主機名的A記錄,然後比較兩個IP地址是否相同:
123.45.67.89 -> 98.76.54.32 [Query]
NQY: (1) NAN: 0 NNS: 0 NAD: 0
QY: trusted.host.com A
很不幸,在98.76.54.32的DNS伺服器不會去查詢這個記錄,而會直接返回在查詢(2)74.222.38.in-addr.arpa時得到的並且存在緩存中的信息:
98.76.54.32 -> 123.45.67.89 [Query]
NQY: 1 NAN: 1 NNS: 2 NAD: 2
QY: trusted.host.com A
AN: trusted.host.com A 38.222.74.2
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10
那麼unix主機就認為38.222.74.2就是真正的trusted.host.com了,我們的目的達到了!
這種IP欺騙的條件是:你必須有一臺Internet上的授權的DNS伺服器,並且你能控制這台伺服器,至少要能修改這台伺服器的DNS記錄,我們的欺騙才能進行.
2、拒絕服務攻擊 Denial of service
還是上面的例子,如果我們更改位於38.222.74.2的記錄,然後對位於98.76.54.32的DNS伺服器發出2.74.222.38.in-addr.arpa的查詢,並使得查詢結果如下:
因為74.222.38.in-addr.arpa完全由我們控制,所以我們能很方便的修改這些信息來實現我們的目的.
38.222.74.2 -> 98.76.54.32 [Answer]
NQY: 1 NAN: 2 NNS: 2 NAD: 2
QY: 2.74.222.38.in-addr.arpa PTR
AN: 2.74.222.38.in-addr.arpa PTR trusted.host.com
AN: www.company.com A 0.0.0.1
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10
這樣一來,使用98.76.54.32這台DNS伺服器的用戶就不能訪問www.company.com了,因為這個IP根本就不存在!
3、偷取服務 Theft of services
還是上面的例子,只是更改的查詢結果如下:
38.222.74.2 -> 98.76.54.32 [Answer]
NQY: 1 NAN: 3 NNS: 2 NAD: 2
QY: 2.74.222.38.in-addr.arpa PTR
AN: 2.74.222.38.in-addr.arpa PTR trusted.host.com
AN: www.company.com CNAME www.competitor.com
AN: company.com MX 0 mail.competitor.com
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10
這樣一來,一個本想訪問http://www.competitor.com的用戶會被帶到另外一個地方,甚至是敵對的公司的主頁(想想把華為和北電聯起來是什麼樣的感覺. :) ).並且發給company.com的郵件會被髮送給mail.compertitor.com.(越來越覺得在網路上的日子不踏實! xxbin這樣想).
4、限制
對這些攻擊,也有一定的限制.
首先,攻擊者不能替換緩存中已經存在的記錄.比如說,如果在98.76.54.32這個DNS伺服器上已經有一條www.company.com的CNAME記錄,那麼攻擊者試圖替換為www.competitor.com將不會成功.然而,一些記錄可以累加,比如A記錄,如果在DNS的緩存中已經存在一條www.company.com的A記錄為1.2.3.4,而攻擊者卻欺騙DNS伺服器說www.company.com的A記錄為4.3.2.1,那麼www.company.com將會有兩個A記錄,客戶端查詢時會隨機返回其中一個.(呵呵,這不是loading balance麽?)
其次,DNS伺服器有個緩存刷新時間問題,如果www.netbuddy.org的TTL為7200,那麼DNS伺服器僅僅會把www.netbuddy.org的信息緩存7200秒或者說兩個小時.如果攻擊者放入一條TLL為604800的A記錄,那麼這條記錄將會在緩存中保存一周時間,過了預設的兩天後,這個DNS伺服器就會到處"分發"攻擊者假造的記錄.
下麵是常用的幾種可以累加和不能累加的記錄:
A can add
NS can add
MX can add
PTR cannot add
DNS欺騙攻擊是很難防禦的,因為這種攻擊大多數本質都是被動的。通常情況下,除非發生欺騙攻擊,否則你不可能知道你的DNS已經被欺騙,只是你打開的網頁與你想要看到的網頁有所不同。在很多針對性的攻擊中,用戶都無法知道自己已經將網上銀行帳號信息輸入到錯誤的網址,直到接到銀行的電話告知其帳號已購買某某高價商品時用戶才會知道。這就是說,在抵禦這種類型攻擊方面還是有跡可循。
保護內部設備:像這樣的攻擊大多數都是從網路內部執行攻擊的,如果你的網路設備很安全,那麼那些感染的主機就很難向你的設備發動欺騙攻擊。
不要依賴DNS:在高度敏感和安全的系統,你通常不會在這些系統上瀏覽網頁,最後不要使用DNS。如果你有軟體依賴於主機名來運行,那麼可以在設備主機文件里手動指定。
使用入侵檢測系統:只要正確部署和配置,使用入侵檢測系統就可以檢測出大部分形式的ARP緩存中毒攻擊和DNS欺騙攻擊。
使用DNSSEC: DNSSEC是替代DNS的更好選擇,它使用的是數字前面DNS記錄來確保查詢響應的有效性,DNSSEC還沒有廣泛運用,但是已被公認為是DNS的未來方向,也正是如此,美國國防部已經要求所有MIL和GOV功能變數名稱都必須開始使用DNSSEC。