DNS的工作原理
DNS分為Client和Server,Client扮演發問的角色,也就是問Server一個Domain Name,而Server必須要回答此Domain Name的真正IP位址。而當地的DNS先會查自己的資料庫。如果自己的資料庫沒有,則會往該DNS上所設的的DNS詢問,依此得到答案之後,將收到的答案存起來,並回答客戶。
DNS伺服器會根據不同的授權區(Zone),記錄所屬該網域下的各名稱資料,這個資料包括網域下的次網域名稱及主機名稱。
在每一個名稱伺服器中都有一個快取快取區(Cache),這個快取快取區的主要目的是將該名稱伺服器所查詢出來的名稱及相對的IP位址記錄在快取快取區中,這樣當下一次還有另外一個客戶端到次伺服器上去查詢相同的名稱 時,伺服器就不用在到別台主機上去尋找,而直接可以從快取區中找到該筆名稱記錄資料,傳回給客戶端,加速客戶端對名稱查詢的速度。例如:當DNS客戶端向指定的DNS伺服器查詢網際網路上的某一台主機名稱 DNS伺服器會在該資料庫中找尋用戶所指定的名稱 如果沒有,該伺服器會先在自己的快取快取區中查詢有無該筆紀錄,如果找到該筆名稱記錄後,會從DNS伺服器直接將所對應到的IP位址傳回給客戶端 ,如果名稱伺服器在資料記錄查不到且快取快取區中也沒有時,伺服器首先會才會向別的名稱伺服器查詢所要的名稱。例如:DNS客戶端向指定的DNS伺服器查詢網際網路上某台主機名稱,當DNS伺服器在該資料記錄找不到用戶所指定的名稱時,會轉向該伺服器的快取快取區找尋是否有該資料 ,當快取快取區也找不到時,會向最接近的名稱伺服器去要求幫忙找尋該名稱的IP位址 ,在另一台伺服器上也有相同的動作的查詢,當查詢到後會回復原本要求查詢的伺服器,該DNS伺服器在接收到另一台DNS伺服器查詢的結果後,先將所查詢到的主機名稱及對應IP位址記錄到快取快取區中 ,最後在將所查詢到的結果回復給客戶端。
常見的DNS攻擊包括
1) 域名劫持
通過採用黑客手段控制了域名管理密碼和域名管理信箱,然後將該域名的NS紀錄指向到黑客可以控制的DNS伺服器,然後通過在該DNS伺服器上添加相應域名紀錄,從而使網民訪問該域名時,進入了黑客所指向的內容。這顯然是DNS服務提供商的責任,用戶束手無策。
2) 快取投毒
利用控制DNS快取伺服器,把原本準備訪問某網站的用戶在不知不覺中帶到黑客指向的其他網站上。其實現方式有多種,比如可以通過利用網民ISP端的DNS快取伺服器的漏洞進行攻擊或控制,從而改變該ISP內的用戶訪問域名的回響結果;或者,黑客通過利用用戶權威域名伺服器上的漏洞,如當用戶權威域名伺服器同時可以被當作快取伺服器使用,黑客可以實現快取投毒,將錯誤的域名紀錄存入快取中,從而使所有使用該快取伺服器的用戶得到錯誤的DNS解析結果。
最近發現的DNS重大缺陷,就是這種方式的。只所以說是“重大”缺陷,據報導是因為是協定自身的設計實現問題造成的,幾乎所有的DNS軟體都存在這樣的問題。
3)DDOS攻擊
一種攻擊針對DNS伺服器軟體本身,通常利用BIND軟體程式中的漏洞,導致DNS伺服器崩潰或拒絕服務;另一種攻擊的目標不是DNS伺服器,而是利用DNS伺服器作為中間的“攻擊放大器”,去攻擊其它網際網路上的主機,導致被攻擊主機拒絕服務。
4) DNS欺騙
DNS欺騙就是攻擊者冒充域名伺服器的一種欺騙行為。
原理:如果可以冒充域名伺服器,然後把查詢的IP位址設為攻擊者的IP位址,這樣的話,用戶上網就只能看到攻擊者的主頁,而不是用戶想要取得的網站的主頁了,這就是DNS欺騙的基本原理。DNS欺騙其實並不是真的“黑掉”了對方的網站,而是冒名頂替、招搖撞騙罷了。
Internet上存在的DNS伺服器有絕大多數都是用bind來架設的,使用的bind版本主要為bind 4.9.5+P1以前版本和bind 8.2.2-P5以前版本.這些bind有個共同的特點,就是BIND會快取(Cache)所有已經查詢過的結果,這個問題就引起了下面的幾個問題的存在。
DNS欺騙,在DNS的快取還沒有過期之前,如果在DNS的快取中已經存在的記錄,一旦有客戶查詢,DNS伺服器將會直接返回快取中的記錄
防止DNS被攻擊的若干防範性措施
網際網路上的DNS放大攻擊(DNS amplification attacks)急劇增長。這種攻擊是一種數據包的大量變體能夠產生針對一個目標的大量的虛假的通訊。這種虛假通訊的數量有多大?每秒鐘達數GB,足以阻止任何人進入網際網路
與老式的“smurf attacks”攻擊非常相似,DNS放大攻擊使用針對無辜的第三方的欺騙性的數據包來放大通訊量,其目的是耗盡受害者的全部頻寬。但是,“smurf attacks”攻擊是向一個網路廣播地址傳送數據包以達到放大通訊的目的。DNS放大攻擊不包括廣播地址。相反,這種攻擊向網際網路上的一系列無辜的第三方DNS伺服器傳送小的和欺騙性的詢問信息。這些DNS伺服器隨後將向表面上是提出查詢的那台伺服器發回大量的回覆,導致通訊量的放大並且最終把攻擊目標淹沒。因為DNS是以無狀態的UDP數據包為基礎的,採取這種欺騙方式是司空見慣的。
這種攻擊主要依靠對DNS實施60個位元組左右的查詢,回復最多可達512個位元組,從而使通訊量放大8.5倍。這對於攻擊者來說是不錯的,但是,仍沒有達到攻擊者希望得到了淹沒的水平。最近,攻擊者採用了一些更新的技術把DNS放大攻擊提高了好幾倍。
當前許多DNS伺服器支持EDNS。EDNS是DNS的一套擴大機制,RFC 2671對次有介紹。一些選擇能夠讓DNS回復超過512位元組並且仍然使用UDP,如果要求者指出它能夠處理這樣大的DNS查詢的話。攻擊者已經利用這種方法產生了大量的通訊。通過傳送一個60個位元組的查詢來獲取一個大約4000個位元組的記錄,攻擊者能夠把通訊量放大66倍。一些這種性質的攻擊已經產生了每秒鐘許多GB的通訊量,對於某些目標的攻擊甚至超過了每秒鐘10GB的通訊量。
要實現這種攻擊,攻擊者首先要找到幾台代表網際網路上的某個人實施循環查詢工作的第三方DNS伺服器(大多數DNS伺服器都有這種設定)。由於支持循環查詢,攻擊者可以向一台DNS伺服器傳送一個查詢,這台DNS伺服器隨後把這個查詢(以循環的方式)傳送給攻擊者選擇的一台DNS伺服器。接下來,攻擊者向這些伺服器傳送一個DNS記錄查詢,這個記錄是攻擊者在自己的DNS伺服器上控制的。由於這些伺服器被設定為循環查詢,這些第三方伺服器就向攻擊者發回這些請求。攻擊者在DNS伺服器上存儲了一個4000個位元組的文本用於進行這種DNS放大攻擊。
由於攻擊者已經向第三方DNS伺服器的快取中加入了大量的記錄,攻擊者接下來向這些伺服器傳送DNS查詢信息(帶有啟用大量回復的EDNS選項),並採取欺騙手段讓那些DNS伺服器認為這個查詢信息是從攻擊者希望攻擊的那個IP位址發出來的。這些第三方DNS伺服器於是就用這個4000個位元組的文本記錄進行回復,用大量的UDP數據包淹沒受害者。攻擊者向第三方DNS伺服器發出數百萬小的和欺騙性的查詢信息,這些DNS伺服器將用大量的DNS回複數據包淹沒那個受害者。
如何防禦這種大規模攻擊呢?首先,保證你擁有足夠的頻寬承受小規模的洪水般的攻擊。一個單一的T1線路對於重要的網際網路連線是不夠的,因為任何惡意的腳本少年都可以消耗掉你的頻寬。如果你的連線不是執行重要任務的,一條T1線路就夠了。否則,你就需要更多的頻寬以便承受小規模的洪水般的攻擊。不過,幾乎任何人都無法承受每秒鐘數GB的DNS放大攻擊 。
因此,你要保證手邊有能夠與你的ISP隨時取得聯繫的應急電話號碼。這樣,一旦發生這種攻擊,你可以馬上與ISP聯繫,讓他們在上游過濾掉這種攻擊。要識別這種攻擊,你要查看包含DNS回復的大量通訊(源UDP連線埠53),特別是要查看那些擁有大量DNS記錄的連線埠。一些ISP已經在其整個網路上部署了感測器以便檢測各種類型的早期大量通訊。這樣,你的ISP很可能在你發現這種攻擊之前就發現和避免了這種攻擊。你要問一下你的ISP是否擁有這個能力。