Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统再会将网址提交DNS域名解析服务器进行IP地址的解析。
一、原理
使用目标资产IP访问目标时,响应状态码基本为:401、403、404、500,但是用域名请求却能返回正常的业务系统。因为大多数都是需要绑定host才能正常请求访问的。如果域名删除了A解析记录,且反向代理服务器的配置未更新,那么就可以尝试通过反向代理服务器对应内网的web服务进行访问。
通过收集到目标的域名和目标资产的IP段,通过host头的域名+IP的url的形式进行访问,从而可通过反代实现内网web访问。
二、工具
https://github.com/fofapro/Hosts_scan
三、关于IP段和域名的收集#
多个ip在一个C端,超过一定阈值时,就猜测整个C端很可能都是厂商的。
域名则可通过oneforall进行收集,host.txt存放搜集的子域名,IP.txt存放搜集的ip地址,碰撞成功的会保存在hosts_ok.txt文件中
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#Author:R3start
#这是一个用于IP和域名碰撞匹配访问的小工具
import requests
import re
lists=[]
files = open('hosts_ok.txt','w+')
#读取IP地址
print("====================================开 始 匹 配====================================")
for iplist in open("ip.txt"):
ip = iplist.strip('\n')
#读取host地址
#http_s = ['http://','https://']
http_s = ['http://']
for h in http_s :
for d in open("top3kdomain.txt",'r'):#moonsec
d = d.strip('\n')
for hostlist in open("host.txt",'r'):
host = d+"."+hostlist.strip('\n')
headers = {'Host':host,'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
try:
r = requests.session()
requests.packages.urllib3.disable_warnings()
rhost = r.get(h+ip,verify=False,headers=headers,timeout=5)
rhost.encoding='utf-8'
title = re.search('<title>(.*)</title>', rhost.text).group(1) #获取标题
info = '%s -- %s 协议:%s 数据包大小:%d 标题:%s' % (ip,host,h,len(rhost.text),title)
lists.append(info)
files.write(info + "\n")
print(info)
except Exception :
error = ip + " --- " + host + " --- 访问失败!~"
print(error)
print("====================================匹 配 成 功 的 列 表====================================")
for i in lists:
print(i)