在浏览器中打开一个网站的时候,首先向DNS服务器发起域名解析请求,获取到网站IP地址后,再向网站服务器发起HTTP请求。
HTTP请求不包含DNS地址,理论上网站服务器是获取不到DNS服务器。不过这里有一个在网页中“曲线”获取客户端DNS的方法。
一次在某网站查看自己的IP地址时,居然看到了我使用的DNS服务器。这意味着,在这次访问中,即使我使用了美国的代理服务器,对方仍然可以获取到我所在的地区(中国广西),匿名效果大打折扣。
浏览器打开一个网页的主要流程如下:
- 向DNS服务器发起域名解析;
- 向目标服务器发起HTTP请求;
- 目标服务器响应HTTP请求。
在这个流程第1步中,客户端发送域名解析请求到DNS服务器,不会与目标服务器发生交互。在2步中,客户端会发送IP地址、浏览器信息、语言等信息到目标服务器,这其中也没有包含DNS服务器的信息。那么,DNS服务器地址是在什么时候泄露的呢?
经过抓包分析,发现浏览器发起了一个CSS文件的请求,地址为:
> https://twfos1559410.ba.whrq.net/css/null.css?_=1456472191430
随后又向目标服务器发起了一个请求,该请求返回了DNS服务器的地址,请求地址如下:
> https://whoer.net/zh/dns?domain=twfos1559410.ba&_=1456472133109
其中domain这个参数的值twfos1559410.ba
与前一个请求的域名前半段一致,是个随机字符串。看来,获取客户端DNS服务器地址的关键就在这里。使用dig命令查看该域名的解析流程,命令如下:
dig twfos1559410.ba.whrq.net +trace
从dig命令的返回结果中,比较关键的一行是:
whrq.net. 172800 IN NS ns8.whdn.net.
这是一条NS记录,即所有whrq.net
的子域名由DNS权威服务器ns8.whdn.net
负责解析。如果该DNS权威服务器与目标服务器“串通“好,就可以获取到客户端的DNS服务器的地址。具体流程如下:
- 客户端向目标服务器发起HTTP请求;
- 目标服务器返回的网页中包含一个由随机字符串组成域名的CSS链接
https://twfos1559410.ba.whrq.net/css/null.css
; - 客户端浏览器解析到该CSS链接的时候,需要先向客户端DNS服务器发起请求解析该域名;
- 客户端DNS服务器向DNS权威服务器
ns8.whdn.net
发起解析twfos1559410.ba.whrq.net
域名的请求。 - DNS权威服务器
ns8.whdn.net
记录下随机数twfos1559410
与客户端DNS服务器的IP地址。 - DNS权威服务器将客户端DNS的IP地址告诉目标服务器。
- 客户端向目标服务器发起请求获取客户端DNS的IP地址。
至此,获取客户端DNS服务器IP地址完成。