信息收集&Fuzz
本文译自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.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 范围并开始扫描以查找泄漏。