建立DNS隧道繞過校園網認證

建立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)
...

我的服務端使用ubuntulinux發行版,直接使用包管理器安裝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,另外如果需要保持前臺運行且輸出日誌信息的話,nohubscreensystemctl都是可行的,維持終端進程後臺運行就不再贅述。

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開啓一個端口爲1080socks代理。

$ 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章