0%

如何在网页中获取客户端的DNS服务器?

在浏览器中打开一个网站的时候,首先向DNS服务器发起域名解析请求,获取到网站IP地址后,再向网站服务器发起HTTP请求。
HTTP请求不包含DNS地址,理论上网站服务器是获取不到DNS服务器。不过这里有一个在网页中“曲线”获取客户端DNS的方法。

dns

一次在某网站查看自己的IP地址时,居然看到了我使用的DNS服务器。这意味着,在这次访问中,即使我使用了美国的代理服务器,对方仍然可以获取到我所在的地区(中国广西),匿名效果大打折扣。

浏览器打开一个网页的主要流程如下:

  1. 向DNS服务器发起域名解析;
  2. 向目标服务器发起HTTP请求;
  3. 目标服务器响应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服务器的地址。具体流程如下:

  1. 客户端向目标服务器发起HTTP请求;
  2. 目标服务器返回的网页中包含一个由随机字符串组成域名的CSS链接https://twfos1559410.ba.whrq.net/css/null.css
  3. 客户端浏览器解析到该CSS链接的时候,需要先向客户端DNS服务器发起请求解析该域名;
  4. 客户端DNS服务器向DNS权威服务器ns8.whdn.net发起解析twfos1559410.ba.whrq.net域名的请求。
  5. DNS权威服务器ns8.whdn.net记录下随机数twfos1559410与客户端DNS服务器的IP地址。
  6. DNS权威服务器将客户端DNS的IP地址告诉目标服务器。
  7. 客户端向目标服务器发起请求获取客户端DNS的IP地址。

至此,获取客户端DNS服务器IP地址完成。