建立DNS隧道繞過校園網認證
因為之前在本科的時候破解過校園網三次,主要就是利用其業務邏輯上的漏洞、53
端口未過濾包、重放攻擊的手段,然后就是一個博弈的過程,這三次加起來用了大概有一年的時間就被完全堵死了,最近又比較需要網絡,然后有開始想折騰了,不過這次建立dns
隧道雖然是成功建立了,使用正常網絡是能夠走服務器的dns
隧道的,但是並沒有成功繞過校園網的認證,至於原因還是有待探查。最后想着還是記錄一下隧道建立流程,之后做CTF
題可能用得到。
描述
dns
隧道相關的描述直接引用參考中文章的一段描述:既然UDP53
端口的數據包可以通過網關,那么我們可以在本地運行一個程序將其它端口的數據包偽裝組成UDP53
端口的數據包,然后發送到本地域名服務器,那么網關就不會進行攔截了,數據包就順利的通過了網關,可是發送出去的數據報如何返回呢?這就需要我們做進一步的設置。接下來我們需要一個VPS
(雲服務器)和一個域名,我了便於敘述,我給這個雲服務器起名為V
,域名起名為Y
。我們偽裝的DNS
數據包要查詢的域名就是Y
,本地域名服務器接收到這個偽裝后的數據包后,由於它無法解析這個域名Y
,便將數據包進行轉發,讓能夠解析Y
的域名服務器進行解析,接下來我們將Y
設置一個NS
記錄,用來指定Y
由哪個域名服務器來進行解析,我們指定的域名服務器就是前面提到的V
,所以接下來數據包會被發送到V
中。此時我們在V
中運行一個程序,對偽裝的數據包進行還原,還原后的數據包再發送出去,這樣當V
接收到響應數據包后,V
上運行的程序會再次對其進行偽裝,偽裝成一個DNS
響應數據包,這個DNS
響應數據包會沿着上述相反的路徑發送回我們的計算機,我們的計算機再次對這個DNS
響應數據包進行還原,到現在,我們真正想要得到的數據包已經到手了。
服務端
假設此時有一個example.com
的域名,服務器的ip
地址為111.111.111.111
。接下來要對域名進行解析,增加一個NS
記錄以及一個A
記錄,新增NS
記錄的名稱為dns.example.com
,值為dnsserver.example.com
,新增A
記錄的名稱為dnsserver.example.com
,值為ip
地址即111.111.111.111
。
類型 名稱 值
NS dns.example.com dnsserver.example.com
A dnsserver.example.com 111.111.111.111
之后在服務器執行以下命令。
$ tcpdump -n -i eth0 udp dst port 53
然后隨便找一台機器進行dns
查詢,然后在服務器的終端就能夠看到查詢的信息了。
$ nslookup dns.example.com
...
19:09:01.810846 IP 222.222.222.222.54346 > 111.111.111.111.53: 6858 [1au] A? dns.example.com. (57)
...
我的服務端使用ubuntu
的linux
發行版,直接使用包管理器安裝dns2tcp
。
$ apt install dns2tcp
接下來需要配置一下dns2tcp
。
$ vim /etc/dns2tcpd.conf
listen = 0.0.0.0
port = 53
# If you change this value, also change the USER variable in /etc/default/dns2tcpd
user = nobody
chroot = /tmp
domain = dns.example.com
resources = ssh:127.0.0.1:22
執行如下命令即可啟動dns2tcp
,其中參數-f /etc/dns2tcpd.conf
指定了配置文件,-F
要求程序在前台運行,-d 2
指明了輸出調試信息,級別為2
,為首次運行,我們加上參數-F
和-d 2
,另外如果需要保持前台運行且輸出日志信息的話,nohub
、screen
、systemctl
都是可行的,維持終端進程后台運行就不再贅述。
dns2tcpd -f /etc/dns2tcpd.conf -F -d 2
19:31:49 : Debug socket.c:55 Listening on 0.0.0.0:53 for domain dns.example.com
Starting Server v0.5.2...
19:31:49 : Debug main.c:132 Chroot to /tmp
11:31:49 : Debug main.c:142 Change to user nobody
客戶端
在服務端只需要開啟一個終端,客戶端需要保持兩個終端,首先我們建立一個鏈接通道,在客戶端也需要下載dns2tcp
,在這里我直接使用brew
安裝。
$ brew install dns2tcp
緊接着需要啟動通道,至此第一個終端連接已經完成。
$ dns2tcpc -l 8888 -r ssh -z dns.example.com 111.111.111.111
Listening on port : 8888
緊接着我們需要借助ssh
開啟一個socks4/5
通用代理,這也就是第二個終端需要完成的任務,相當於完成了一個ssh
連接,同樣也是需要賬號密碼或者私鑰的,執行下面的命令即可在127.0.0.1
開啟一個端口為1080
的socks
代理。
$ ssh -D 127.0.0.1:1080 root@127.0.0.1 -p 8888
之后就是使用代理了,可以為全局進行代理也可以近為一些軟件啟用socks
代理連接,在此本地進行了簡單的測試。
$ curl https://www.baidu.com --proxy socks5://127.0.0.1
可以看到服務端有大量的輸出。
...
Debug queue.c:240 Flush Write 72 bytes, crc = 0x40c5
Debug queue.c:300 Flushing outgoing data
Debug queue.c:642 Packet [646] decoded, data_len 0
Debug queue.c:653 diff = 21
Debug queue.c:300 Flushing outgoing data
Debug queue.c:642 Packet [647] decoded, data_len 24
Debug queue.c:653 diff = 21
Debug queue.c:240 Flush Write 24 bytes, crc = 0xd739
Debug queue.c:300 Flushing outgoing data
Debug queue.c:642 Packet [648] decoded, data_len 0
Debug queue.c:653 diff = 21
Debug queue.c:300 Flushing outgoing data
...
要注意的是無論是本地的終端還是服務器的終端都需要保持其運行才能繼續正常使用,畢竟如果終端掉了進程結束了也就不存在封包解包的操作了,另外實際使用速度還是比較感人的,畢竟其有大量的封包拆包操作。
最后
最終還是沒能成功實現想要的功能,最后使用dnslog
探查了一下實際上是有dns
查詢的,還是需要研究一下究竟是什么阻攔策略導致沒有完成隧道的建立。想來三級域名的A
記錄其實是可以攜帶一點信息的,即abc.example.com
可以攜帶abc
這個信息過去。此外還有一個終極大招,直接物理方案解決,畢竟AP
可是在宿舍里邊的。
參考
http://0sec.com.cn/2018-08-05/
http://blog.dengxj.com/archives/14/
https://www.cnblogs.com/nkqlhqc/p/7805837.html
https://blog.csdn.net/wn314/article/details/81430554
https://blog.csdn.net/m0_53129012/article/details/111173610
https://blog.csdn.net/miaomiaodmiaomiao/article/details/50883764