利用 DNS 隧道免认证上网
现在很多商场、饭店的商业WIFI采用了WEB Portal认证方式,但有些认证系统存在漏洞,可以利用 DNS 隧道绕过网关计费系统,实现上网。
DNS运行机制
DNS(Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于TCP/IP网络,提供将主机名和域名转换为IP地址的服务,举例就是把www.qq.com
转换为IPV4地址119.147.15.13
DNS解析域名过程如下叙述:
- 找浏览器缓存,当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在)。
- 找系统缓存,当浏览器缓存中无域名对应IP则会自动检查用户计算机系统Hosts文件DNS缓存是否有该域名对应IP。
- 找路由器缓存,当浏览器及系统缓存中均无域名对应IP则进入路由器缓存中检查,以上三步均为客服端的DNS缓存。
- 找ISP的DNS缓存,当在用户客服端查找不到域名对应IP地址,则将进入ISP DNS缓存中进行查询。比如你用的是电信的网络,则会进入电信的DNS缓存服务器中进行查找。
- 查询根域名服务器,当以上均未完成,则进入根服务器进行查询。全球仅有13台根域名服务器,1个主根域名服务器,其余12为辅根域名服务器。根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如.com)服务器IP告诉本地DNS服务器。
- 查询顶级域名服务器,顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的IP地址告诉本地DNS服务器。
- 查询主域名服务器,主域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确纪录。
- 保存结果到缓存,本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个IP地址与web服务器建立链接。
DNS隧道原理
DNS隧道从名字上来看就是利用DNS查询过程建立起隧道,传输数据。概括地讲,所谓 tunnel 就是把下一层(比如IPv4层)的包封装到上一层(比如 SSH,HTTP)或者同一层(比如IPv6层)的协议中进行传输,从而实现网络之间的穿透。
很明显,这种实现有个前提,那就是:发送端和接收端必须各有一个解析这种包的程序或者内核模块才能实现正常通信。DNS隧道技术简单来说就是将网络流量封装成DNS流量,再通过DNS的正常走向将流量传出来.这里的流量封装通常由一个客户端来完成,而降封装的DNS流量还原成正常的流量将由一个服务端来完成。
下面是利用DNS隧道连接外部网络时DNS解析的一个过程,由于防火墙并没有对dns协议做任何处理,所以我们可以通过这种方式向外网发送数据来穿透防火墙。
- 向内部dns服务器发送一个查询xxx.com的请求,这个域名的控制权限是在自己手里的
- 内部dns服务器通过防火墙向根dns服务器发出查询请求
- 经过大量重定向后,DNS请求到达xxx.com的权威DNS服务器,该服务器处于自己的控制之下
- 请求查询的响应结果通过防火墙
- 响应结果返回到内部服务器
- 内部服务器将响应结果返回
Web Portal的原理
Portal在英语中是入口的意思。Portal认证通常也称为Web认证,一般将Portal认证网站称为门户网站。未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其中的服务。当用户需要使用互联网中的其它信息时,必须在门户网站进行认证,只有认证通过后才可以使用互联网资源。Portal业务可以为运营商提供方便的管理功能,门户网站可以开展广告、社区服务、个性化的业务等,使宽带运营商、设备提供商和内容服务提供商形成一个产业生态系统。
Portal的典型组网方式如下面拓扑图所示,它由五个基本要素组成:认证客户端、接入设备、Portal服务器、认证/计费服务器和安全策略服务器。
Portal认证的基本过程如下:
客户机首先通过DHCP协议获取到IP地址(也可以使用静态IP地址),但是客户使用获取到的IP地址并不能登上Internet,在认证通过前只能访问特定的IP地址,这个地址通常是PORTAL服务器的IP地址。采用Portal认证的接入设备必须具备这个能力。一般通过修改接入设备的访问控制表(ACL)可以做到。
用户登录到Portal Server后,可以浏览上面的内容,比如广告、新闻等免费信息,同时用户还可以在网页上输入用户名和密码,它们会被WEB客户端应用程序传给 Portal Server,再由Portal Server与NAS之间交互来实现用户的认证。
Portal Server在获得用户的用户名和密码外,还会得到用户的IP地址,以它为索引来标识用户。然后Portal Server 与NAS之间用Portal协议直接通信,而NAS又与RADIUS 服务器直接通信完成用户的认证和上线过程。因为安全问题,通常支持安全性较强的CHAP式认证。
设备及环境软件
设备 | 环境软件 |
---|---|
本地主机 | Windows10,iodine0.7,ShadowSocks代理,OpenVpn2.3.10,XShell6 |
腾讯云主机 | CentOS,OpenVpn,ShadowSocks代理,iodined |
阿里云域名 | 域名解析设置 |
方案设计
一般情况下,连接上路由器后,不经过其它操作直接输入别的网址打开,主机的数据包将从TCP端口发出,这时路由器网关发现主机没有经过Portal认证,立刻就拦截这个端口发出的数据包,其它端口同理也拦截,最后重定向至认证页面要求用户进行认证。
然而,世间万事都有例外。即使在不经过Portal认证的情况下,UDP的53端口发出的数据包也不会被网关拦截,而在这个端口上运行的就是DNS协议,DNS的解析功能依然正常,因此设法利用这个端口,在本地将上网的数据包伪装成DNS数据包,本地DNS自然无法解析这个伪装的DNS数据包,利用域名解析解析到远程的自己搭建的服务器上,在远程服务器上再还原出真实的上网数据包完成各种上网请求,最后整理响应数据伪装成DNS响应数据包,返回主机上还原查看上网响应数据包。
流程
域名解析配置
在阿里云上申请了一个.top域名,进入到域名控制台中,点击“解析”进入到解析配置,为域名添加一条A记录和一条NS记录,详情如下图所示。
其中A记录用来指定主机名或域名对应的IP地址记录,NS记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。当本地域名服务器无法解析伪装的数据包后,便将数据包发送给NS记录指定的服务器aaa.coolcc.top,而aaa.coolcc.top的IP地址已经在A记录中给出了。
因此,这样配置后本地域名服务器会将伪装的DNS数据包发送到云主机上。
云主机配置
在腾讯云上购买了体验云主机,配置为1 核 1 GB 1 Mbps,预装系统为CentOS 7.4 64位,可在控制台中查看到当前云主机概况,如下图所示。
在控制台菜单中进入到安全组
选项,新建安全组,设置为放通所有端口
,便于DNS数据在UDP53端口的接收传送。回到云主机概况中,点此云主机的更多
,进入到配置安全组选项
,将此安全组配置给云主机。
使用XShell连接云主机,新建会话,在主机一栏中填入云主机的公网IP,随后弹出登录验证界面,输入用户账号密码后即可登录使用管理云主机。
登录云主机成功后就可以开始配置主机环境,安装DNS隧道所需软件,输入以下安装指令并依照提示安装即可
软件 | 安装指令 | 作用 |
---|---|---|
iodined | yum install iodine | 建立DNS隧道 |
OpenVpn | yum install openvpn | 虚拟网卡 |
ShadowSocks | yum install python-setuptools ; easy_install pip | 系统代理 |
安装完软件后需要配置软件,对于ShadowSocks,配置其代理设置,输入vim /etc/shadowsocks.json
指令来创建配置文件,内容如下图,其中服务器地址填写的地址需要与云主机内网IP在同一个网段下,保存退出。随后输入ssserver -c /etc/shadowsocks.json -d start
指令,表明用配置文件启动运行ShadowSocks服务。最后输入iodined -c -f -P 12345678 172.16.99.1 zwc.coolcc.top
指令启动iodine,监听zwc.coolcc.top的DNS解析。
另外,可以上https://code.kryo.se/iodine/check-it/这个网站输入监听解析域名,上面例子就是zwc.coolcc.top,验证iodine工作是否正常。如下图,返回结果提示iodine工作没问题。
本地主机配置
本地主机同样先安装好所需环境和软件,安装包都能在对应官网上找到下载,这里也不赘述详细安装过程了。注意的问题一是OpenVpn最好用2.3.10版本,因为一开始用2.3.13版本网络无法连通,换成2.3.10之后就好了,二是安装OpenVpn时只需要勾选安装TAP Virtual Ethernet Adapter
一项即可,因为只需要用到OpenVpn生成的这个TAP网络适配器来沟通连接服务器的网卡。
安装完后启动iodine服务。以管理管身份运行cmd,在cmd中进入到iodine的32位或者64位目录下,输入iodine -f -P 12345678 203.195.135.206 zwc.coolcc.top
指令启动iodine,与云主机建立DNS隧道,注意到输入参数为云主机的公网IP,12345678为云主机端的iodine程序设置的密码。成功建立后可以窗口如下图所示。
可以另开一个cmd测试一下此时本地主机与云主机的连通性,ping一下云主机之前设置的DNS服务器地址,效果如下图所示。
现在要启用ShadowSocks代理,选项按照云主机的配置文件填写就可以了,如下图编辑服务器界面。最后右击任务栏ShadowSocks小图标,正式启用ShadowSocks系统代理,并把代理模式改成全局代理模式。
结果
去学校隔壁的麦当劳,连接上麦当劳的wifi,理所当然地弹出了Web的Portal认证页面
无视麦当劳的认证界面,打开浏览器别的选项卡输入网址浏览,发现网页都能打开,说明我们的实验成功了。在百度搜索中输入IP,显示的IP为云主机的公网IP地址,属于腾讯云,说明我们的代理设置也成功了。但是在这种上网情况下,QQ微信等即时通讯软件是无法使用的,因为数据不走DNS解析通道,这也能解释有时候网页打不开但是QQ能上的现象,就是因为DNS解析的问题。
现在测试一下采用这种方式的上网通信质量,打开老牌的网络测速网站SpeedTest,任选一个测速点测试本地主机与测速点的通信质量。在测速报告中可以看到下载上传速度都在1Mbps左右,网络质量不太好,打开网页和加载网络图片也感到明显卡顿,延迟高
网络质量不好的原因在于三方面,一是我们购置的云主机为最低配,网络带宽配置仅有1Mbps,从这么低的带宽自然无法得到良好的上网体验;二是网络的多重处理转发性,经历了本地主机软件的伪造DNS数据包处理,内部DNS服务器的转发,远程主机的接收还原这么多步骤后,才开始通过远程主机与互联网的连接真正处理网络请求数据,接收到响应数据之后还要重新逆执行前面的步骤,这样复杂的转发机制无疑加大的延迟,降低网络质量;三是UDP协议的不可靠性,虽然快捷但是不保证可靠,提升传输丢包的风险,再次影响了上网体验。
参考
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!