DNS域欺騙攻擊詳細教程之Linux篇


、DNS域欺騙攻擊原理

DNS欺騙即域名信息欺騙是最常見的DNS安全問題。當一 個DNS服務器掉入陷阱,使用了來自一個惡意DNS服務器的錯誤信息,那么該DNS服務器就被欺騙了。DNS欺騙會使那些易受攻擊的DNS服務器產生許多 安全問題,例如:將用戶引導到錯誤的互聯網站點,或者發送一個電子郵件到一個未經授權的郵件服務器。


二、DNS域欺騙攻擊實現步驟

1.配置實驗環境;

2.假設攻擊者已經侵入受害者機器實施攻擊;

3.使用嗅探進行DNS ID欺騙;

4.DNS通配符攻擊。


我們需要像圖1那樣設置實驗環境。為簡化,我們讓用戶計算機、DNS服務器和攻擊者計算機位於同一物理機器上,但是使用不同的虛擬機,網頁可以是任意網頁。


圖1 實驗環境

本次實驗中,DNS Server部署在Fedora 17(192.168.1.137)上,Attacker系統為SeedUbuntu 11.04(192.168.1.141),User系統為Redhat 9.0(192.168.1.128),網頁選擇為www.example.com。下面介紹如何在Fedora 17和SeedUbuntu 11.04上安裝BIND9 DNS軟件,如何設置example.com域及其子域。應當指出的是,example.com的域名是被保留用於文件的,不屬於任何人,所以使用它不必 擔心重名。

   注意:如果沒有這些虛擬機系統可以用自己的環境,如兩個Ubuntu和一個Windows XP或7,這樣下面針對Fedora的DNS配置可省略不看。

如果客戶機是Windows系統,請看“DNS域欺騙攻擊詳細教程之Windows篇


2.1 配置實驗環境

2.1.1 在Fedora 17上配置DNS服務器

使用BIND 9軟件包作為DNS服務器,具體配置步驟如下:

1)安裝DNS服務器:#yum install bind9

查看安裝后的相關軟件包信息:$ rpm – qa bind

查看端口是否已啟動:$ netstat – tunlp | grep 53

 

圖2 安裝bind 9

 

2)創建域。修改DNS主配置文件/etc /named.conf,用以下內容創建一個名為example.com的域和名為1.168.192.in-addr.arpa的域。注意,我們以 192.168.1.x為例,如果你使用了不同的IP地址,需要修改/etc/named.conf及相應的反向DNS查找文件。

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. zone "example.com" {  
  2.   
  3.     type master;  
  4.   
  5.     file "/var/named/example.com.db";  
  6.   
  7. };  
  8.   
  9. zone "1.168.192.in-addr.arpa"{  
  10.   
  11.     type master;  
  12.   
  13.     file "var/named/rev.1.168.192.in-addr.arpa";  
  14.   
  15. };  


3)設置正向域文件。在/var/named目錄下,編寫如下的example.com.db域文件:

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @ IN SOA ns.example.com.admin.example.com.(  
  2.   
  3. 13070201 ; Serial  
  4.   
  5. 28800 ; Refresh  
  6.   
  7. 3600 ; Retry  
  8.   
  9. 604800 ; Expire  
  10.   
  11. 38400) ; Negative Cache TTL  
  12.   
  13. example.com. IN NS ns.example.com.  
  14.   
  15. example.com. IN MX 10 mta.example.com.  
  16.   
  17. www IN A 220.181.111.86 ; modify this IP addressaccordingly  
  18.   
  19. mta IN A 192.168.1.137 ; modify thisIP address accordingly  
  20.   
  21. ns IN A 192.168.1.3 ; modify thisIP address accordingly  
  22.   
  23. *.example.com. IN  A 173.194.72.141 ; modify this IP addressaccordingly  


圖3 example.com.db域文件

 

4)設置DNS反向查找文件。在/var/named目錄下,編輯一個名為rev.1.168.192.in-addr.arpa的反向DNS查找域文件:

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @ IN SOA ns.example.com.admin.example.com.(  
  2.   
  3. 13070202;  
  4.   
  5. 28800;  
  6.   
  7. 604800;  
  8.   
  9. 604800;  
  10.   
  11. 86400 )  
  12.   
  13. @   IN NS ns.example.com.  
  14.   
  15. 137 IN PTR example.com.  


圖4 rev.1.168.192.in-addr.arpa域文件

 

