web信息搜集
1.whois查询
whois是什么:WHOIS
是一种用于查询 域名 和 IP地址 注册信息的标准化协议。
whois可以查询什么?
1. 域名信息查询
-
域名所有者:注册人姓名、机构名称。
-
注册商:域名是通过哪个注册商(如 GoDaddy、阿里云)购买的。
-
注册日期:域名首次注册的时间。
-
到期日期:域名何时会过期(需续费)。
-
更新时间:最后一次信息更新的时间。
-
域名服务器(DNS):域名指向的DNS服务器地址。
-
状态:域名是否被锁定、是否可转让等。
示例: 查询 example.com
的 WHOIS 信息,可以看到该域名由哪个公司持有、何时到期等。
最简单的python查询whois代码:
import whois
def whoisCheck(info):
if info == "":
return print("你输入的是空的啊?")
try:
whoisResultInfo = whois.whois(info)
print(whoisResultInfo)
print(whoisResultInfo.get('name'))
print(whoisResultInfo.get('emails'))
print(whoisResultInfo.get('registrar'))
except KeyError as ke:
print(f"WHOIS信息缺少对应键: {ke}")
except Exception as e:
print(f"查询出现问题: {e}")
if __name__ == '__main__':
info = input("请您输入目标地址:")
whoisCheck(info)
2. IP地址信息查询
-
IP归属:IP地址的分配机构(如ISP、云服务商)。
-
地理位置:IP地址的大致地理位置(通常到国家或城市)。
-
自治系统号(ASN):管理该IP的自治系统编号。
-
IP段范围:该IP所属的地址段。
示例: 查询 8.8.8.8
的 WHOIS 信息,会发现它属于 Google 的公共DNS服务。
常用手段:ping,nmap, 超级ping,whois,等等等等。。。
ping:
nmap扫描:
超级ping:
3.子域名查询扫描
子域名收集的核心价值
-
扩大攻击面:发现未授权或被遗忘的子域名
-
权限提升:通过子域名渗透到主站
-
信息泄露:暴露测试环境、API 接口等敏感资产
-
安全评估:完善企业资产清单
子域名收集方法论
被动收集(不直接访问目标)
-
DNS 信息挖掘
-
whois domain.com
:获取注册邮箱、域名服务器 -
dig axfr @ns1.domain.com domain.com
:尝试 DNS 区域传输 -
工具:
dnsx
,dnslookup
-
-
证书透明度日志
-
访问
crt.sh
或censys.io
查询证书关联的子域名 -
工具:
subfinder -d domain.com -sources crtsh
site:*.domain.com
(Google/Bing)-
hostname:*.domain.com
(Shodan) -
(domain.com OR *.domain.com)
(Censys)
-
-
第三方平台
-
威胁情报:微步在线、威胁猎人
-
云平台:AWS/Azure 云存储子域名泄露
-
代码托管:GitHub/GitLab 搜索
*.domain.com
-
主动收集(直接探测)
暴力枚举
示例:
字典优化:使用/usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt
等字典
工具:subfinder
, amass
, assetfinder
DNS 解析验证
massdns -r /usr/share/massdns/lists/resolvers.txt -t A subdomains.txt -o S -w resolved.txt
dnsx -l subdomains.txt -a -o valid_subdomains.txt
(同时解析 IP 和存活检测)
服务发现
端口扫描:
nmap -iL live_subdomains.txt -p 80,443 --min-parallelism 100
结合httpx验证 HTTP 存活:
subfinder -d domain.com | httpx -o live_subdomains.txt
特殊场景处理
泛解析绕过
生成随机字符串(如xxx.domain.com
)验证是否存在泛解析
使用工具knockpy
自动处理泛解析问题
CDN 隐藏
通过dnsx -d domain.com -resp-only
获取真实 IP
使用findomain -t domain.com
结合多个 DNS 服务器解析
常用的子域名查询工具:python脚本,subfinder
, amass
, assetfinder
4.备案查询
大多数通过网站查询
官方备案查询平台:
https://beian.miit.gov.cn/
站长工具:
https://www.aizhan.com/
https://tool.chinaz.com/
企查查:
https://www.qcc.com/
全国互联网安全管理服务平台(备案号查询):
https://beian.mps.gov.cn/
#多数合规网站会在底部标注备案号(如 “京 ICP 备 12345678 号”)
5.IP端口服务查询
这个ip端口获取方式很多
nmap扫描
nmap 192.168.110.1
nmap -p 1~65535
nmap -p 80,443
goby扫描
goby官网:Goby— 资产绘测及实战化漏洞扫描工具
6.三方工具检索资产指纹
nmap扫描
例如;
nmap -A www.baidu.com
nmap -A -O -sV www.baidu.com
nmap -A -O -sV 180.101.51.73
goby扫描(推荐)
7.python脚本探测子域名
需要环境:python3.10+
链接放末尾
代码:(如果报错需要手动添加第三方模块哦)
import requests
import dns.resolver
import whois
from concurrent.futures import (ThreadPoolExecutor)
def check_subdomain_http(sub, domain, subdomains):
url = f"https://{sub}.{domain}" # 优先使用 HTTPS
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
print(f"[+] Found subdomain (HTTPS): {url}")
subdomains.append(url)
else:
print(f"[-] Not found (HTTPS): {url}") # 对于其他状态码统一输出 [-]
return # 直接返回,避免继续执行 HTTP 部分
except requests.RequestException:
url = f"http://{sub}.{domain}"
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
print(f"[+] Found subdomain (HTTP): {url}")
subdomains.append(url)
else:
print(f"[-] Not found (HTTP): {url}") # 对于其他状态码统一输出 [-]
except requests.RequestException:
pass
def subdomain_scan_http(domain):
subdomains = []
with open('子域名扫描配置字典.txt', 'r') as file:
wordlist = [line.strip() for line in file]
with ThreadPoolExecutor(max_workers=500) as executor:
futures = [executor.submit(check_subdomain_http, sub, domain, subdomains) for sub in wordlist]
for future in futures:
future.result()
return subdomains
def subdomain_scan_dns(domain):
subdomains = []
with open('子域名扫描配置字典.txt', 'r') as file:
wordlist = [line.strip() for line in file]
resolver = dns.resolver.Resolver()
for sub in wordlist:
subdomain = f"{sub}.{domain}"
try:
answers = resolver.resolve(subdomain, 'A')
if answers: # 仅当有答案时添加到子域名列表
print(f"[+] Found subdomain (DNS): {subdomain}")
subdomains.append(subdomain)
else:
print(f"[-] Not found (DNS): {subdomain}")
except dns.resolver.NXDOMAIN:
print(f"[-] Not found (DNS): {subdomain}")
except dns.resolver.NoAnswer:
print(f"[-] No answer for: {subdomain}")
except dns.resolver.Timeout:
print(f"[-] Timeout occurred while checking: {subdomain}")
except dns.exception.DNSException as e:
print(f"[-] DNS error occurred: {str(e)}")
return subdomains
def subdomain_scan_whois(domain):
subdomains = []
try:
w = whois.whois(domain)
for name_server in w.name_servers:
subdomain = name_server.split('.')[0]
if subdomain!= domain.split('.')[0]:
print(f"[+] Found subdomain (WHOIS): {subdomain}.{domain}")
subdomains.append(f"{subdomain}.{domain}")
else:
print(f"[-] Not found (WHOIS): {subdomain}.{domain}") # 对于未找到的情况输出 [-]
except Exception as e:
print(f"[-] Error occurred while checking WHOIS: {e}")
return subdomains
def subdomain_scan_api(domain):
subdomains = []
# 使用 crt.sh API 进行子域名查找
url = f"https://crt.sh/?q=%.{domain}&output=json"
try:
response = requests.get(url)
if response.status_code == 200:
data = response.json()
for entry in data:
subdomain = entry.get('name_value')
if subdomain.endswith(f'.{domain}'):
print(f"[+] Found subdomain (API): {subdomain}")
subdomains.append(subdomain)
else:
print(f"[-] Not found (API): {subdomain}") # 对于不满足条件的情况输出 [-]
else:
print(f"[-] Failed to fetch data from API: {url}")
except Exception as e:
print(f"[-] Error occurred while using API: {e}")
return subdomains
def save_valid_subdomains(subdomains):
valid_subdomains = []
for subdomain in subdomains:
try:
response = requests.get(subdomain, timeout=5)
if response.status_code == 200:
valid_subdomains.append(subdomain)
except requests.RequestException:
pass
with open('子域名扫描结果.txt', 'w') as file:
for subdomain in valid_subdomains:
file.write(subdomain + '\n')
def main():
domain = input("请输入要扫描的域名: ")
if not domain.startswith("http://") and not domain.startswith("https://"):
domain = "http://" + domain
domain = domain.split('/')[2] # 提取域名部分,去除协议和路径
# 仅使用 subdomain_scan_http 进行爆破
subdomains_http = subdomain_scan_http(domain)
all_subdomains = subdomains_http
print("\nAll found subdomains:")
for subdomain in all_subdomains:
print(subdomain)
# 增加更多日志输出,便于调试
print(f"Total subdomains found: {len(all_subdomains)}")
with ThreadPoolExecutor(max_workers=1000) as executor:
executor.submit(save_valid_subdomains, all_subdomains)
if __name__ == "__main__":
main()
使用教程:
1.将子域名配置字典保存文档为 子域名配置字典.txt(链接已打包6w+字典长度)
2.运行时去除前缀,例如查询www.baidu.com只输入baidu.com
3.等待脚本运行完毕输出控制台并同时保存同路径文本文档
打包链接:python子域名扫描官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘
备用链接:python子域名扫描官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘
8.其他子域名扫描核心工具详解
1. Subfinder
项目地址:GitHub - projectdiscovery/subfinder: Fast passive subdomain enumeration tool.
功能:快速枚举子域名(支持 API 和被动源)
安装:
GO111MODULE=on go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
配置 API(提升效率):
注册Censys
, SecurityTrails
, RapidDNS
等平台获取 API Key
执行subfinder -config ~/.config/subfinder/config.yaml
配置
2. Amass
kali默认内置,详细的不过多介绍,下面链接有更详细单独的介绍
功能:综合子域名枚举(主动 + 被动)
常用命令:
amass enum -d domain.com -passive -o passive.txt # 仅被动模式
amass enum -d domain.com -brute -w /path/to/dict.txt # 暴力枚举
详细教程:子域名收集神器:Amass 保姆级教程(附链接)-CSDN博客
3. OneForAll
项目链接:GitHub - shmilylty/OneForAll: OneForAll是一款功能强大的子域收集工具
特点:支持多线程、多模块、结果去重
使用示例:
python3 oneforall.py --target domain.com run
更多详细教程:OneForAll工具:安装指南、使用方法及常见问题解决(超全)-CSDN博客
4. httpx
用途:快速验证子域名存活并获取响应头
环境:python3.10+
脚本链接:Httpx子域名扫描官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘
备用链接:Httpx子域名扫描官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘
使用教程:
1.编辑文件夹里面的文本文档,和前面的子域名配置字典一样
2.python3 +python脚本+-d 域名 + -w 字典 +-t 线程
配置参数;
python3 subdomain_enum.py -h
usage: subdomain_enum.py [-h] -d DOMAIN -w WORDLIST [-t THREADS]
options:
-h, --help show this help message and exit
-d DOMAIN, --domain DOMAIN
-w WORDLIST, --wordlist WORDLIST
-t THREADS, --threads THREADS
-d指定域名 -w 指定字典 -t指定线程
例如:
python3 subdomain_enum.py -d baidu.com -w /home/kali/Desktop/httpx/subdomains.txt -t 500
9.总结
目前我们可以使用的手段
1.whois查询
2.ip地址基础信息
3.子域名扫描
4.备案查询
5.被动信息搜集
6.主动信息搜集
7.ip端口服务查询
8.三方自动化工具检索指纹资产
9.其他自动化子域名扫描工具的使用
针对CDN的搜集由于作者实在肝不下去了,想了解的铁子们可以期待下篇的帖子,如有不懂的可私信留言