Hosts碰撞简介

首先有四个常识需要注意:

  • 隐形资产 == 隐藏资产

  • host注入 ≠ host型的ssrf ≠ hosts碰撞,host碰撞属于host头攻击的一种

  • 反向代理服务器 == 反代服务器

  • 报文头 == 标头

再介绍一下Hosts碰撞有什么用:

  • 发现隐形资产

  • 暴露内网系统

  • 找到业务系统的真实IP

  • 绕过云WAF的安全防护

隐形资产是什么?为什么会有隐形资产?

在渗透测试中,我们会搜集很多IP资产、域名资产,通过端口扫描能够发现其开放的端口。比如都开放了如web端口——对于域名资产的场景是:通过域名能正常访问,对域名做解析发现该域名指向的是一个内网ip。对于IP资产的场景是:通过IP访问状态码报4xx(如400、403、404)禁止我们访问、5xx错误、显示200却对任何输入不做响应。对于同一个资产的场景是:使用其真实IP无法访问,只有域名才能访问。出现这种情况是因为:大部分是因为中间件(如反向代理服务器Nginx)对直接IP访问进行了限制,必须使用域名访问。这些资产大部分是内部员工使用的系统,使用外网IP,但是绑定的域名是内部域名,外网DNS服务器无法解析,必须在本地hosts文件写入绑定关系,才可正常使用内部域名访问。举个例子,一个网站对外主域名为www.test.com,而内网中存在多个业务系统,都绑定了内网域名,比如manage.test.com,这是内网自定义的域名,无法在公网DNS解析到,因为公网无法解析其IP,显然无法直接访问到。系统管理员其实是这样配置的,利用Apache或Nginx进行配置,使得无法直接通过IP去访问系统。因为公网DNS无法解析自定义子域名,因此访问系统有两个条件:知道系统的内网域名和对应的IP,再利用本地DNS解析(在本地hosts文件写入绑定关系)即可访问。这时候就出现了隐形资产概念,隐形资产的出现往往是因为配置错误或是配置未及时回收等原因而造成的,以Nginx为例,Nginx作为反代服务器,后面的业务有时是隐藏的,下面是一副典型的企业部署架构图

image-20231203111457669

基于这幅架构图,可以很好地看出隐形资产的由来:现在很多较大的公司比较流行资产统一把控,也就是把自己所有的资产全部收缩进内网,然后使用Nginx或是Apache反代服务器,想对外网开放某个资产的时候,就通过这个反代服务器新添加个配置映射出去

也就存在两种典型的漏洞场景:

  • 对于nginx背后隐藏的业务,即不开放到外网的业务,如测试环境或预生产环境,将公网的域名解析清除了,但是Nginx配置没有及时清除,绑定正确的host就能正常访问到【业务通过 DNS 解析到外网,后面删除了A记录(但是 nginx/Apache 的反向代理还没删除)】
  • 出于安全性考虑,外网Nginx和内网Nginx是需要做严格区分,但这里却没区分内外网。使用同一个Nginx完成内网和外网服务配置,通过公网域名解析到公网,内网DNS解析到内网。这个时候,绑定正确的host就可以访问到内网系统

隐形资产在渗透过程中的价值不言而喻,上面的漏洞场景都提到了一种利用手法,即“绑定正确的host就能访问”,这也就有了Hosts碰撞攻击。

Hosts碰撞原理