5)轉發DNS請求。局域網中的本地DNS服務器往往分程 傳遞DNS請求,它們不能解析外部DNS。我們將我們的DNS服務器配置為只解析example.com,讓外部的DNS服務器解析其它請求。這需要附加 以下行到/etc/named.conf來實現。本例中,DNS服務器從一個客戶端到另一個DNS服務器202.38.64.1分程傳遞DNS請求。

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. options {  
  2.   
  3.     forwarders {  
  4.   
  5.     202.38.64.1;  
  6.   
  7.     }  
  8.   
  9. };  

 

 

6)啟動DNS服務器並查看啟動named服務的日志。

啟動DNS服務器的方式有下面幾種:

# /usr/sbin/named -u named

# service named start

# /etc/inti.d/named start

 

查看啟動named服務的日志:

# tail /var/log/messages

圖5 啟動named服務日志

從中可以看出我們啟動named服務成功。如果啟動失敗,可在此找到失敗的詳細原因以供我們排查。


2.1.2 在SEEDUbuntu上配置DNS服務器

1)安裝DNS服務器:#sudo apt-get install bind9

查看安裝后的相關軟件包信息:# sudo dpkg – lbind9

查看端口是否已啟動:# netstat – tunlp | grep 53

注意:若/etc下有bind文件,則表示bind9已經安裝過,不用重新安裝或用dpkg -lbind來查看是否安裝了該軟件包。

圖6 安裝DNS Server

 

在DNS Server下的配置文件主要有:(在/etc/bind/下)

/etc/bind/named.conf.local          //本地文件

/etc/bind/named.conf.options        //全局設置

/etc/bind/named.conf.default-zone    //添加或刪除zone的配置

/etc/bind/db.127                  //本機反解

/etc/bind/db.local                 //本機正解

 

2)創建域。修改DNS主配置文件/etc/bind /named.conf,用以下內容創建一個名為example.com的域和名為1.168.192.in-addr.arpa的域。注意,我們以 192.168.1.x為例,如果你使用了不同的IP地址,需要修改/etc/named.conf及相應的反向DNS查找文件。

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. zone "example.com" {  
  2.   
  3.     type master;  
  4.   
  5.     file "/etc/bind/example.com.db";  
  6.   
  7. };  
  8.   
  9. zone "1.168.192.in-addr.arpa"{  
  10.   
  11.     type master;  
  12.   
  13.     file "/etc/bind/rev.1.168.192.in-addr.arpa";  
  14.   
  15. };  


3)設置正向域文件。在/etc/bind目錄下,編寫如下的example.com.db域文件:

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @ IN SOA ns1.example.com.admin.example.com.(  
  2.   
  3. 13070201 ; Serial  
  4.   
  5. 28800 ; Refresh  
  6.   
  7. 3600 ; Retry  
  8.   
  9. 604800 ; Expire  
  10.   
  11. 38400) ; Negative Cache TTL  
  12.   
  13. example.com. IN NS ns1.example.com.  
  14.   
  15. example.com. IN MX 10 mta.example.com.  
  16.   
  17. www IN A 220.181.111.86 ; modify this IP addressaccordingly  
  18.   
  19. mta IN A 192.168.1.141; modify thisIP address accordingly  
  20.   
  21. ns1 IN A 192.168.1.3 ; modify thisIP address accordingly  
  22.   
  23. *.example.com. IN  A 220.181.111.86 ; modify this IP addressaccordingly  

 

圖7 example.com.db域文件

 

4)設置DNS反向查找文件。在/etc/bind目錄下,編輯一個名為rev.1.168.192.in-addr.arpa的反向DNS查找域文件:

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @ IN SOA ns1.example.com.admin.example.com.(  
  2.   
  3. 13070202;  
  4.   
  5. 28800;  
  6.   
  7. 604800;  
  8.   
  9. 604800;  
  10.   
  11. 86400 )  
  12.   
  13. @   IN NSns1.example.com.  
  14.   
  15. 141 IN PTR example.com.  

 

圖8 rev.1.168.192.in-addr.arpa域文件

5)轉發DNS請求。局域網中的本地DNS服務器往往分程 傳遞DNS請求,它們不能解析外部DNS。我們將我們的DNS服務器配置為只解析example.com,讓外部的DNS服務器解析其它請求。需要附加以 下行到/etc/named.conf.options來實現。本例中,DNS服務器從一個客戶端到另一個DNS服務器202.38.64.1分程傳遞 DNS請求。

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. forwarders {  
  2.   
  3.     202.38.64.1;  
  4.   
  5. };  

 

6)啟動DNS服務器及查看啟動日志以便排錯。

啟動DNS服務器的方式有下面幾種:

# /usr/sbin/named -u bind

# service bind9 start

