mirror of
https://github.com/shmilylty/OneForAll.git
synced 2026-10-27 02:45:52 +08:00
pep8
This commit is contained in:
@@ -29,22 +29,22 @@ class CensysAPI(Query):
|
|||||||
resp = self.post(self.addr, json=data, auth=(self.id, self.secret))
|
resp = self.post(self.addr, json=data, auth=(self.id, self.secret))
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
resp_json = resp.json()
|
data = resp.json()
|
||||||
status = resp_json.get('status')
|
status = data.get('status')
|
||||||
if status != 'ok':
|
if status != 'ok':
|
||||||
logger.log('ALERT', status)
|
logger.log('ALERT', status)
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, str(resp_json))
|
subdomains = self.match(self.domain, str(data))
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
pages = resp_json.get('metadata').get('pages')
|
pages = data.get('metadata').get('pages')
|
||||||
for page in range(2, pages + 1):
|
for page in range(2, pages + 1):
|
||||||
time.sleep(self.delay)
|
time.sleep(self.delay)
|
||||||
data['page'] = page
|
data['page'] = page
|
||||||
resp = self.post(self.addr, json=data, auth=(self.id, self.secret))
|
resp = self.post(self.addr, json=data, auth=(self.id, self.secret))
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, str(resp.json()))
|
subdomains = self.match(self.domain, str(resp.json()))
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -29,11 +29,11 @@ class CertDBAPI(Query):
|
|||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
json = resp.json()
|
json = resp.json()
|
||||||
subdomains_find = utils.match_subdomain(self.domain, str(json))
|
subdomains = utils.match_subdomain(self.domain, str(json))
|
||||||
if not subdomains_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
page_num += 1
|
page_num += 1
|
||||||
# 默认每次查询最多返回30条 当前条数小于30条说明已经查完
|
# 默认每次查询最多返回30条 当前条数小于30条说明已经查完
|
||||||
if json.get('count') < 30:
|
if json.get('count') < 30:
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ class CertSpotter(Query):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = utils.match_subdomain(self.domain, str(resp.json()))
|
subdomains = utils.match_subdomain(self.domain, str(resp.json()))
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ class Crtsh(Query):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = utils.match_subdomain(self.domain, str(resp.json()))
|
subdomains = utils.match_subdomain(self.domain, str(resp.json()))
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ class Entrust(Query):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = utils.match_subdomain(self.domain, str(resp.json()))
|
subdomains = utils.match_subdomain(self.domain, str(resp.json()))
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ class Google(Query):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = utils.match_subdomain(self.domain, resp.text)
|
subdomains = utils.match_subdomain(self.domain, resp.text)
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
"""
|
"""
|
||||||
查询域名的NS记录(域名服务器记录,记录该域名由哪台域名服务器解析),检查查出的域名服务器是否开启
|
查询域名的NS记录(域名服务器记录,记录该域名由哪台域名服务器解析),检查查出的域名服务器是
|
||||||
DNS域传送,如果开启且没做访问控制和身份验证便加以利用获取域名的所有记录
|
否开启DNS域传送,如果开启且没做访问控制和身份验证便加以利用获取域名的所有记录。
|
||||||
|
|
||||||
DNS域传送(DNS zone transfer)指的是一台备用域名服务器使用来自主域名服务器的数据刷新自己的域
|
DNS域传送(DNS zone transfer)指的是一台备用域名服务器使用来自主域名服务器的数据刷新自己
|
||||||
数据库,目的是为了做冗余备份,防止主域名服务器出现故障时 dns 解析不可用。
|
的域数据库,目的是为了做冗余备份,防止主域名服务器出现故障时 dns 解析不可用。
|
||||||
当主服务器开启DNS域传送同时又对来请求的备用服务器未作访问控制和身份验证便可以利用此漏洞获取某个
|
当主服务器开启DNS域传送同时又对来请求的备用服务器未作访问控制和身份验证便可以利用此漏洞获
|
||||||
域的所有记录。
|
取某个域的所有记录。
|
||||||
"""
|
"""
|
||||||
import dns.resolver
|
import dns.resolver
|
||||||
import dns.zone
|
import dns.zone
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ class CheckCDX(Module):
|
|||||||
"""
|
"""
|
||||||
检查crossdomain.xml文件收集子域名
|
检查crossdomain.xml文件收集子域名
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, domain: str):
|
def __init__(self, domain: str):
|
||||||
Module.__init__(self)
|
Module.__init__(self)
|
||||||
self.domain = self.register(domain)
|
self.domain = self.register(domain)
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ class CheckCert(Module):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.log('ERROR', e)
|
logger.log('ERROR', e)
|
||||||
return
|
return
|
||||||
subdomains_find = utils.match_subdomain(self.domain, str(cert_dict))
|
subdomains = utils.match_subdomain(self.domain, str(cert_dict))
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -25,8 +25,10 @@ class CheckCSP(Module):
|
|||||||
正则匹配响应头中的内容安全策略字段以发现子域名
|
正则匹配响应头中的内容安全策略字段以发现子域名
|
||||||
"""
|
"""
|
||||||
if not self.header:
|
if not self.header:
|
||||||
urls = [f'http://{self.domain}', f'https://{self.domain}',
|
urls = [f'http://{self.domain}',
|
||||||
f'http://www.{self.domain}', f'https://www.{self.domain}']
|
f'https://{self.domain}',
|
||||||
|
f'http://www.{self.domain}',
|
||||||
|
f'https://www.{self.domain}']
|
||||||
response = None
|
response = None
|
||||||
for url in urls:
|
for url in urls:
|
||||||
self.header = self.get_header()
|
self.header = self.get_header()
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ class ArchiveCrawl(Crawl):
|
|||||||
for resp in cdx.iter(url, limit=limit):
|
for resp in cdx.iter(url, limit=limit):
|
||||||
if resp.data.get('status') not in ['301', '302']:
|
if resp.data.get('status') not in ['301', '302']:
|
||||||
url = resp.data.get('url')
|
url = resp.data.get('url')
|
||||||
subdomains_find = self.match(self.register(domain),
|
subdomains = self.match(self.register(domain),
|
||||||
url + resp.text)
|
url + resp.text)
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -27,9 +27,9 @@ class CommonCrawl(Crawl):
|
|||||||
|
|
||||||
for resp in tqdm(cdx.iter(url, limit=limit), total=limit):
|
for resp in tqdm(cdx.iter(url, limit=limit), total=limit):
|
||||||
if resp.data.get('status') not in ['301', '302']:
|
if resp.data.get('status') not in ['301', '302']:
|
||||||
subdomains_find = self.match(self.register(domain), resp.text)
|
subdomains = self.match(self.register(domain), resp.text)
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ class BinaryEdgeAPI(Query):
|
|||||||
resp = self.get(url)
|
resp = self.get(url)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, str(resp.json()))
|
subdomains = self.match(self.domain, str(resp.json()))
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ class BufferOver(Query):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ class Chinaz(Query):
|
|||||||
resp = self.get(self.addr)
|
resp = self.get(self.addr)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ class ChinazAPI(Query):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, str(resp.json()))
|
subdomains = self.match(self.domain, str(resp.json()))
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ class CirclAPI(Query):
|
|||||||
resp = self.get(self.addr + self.domain, auth=(self.user, self.pwd))
|
resp = self.get(self.addr + self.domain, auth=(self.user, self.pwd))
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, str(resp.json()))
|
subdomains = self.match(self.domain, str(resp.json()))
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -54,13 +54,13 @@ class DNSdb(Query):
|
|||||||
resp = self.get(url)
|
resp = self.get(url)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
else:
|
else:
|
||||||
subdomains_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ class DNSdbAPI(Query):
|
|||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
if resp.status_code == 200:
|
if resp.status_code == 200:
|
||||||
subdomains_find = utils.match_subdomain(self.domain, resp.text)
|
subdomains = utils.match_subdomain(self.domain, resp.text)
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -28,10 +28,10 @@ class DNSdumpster(Query):
|
|||||||
resp = self.post(self.addr, data)
|
resp = self.post(self.addr, data)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = utils.match_subdomain(self.domain, resp.text)
|
subdomains = utils.match_subdomain(self.domain, resp.text)
|
||||||
if subdomains_find:
|
if subdomains:
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ class HackerTarget(Query):
|
|||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
if resp.status_code == 200:
|
if resp.status_code == 200:
|
||||||
subdomains_find = utils.match_subdomain(self.domain, resp.text)
|
subdomains = utils.match_subdomain(self.domain, resp.text)
|
||||||
if subdomains_find:
|
if subdomains:
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -26,14 +26,14 @@ class IPv4InfoAPI(Query):
|
|||||||
return
|
return
|
||||||
if resp.status_code != 200:
|
if resp.status_code != 200:
|
||||||
break # 请求不正常通常网络是有问题,不再继续请求下去
|
break # 请求不正常通常网络是有问题,不再继续请求下去
|
||||||
resp_json = resp.json()
|
data = resp.json()
|
||||||
subdomains_find = self.match(self.domain, str(resp_json))
|
subdomains = self.match(self.domain, str(data))
|
||||||
if not subdomains_find:
|
if not subdomains:
|
||||||
break
|
break
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
# 不直接使用subdomains是因为可能里面会出现不符合标准的子域名
|
# 不直接使用subdomains是因为可能里面会出现不符合标准的子域名
|
||||||
subdomains = resp_json.get('Subdomains')
|
subdomains = data.get('Subdomains')
|
||||||
if subdomains:
|
if subdomains:
|
||||||
# ipv4info子域查询接口每次最多返回300个 用来判断是否还有下一页
|
# ipv4info子域查询接口每次最多返回300个 用来判断是否还有下一页
|
||||||
if len(subdomains) < 300:
|
if len(subdomains) < 300:
|
||||||
|
|||||||
@@ -46,11 +46,11 @@ class NetCraft(Query):
|
|||||||
resp = self.get(self.addr + last, params)
|
resp = self.get(self.addr + last, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
if not subdomains_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
if 'Next page' not in resp.text: # 搜索页面没有出现下一页时停止搜索
|
if 'Next page' not in resp.text: # 搜索页面没有出现下一页时停止搜索
|
||||||
break
|
break
|
||||||
last = re.search(r'&last=.*' + self.domain, resp.text).group(0)
|
last = re.search(r'&last=.*' + self.domain, resp.text).group(0)
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ class PTRArchive(Query):
|
|||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
if resp.status_code == 200:
|
if resp.status_code == 200:
|
||||||
subdomains_find = utils.match_subdomain(self.domain, resp.text)
|
subdomains = utils.match_subdomain(self.domain, resp.text)
|
||||||
if subdomains_find:
|
if subdomains:
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ class Riddler(Query):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -32,10 +32,10 @@ class Robtex(Query):
|
|||||||
resp = self.get(url)
|
resp = self.get(url)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
if subdomains_find:
|
if subdomains:
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ class SecurityTrailsAPI(Query):
|
|||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
prefixs = resp.json()['subdomains']
|
prefixs = resp.json()['subdomains']
|
||||||
subdomains_find = [f'{prefix}.{self.domain}' for prefix in prefixs]
|
subdomains = [f'{prefix}.{self.domain}' for prefix in prefixs]
|
||||||
if subdomains_find:
|
if subdomains:
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -26,11 +26,11 @@ class SiteDossier(Query):
|
|||||||
resp = self.get(url)
|
resp = self.get(url)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
if not subdomains_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
# 搜索页面没有出现下一页时停止搜索
|
# 搜索页面没有出现下一页时停止搜索
|
||||||
if 'Show next 100 items' not in resp.text:
|
if 'Show next 100 items' not in resp.text:
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ class ThreatCrowd(Query):
|
|||||||
return
|
return
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, str(resp.json()))
|
subdomains = self.match(self.domain, str(resp.json()))
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -60,9 +60,9 @@ class BruteSRV(Module):
|
|||||||
for result in results:
|
for result in results:
|
||||||
if result:
|
if result:
|
||||||
for answer in result:
|
for answer in result:
|
||||||
subdomain = utils.match_subdomain(self.domain, answer.host)
|
subdomains = utils.match_subdomain(self.domain, answer.host)
|
||||||
if subdomain:
|
if subdomains:
|
||||||
self.subdomains = self.subdomains.union(subdomain)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
else:
|
else:
|
||||||
logger.log('DEBUG', f'{answer.host}不是{self.domain}的子域')
|
logger.log('DEBUG', f'{answer.host}不是{self.domain}的子域')
|
||||||
if not len(self.subdomains):
|
if not len(self.subdomains):
|
||||||
|
|||||||
@@ -24,11 +24,9 @@ class RiskIQ(Query):
|
|||||||
auth=(self.user, self.key))
|
auth=(self.user, self.key))
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
resp_json = resp.json()
|
data = resp.json()
|
||||||
subnames = resp_json.get('subdomains')
|
names = data.get('subdomains')
|
||||||
if subnames:
|
self.subdomains = set(map(lambda sub: f'{sub}.{self.domain}', names))
|
||||||
self.subdomains = set(map(lambda sub: f'{sub}.{self.domain}',
|
|
||||||
subnames))
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ class ThreatBookAPI(Query):
|
|||||||
resp = self.post(self.addr, params)
|
resp = self.post(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(self.domain, str(resp.json()))
|
subdomains = self.match(self.domain, str(resp.json()))
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ class ThreatMiner(Query):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -30,19 +30,19 @@ class VirusTotal(Query):
|
|||||||
resp = self.get(url=self.addr.format(self.domain), params=params)
|
resp = self.get(url=self.addr.format(self.domain), params=params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
resp_json = resp.json()
|
data = resp.json()
|
||||||
subdomain_find = set()
|
subdomains = set()
|
||||||
datas = resp_json.get('data')
|
datas = data.get('data')
|
||||||
|
|
||||||
if datas:
|
if datas:
|
||||||
for data in datas:
|
for data in datas:
|
||||||
subdomain = data.get('id')
|
subdomain = data.get('id')
|
||||||
if subdomain:
|
if subdomain:
|
||||||
subdomain_find.add(subdomain)
|
subdomains.add(subdomain)
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
meta = resp_json.get('meta')
|
meta = data.get('meta')
|
||||||
if meta:
|
if meta:
|
||||||
next_cursor = meta.get('cursor')
|
next_cursor = meta.get('cursor')
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ class VirusTotalAPI(Query):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
resp_json = resp.json()
|
data = resp.json()
|
||||||
subdomain_find = set(resp_json.get('subdomains'))
|
subdomains = set(data.get('subdomains'))
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -30,14 +30,14 @@ class Ask(Search):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(domain, resp.text)
|
subdomains = self.match(domain, resp.text)
|
||||||
if not subdomain_find:
|
if not subdomains:
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
||||||
if subdomain_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
self.page_num += 1
|
self.page_num += 1
|
||||||
if '>Next<' not in resp.text:
|
if '>Next<' not in resp.text:
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -50,17 +50,17 @@ class Baidu(Search):
|
|||||||
return
|
return
|
||||||
if len(domain) > 12: # 解决百度搜索结果中域名过长会显示不全的问题
|
if len(domain) > 12: # 解决百度搜索结果中域名过长会显示不全的问题
|
||||||
# 获取百度跳转URL响应头的Location字段获取直链
|
# 获取百度跳转URL响应头的Location字段获取直链
|
||||||
subdomains_find = self.redirect_match(domain, resp.text)
|
subdomains = self.redirect_match(domain, resp.text)
|
||||||
else:
|
else:
|
||||||
subdomains_find = self.match(domain, resp.text)
|
subdomains = self.match(domain, resp.text)
|
||||||
if not subdomains_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
||||||
if subdomains_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
self.page_num += self.per_page_num
|
self.page_num += self.per_page_num
|
||||||
# 搜索页面没有出现下一页时停止搜索
|
# 搜索页面没有出现下一页时停止搜索
|
||||||
if '&pn={next_pn}&'.format(next_pn=self.page_num) not in resp.text:
|
if '&pn={next_pn}&'.format(next_pn=self.page_num) not in resp.text:
|
||||||
|
|||||||
@@ -36,15 +36,15 @@ class Bing(Search):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(domain, resp.text)
|
subdomains = self.match(domain, resp.text)
|
||||||
if not subdomains_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
||||||
if subdomains_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
# 搜索页面没有出现下一页时停止搜索
|
# 搜索页面没有出现下一页时停止搜索
|
||||||
if '<div class="sw_next>' not in resp.text:
|
if '<div class="sw_next>' not in resp.text:
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -36,15 +36,15 @@ class BingAPI(Search):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(domain, str(resp.json()))
|
subdomains = self.match(domain, str(resp.json()))
|
||||||
if not subdomains_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
||||||
if subdomains_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
self.page_num += self.per_page_num
|
self.page_num += self.per_page_num
|
||||||
if self.page_num >= self.limit_num: # 搜索条数限制
|
if self.page_num >= self.limit_num: # 搜索条数限制
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -30,14 +30,14 @@ class DuckDuckGO(Search):
|
|||||||
resp = self.post(self.addr, data)
|
resp = self.post(self.addr, data)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(domain, resp.text)
|
subdomains = self.match(domain, resp.text)
|
||||||
if not subdomain_find:
|
if not subdomains:
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
||||||
if subdomain_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
try:
|
try:
|
||||||
s = re.findall(r'name="s" value="(\d.*)"', resp.text)[-1]
|
s = re.findall(r'name="s" value="(\d.*)"', resp.text)[-1]
|
||||||
dc = re.findall(r'name="dc" value="(\d.*)"', resp.text)
|
dc = re.findall(r'name="dc" value="(\d.*)"', resp.text)
|
||||||
|
|||||||
@@ -32,13 +32,13 @@ class Exalead(Search):
|
|||||||
resp = self.get(url=self.addr, params=params)
|
resp = self.get(url=self.addr, params=params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(domain, resp.text)
|
subdomains = self.match(domain, resp.text)
|
||||||
if not subdomain_find:
|
if not subdomains:
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
if subdomain_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
self.page_num += self.per_page_num
|
self.page_num += self.per_page_num
|
||||||
if self.page_num > 1999:
|
if self.page_num > 1999:
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -32,10 +32,10 @@ class FoFa(Search):
|
|||||||
resp = self.get(self.addr, query)
|
resp = self.get(self.addr, query)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
if not subdomain_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
self.page_num += 1
|
self.page_num += 1
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
|||||||
@@ -40,13 +40,13 @@ class Google(Search):
|
|||||||
resp = self.get(url=self.addr, params=payload)
|
resp = self.get(url=self.addr, params=payload)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(domain, resp.text)
|
subdomains = self.match(domain, resp.text)
|
||||||
if not subdomain_find:
|
if not subdomains:
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
if subdomain_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
page_num += per_page_num
|
page_num += per_page_num
|
||||||
if 'start=' + str(page_num) not in resp.text:
|
if 'start=' + str(page_num) not in resp.text:
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -35,13 +35,13 @@ class GoogleAPI(Search):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(domain, str(resp.json()))
|
subdomains = self.match(domain, str(resp.json()))
|
||||||
if not subdomain_find:
|
if not subdomains:
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
if subdomain_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
self.page_num += self.per_page_num
|
self.page_num += self.per_page_num
|
||||||
if self.page_num > 100: # 免费的API只能查询前100条结果
|
if self.page_num > 100: # 免费的API只能查询前100条结果
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -25,11 +25,11 @@ class ShodanAPI(Search):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
if not subdomain_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
if subdomain_find:
|
if subdomains:
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
page += 1
|
page += 1
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
|||||||
@@ -31,14 +31,14 @@ class So(Search):
|
|||||||
resp = self.get(url=self.addr, params=payload)
|
resp = self.get(url=self.addr, params=payload)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(domain, resp.text)
|
subdomains = self.match(domain, resp.text)
|
||||||
if not subdomain_find:
|
if not subdomains:
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
||||||
if subdomain_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
page_num += 1
|
page_num += 1
|
||||||
# 搜索页面没有出现下一页时停止搜索
|
# 搜索页面没有出现下一页时停止搜索
|
||||||
if '<a id="snext"' not in resp.text:
|
if '<a id="snext"' not in resp.text:
|
||||||
|
|||||||
@@ -28,14 +28,14 @@ class Sogou(Search):
|
|||||||
resp = self.get(self.addr, payload)
|
resp = self.get(self.addr, payload)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(domain, resp.text)
|
subdomains = self.match(domain, resp.text)
|
||||||
if not subdomain_find:
|
if not subdomains:
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
||||||
if subdomain_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
self.page_num += 1
|
self.page_num += 1
|
||||||
# 搜索页面没有出现下一页时停止搜索
|
# 搜索页面没有出现下一页时停止搜索
|
||||||
if '<a id="sogou_next"' not in resp.text:
|
if '<a id="sogou_next"' not in resp.text:
|
||||||
|
|||||||
@@ -36,15 +36,15 @@ class Yahoo(Search):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(domain, resp.text)
|
subdomains = self.match(domain, resp.text)
|
||||||
if not subdomains_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
||||||
if subdomains_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
if '>Next</a>' not in resp.text: # 搜索页面没有出现下一页时停止搜索
|
if '>Next</a>' not in resp.text: # 搜索页面没有出现下一页时停止搜索
|
||||||
break
|
break
|
||||||
self.page_num += self.per_page_num
|
self.page_num += self.per_page_num
|
||||||
|
|||||||
@@ -36,15 +36,15 @@ class Yandex(Search):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomains_find = self.match(domain, resp.text)
|
subdomains = self.match(domain, resp.text)
|
||||||
if not subdomains_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
if not full_search:
|
if not full_search:
|
||||||
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
# 搜索中发现搜索出的结果有完全重复的结果就停止搜索
|
||||||
if subdomains_find.issubset(self.subdomains):
|
if subdomains.issubset(self.subdomains):
|
||||||
break
|
break
|
||||||
# 合并搜索子域名搜索结果
|
# 合并搜索子域名搜索结果
|
||||||
self.subdomains = self.subdomains.union(subdomains_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
if '>next</a>' not in resp.text: # 搜索页面没有出现下一页时停止搜索
|
if '>next</a>' not in resp.text: # 搜索页面没有出现下一页时停止搜索
|
||||||
break
|
break
|
||||||
self.page_num += 1
|
self.page_num += 1
|
||||||
|
|||||||
@@ -25,12 +25,12 @@ class ZoomEyeAPI(Search):
|
|||||||
if not resp:
|
if not resp:
|
||||||
logger.log('FETAL', f'登录失败无法获取{self.source}的访问token')
|
logger.log('FETAL', f'登录失败无法获取{self.source}的访问token')
|
||||||
return
|
return
|
||||||
resp_json = resp.json()
|
data = resp.json()
|
||||||
if resp.status_code == 200:
|
if resp.status_code == 200:
|
||||||
logger.log('DEBUG', f'{self.source}模块登录成功')
|
logger.log('DEBUG', f'{self.source}模块登录成功')
|
||||||
return resp_json.get('access_token')
|
return data.get('access_token')
|
||||||
else:
|
else:
|
||||||
logger.log('ALERT', resp_json.get('message'))
|
logger.log('ALERT', data.get('message'))
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
def search(self):
|
def search(self):
|
||||||
@@ -48,10 +48,10 @@ class ZoomEyeAPI(Search):
|
|||||||
resp = self.get(self.addr, params)
|
resp = self.get(self.addr, params)
|
||||||
if not resp:
|
if not resp:
|
||||||
return
|
return
|
||||||
subdomain_find = self.match(self.domain, resp.text)
|
subdomains = self.match(self.domain, resp.text)
|
||||||
if not subdomain_find: # 搜索没有发现子域名则停止搜索
|
if not subdomains: # 搜索没有发现子域名则停止搜索
|
||||||
break
|
break
|
||||||
self.subdomains = self.subdomains.union(subdomain_find)
|
self.subdomains = self.subdomains.union(subdomains)
|
||||||
page_num += 1
|
page_num += 1
|
||||||
if page_num > 500:
|
if page_num > 500:
|
||||||
break
|
break
|
||||||
|
|||||||
Reference in New Issue
Block a user