信息搜集
拿到一个渗透测试目标,在获得合法授权的前提下,要做的第一步就是根据测试范围,开展尽量全面的信息搜集工作,主要目的在于针对测试目标,扩展攻击面,获取的信息越多,了解的目标越全面、立体,越能增加漏洞发现的可能性,本文的内容,主要是涉及web安全方面的信息搜集,具体包含:域名(包括子域名)信息搜集、ip信息搜集、端口信息及开放服务等敏感信息的搜集。
1、域名信息(和ip)搜集
域名记录:
A:主机记录
C name:别名记录,把一个域名解析到另一个域名
NS:域名服务器记录,指向该域的域名服务器地址
MX:邮件服务器记录,指向该域的邮件服务器地址
ptr:反向解析
whois服务器(根域名):
APNIC(net)
ARIN (net)
AFRINIC (net)
IANA (com)
ICANN (org)
LACNIC (net)
NRO (net)
RIPE (net)
InterNic(original net)
域名信息搜集通常有以下几种方法:
1、通过第三方网站或者搜索引擎
2、通过命令行方式
3、python等自定义脚本
(1)
搜索引擎,包括常见的百度、必应(bing)、谷歌(国内无法直接访问,需要科学上网)、搜狗、360等。
搜索引擎是一个通道,搜索的关键在于根据目标,使用适当的搜索语法,可以参考google-hacking-database,该搜索语法是基于google搜索引擎的,但是对于百度等 也是适用的。
举例:
site:baidu.com
可以查询到 所有百度相关域名的网站,对于搜索到的结果,使用爬虫脚本进行爬取和去重,即可获得大部分的百度子域名。
域名查询常用的第三方网站:
站长之家、万网、爱站、ICANN、InterNIC、WHOis.net、全球WHOIS查询等。
子域名查询:netcraft
(2)
域名信息的命令行实现,主要是:
在非windows系统中,如linux、mac系统中,可以在命令行模式下,使用 whois 命令查询域名的注册信息,例如域名是否被注册、注册域名的单位信息,注册人信息,注册邮箱等。
子域名查询:Kali 系统下的命令行工具:Fierce、dig、dnsrecon、host、dnsenum、whois、lbd、nslookup等。
fierce 使用多种技术来扫描目标主机IP地址和主机名(子域名),是一个DNS服务器枚举工具,运用递归的方式(dns查询的另一种方式为迭代)来工作。
工作原理:通过查询本地DNS服务器获得目标DNS服务器,使用目标DNS服务器来查找子域名。
fierce可以用来定位独立IP空间对应域名和主机名,也可以测试目标dns服务器是否包含域传送漏洞。
使用举例:
fierce -dns baidu.com
dig www.baidu.com
host baidu.com
whois baidu.com
dnsenum baidu.com
lbd baidu.com
dnsrecon -d sina.com
在windows系统中,可以通过在命令行执行 nslookup 命令,实现 域名解析,获得对应的ip地址、邮件服务器、名称解析服务器等信息。
(3)
自定义脚本(python),通常由一些安全领域的大佬自行编写并在网上公开和分享:
子域名爆破工具:subDomainsBrute、wydomain、OneForAll。
其他工具:Layer子域名挖掘机
网上获得的Layer下载地址:
链接:https://pan.baidu.com/s/1z3vvgqqZcYLLK-7DAvwnBw
提取码:hvlc
分享一个自写的爬虫脚本,通过提供的目标主站(例如http://www.test.com/)作为入口,结合正则匹配出子域名,如何继续在得到的子网站递归爬取,最终获得目标站的大部分子域名。
import requests
import re,sys,time
#from functools import lru_cache
# @lru_cache(maxsize=64)
# set recursion limit
#sys.setrecursionlimit(2000)
pass_list=['ac.cn','edu.cn','edu.my''edu.hk','edu.mo','edu.sg','edu.tw','com.cn','gov.cn','net.cn','org.cn','edu.au','ac.kr','ac.in','ac.uk','ac.jp','ac.nz']
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36','Connection': 'close','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9','Referer': 'https://www.baidu.com/'}
result=set()
def deal_url(url):
if 'http://' == url[:7] or 'https://' == url[:8]:
return url
if '//' == url[:2]:
return 'http:'+url
if '/' == url[:1]:
return 'http:/'+url
def starts_spider(domain):
global result,domains,pt
if not domain:
return
result.add(domain)
host=domain.split('/')[2]
#print(host)
headers['Host']=host
#headers['Cookie']= Cookie
try:
res=requests.get(domain,headers=headers,timeout=15,verify=False)
except:
res=''
if not res:
return
urls=pt.findall(res.text)
urls=[deal_url(i) for i in urls]
#print(res.content)
if not urls:
return
dfs=list(set(urls).difference(result))
if not dfs:
return
result=result|set(dfs)
for url in dfs:
if not url:
continue
print(url)
starts_spider(url)
def get_parts(domains):
for i in pass_list:
if i in domains:
tmp=domains.replace('http://','').replace('https://','').split('/')[0].strip()
return '.'.join(tmp.split('.')[-3:])
tmp=domains.replace('http://','').replace('https://','').split('/')[0].strip()
return '.'.join(tmp.split('.')[-2:])
if __name__=='__main__':
try:
domain=sys.argv[1]
except:
print('Usage: %s http://www.test.com' % sys.argv[0])
exit()
global domains,pt
if domain.count('.') != 1:
domains=get_parts(domain)
else:
domains=domain.replace('www.','').replace('http://','').replace('https://','').split('/')[0].strip()
print(domains)
pts='(?:http://|https://|//|/){0,1}[0-9a-z\\.\\-]+\\.'+domains.replace('.','\\.')
print(pts)
pt=re.compile(pts)
domain=domain.split('//')[0]+'//'+domain.split('//')[1].split('/')[0] if 'http'==domain[:4] else 'http://'+domain.split('/')[0]
print(domain)
starts_spider(domain)
if result:
result = [i for i in result if i]
sites=len(result)
print('Found {} sites.'.format(sites))
dms={i.replace('http://','').replace('https://','') for i in result}
print('Found {} subdomains.'.format(len(dms)))
fname=str(int(time.time()))+'-'+domains+'-subdomains.txt'
with open(fname,'w') as f:
for us in result:
f.write(us+'\n')
以上信息搜集工具中,某些已经包含了对域名的解析功能,即域名对应的ip地址的获取。
2、端口和服务信息搜集
借助工具软件:
这里引入一款有 “诸神之眼” 之称的 nmap,该工具具有跨平台的各个版本,功能丰富,包括:域名解析对应ip,在线存活IP的扫描,开放端口的发现,服务识别和漏洞利用等,简单例如部分功能:
c段在线主机发现:
nmap -v -sn 192.168.1.1/24
dns解析
nmap -v www.baidu.com
端口(扫描1000个常见端口)开放检测 和 服务识别
nmap -v -sV -n -Pn 192.168.1.1 # 不做dns解析 -n,不检测ip存活性 -Pn
主要有效信息
PORT STATE SERVICE VERSION
23/tcp open telnet
80/tcp open http H3C-Miniware-Webs
443/tcp open ssl/https H3C-Miniware-Webs
5431/tcp open upnp
借助第三方网站:
http://coolaf.com/tool/port
http://tool.chinaz.com/port
https://tool.lu/portscan/
https://saomiao.51240.com/
http://www.matools.com/port
敏感信息:
网站各类用户信息:包括普通用户和超级用户、管理员等用户的账号信息、个人隐私(邮件、电话、家庭信息、单位信息、银行账号、个人征信、购物信息等)信息等。
网站备份信息:网站源码备份、数据库文件备份
登录页面:网站后台和各种管理员登录页面
敏感信息查询接口:各类信息查询api地址的无需授权和认证的访问
网站组织结构信息:通过robots.txt文件泄露网站结构
凭证信息:会话cookie、session、令牌token等可以标识身份的信息
各种包含敏感信息的缓存
文件上传地址
编辑器地址
网站物理地址:网站在服务器的根目录,因为页面报错等原因被泄露
来源:CSDN
作者:random numbers
链接:https://blog.csdn.net/shadow20112011/article/details/104196383