# /etc/inti.d/bind9 start

查看啟動bind服務的日志:

# tail /var/log/syslog

圖9 啟動DNS服務及啟動日志

從中可以看出我們啟動bind服務成功。


2.1.3 在服務器即本機(192.168.1.137)上進行測試

以Fedora為例進行測試,SeedUbuntu測試方法一樣。

1)讓DNS服務器能監聽到本機端口,在/etc/named.conf的options選項listen-on port 53里添加本機IP,即192.168.1.137或直接改為any,然后將allow-query改為any即可,如下圖所示:

圖10 DNS Server監聽本機端口

 

2)設置本機DNS服務器如下:

# vi /etc/resolv.conf

在首行添加一項:nameserver 192.168.1.137(DNS Server IP)

圖11 設置本機DNS Server

然后ping www.example.com,應該可以看到ping包將前74.125.31.99。

圖12 ping www.example.com結果

 

2.1.4 在客戶機即用戶機器(192.168.1.128)上進行測試

1)讓DNS服務器能監聽到客戶機端口

    Fedora中,在/etc/named.conf的options選項listen-on port 53里添加該機IP,即192.168.1.128,然后將allow-query改為any即可,設置成功后一定要重啟named服務,如圖13。

圖13 DNS Server監聽客戶機端口

 

2)設置客戶機DNS服務器

    在客戶機Redhat的文件/etc/resolv.conf里添加下面幾行:

 

圖14 設置客戶機DNS服務器

設置好了pingwww.example.com,結果如下圖所示:

圖15 ping www.example.com結果


2.2 假設攻擊者已經侵入受害者機器

    如果攻擊者已經成功入侵受害者機器,這時可以通過下面兩種方式來進行DNS欺騙攻擊。

2.2.1 修改HOSTS文件

    HOSTS文件(/etc/hosts)里的主機名和IP地址對用於本地查找,它們優先於遠程DNS查找。例如,如果用戶計算機的HOSTS文件里有一個 地址對“192.168.1.200  www.example.com”,則不用詢問DNS服務器,這台機器上www.example.com將被解析為192.168.1.200。

如果攻擊者已經侵入一台用戶機器,每當用戶試圖訪問www.example.com時,他們可以修改HOSTS文件來誤導用戶到另一個惡意網站,方法如下:

1)首先使用ssh登錄到遠程機器,獲得root權限。

圖16 ssh遠程登錄

2)修改HOSTS文件。

    這里以重定向到google網站為例,使用IP地址173.194.72.99,然后遠程修改HOSTS文件,在里面添加下面一項:

173.194.72.99  www.example.com

圖17 修改HOSTS文件

    此時在用戶機器上ping www.example.com發現IP地址已改變,去瀏覽器輸入www.example.com發現立即重定向到Google網站。

圖18 IP地址重定向

 

2.2.2 修改網絡配置文件resolv.conf

    當配置一台計算機的網絡時,我們需要明確告訴機器DNS服務器在哪。這要通過DNS網絡設置來實現。在Linux中,設置保存於/etc /resolv.conf文件。假設你已經侵入了一台機器,可以使用這項技術重定向這台機器的DNS請求到你的DNS服務器。具體步驟如下:

1)首先ssh登陸到用戶機器,然后往/etc/resolv.conf寫入一行:

nameserver 192.168.1.141;其中192.168.1.141是你的DNS服務器。


圖19 向resolv.conf寫入內容

然后再dig www.example.com 發現DNS Server和IP地址已經改變成攻擊者的DNS和設置好的IP,如下圖所示:

圖20 DNS Server和IP地址改變

 

注意:如果用戶機器為Ubuntu或Fedora,每次重 啟網絡都會重寫文件resolv.conf,這意味着這次攻擊成功,下次用戶重啟網絡或機器后,你寫入的信息就不在了,為了使resolv.conf文件 不被重寫,下面給出Ubuntu和Fedora這兩種用戶環境下的方法:

(a)Ubuntu:停止network manager服務,防止其在啟動時重寫/etc/resolv.conf文件,具體方法:

$ sudo servicenetwork-manager stop ;立即停止network manager服務

$ sudo vi/etc/init/network-manager.conf ;永久停止network manager服務

注釋掉start on的部分即可

 

(b)Fedora:停止使用networkmanager服務,具體方法:

# vi /etc/sysconfig/nework-scripts/ifcfg-eth0

圖21 ifcfg-eth0文件內容

 

NM_CONTROLLED = no 表示不由NetworkManager接管。 

