建立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 [email protected] -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