渗透测试之信息搜集

久未见 提交于 2020-02-07 02:52:15

信息搜集

拿到一个渗透测试目标,在获得合法授权的前提下,要做的第一步就是根据测试范围,开展尽量全面的信息搜集工作,主要目的在于针对测试目标,扩展攻击面,获取的信息越多,了解的目标越全面、立体,越能增加漏洞发现的可能性,本文的内容,主要是涉及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

可以查询到 所有百度相关域名的网站,对于搜索到的结果,使用爬虫脚本进行爬取和去重,即可获得大部分的百度子域名。

域名查询常用的第三方网站
站长之家万网爱站ICANNInterNICWHOis.net全球WHOIS查询等。

子域名查询:netcraft

(2)

域名信息的命令行实现,主要是:
在非windows系统中,如linux、mac系统中,可以在命令行模式下,使用 whois 命令查询域名的注册信息,例如域名是否被注册、注册域名的单位信息,注册人信息,注册邮箱等。

子域名查询:Kali 系统下的命令行工具:Fiercedigdnsreconhostdnsenumwhoislbdnslookup等。
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),通常由一些安全领域的大佬自行编写并在网上公开和分享:
子域名爆破工具:subDomainsBrutewydomainOneForAll
其他工具: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等可以标识身份的信息
各种包含敏感信息的缓存
文件上传地址
编辑器地址
网站物理地址:网站在服务器的根目录,因为页面报错等原因被泄露

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!