manxingxing/manxingxing.github.io

DNS rebinding attack

Opened this issue · 0 comments

是什么?

是一种利用DNS进行的攻击。它诱使受害者访问恶意网页,在客户端执行javascript脚本,攻击受害者网络上的其他计算机/服务。它可绕过同源策略,也可绕过内网防火墙。

怎么实施?

攻击者注册一个域名,并掌控一个 DNS 服务器。通过给该域名设置非常短的 ttl (time to live),令 DNS 解析该域名时会指向变动的 IP地址。

  • 诱使受害者访问恶意域名下的网址
  • 在初次访问时,DNS 服务解析域名到恶意网页所在的 IP 地址
  • 在恶意网页上运行有恶意脚本,扫描用户内网可能存在隐患的服务或设备
  • 一旦发现可攻击的目标服务或设备,恶意脚本向恶意域名发送攻击请求
  • 受控的 DNS 服务将恶意域名解析到目标服务或设备的 IP 地址,由于请求的源域名和目的域名相同,所以不会被同源策略拦截
  • 攻击请求被成功发到目标服务服务或设备

目标服务为何能接受攻击请求

一般来说,web 服务器根据请求的 HOST 请求头来判断请求转发给那个虚拟主机服务(virtual host)。攻击请求的 Host 请求头一般是恶意域名,而不是目标服务的域名,那为何请求能成功到达目标服务呢?

对 nginx 来说,会存在一个默认的虚拟主机。当请求的 Host 请求头与所有的虚拟主机的 server_name 都不匹配时,就会将请求转发给这个默认的虚拟主机。于是恶意请求就被转发到这个默认的虚拟主机服务。

这种攻击容易实施吗

存在一些检测 DNS 重绑定漏洞服务的工具,它们本身就能发动这种攻击。例如 https://github.com/nccgroup/singularity

如何防范

最简单的方法就是检查请求的 Host 请求头。如果和预期不符,拒接请求即可

Rails 和 HostAuthorization

Rails 6 自带了一个 HostAuthorization 的 middleware,会检测 Host 请求头,拒绝不合法的请求