原理在上面已经零零散散地提到了,这里先简单说明下DNS解析机制,当我们访问某个域名时,会解析到对应的IP去访问业务系统,大致顺序如下(1~4):

  1. 浏览器缓存,先检查自身缓存中有没有被解析过的这个域名对应的ip地址
  2. 本地缓存hosts文件,记录域名和对应的IP地址(此步骤就是hosts碰撞的修改点
  3. 本区域域名服务器(LDNS),即你所在或附近城市的域名服务器,大约80%的域名解析到这里就完成了
  4. 再高一级域名服务器,如果还是解析不到就继续往上一级查

结合DNS解析机制,给出一张hosts碰撞原理图,如下

image-20231203114746007

再提一下Host报文头,从HTTP / 1.1开始,Host报文头是必需的请求报文头。它指定客户端要访问的域名。例如,当用户访问https://example.net/web-security时,其浏览器将组成一个包含Host报文头的请求,如下所示:

GET /web-security HTTP/1.1
Host: example.net

在Nginx、Apache中,可以通过相应配置文件进行域名绑定,使得直接访问IP是无法访问成功的,而访问其绑定的域名才可以访问成功。

将请求数据包的host报文头替换为某个域名时,再访问反代服务器的ip,如果Nginx/Apache的反向代理的host配置没删除,就会把请求转发到内网对应的host业务服务器上,接着返回该业务的信息,实现本该隐藏的业务访问

知道了原理,我们就可以收集内网系统的域名和目标资产的IP段,将两者进行组合遍历,便可发现一些暴露在公网的内网资产(即隐形资产)了【通过将域名和IP进行组合遍历,一旦匹配到后端代理服务器上的域名绑定配置,就可以访问到对应的业务系统,从而发现隐形资产。将域名和IP进行组合遍历的过程就是域名和IP进行捆绑碰撞的过程,Hosts碰撞中的“碰撞”一词就体现在这】

下面举个例子加深印象:

场景:外网有个ip: 47.10.10.1,它的域名为: test.com

现在它对映射规则配置不当,即存在Hosts碰撞

对外映射的域名1: a.test.com
对外映射的域名2: b.test.com
内部Nginx/Apache反代服务器映射的域名: ab.test.com

那么这种情况下如果我们进行Hosts碰撞,撞了一个 ab.test.com 进去
那么Nginx/Apache反代服务器接收到这个 host: ab.test.com 
就会直接去请求这个所谓的被收缩进内网的资源(即隐藏资源),然后返回

Hosts碰撞攻击手法

Hosts碰撞流程:

  • 搜集指向目标内网IP的域名
  • 搜集目标IP资产
  • 进行碰撞

下面对每一个流程进行介绍

搜集指向目标内网IP的域名

域名来源主要有:

  • 在对该目标进行信息收集时收集到的域名

  • 子域名挖掘

  • 自定义常用内部域名字典(内网办公系统常用的域名、子域名等)

这里列举一下内网办公系统常用的子域名:

#主域名为www.test.com
oa.test.com
user.test.com
mail.test.com
sso.test.com
portal.test.com

搜集目标IP资产

IP来源主要有:

  • 在对该目标进行信息收集时收集到的ip

  • ping 收集到的域名获取 ip

  • 自定义ip段字典

原则上任何一个ip都有host碰撞的价值,但是为了提高效率,要对ip做一些简单的筛选,流程和原则如下:

  1. 筛选未使用cdn的ip地址
  2. 对ip段进行常见web端口扫描(最好是开放web服务的资产)
  3. 访问时状态码为40x、50x的ip

这里给出一些相应工具:

进行碰撞

实际渗透过程中会使用到的Hosts碰撞工具:

这里再说一点,目前github上面的工具主要针对80、443端口做Hosts碰撞,但是其实还有大量其它的端口存在nginx业务返回码是40x,所以可以给这些工具做一个扩展功能,把对应IP开放的web端口也加入到Hosts碰撞工具中进行碰撞,这样可以收集更多的隐形资产。

下面再给出一种使用BurpSuite进行Hosts碰撞的方法——本质上就是对某个 IP 的 Host 头的值进行 Fuzz。但注意,该方法仅能对单个IP进行Hosts碰撞,如下:

  1. 收集域名形成FUZZ字典
  2. 将可能存在Hosts碰撞的ip的请求报文发送到BurpSuite的 Intruder 模块
  3. 标记Host报文头的值后导入FUZZ字典即可开始Hosts碰撞

这里再说一下找到隐形资产后,使用浏览器访问的两种方法,如下:

  • 修改本地hosts文件,添加碰撞出来的IP和域名后,浏览器直接访问即可

    windows:C:\Windows\System32\Drivers\etc\hosts

    linux:/etc/hosts

    image-20231203171356377image-20231203171428354

  • 在burp中设置,浏览器挂上burp代理后,进行访问image-20231203171509102

    image-20231203171525180

鸣谢

Comments

2023-12-02

⬆︎TOP