此時再去/etc/resolv.conf發現以前的信息 全部沒有了,可以添加自己固定的nameserver,重啟網絡后不會被重寫。如果用戶機器為Redhat則不需要改動,因為Redhat未使用 NetworkManager服務,所以resolv.conf文件不會被重寫。

 

2.3 使用嗅探進行DNS ID欺騙

    在本攻擊中,受害者的機器還沒有被入侵,所以攻擊者不能在其機器上重定向DNS請求過程。然而若攻擊者和受害者處於同一本地局域網,他們仍然可以造成巨大 的破壞。當一個用戶在web瀏覽器鍵入一個網址,如www.chase.com,用戶的機器將向DNS服務器發出一個DNS請求來解析主機名的IP地址。 當監聽到這個DNS請求,攻擊者將編造一個假的DNS應答。一個假的DNS應答如果符合以下標准將會被用戶機接受:

1、源IP地址必須與DNS請求被送往的IP地址相匹配

2、目的IP地址必須與DNS請求送來的IP地址相匹配;

3、源端口號(UDP端口)必須與DNS請求被送達(通常是53號端口)的端口號相匹配;

4、目的端口號必須與DNS請求送來的端口號相匹配;

5、UDP校驗和的計算必須正確無誤;

6、傳輸ID必須與DNS的傳輸ID相匹配;

7、答復詢問部分的域名必須與請求詢問部分的域名匹配;

8、答復部分的域名必須與DNS請求詢問部分的域名匹配;

9、用戶電腦必須在收到合法的DNS響應之前收到攻擊者的DNS應答。

滿足了1到8的條件,攻擊者就可以嗅探到受害者發送的 DNS請求信息,然后就可以創建 一個偽造的DNS響應,在真正的DNS服務器響應之前,發送給受害者。Netwag tool 105工具提供了執行嗅探和響應的應用。首先在終端下輸入netwag打開工具,然后進行如下配置:

圖22 netwag tool105配置

 

    配置成功后點擊右下角的“Run”按鈕即可監聽受害者機器向自己DNS服務器發送的數據包並發送自己偽造的DNS包,這樣等一小段時間再nslookup www.example.com發現此網站本來的IP地址已經改變成攻擊者偽造的IP,表示DNS欺騙成功。

圖23 DNS ID欺騙成功

注意:在發送自己偽造數據包的過程中可能因為網絡傳輸延遲等的影響,條件9並不是每次都滿足,即並不是每次都欺騙成功,所以受害者每次打開www.example.com網站可能是原來的網站也可能是偽造的網站。


2.4 DNS通配符攻擊

    DNS通配符是DNS配置文件中的特殊表項,用來處理容器名稱解析。例如,下面的表項就是一個通配符入口:

*.example.com. IN A 128.230.212.170 ;modify IP address as required

example.com域中所有的主機名,例 如,www.mybank.com.pharmer.example.com,如果沒有更好的匹配,將被映射到128.230.212.170,在本次攻 擊中,攻擊者向受害者發出一個很長的URL,就如上面用到的那個。受害者通常被這個URL的第一部分所欺騙,那是一個真正的網站名字。然而,如果受害者點 擊此鏈接,DNS請求將發往攻擊者的DNS服務器,會返回一個惡意網站的IP地址。攻擊者將使虛假網頁看起來和來自www.mybank.com的一樣, 如果受害者輸入密碼,他們的密碼將暴露給攻擊者。使用DNS通配符配置,攻擊者可以構建許多不同的誤導URL。具體操作如下:

1)在入侵者成功入侵到用戶機器后,首先修改/etc/resolv.conf文件,使用戶的DNS服務器重定向到攻擊者的DNS服務器,如下圖所示:

圖24 重定向DNS服務器

然后在攻擊者的DNS服務器的配置文件example.com.db里添加一行

*.example.com. IN A 173.194.72.147 ;

其中173.194.72.147是你自己惡意網站的IP,然后給用戶發送一個較長的看起來像真實URL的偽造URL,如:www.mybank.com.pharmer.example.com,將會被映射到事先設置好的173.194.72.147上,如下圖:

圖25 添加通配符項

圖26 偽造URL映射成功


三、DNS的防范方法

  防范方法其實很簡單,總結來說就只有兩條:

(1) 直接用IP訪問重要的服務,這樣至少可以避開DNS欺騙攻擊。但這需要你記住要訪問的IP地址。

(2) 加密所有對外的數據流,對服務器來說就是盡量使用SSH之類的有加密支持的協議,對一般用戶應該用PGP之類的軟件加密所有發到網絡上的數據。只要能做到這些,基本上就可以避免DNS欺騙攻擊了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM