继续从大佬同学那里骗作业过来~
利用DNS TUNNEL穿越网关计费系统
说到DNS Tunnel,我之前有一篇文章介绍过:
tecent安全工程师测试
当时是粗略的看了一下,这里重新复习一次DNS Tunnel的原理先。
DNS的定义
DNS(Domain Name System),也就是域名解析系统,是一种能够将数字ip与域名形成映射的协议。就好像ip180.97.33.107这个我们很难记忆这4个数字,但是[www.baidu.com]本身我们很容易去记忆,将这两者联系起来的就是DNS协议。
DNS工作原理
当我们尝试去访问一个域名,比如说test.com的时候,此时电脑会发起一个请求去访问这个域名,此时会有一个请求去寻找域名所绑定的ip是什么。
我们访问的第一个服务器就是递归解析器(recusive resolver),也就是你的ISP(Internet Server Provider),互联网服务提供商,或者Wireless carriers(也就是手机平板之类使用的服务提供)或者其他第三方提供。递归解析器知道要访问哪些其他的DNS 服务器来获得你所访问的域名的解析
有时候递归服务器本身就会存储有ip和域名之间的映射关系,此时它就会直接返回ip地址,结束访问。
如果没有缓存这个映射关系的话,递归解析器就回去访问13个服务器,叫做根服务器(Root Server),根服务器能解析顶级域名所在的ip 地址,比如说.com等等。由于根服务器其实在世界上很多地区都有,所以域名解析的时候,DNS 能够确保递归解析器会去寻找离它最近的服务器进行询问。
接下来,递归解析器会去查询当前顶级域名(Top Level Domain)解析服务器,顶级域名解析服务器会返回当前域名服务器(权威服务器, Authorization Server)所在的地址,从而进一步访问:
最后就相当于是从域名服务器中取得了当前test.com的ip,访问指定ip就相当于是进行了访问
我们可以尝试使用linux下的dig指令来查看:
第一段相当于是介绍一些简单的查询参数。
1 | ; <<>> DiG 9.9.5-3ubuntu0.10-Ubuntu <<>> www.baidu.com |
第二段是显示我们此时请求的域名是啥
1 | ;; QUESTION SECTION: |
此时的A表示的是Address,也就是地址,说明我们此时查询的是www.baidu.com的地址。注意到这里的域名最后有一个**.**,这里是有原因的:
**.**其实是因为,所有的域名结尾都是.root,比如说www.google.com的真正域名是www.google.com.root。这里使用.省略这个写法。
第三段显示了当前DNS服务器给出的答复:
1 | ;; ANSWER SECTION: |
这里的CName(Canonical Name)表示的是当前域名的规范域名,相当于说这个域名和www.baidu.com是等效的。
第四段则是显示了此时的查询究竟查询了哪些服务器:
1 | ;; AUTHORITY SECTION: |
这里能看到,这个a.shifen.com总共查询了五个DNS服务器,NS表示的就是Name Server,就是说这五个服务器在管理这个域名。
1 | ns1.a.shifen.com. 442 IN A 61.135.165.224 |
这一段显示的是上一段查询的服务器的ip为多少。
1 | ;; Query time: 64 msec |
最后一段表示的是一些查询结果,查询总共花了64秒。并且本机的DNS服务器地址为218.2.2.2,端口为53(默认的查询端口)
这里介绍一下DNS记录有哪些类型:
- MX: 这类是SMTP用来传输邮件时候使用的
- SRV: 用于记录每一种服务器提供的服务. SRV记录在高性能或者读取负载均衡方案和中很常见.
- A: 表示此时为一个IPv4地址.
- AAAA: 表示此时是一个IPv6地址.
- TXT: 用于存放通用信息. 这个记录常常用于DNS Tunnel中.
- PTR: 表示DNS反向信息.也就是说当前ip对应的域名是啥(查询的话,使用指令
dig -x
)
作业总结
最近做了一个作业,发现还是存在一些不熟悉的地方,这里记录一下:
存在cdn的网站,最后cdn的ip解析会解析到cdn所在的服务器上
我这里以为这个说法是不正确的,因为我一开始没想过cdn和dns能有啥关联的,所以想到说url的 CNAME 解析成cdn的url也没什么关系。后来才想到,如果cdn存在的话,那么对于CNAME解析,这个就不是一个别名那么简单,而是利用别名让url解析的ip对应到对应的cdn服务器上,从而实现cdn的加速(感觉一个很简单的道理一下子没想清楚)
DNS Tunnel
介绍了DNS的工作原理之后,我们做出如下的假设:
如果我们此时在一个受限制的网络中,不能主动访问外网,但是此时DNS请求却没有被禁止。那么我们如果利用DNS协议的话,是不是就能够伪装成进行DNS交换,但是实际上是和对应的服务器进行了交互,让DNS服务器帮忙转发我们的数据包呢?
假如说,此时我们已经能够控制一台域名服务器(Authorization Server),那么当我们尝试访问一个域名,并且在本地的递归解析器中并没有留下缓存的话,那么其就会向我们之前所说的进行迭代查找。如果我们能够控制一个域名服务器的话,那么这个查找最终就会查找到对应的服务器上,然后服务器会对我们的请求进行回复,从而构建成一个逻辑上的通路。
比如说,这次我们要发送的数据为
1 | c2VjcmV0 |
那么此时我们应该尝试访问的网站叫做:
1 | c2VjcmV0.domain.com |
那么接下来的操作就会如下图一样,完成一次通信:
最后就相当于在局域网中的电脑和外部的服务器形成了链接。
Web Portal认证方式
光知道DNS Tunnel 是啥还不够,我们还得知道这个Web Portal认证是啥,才能尝试去绕过。
Web portal,其实就是我们很多时候在商场或者学校链接WiFi的时候,有时候会插入一个页面,要求我们输入用户名密码,或者手机号之类的东西。这个时候进行认真的方式就叫做Web Portal。Web Portal本身的网络拓扑图大致如下:
然后用户在发起HTTP/HTTPS请求的时候,如果接入设备发现用户并没有进行身份认证的话,就会强制将用户重定向至于Portal服务器上。用户利用portal服务器上的信息进行基本的身份确认,然后将确认后的信息发送给接入设备。然后通过接入设备和认证服务器认证之后,计费服务器便开始进行数据请求并且进行流量计费。
绕过方法
我们可以看到,当前的Web Portal认证的方法有些【并没有阻止接入设备向外进行其他协议请求】。也就是说,其并没有限制DNS请求(当然也是看处理方式)。如果我们使用DNS隧道的方式,就能够绕过Web Portal中对于HTTP/HTTPS请求的拦截,完成通信。
这里使用工具Iodine进行DNS隧道搭建。为了能够实现DNS隧道搭建,那么最为关键的是要实现【查询域名的DNS请求能够来到我们指定的服务器上】。为了实现这一点,我们可以给DNS服务器上增加两条内容:
1 | t1 IN NS t1ns.mydomain.com. |
然后在服务器上使用iodined
监听对于t1.mydomain.com的请求,
1 | ./iodined -f -c -P secretpassword 192.168.99.1 t1.mydomain.com |
其中 -P 后面可以填入我们此时隧道加密的密码,然后在客户端这边,使用iodine
发起DNS请求
1 | ./iodine -f -P secretpassword t1.mydomain.com |
如果设置没有问题的话,就能够建立DNS隧道了!
参考网站:
http://www.ruanyifeng.com/blog/2016/06/dns.html
http://blog.csdn.net/xianweijian/article/details/49450703