DNS深度理解
0x01 首先,我們先來簡單回顧下DNS的基本解析流程, 比較簡單,如下
-> 以客戶端瀏覽器訪問 www.rootkit.org 域名為例,首先,它會去檢查當前瀏覽器快取,如果有,就直接響應,如果沒有,就繼續往下找
-> 接著,作業系統會去檢查自己的host檔案,如果從中沒找到對應關係,會再到系統dns快取中查,如果快取中有,就直接返回該域名所對應的ip
-> 如果快取中沒有,則會向我們事先設定好的dns伺服器 [ 一般有兩個, 主 & 備 ] 去請求,即所謂的`遞迴查詢`,dns伺服器首先會到自身解析資料庫中去查
-> 如果dns伺服器在自己的解析庫中也沒找到,它就會自動幫我們向根傳送詢問請求
-> 此時,根看到要請求的是org的字尾,就會把org所在的ns伺服器告訴我們的dns
-> 然後,我們的dns伺服器就會去請求org所在的ns伺服器
-> 當請求到達org ns伺服器時,org一看域名是在rootkit這個域下的,就會把rootkit所在的ns伺服器再告訴我們的dns伺服器
-> 再然後,我們的dns伺服器就會去請求rootkit這個域的ns伺服器
-> rootkit這個域的ns伺服器一看是要訪問www就直接找到了www對應的A記錄的ip,並把它丟給我們的dns,上面逐個詢問的過程,即 `迭代查詢`
-> 最後,我們的dns再把最終解析到的這個ip丟給我們的客戶端,然後客戶端就直接拿著去訪問了,如下,訪問google.com時的簡易流程圖
演示環境,此處暫以一主一從為例進行演示
DnsMaster ip : 192.168.3.60 主 DNS 伺服器
DnsSlave ip : 192.168.3.61 從 DNS 伺服器
0x02 幾種常見的 DNS 功用型別
主dns,主要負責實際的正反向域名解析
從dns,主要從其它的主dns或者從dns中同步解析資料庫,`即區域傳送`,一般是通過序列號遞增來判斷主dns是否有更新
快取DNS伺服器...
轉發器...
0x03 理解DNS區域解析流向
正向 : FQDN -> IP
反向 : IP -> FQDN
FQDN 即 `完整合法域名`,如 `www.rootkit.org.` 最後面的`.`表示根,意思就是根下的org下的rootkit
不管是正向還是反向區域都需要有一個單獨的解析資料庫去解析
0x04 認識DNS中一些常見的資源記錄型別,說到底就是用它們來標記某個主機型別
A 記錄 FQDN -> ipv4
AAAA 記錄 FQDN -> ipv6
NS 記錄 標明當前區域的NS伺服器是誰
MX 記錄 標明當前域內誰是郵件伺服器
PTR 記錄 ip -> FQDN
SOA 記錄 一個解析庫有且只有一個SOA記錄,且必須為解析庫的第一條記錄
CNAME 記錄 別名
0x05 如何在區域配置檔案中定義上述各種資源記錄
記錄定義標準格式,如下
name TTL值[快取時長可省] IN 記錄型別 值
定義SOA記錄,一般會配合DNS主從同步來用
admin.org. IN SOA ns.admin.org. admin.admin.org. (
2017122309 ; 序列號
2H ; 重新整理時間
10M ; 重試時長
1W ; 過期時間
1D ; 否定答案的TTL值)
定義NS記錄,如果連續兩條緊挨著的記錄相同,後面一個的name可省略,另外NS記錄需要在後續有一個對應的A記錄
admin.org. IN NS ns1.admin.org.
admin.org. IN NS ns2.admin.org.
定義MX記錄,注意,此記錄有優先順序,數字越小,優先順序越高,同樣,後面也需要指向一條A記錄
admin.org. IN NS ns1.admin.org.
admin.org. IN NS ns2.admin.org.
定義A記錄,注意,對於A記錄,同一個name可以對應多個不同的ip,訪問時會自動實現輪詢的效果
www.admin.org. IN A l.2.3.4
www.admin.org. IN A l.2.3.4
*.admin.org. IN A 1.2.3.4 泛解析,使用者輸入不存在的域名是全部都解析到這個ip上
admin.org. IN A 1.2.3.4 另外一種泛解析寫法 admin.org
定義PTR記錄,即反向區域解析,一定要注意,所有的ip地址必須反過來寫,另外,都必須帶上固有後綴in-addr.arpa.
4.3.2.in-addr.arpa. IN PTR www.admin.org.
定義CNAME記錄,意思就是當訪問web.admin.org.時就直接解析到www.admin.org.
web.admin.org. IN CNAME www.admin.org.
0x06 關於一些常見 dns 解析測試工具的基本使用
# dig -t 記錄型別 要解析的域名 @用於解析該域名的dns伺服器
# dig -t axfr 要解析的域名 @用於解析該域名的dns伺服器 全量區域同步,可用來測試`區域傳送漏洞`
# dig +trace 要解析的域名 跟蹤指定域名的詳細解析過程
# nslookup 互動式查詢
# host -t 型別 要解析的域名 用於解析的dns伺服器
0x07 因為後續還要做DNS主從實時同步,所以這裡就先從配置正向區域解析開始
開始安裝主DNS,bind是核心包,bind-devel是bind核心庫,utils是dns測試工具包,工具包裡包含了一些常用工具,如,nslookup,dig,host,另外,此處暫以yum方式進行安裝,當然,你也可以自行採用原始碼編譯的方式進行安裝,不過編譯安裝不太好的地方就是,有很多關鍵目錄和配置檔案沒法自動生成,配置起來比較繁瑣
# yum install bind-utils bind bind-devel bind-chroot -y
# rpm -qa | grep bind
配置主DNS的主配置檔案named.conf
# cat /var/named/named.ca 全球13組根DNS伺服器解析地址的存放位置
# cp /etc/named.conf{,.bak} 先備份配置檔案再編輯
# > /etc/named.conf bind的主配置檔案,主要提供全域性配置
# vi /etc/named.conf
// 全域性配置段,注意,dns工作在tcp/53和udp/53埠上,tcp/53一般主要用來進行區域同步,而udp/53主要用來負責正常的解析請求和響應
options {
version "1.1.1";
listen-on port 53 { 192.168.3.60;127.0.0.1; }; // 把dns埠監聽在本地指定的ip上
directory "/var/named/chroot/etc/";
pid-file "/var/named/chroot/var/run/named/named.pid";
allow-query { any; }; // 允許任意主機向我進行dns請求
Dump-file "/var/named/chroot/var/log/binddump.db";
Statistics-file "/var/named/chroot/var/log/named_stats";
zone-statistics yes;
memstatistics-file "log/mem_stats";
empty-zones-enable no;
forwarders { 114.114.114.114;8.8.8.8; };
};
// 設定rndc通訊共享祕鑰
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
// bind日誌配置區段
logging {
channel warning {
file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns {
file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
warning;
};
category queries {
general_dns;
};
};
// 為了簡化bind主配置檔案,可以通過include的方式來引入區域檔案
include "/var/named/chroot/etc/view.conf";
針對rndc 的簡單配置,關於rndc其實就是個bind服務管理工具,可以通過它在本地或者直接遠端來方便的對bind服務進行各種管理操作,如,過載,重新整理快取,關閉…預設工作在tcp/953埠上,比較危險,所以我們一般只讓它監聽在本地即可
0x08 定義正向區域檔案
0x09 定義正向區域檔案,我們再來編寫正向區域解析資料庫,內部主要用於存放各種記錄型別和巨集,如下
0x10 配置完正向區域解析庫以後,我們就可以來過載服務,測試解析了
0x11 在正向區域測試解析沒有任何問題之後,我們再來看如何定義反向區域,注意,反向區域的ip地址要全部反寫,即 變化的區域不寫,不變的區域反寫,此區域不需要MX和A記錄,只需要PTR記錄即可,另外,通常都是先有正向解析再有反向解析
192.168.3.x => 3.168.192.in-addr.arpa
192.168.x.x => 168.192.in-addr.arpa
定義反向區域的方式很簡單,先定義好反向區域檔案
再來定義反向區域解析庫
0x12 當主DNS的正反向區域解析都沒任何問題之後,我們開始來配置主從DNS實時同步
# yum install bind-utils bind bind-devel bind-chroot -y
# rpm -qa bind-utils bind bind-devel bind-chroot
開始配置從DNS,其實,在這裡跟配置主DNS並沒有太大區別,還是先按上面主DNS的配置方式來一遍
# > /etc/named.conf
# vi /etc/named.conf
options {
version "1.1.1";
listen-on port 53 { 192.168.3.61; 127.0.0.1; };
directory "/var/named/chroot/etc/";
pid-file "/var/named/chroot/var/run/named/named.pid";
allow-query { any; };
Dump-file "/var/named/chroot/var/log/binddump.db";
Statistics-file "/var/named/chroot/var/log/named_stats";
zone-statistics yes;
memstatistics-file "log/mem_stats";
empty-zones-enable no;
forwarders { 114.114.114.114;8.8.8.8; };
};
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
logging {
channel warning {
file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns {
file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
warning;
};
category queries {
general_dns;
};
};
include "/var/named/chroot/etc/view.conf";
配置rndc
0x13 接著,再來配置主從DNS正向區域實時同步,務必要記得在主DNS的正向解析庫中一定要先有一條ns記錄的ip是指向從DNS伺服器的,不然同步通知是無法完成的,也就是說,一旦主DNS發生改變,它會通知所有的ns伺服器進行更新,這樣就可以實現實時正向區域同步的效果
對於從DNS的配置就非常簡單了,只需要在從DNS上編輯區域檔案,在裡面配置好主DNS伺服器的ip,設定好從DNS正向區域檔名,然後啟動服務即可,如下
上面配置沒問題以後,我們來過載服務試試
正向區域實時同步搞定之後,我們再來看看如何實現反向區域實時主從同步,還是要先在主DNS上的反向區域解析庫中定義一條指向從DNS伺服器的PTR記錄,如下
首先,到主DNS伺服器上去編輯反向區域解析庫檔案,新增一條指向從DNS伺服器的PTR記錄,具體如下
之後,再回到從DNS伺服器上編輯區域配置檔案,新增一個反向區域,跟正向區域同步一樣,依然是指明主DNS伺服器ip和從DNS反向區域解析庫檔名,之後再過載服務,測試解析即可
0x14 關於DNS自身的安全問題
配置錯誤,修復簡單
各類投毒汙染攻擊,需要多方配合,篇幅原因後續我們再詳細說
bind工具自身的漏洞,時常注意官方釋出的各類高危補丁,尤其是可以直接被遠端利用的,而後進行適時修補或更新即可
0x15 基於 DNS 的各類滲透技巧,其實說來,底層的原理非常簡單,因為在一些指令碼或者資料庫中有很多那種可以直接用於發起DNS請求的函式,而我們就可以通過此來構造自己的各種攻擊語句,然後再從解析log中提取執行結果
基於DNS log的sql盲注,程式碼及命令執行...後續有空接著說
基於DNS隧道的各類遠端,如,cobalt strike,關於這個,我們後續還會再單獨抽出來詳細說
更多,待續...
下面就是個簡單的區域傳送效果,不過像這種古董級漏洞,現在確實已經非常罕見了,屬於敏感資訊洩露的一種,容易直接被人看見內部的網路結構拓撲部署,祝大家好運吧 ^_^
後話:
其實,像dns這種過於的基礎服務,配置起來確實非常簡單,不過,關鍵還是要能靈活應用,非常建議大家還是把絕大部分的時間都花在去深入理解dns的解析過程上,個人覺得那個才是真正的價值,因為所有的DNS高階應用場景,最底層全部都是基於這個,把最基礎的東西搞通透以後,再去看各類高階應用就非常簡單了,還是那句話不管上層怎麼變化,但萬變不離其宗,篇幅限制,此處僅僅也只是先帶大家打個照面,更多高階應用,後續肯定還會有大量的篇幅說明,來日方長,我們待續……
文章出處:klion's blog
原文連結:https://klionsec.github.io/2017/12/11/Dns-tips/