、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查找文件。
- zone "example.com" {
- type master;
- file "/var/named/example.com.db";
- };
- zone "1.168.192.in-addr.arpa"{
- type master;
- file "var/named/rev.1.168.192.in-addr.arpa";
- };
3)設置正向域文件。在/var/named目錄下,編寫如下的example.com.db域文件:
- @ IN SOA ns.example.com.admin.example.com.(
- 13070201 ; Serial
- 28800 ; Refresh
- 3600 ; Retry
- 604800 ; Expire
- 38400) ; Negative Cache TTL
- example.com. IN NS ns.example.com.
- example.com. IN MX 10 mta.example.com.
- www IN A 220.181.111.86 ; modify this IP addressaccordingly
- mta IN A 192.168.1.137 ; modify thisIP address accordingly
- ns IN A 192.168.1.3 ; modify thisIP address accordingly
- *.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查找域文件:
- @ IN SOA ns.example.com.admin.example.com.(
- 13070202;
- 28800;
- 604800;
- 604800;
- 86400 )
- @ IN NS ns.example.com.
- 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請求。
- options {
- forwarders {
- 202.38.64.1;
- }
- };
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查找文件。
- zone "example.com" {
- type master;
- file "/etc/bind/example.com.db";
- };
- zone "1.168.192.in-addr.arpa"{
- type master;
- file "/etc/bind/rev.1.168.192.in-addr.arpa";
- };
3)設置正向域文件。在/etc/bind目錄下,編寫如下的example.com.db域文件:
- @ IN SOA ns1.example.com.admin.example.com.(
- 13070201 ; Serial
- 28800 ; Refresh
- 3600 ; Retry
- 604800 ; Expire
- 38400) ; Negative Cache TTL
- example.com. IN NS ns1.example.com.
- example.com. IN MX 10 mta.example.com.
- www IN A 220.181.111.86 ; modify this IP addressaccordingly
- mta IN A 192.168.1.141; modify thisIP address accordingly
- ns1 IN A 192.168.1.3 ; modify thisIP address accordingly
- *.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查找域文件:
- @ IN SOA ns1.example.com.admin.example.com.(
- 13070202;
- 28800;
- 604800;
- 604800;
- 86400 )
- @ IN NSns1.example.com.
- 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請求。
- forwarders {
- 202.38.64.1;
- };
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欺騙攻擊了。