这种方式是给出一个顶级域名,然后在字典中写入各种可能存在的子域名,拼接起来一个个访问,如果能够解析成功就说明这个域名真实存在。
2.网页搜索比如在bing搜索baidu.com,弹出来如下界面:
红框中的域名肯定都是baidu.com真实存在,可以被访问到的域名,只要从页面中提取到这一块内容就能拿到子域名。
2.脚本代码 1.字典爆破脚本运行前首先准备好一个子域名字典,运行时加上需要查询的顶级域名,程序拿到顶级域名,然后从字典中一个个读出子域名,两者拼接,接着拿去解析,解析成功就是一个有效的子域名。
import sys
import dns.resolver
# 接收用户输入的顶级域名
domain = sys.argv[1]
domain_lst = []
with open('E:python脚本subdomain.txt', 'r') as f:
# 从字典中读出一个子域名
for i in f:
i = i.strip()
subdomain = i + '.'+domain
try:
# 解析拼好的子域名
ip = dns.resolver.resolve(subdomain, lifetime=1)
if ip in domain_lst:
pass
else:
domain_lst.append(ip)
print(subdomain)
except Exception as e:
pass
2.网页收集子域名
拿到之后直接点下一页,多点几次,把每一页的url都拿来比较一下
前两个框是我们传入的参数,后两个框从第三行开始就有规律了,这里就可以构造出待访问的url
然后再看域名所在的html标签,F12查看源代码:
看到域名都在一个cite标签里面
整体思路为,接收一个待查询的子域名,构造好url访问,拿到会返回的源代码,将源代码中的cite标签提取出来,最后输出。
代码:
import requests
from bs4 import BeautifulSoup
import sys
import re
def find_sub_domain(site, pages):
Subdomain = []
# 请求头信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Referer': "https://cn.bing.com/search?q=baidu.com&sp=-1&pq=baidu.com&sc=8-9&qs=n&sk=&cvid=4ADFD86C6FEF49279A09DF578A997EC0&first=8&FORM=PORE",
'Cookie': "MUID=09F689A7A8796FBB2A449815A9936E45; SUID=M; MUIDB=09F689A7A8796FBB2A449815A9936E45; _EDGE_S=SID=06EB8F7C11DC6122102E9EC810BA6056; SRCHD=AF=NOFORM; SRCHUID=V=2&GUID=243B793FFB114F0DAF6B5E13EC7C7D66&dmnchg=1; _SS=SID=06EB8F7C11DC6122102E9EC810BA6056; _UR=QS=0&TQS=0; _HPVN=CS=eyJQbiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiUCJ9LCJTYyI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiSCJ9LCJReiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiVCJ9LCJBcCI6dHJ1ZSwiTXV0ZSI6dHJ1ZSwiTGFkIjoiMjAyMi0wNS0zMFQwMDowMDowMFoiLCJJb3RkIjowLCJHd2IiOjAsIkRmdCI6bnVsbCwiTXZzIjowLCJGbHQiOjAsIkltcCI6Mn0=; ipv6=hit=1653877828725&t=4; ZHCHATSTRONGATTRACT=TRUE; SRCHUSR=DOB=20220530&T=1653874238000&TPC=1653874280000; ZHCHATWEAKATTRACT=TRUE; SNRHOP=TS=637894711574924019&I=1; SRCHHPGUSR=SRCHLANG=zh-Hans&BRW=NOTP&BRH=M&CW=767&CH=722&SW=1536&SH=864&DPR=1.25&UTC=480&DM=1&PV=10.0.0&HV=1653874333&WTS=63789471038&BZA=0"
}
# page是需要查询的网页数
for i in range(1, int(pages)+1):
# 拼凑url
url = "https://cn.bing.com/search?q="+site+"&sp=-1&pq="+site + "&sc=8-9&qs=n&sk=&cvid=1B54F90605E44CF58E0CAB6DB948D0D0&first=" + str(((int(i)-1)*10)+8) +"&FORM=PERE" + str(i)
# 发起get请求,拿到返回值
html = requests.get(url, headers=headers)
# 把返回值解析成html
soup = BeautifulSoup(html.content, 'html.parser')
# 把所有的cite标签全部提取出来
job_bt = soup.find_all('cite')
# 对拿到的域名进行正则匹配,这里提前编译好匹配规则
pattern = re.compile(r"w+.baidu.com")
for i in job_bt:
# 通过正则表达式,拿到子域名
get = re.findall(pattern, str(i))[0]
if get in Subdomain:
pass
else:
Subdomain.append(get)
print(get)
if __name__ == '__main__':
if len(sys.argv) == 3:
site = sys.argv[1]
page = sys.argv[2]
else:
print("py -3 E:/python脚本/子域名爆破脚本.py domain pages")
sys.exit(-1)
Subdomain = find_sub_domain(site, page)
运行效果如下:



