不见归来 ,相思寄于山海!
由于合规要求,我需要探测公司哪些主机上运行了DOT、DOH服务,而nmap暂时识别不出这两个服务指纹,无奈只能自己动手了。DOT即(DNS over TLS),DOH即(DNS over HTTPS),这两者都是DNS加密服务,由于我也是第一次接触它们,因此费了一番时间查阅资料,在此记录。
为什么需要DNS加密
DNS是互联网中最基本的协议,可以解析域名成IP地址,使用范围非常广。如果dns解析请求过程没有进行加密,被中间人截取dns请求流量后,就可以进行劫持、钓鱼、监控用户浏览的站点。
DOH VS DOT
两者有点类似,都是用来加密dns请求流量。IETF已将HTTPS上的DNS定义为RFC8484,并将其通过TLS定义为RFC7858和RFC8310。DOT使用TCP作为基本连接协议,并通过TLS加密和身份验证进行分层。DOH默认端口是443,基于HTTPS协议;DOT默认端口是853,基于tcp协议。
如何识别DOT、DOH服务
前面说到DOT默认开853端口,因此只要扫描主机是否开了853端口,或者扫描全端口后识别哪些端口为domain服务即可。但DOH默认开443端口,nmap探测返回的是https服务指纹,因此很难加以判断识别。唯一的方式就是模拟DOH标准协议的dns请求,观察是否能够正常返回解析结果。但是构造标准的请求包需要研究具体协议以及原理,难度很大,好在已经有人用python写了一个这方面的库。
doh-proxy
官方PYPI:https://pypi.org/project/doh-proxy/#doh-client
doh-proxy是专门用来代理doh的库,它分为服务端工具与客户端工具,安装完成后,自带了doh-proxy、doh-client,重点关注一下doh-client,可以模拟发起使用doh加密的dns请求。目前只支持>python3.5,用pip直接安装即可。
使用命令
如果运行没有报错,则说明1.1.1.1的443端口支持doh服务,替换1.1.1.1为要识别的主机IP即可识别出主机的443端口是否提供了DOH服务。如果想要批量扫描主机,可以修改site-packages/dohproxy目录下的client.py文件,比如像下面这样:
然后运行python client.py文件。
参考文章
https://www.racent.com/blog/dns-over-tls-vs-dns-over-https/
https://program-think.blogspot.com/2018/10/Comparison-of-DNS-Protocols.html
https://zhuanlan.zhihu.com/p/47170371