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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM