信息收集&Fuzz
阅读原文时间:2023年07月10日阅读:1

本文译自https://0xjoyghosh.medium.com/information-gathering-scanning-for-sensitive-information-reloaded-6ff3455e0d4e 感谢JoyGhosh优质的内容

测试 Web 应用程序/网络,在我们测试目标上的漏洞之前,信息收集很重要吗?

我们需要收集什么样的信息来测试 Web 应用程序?

  • whois查找[收集有关于注册公司的信息以及用于查找资产的Email]
  • 相关主域名[寻找更多相关顶级域名]
  • 子域名枚举,垂直域关联[查找漏洞,安全问题并收集目标资产]
  • ASN查找[使用asn号码发现公司更多资产]
  • 目标可视化/网页截图[也称为视觉侦察,以查看目标有何课可测试的功能]
  • 爬取和收集页面链接[爬取子域以获取域的连接和url]
  • Javascript Files 爬取[从js文件中查找敏感信息,如 api密钥auth密钥,其他信息等]
  • 参数发现[扫描注入类型漏洞以及其他安全问题]
  • 子域名Cname提取[检查是否有任何域指向脆弱的第三方服务,我们可以使用这些信息进行子域接管]
  • 域/子域版本和技术检测[映射下一个漏洞扫描步骤]
  • 敏感信息发现[利用搜索引擎查找目标敏感性息]

Whois查询

通过网站注册人信息,检查注册人注册的其他网站(对注册人邮箱,电话进行反查),对目标网站进行深入调查。

whois target.tld

此命令将向你展示target.tld的whois结果,whois查询结果的输出包含 Name Server registrant email,我们可以使用这些信息反向 whois 查找以查找目标公司的更多资产。

我们只需使用 grep 和 regex 就可以从这里过滤和 grep 电子邮件。

whois $domain | grep "Registrant Email" | egrep -ho "[[:graph:]]+@[[:graph:]]+"

相关主域名收集

大多数时候我们关注子域,但他们忽略了另一半,即水平域相关。水平域相关是查找其他域名的过程,这些域名具有不同的二级域名但与同一实体相关。

首先,让我们考虑一下。我们不能像上一步那样依赖句法匹配。潜在的,abcabcabc.com和cbacbacba.com可以由同一实体所拥有。但是,它们在语法上并不匹配。为此,我们可以使用之前从 whois 结果中收集电子邮件的 whois 结果进行反向 whois 搜索。有很多网站可以做反向whois查询。现在让我们使用我们使用收集的电子邮件进行反向 whois 查找。

whois $domain | grep "Registrant Email" | egrep -ho "[[:graph:]]+@[[:graph:]]+"
-------------------------------------------------------------
https://viewdns.info/reversewhois/
https://domaineye.com/reverse-whois
https://www.reversewhois.io/

多次访问网站和查找是浪费时间,因此我创建了一个 bash 脚本来使用 cli 中的 bash 进行此搜索。

#!/usr/bin/bash
domain=$1
email=$(whois $domain | grep "Registrant Email" | egrep -ho "[[:graph:]]+@[[:graph:]]+")
curl -s -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36" "https://viewdns.info/reversewhois/?q=$email" | html2text | grep -Po "[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)" | tail -n +4  | head -n -1

子域名枚举

在为目标公司做信息收集时,我们的第一步是为这些收集的域枚举子域。我们可以将枚举过程分为两种,一种是被动枚举一种是主动枚举。在被动枚举过程中,我们使用工具从网站的不同来源收集子域,这些工具在主动枚举过程中从 [hackertarget 、virustotal、threakcrowd、cert.sh 等] 等来源收集子域,在主动枚举过程中,我们将使用字典和我们所有的一级域来生成一个列表并解析它们检查列表中的目标哪些是活动的和有效的子域。

被动枚举

在互联网上有很多工具可以被动的收集子域。

通过Zoomeye收集子域

通过dork示例使用谷歌搜索找到子域:

site:*.target.tld

从 google 收集子域看起来很复杂,我们可以使用 bash 使其成为基于 cli 的脚本

#!/usr/bin/bash
domain=$1
agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36"
curl -s -A $agent "https://www.google.com/search?q=site%3A*.$domain&start=10" | grep -Po '((http|https):\/\/)?(([\w.-]*)\.([\w]*)\.([A-z]))\w+' | grep $domain | sort -u curl -s -A $agent "https://www.google.com/search?q=site%3A*.$domain&start=20" | grep -Po '((http|https):\/\/)?(([\w.-]*)\.([\w]*)\.([A-z]))\w+' | grep $domain | sort -u curl -s -A $agent "https://www.google.com/search?q=site%3A*.$domain&start=30" | grep -Po '((http|https):\/\/)?(([\w.-]*)\.([\w]*)\.([A-z]))\w+' | grep $domain | sort -u curl -s -A $agent "https://www.google.com/search?q=site%3A*.$domain&start=40" | grep -Po '((http|https):\/\/)?(([\w.-]*)\.([\w]*)\.([A-z]))\w+' | grep $domain | sort -u

或者我们可以使用来自D∆₹K⚜LÖ†Û$tools

他的结果是这样的

或者我们可以使用shodan查找目标域的子域名

hostname:"target.tld"

或者我们可以通过cli收集

shodan init your_api_key #设置shodan密钥
shodan domain domain.tld

让我们看看一些在线工具,它们将帮助我们枚举来自不同来源的子域

riddler.io

curl -s "https://riddler.io/search/exportcsv?q=pld:domain.com" | grep -Po "(([\w.-]*)\.([\w]*)\.([A-z]))\w+" | sort -u

subbuster.cyberxplore.com

curl "https://subbuster.cyberxplore.com/api/find?domain=domain.tld" -s | grep -Po "(([\w.-]*)\.([\w]*)\.([A-z]))\w+"

certspotter

curl -s "https://certspotter.com/api/v1/issuances?domain=domain.com&include_subdomains=true&expand=dns_names" | jq .[].dns_names | tr -d '[]"\n ' | tr ',' '\n'

使用 cloudflare 的 Dns 枚举

bugcrowd-levelup-subdomain-enumeration

wget https://raw.githubusercontent.com/appsecco/bugcrowd-levelup-subdomain-enumeration/master/cloudflare_enum.py
# 登录 cloudflare https://www.cloudflare.com/login
#“添加站点”到您的帐户 https://www.cloudflare.com/a/add-site
# 提供目标域作为要添加的站点
# 等待 cloudflare 挖掘 DNS 数据并显示结果
python cloudflare_enum.py your@email.com target.tld

一直以来,我们都在讨论和展示关于被动收集子域的单一来源,但是有很多工具使用了所有的这些来源手机子域名并过滤独特的,是我们查找到这么多子域名的的方式

assetfinder

go get -u github.com/tomnomnom/assetfinder #下载assetfinder
assetfinder --subs-only domain.tld # 枚举子域

subfinder

download https://github.com/projectdiscovery/subfinder/releases/tag/v2.4.8
subfinder -d domain.tld --silent

OneForAll

外国的月亮也不圆嘛被动收集还得看OneForAll

docker pull shmilylty/oneforall
docker run -it --rm -v ~/results:/OneForAll/results -v ~/.config:/OneForAll/config shmilylty/oneforall --target example.com run

拉取镜像并执行,其中~/.config替换为你自己配置文件所在文件夹的路径

python3 oneforall.py --target example.com run
python3 oneforall.py --targets ./example.txt run

我们使用了很多替代的方法来被动收集子域,但是这些工具大多使用相同的api和源来收集子域名

主动枚举

在主动枚举中,首先我们需要使用字典与域拼接

为了获得大部分子域,我建议您使用包含更多单词的大字典来排列更多子域。有可用的工具可以像amass一样同时进行排列和解析。但是这个集合有一些问题,我们要跳过它。我将向您展示我用来生成字典的工具。

GoAltdns

GoAltdns 是一种排列生成工具,可以获取子域列表,使用单词列表排列它们,插入索引、数字、破折号,并增加您找到在漏洞赏金或渗透测试期间没有人发现的神秘子域的机会。它使用多种技术来实现这一点。它可以允许发现符合模式的子域。GoAltdns 接收可能出现在域下的子域(例如测试、开发、暂存)中的单词以及您知道的子域列表。

amass

原作者认为amass集合有一些问题,但作为拓展仍介绍一下它。Amass 是OWASP 项目使用开源的信息收集和主动侦察技术执行攻击面的网络映射和外部资产发现。

在生成子域排列后我们的首要任务是解析他们以过滤存活的子域我们将使用massdns也可以使用puredns现在我们的第一个任务是混合被动扫描和排列收集到的的所有子域。

cat passive-subs.txt perm.txt | sort -u | tee -a all-sub.txt

massdns

massdns -r resolvers.txt -t AAAA -w result.txt all-sub.txt

它将直接从goaltdns 获取输出并解析它。

puredns

原作者最喜爱的,因为它可以同时置换和解析。

或者我们可以使用nmap对子域名暴力枚举

NMAP

nmap --script dns-brute --script-args dns-brute.domain=uber.com,dns-brute.threads=6

原作者还推荐了一个中文的子域名在线枚举工具

应该是大家常用的来自Lcy师傅的在线子域名查询

在主动和被动收集所有子域名后,我们的第一个任务是探测这些域名是否使用 http 或 https协议我们可以使用httprobe

ASN 查询

在国内很少有提到ASN(Autonomous system)其实就是自治系统同一个自治系统中的集合由一个单一的行政实体或域的一个或多个网络运营商的控制。

有很多方法可以找到公司的asn号码,asn号码将帮助我们检索目标互联网资产。我们可以使用 dig 和 whois 找到一家公司的 asn 号码,但大多数情况下,它们会给你一个托管服务提供商的 asn 号码。

但是你很有可能找到一家云公司,应为他们的服务器被托管在云服务器上。

示例 Google

我们可以使用名为 asnlookup.com 的免费 api 提取目标公司的 asn ipdata。

http://asnlookup.com/api/lookup?org=starlink

提取其 ip 范围后,只需从中选择一个不带子网的 ip 并将其粘贴

whois -h whois.cymru.com 1.1.1.1

它将会告诉你目标公司的asn号码

你也可以使用curl或者python3脚本来使用api

import requests
import json
def asn_lookup(company):
        headers = {
        'User-Agent': 'ASNLookup PY/Client'
        }
        asn_db=requests.get(f'http://asnlookup.com/api/lookup?org={company}',headers).text
        print(f'{Fore.GREEN}[+] {Fore.WHITE}ASN Lookup Result For {company}')
        print('')
        asndb_load=json.loads(asn_db)
        for iprange in asndb_load:
            print(iprange)

asn_lookup('company_name')

那么我们获得了ASN后可以在哪里使用这个ASN号码呢?

我们可以在网络空间搜索引擎上使用这个ASN号码来获取关于目标公司的更多信息。

Shodan Dork

asn:AS50494

Censys Dork

autonomous_system.asn:394161

Zoomeye or 360 Quake Dork

asn:42893

同样我们也可以通过在网络空间搜索引擎中得到目标公司的ASN号码

目标可视化截图

在得到子域名之后,我们需要可视化查看这些目标使用界面的样子,主要是查看是否泄漏了任何重要信息或数据库。有时在域/子域收集中,我们得到了 2k-10k 子域,我们想要全部手工访问这是不可能的,需要 30-40 个小时,有许多工具可以从子域列表中获取这些页面。

gowitness是一个用 Golang 编写的网站截图实用程序,它使用 Chrome Headless 使用命令行生成 Web 界面的屏幕截图,并带有一个方便的报告查看器来处理结果。支持 Linux 和 macOS,主要支持 Windows。

它非常的快速且不需要任何外部依赖

备选方案

EyeWitness

EyeWitness 旨在截取网站的屏幕截图,提供一些服务器标头信息,并在已知的情况下识别默认凭据。

抓取和收集页面链接

一个页面包含许多link,有时这些link包含一些敏感信息披露的参数、端点等。有很多工具可用于抓取或收集页面链接。

Hakrawler

它是一个基于 golang 的爬虫,以其速度而闻名。它还可以从页面中收集子域,这就是我最喜欢它的原因。URL 是通过抓取应用程序、解析 robots.txt 文件和解析 sitemap.xml 文件来提取的。

gospider

Gospider - 用 Go 编写的快速网络蜘蛛

rad

想必大家最熟悉不过了来自于长亭科技的xray扫描器衍生品一款专为安全扫描而生的浏览器爬虫

crawlergo

这个大家想必也不会陌生,来自360的浏览器爬虫现已开源

现在让我们看看那些被动链接提取器 这些链接提取器使用alien-vault , waybackurls等来收集页面链接。

Waybackurls

这个使用archive.org 的回溯引擎来收集页面链接。

gau

getallurls (gau) 从 AlienVault 的Open Threat Exchange、Wayback Machine 和 Common Crawl 获取任何给定域的已知 URL 。灵感来自 Tomnomnom 的waybackurls。

javascript文件抓取/从javascript文件提取敏感信息

他和网页抓取没什么区别我们可以从这些工具中收集javaScript文件

我们可以使用之前讨论过的gospider从网页中抓取javascript文件

gospider -s https://target.com --js --quiet

或者我们可以使用 Waybackurls/gau and httpx 来收集 javascript 文件。

echo starlink.com | gau | grep '\.js$' | httpx -status-code -mc 200 -content-type | grep 'application/javascript'
or
gau target.tld | grep "\\.js" | uniq | sort -u waybackurls targets.tld | grep "\\.js" | uniq | sort

或者我们可以使用众所周知的流行工具来收集js文件

getJS

getJS 是一个从一组给定的 url 中提取所有 javascript 文件的工具。url 也可以通过管道传输到 getJS,或者您可以使用 -url 参数指定单个 url。getJS 提供了一系列选项,从完成网址到解析文件。

cat subdomains | getJS --complete

或我的 Python3 脚本从网页中过滤 js

#!/bin/bash
import requests
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin

def js(domain):
    session = requests.Session()
    session.headers["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
    html = session.get(domain).content
    soup = bs(html, "html.parser")
    script_files = []
    for script in soup.find_all("script"):
        if script.attrs.get("src"):
            script_url = urljoin(domain, script.attrs.get("src"))
            script_files.append(script_url)
            for js_file in script_files:
                print(js_file)

js('https://target.com')

收集完 javascrip 文件后,我们的首要任务是从 javascript 文件中找到敏感信息,敏感信息可能与 api 密钥、身份验证令牌、活动 cookie 等相关。

您可以使用此方法获取 api 密钥

这个项目提供了一些能够过滤API-Key的正则

cat file.js | grep API_REGEX

或者使用SecretFinder

有时这些 javascript 文件还包含传参点,我们可以使用 bash 提取这些传参点。

cat file.js | grep -aoP "(?<=(\"|\'|\`))\/[a-zA-Z0-9_?&=\/\-\#\.]*(?=(\"|\'|\`))" | sort -u

或者我们可以使用

Relative-url-extractor

一个从文件中提取相对 URL 的小工具。

cat demo-file.js | ./extract.rb

参数发现

Web 应用程序经常使用GET请求传入参数来接受用户输入。我们可以在这些参数中测试 xss、sql、lfi、rce 等一些漏洞。

Arjun

pip3 install arjun    安装Arjun
arjun -i subdomains.txt -m GET -oT param.txt   针对多个目标
arjun -u target.com -m GET -oT param.txt   针对单个目标
[-m ] 参数方法
[-oT] 文本格式输出 # arjun -h 可以看到更多选项

ParamSpider

或者我们可以使用parameth暴力枚举进行参数发现

子域名Cname提取

提取子域的 cname 对我们查看这些子域中是否有指向其他托管/云服务的子域很有用。方便我们之后可以测试接管。

我们可以使用dig查询Cname记录值

dig CNAME 1.github.com +short

而我们有多个子域可以使用 xargs 使多任务自动化

cat subdomains.txt | xargs -P10 -n1 dig CNAME +short

域/子域版本和技术检测

扫描域/子域版本和技术很重要,这样我们就可以创建漏洞检测模型,我们将如何接近目标站点

Wappalyzer

Wappalyzer是一个流行的技术和版本检测工具,通常我们使用chrome 扩展可以看到我们正在访问的网站它的技术栈。

npm i -g wappalyzer
wappalyzer https://uber.com #single domain
cat subdomain.txt | xargs -P1 -n1 wappalyzer | tee -a result

WAD

Whatweb

敏感信息发现

某些目标无意中泄漏敏感信息,如数据库转储、站点备份、数据库备份、调试模式泄漏等。有时搜索引擎如 google、shodan、zoomeye、leakix 包含站点的某些敏感信息或泄漏某些内容

扫描 Web 应用程序备份

我们可以使用ffuf对数据库转储进行fuzz,使用常用字典来扫描数据库转储。下面我们使用这个sqlbacklist进行fuzz。

对于多个url的fuzz我们可以使用xargs

cat subdomains | xargs -P1 -n1 ffuf -w backup.txt -mc 200,403 -u

我们选择过滤相应码为200,403的响应因为有一些方法可以绕过未经授权的 403

403Bypass

Content-discovery这是原作者提供的一个fuzz测试的字典

osint

Google

我们都知道众所周知的快速和流行的搜索引擎是 google.com,该搜索引擎收集和索引大部分表面网络上可用的网站,因此我们可以使用它来查找有关域的敏感信息。我们将使用 google 高级搜索,也被称为Google hacker。

公开文件获取

site:target.tld ext:doc | ext:docx | ext:odt | ext:rtf | ext:sxw | ext:psw | ext:ppt | ext:pptx | ext:pps | ext:csv

目录列表

site:target.tld intitle:index.of

暴露的配置文件

site:target.tld ext:xml | ext:conf | ext:cnf | ext:reg | ext:inf | ext:rdp | ext:cfg | ext:txt | ext:ora | ext:ini | ext:env

数据库文件

site:target ext:sql | ext:dbf | ext:mdb

日志文件泄漏

site:target ext:log | ext:logs

备份文件

site:target ext:bkf | ext:bkp | ext:bak | ext:old | ext:backup

phpinfo

phpinfo() site:jiebao8.top ext:php intitle:phpinfo “published by the PHP Group”

如果你想自动化获取这些可以使用uDork

Github 信息泄露

许多目标都有 github 存储库,其中一些是开源项目,有时候 github 代码项目会泄露许多服务的私有 api 密钥,或者有时源代码会公开一些敏感的东西,这就是为什么 github 不仅是代码库,而且还是黑客的 pii 库。您可以在 github 上进行侦察 2 方式,一种是手动方式,一种是自动方式,使用 github dorking 工具。

GitDorker

Github Recon 可帮助您更轻松地找到 PII。

Shodan Zoomeye 360Quake 这一类网络空间搜索引擎就不再赘述了

我们主要介绍一个被低估了的泄漏和配置错误搜索引擎leakix它可以找到 .git .env phpinfo() 和许多其他文件的泄漏。您可以直接从浏览器使用它或使用它的客户端。

您可以使用我的基于 python3 的客户端,它直接从网络获取结果

import requests
from bs4 import BeautifulSoup
from colorama import Fore, Style
def leakix_search(ip):
        get = requests.get(f'https://leakix.net/host/{ip}')
        comp = BeautifulSoup(get.content, 'lxml')
        search = comp.find_all('pre',class_="rounded p-1 wrap")
        for data in search:
            print(f'{Fore.RED}[+]{Fore.WHITE}  {ip} {Fore.RED}[LEAK]{Fore.WHITE}')
            print()
            print(Fore.CYAN+data.get_text()+Fore.WHITE)

leakix_search('your_target_ip')

您可以将所有子域主机名转换为 ip,然后使用它们开始批量扫描,或者从 asn 收集 CIDR/Ip 范围并开始扫描以查找泄漏。

[像专业人士一样进行侦察的简单方法]