突破校园网的认证限制

0x01 事情起因

事情是这样的,我一大早来到教室不想学汇编,由于之前在搞ipv6,开始就ipconfig查看自己的ipv6,然后我ping了一下buucoj.cn,让我感兴趣的是他的ipv6,但是在ping的过程中,我发现自己ping不同,开始疑惑以为是限制了他们那一方限制了ping命令,然后打开该网站这才想起自己未认证校园网,这时候才开始思考未认证校园网为什么可以得到dns记录,我以为是缓存,可是电脑才开机,带着疑问我去随意ping 了一个dn1.com,

image-20220307171954298

​ 图 1-1ping buu

结果如下

image-20220307172438146

显然我的电脑是不可能带有dn1.com的缓存(我甚至不知道这个网站真实存在),最后在网上找到了相关的论述,网上说是有一个入口设备在未认证的时候导向校园网的认证页面,直到认证完成,然后才让你的数据通过,但是dns数据是可以通过的,既然数据是可以传出去,还能传回来,那么我肯定可以利用这一点,于是我去网上搜索了相关文章,网上有很多的利用dns隧道技术突破校园网的限制,文章附上

文章教程 类似的教程

0x02 预备知识

硬件要求:需要服务器一台,域名一个,电脑一台。

​ 我们假设读者对DNS有最基本的了解,若不了解可先阅读《百度百科:DNS》。这里要介绍的是NS记录。网上百度得到的是一下内容

​ NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析,如果我们在记录添加了一NS记录,那么我们访问该域名的时候,他会让我们去访问指定的域名服务器,如果这个域名服务器是我们自己,那么我们就能和服务器通讯,因为一般的DNS查询机制不会经过我们的服务器,一般在权威服务器查到了就返回,添加NS服务器的目的在于让DNS查询经过我们服务器。

img

0x03 开始搭建

1、域名解析

​ 搭建的开始我们需要确定我们已经 有了一台服务器,我用的是ubuntu的服务器,以及一个域名,rao2357.top.

​ 在配置DNS的时候加上一条NS记录,同时加上一条A记录,

image-20220307191945558

添加NS记录,记录名称是aaa.dns.rao2357.top,值为dns.rao2357.top

添加A记录,记录名称为dns.rao2357.top,值为119.3.208.71

​ NS的值和A记录是名称要对应,A记录的值是自己公网的IP,NS的记录名称等会会用到。当某个主机想知道aaa.dns.rao2357.top的时候,会去访问dns.rao2357.top,然后这个值指向自己,如果自己搭建了DNS那么是可以应答的。

在服务器运行如下命令

1
tcpdump -n -i eth0 udp dst port 53

TCPDump可以将网络中传送的数据包完全截获下来提供分析,-n 不进行IP地址到主机名的转换,-i 选择过滤的网络接口,这里选择的是eth0网卡,udp协议,目的端口是53的数据包。

在电脑中运行如下命令

1
2
nslookup aaa.rao2357.top
ping aaa.rao2357.top

nslookup aaa.rao2357.top,这时候,如果不指定DNS服务器,一般是默认的服务器,我们用ping 命令也是异曲同工的。

这个时候服务器端就会出现如下命令,说明NS和A记录生效了,拦截到了目的端口是53的流量。

image-20220307193034294

二、服务器端配置

1、安装配置dns2tcp

在服务器上运行安装命令

1
sudo apt-get install dns2tcp

或者是在centos安装,但是centos是没有这个包的,去编译运行他,win编译

dns2tcp是一款在linux下使用C语言开发的建立dns隧道的开源工具,项目开源地址:https://github.com/alex-sector/dns2tcp

​ 修改/etc/dns2tcp.conf

1
2
3
4
5
6
7
8
listen = 192.168.0.29
port = 53
user = nobody
chroot = /tmp
domain = aaa.dns.rao2357.top
resources = socks:119.xx.xx.120:7777


​ listen需要改成服务器内网地址,因为这里的如果填的是0.0.0.0,那么会绑定端口失败,因为有一个系统服务systemd-resolve会占用这个服务用于自己的dns解析服务。

安装配置dante-server
现在让我们来搭建一个socks代理。我选择使用dante-server来搭建。首先安装它,命令如下:

1
apt-get install dante-server

安装完成后打开配置文件“/etc/danted.conf”,将其中内容修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
logoutput: /var/log/sockd.log
internal: eth0 port = 7777
external: eth0
socksmethod: username none
user.privileged: proxy
user.unprivileged: nobody
client pass {
from: 0.0.0.0/0 port 1-65535 to: 0.0.0.0/0
}
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
protocol: tcp udp
}

一般修改配置文件都先做好备份,不然很容易搞炸。我们现在看到的配置文件配置了一个监听端口7777的socks代理,无身份认证,允许任何客户端连接

​ 客户端我们用的是windows,但是dns-tcp是没有windows的,我们从网上找到源码进行编译,点击查看教程:win编译

0x04 搭建隧道

首先在服务器上运行如下命令来启动socks代理:

1
/etc/init.d/danted start

然后在服务器上运行如下命令来启动dns2tcp的服务器端:

1
dns2tcpd -f /etc/dns2tcpd.conf -F -d 2

其中参数“-f /etc/dns2tcpd.conf”指定了配置文件,“-F”要求程序在前台运行,“-d 2”指明了输出调试信息,级别为2。作为首次运行,我们加上参数“-F”和“-d 2”。

最后,在办公电脑(客户端)上运行如下命令以建立DNS隧道:

1
./dns2tcpc -r socks -z aaa.dns.rao2357.top -l 8888 -d 2

其中参数“-r socks”指明了要连接的资源,“-z aaa.dns.rao2357.top”指明了建立DNS隧道使用的域名,“-l 8888”指明了隧道的这头监听的端口,“-d 2”的作用和服务器端相同。

要持续运行服务器的dns2tcp需要将其放入后台进程

创建screen会话 screen -S dns2tcpd
启动dns2tcp sudo dns2tcpd -f /etc/dns2tcpd.conf -F -d 2
暂时离开快捷键 Ctrl + a + d
恢复screen会话 screen -r dns2tcpd
列出当前的会话列表 screen -ls
强行终止dns2tcp进程 screen -S dns2tcpd -X quit

最后我们可以在windows的火狐打开网络配置

image-20220307194905199

设置好我们的代理端口为本地的8888端口,选择socks5。

image-20220307195028595

可以看到本地cmd中显示以上内容,说明我们已经有数据进行传输了。

然后我们百度当前的IP

image-20220307195139936

我们的IP变成了我们的服务器IP,然后我们注销校园网认证账号。

image-20220307195604384

可见我们是能够继续访问的。

同样我们可以设置系统代理,不局限于浏览器突破限制

或者专门的QQ代理

image-20220307200345422

不过以上实现的DNS隧道速度不快,有待改进。不过一步步的学习总归是学到了一点东西, 还好我没有放弃思考问题。不过校园网认证系统存在的这个漏洞虽然不具有安全危害,但是也背离了认证的意义,使得干坏事的人有更隐蔽的手段。