淺談與DNS相關的攻擊
一 什么是DNS
DNS 是域名系統 (Domain Name System) 的縮寫,是因特網的一項核心服務,它作為可以將域名和IP地址相互映射的一個分布式數據庫,能夠使人更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。
DNS 域名結構
通常 Internet 主機域名的一般結構為:主機名.三級域名.二級域名.頂級域名。 Internet 的頂級域名由 Internet網絡協會域名注冊查詢負責網絡地址分配的委員會進行登記和管理,它還為 Internet的每一臺主機分配唯一的 IP 地址。全世界現有三個大的網絡信息中心: 位于美國的 Inter-NIC,負責美國及其他地區; 位于荷蘭的RIPE-NIC,負責歐洲地區;位于日本的APNIC ,負責亞太地區。

DNS查詢報文

DNS應答報文

DNS 的解析流程
全世界有很多的域名需要解析,這些不可能都在一臺服務器上解析,那就太慢了。dns解析采用了樹形結構的解析流程。

在上面的解析流程的前面其實還有一步的,系統在發出dns解析之前會先看看本地是否保存了相關域名的解析,如果有的話會節省會多的時間。該文件保存在C:\Windows\System32\drivers\etc\hosts,文件保存了本地dns解析的相關內容,如下:
# Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name. # The IP address and the host name should be separated by at least one # space. # # Additionally, comments (such as these) may be inserted on individual # lines or following the machine name denoted by a '#' symbol. # # For example: # # 102.54.94.97 rhino.acme.com # source server # 38.25.63.10 x.acme.com # x client host # localhost name resolution is handled within DNS itself. # 127.0.0.1 localhost # ::1 localhost
二 DNS相關的攻擊類型
1 針對DNS服務器的DDOS攻擊
第一類 基于主機耗盡型的dns查詢拒絕服務攻擊
這類攻擊就是想受害者DNS服務器發送大量的dns解析請求包,由于DNs服務器美妙查詢的次數有限,使得它忙不過來造成拒絕服務攻擊。

第二類 基于寬帶耗盡型的DNS反彈式拒絕服務攻擊(DNS reflector attacks,又稱DNS amplification attacks)
原理:大量主機偽造受害者ip向胡亮王上的大量開放式遞歸DNS服務器發送NDS查詢請求包。由于開放遞歸DNS服務器并不對請求包進行地質真實性驗證,因此都會進行應答,這樣受害著將同時接收到大量的DNS請求應答包,堵塞受害DNS服務器的網絡,最終形成拒絕服務攻擊。
什么是開放遞歸DNS服務器?
開放遞歸服務器是指支持遞歸查詢,同時對發起遞歸查詢請求的客戶端不進行身份驗證的DNS服務器。
如下圖:

2 針對用戶的DNS劫持
簡單的說什么是dns劫持呢?
就是本來你想訪問攜程的網站www.ctrip.com,結果輸入域名后返回給你的是百度的服務器ip,那么自然顯示在瀏覽器中的也就是百度的頁面。
那么我可以根據上面介紹的dns解析流程來看看哪些地方會導致返回給你的ip是錯誤的。
a 首先是dns服務器地址被劫持
比如你的路由器中的dns服務器地址被修改為惡意的dns服務器。那就一切都完蛋了,你訪問的任何域名都被解析成其他的地址。
但是這種情況一般是不會發生的, 因為惡意人員登錄不了的路由器修改不了dns服務器地址,就更修改不了你本機的dns設置。不過當幾個小的漏洞結合在一起的時候就成為了大的漏洞。比如之前出現過的路由器劫持事件:
漏洞本身依賴3個部分:
tp-link路由器發現存在csrf漏洞。
有些用戶的路由器沒有更改用戶名和密碼,使用了默認的用戶名和密碼;或者瀏覽器記錄了路由器的登錄狀態。
firefox和chrome等瀏覽器支持Http Authentication。
這些結合在一起就導致了這么一個攻擊流程:
惡意人員構造了一個惡意的web頁面,如www.foo.com/text.html,頁面的功能是自動登錄路由器并修改dns地址。
惡意人員構造一個url發送給被害者,當被害者點擊這個鏈接的時候就訪問了惡意頁面,就修改了路由器的dns地址。
接下來就簡單了,惡意人員可以將你想要訪問的網站域名如www.ctrip.com解析到任意其他的地址如1.1.1.1等。(當然他不會解析到這里,要有經濟利益,或者廣告或者ctrip推廣聯盟url等。)
下面附上tplink的小demo:
- <script>
- function dns(){
- alert('I have changed your dns on my domain!')
- i = new Image;
- i.src='http://192.168.1.1/userRpm/LanDhcpServerRpm.htm?dhcpserver=1&ip1=192.168.1.100&ip2=192.168.1.199&Lease=120&gateway=0.0.0.0&domain=&dnsserver=8.8.8.8&dnsserver2=0.0.0.0&Save=%B1%A3+%B4%E6';
- }
- </script>//修改dns
- <img src="http://admin:admin@192.168.1.1/images/logo.jpg" height=1 width=1 onload=dns()>//登錄
b hosts文件被修改
根據解析流程來看,如果要解析www.ctrip.com的ip,系統會首先訪問hosts文件,看看有沒有相關的綁定:
如果有如下記錄:
1.1.1.1 www.ctrip.com
你們系統就不會將www.ctrip.com發送給dns服務器去解析,直接就將它解析為1.1.1.1。
c DNS服務器緩存中的映射關系被修改,又稱緩存投毒攻擊
系統檢測到hosts文件中沒有響應的域名的解析的時候就會發送給本地dns服務器進行解析,解析之前會先查看緩存中是否存在,如果沒有,再將解析請求發送給下一個dns服務器。結果返回后將該域名的解析結果保存到緩存中,方便下一次的解析。
針對緩存中的解析的攻擊有2種:
傳統的DNS緩存投毒攻擊:惡意人員向受害DNS服務器發送域名的解析請求,然后搶在權威服務器應答前偽造應答包發送給受害服務器。這樣錯誤的解析記錄就保存到了緩存中,那么接下來緩存時間內所有該域名的解析就都是錯誤了。這種攻擊偽造的是回答資源記錄,攻擊時間很短,效率低。

kaminsky緩存投毒攻擊:惡意人員發送類似這種的查詢請求www24385.ctrip.com到dns服務器,搶在權威應答前偽造應答包發送給dns服務器。它修改的是授權資源記錄,可以大量的嘗試。

d 入侵dns服務器,修改其中的數據庫記錄。
這種就是比較直接暴力的方法了,當然也是最困難的。