优化代码结构 删除无用队列结果集参数

This commit is contained in:
shmilylty
2019-08-05 18:00:01 +08:00
parent 53213304e2
commit 11642edf6e
50 changed files with 332 additions and 502 deletions
+1 -3
View File
@@ -59,12 +59,10 @@ class Collect(object):
self.get_mod() self.get_mod()
self.import_func() self.import_func()
if not rx_queue:
rx_queue = queue.Queue(maxsize=len(self.collect_func)) # 结果集队列
threads = [] threads = []
# 创建多个子域收集线程 # 创建多个子域收集线程
for collect_func in self.collect_func: for collect_func in self.collect_func:
thread = threading.Thread(target=collect_func, args=(self.domain, rx_queue), daemon=True) thread = threading.Thread(target=collect_func, args=(self.domain,), daemon=True)
threads.append(thread) threads.append(thread)
# 启动所有线程 # 启动所有线程
for thread in threads: for thread in threads:
+11
View File
@@ -37,6 +37,17 @@ class Module(object):
self.end = None self.end = None
self.elapsed = time.time() - self.start # 模块执行耗时 self.elapsed = time.time() - self.start # 模块执行耗时
def check(self, *apis):
"""
简单检查是否配置了api信息
:param apis: api信息元组
:return: 检查结果
"""
if not all(apis):
logger.log('ALERT', f'{self.source}模块API配置有误跳过执行')
return False
return True
def begin(self): def begin(self):
""" """
输出模块开始信息 输出模块开始信息
+8 -11
View File
@@ -1,6 +1,6 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
import config import config
from common.query import Query from common.query import Query
from config import logger from config import logger
@@ -48,34 +48,31 @@ class CensysAPI(Query):
subdomains_find = self.match(self.domain, str(resp.json())) subdomains_find = self.match(self.domain, str(resp.json()))
self.subdomains = self.subdomains.union(subdomains_find) self.subdomains = self.subdomains.union(subdomains_find)
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not (self.id and self.secret): if not self.check(self.id, self.secret):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
self.begin() self.begin()
self.query() self.query()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = CensysAPI(domain) query = CensysAPI(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+7 -13
View File
@@ -1,10 +1,9 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
import config import config
from common.query import Query
from common import utils from common import utils
from config import logger from common.query import Query
class CertDBAPI(Query): class CertDBAPI(Query):
@@ -36,34 +35,29 @@ class CertDBAPI(Query):
if resp_json.get('count') < 30: # 默认每次查询最多返回30条 当前条数小于30条说明已经查完 if resp_json.get('count') < 30: # 默认每次查询最多返回30条 当前条数小于30条说明已经查完
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not self.token: if not self.check(self.token):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
self.begin() self.begin()
self.query() self.query()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = CertDBAPI(domain) query = CertDBAPI(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import time import time
from common import utils from common import utils
@@ -28,7 +27,7 @@ class CertSpotter(Query):
subdomains_find = utils.match_subdomain(self.domain, str(resp.json())) subdomains_find = utils.match_subdomain(self.domain, str(resp.json()))
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -37,21 +36,20 @@ class CertSpotter(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = CertSpotter(domain) query = CertSpotter(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+4 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import time import time
from common import utils from common import utils
@@ -28,7 +27,7 @@ class Crtsh(Query):
subdomains_find = utils.match_subdomain(self.domain, str(resp.json())) subdomains_find = utils.match_subdomain(self.domain, str(resp.json()))
self.subdomains = self.subdomains.union(subdomains_find) self.subdomains = self.subdomains.union(subdomains_find)
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -37,21 +36,18 @@ class Crtsh(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = Crtsh(domain) query = Crtsh(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+4 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import time import time
from common import utils from common import utils
@@ -28,7 +27,7 @@ class Entrust(Query):
subdomains_find = utils.match_subdomain(self.domain, str(resp.json())) subdomains_find = utils.match_subdomain(self.domain, str(resp.json()))
self.subdomains = self.subdomains.union(subdomains_find) self.subdomains = self.subdomains.union(subdomains_find)
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -37,21 +36,18 @@ class Entrust(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = Entrust(domain) query = Entrust(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+4 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import time import time
from common import utils from common import utils
@@ -28,7 +27,7 @@ class Google(Query):
subdomains_find = utils.match_subdomain(self.domain, resp.text) subdomains_find = utils.match_subdomain(self.domain, resp.text)
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -37,21 +36,18 @@ class Google(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = Google(domain) query = Google(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+4 -9
View File
@@ -7,7 +7,6 @@ DNS域传送(DNS zone transfer)指的是一台备用域名服务器使用来自
目的是为了做冗余备份,防止主域名服务器出现故障时 dns 解析不可用。 目的是为了做冗余备份,防止主域名服务器出现故障时 dns 解析不可用。
当主服务器开启DNS域传送同时又对来请求的备用服务器未作访问控制和身份验证便可以利用此漏洞获取某个域的所有记录。 当主服务器开启DNS域传送同时又对来请求的备用服务器未作访问控制和身份验证便可以利用此漏洞获取某个域的所有记录。
""" """
import queue
import dns.resolver import dns.resolver
import dns.zone import dns.zone
@@ -63,7 +62,7 @@ class CheckAXFR(Module):
logger.log('DEBUG', '\n'.join(self.results)) logger.log('DEBUG', '\n'.join(self.results))
self.results = [] self.results = []
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -73,23 +72,19 @@ class CheckAXFR(Module):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
logger.log('DEBUG', f'结束执行{self.source}检查{self.domain}的域传送漏洞') logger.log('DEBUG', f'结束执行{self.source}检查{self.domain}的域传送漏洞')
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
check = CheckAXFR(domain) check = CheckAXFR(domain)
check.run(rx_queue) check.run()
if __name__ == '__main__': if __name__ == '__main__':
# do('ZoneTransfer.me') do('ZoneTransfer.me')
result_queue = queue.Queue()
do('example.com', result_queue)
+5 -9
View File
@@ -2,7 +2,6 @@
""" """
检查crossdomain.xml文件收集子域名 检查crossdomain.xml文件收集子域名
""" """
import queue
from common.module import Module from common.module import Module
from common.utils import match_subdomain from common.utils import match_subdomain
@@ -25,7 +24,6 @@ class CheckCDX(Module):
检查crossdomain.xml收集子域名 检查crossdomain.xml收集子域名
:return: :return:
""" """
url = f'http://{self.domain}/crossdomain.xml'
urls = [f'http://{self.domain}/crossdomain.xml', f'https://{self.domain}/crossdomain.xml', urls = [f'http://{self.domain}/crossdomain.xml', f'https://{self.domain}/crossdomain.xml',
f'http://www.{self.domain}/crossdomain.xml', f'https://www.{self.domain}/crossdomain.xml'] f'http://www.{self.domain}/crossdomain.xml', f'https://www.{self.domain}/crossdomain.xml']
response = None response = None
@@ -39,7 +37,7 @@ class CheckCDX(Module):
return return
self.subdomains = match_subdomain(self.domain, response.text) self.subdomains = match_subdomain(self.domain, response.text)
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -49,21 +47,19 @@ class CheckCDX(Module):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
logger.log('DEBUG', f'结束执行{self.source}检查{self.domain}域的crossdomain.xml') logger.log('DEBUG', f'结束执行{self.source}检查{self.domain}域的crossdomain.xml')
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param domain: 域名 :param domain: 域名
:param rx_queue: 结果集队列
""" """
check = CheckCDX(domain) check = CheckCDX(domain)
check.run(rx_queue) check.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('163.com', result_queue)
+4 -8
View File
@@ -4,7 +4,6 @@
""" """
检查域名证书收集子域名 检查域名证书收集子域名
""" """
import queue
import socket import socket
import ssl import ssl
@@ -36,7 +35,7 @@ class CheckCert(Module):
subdomains_find = utils.match_subdomain(self.domain, str(cert_dict)) subdomains_find = utils.match_subdomain(self.domain, str(cert_dict))
self.subdomains = self.subdomains.union(subdomains_find) self.subdomains = self.subdomains.union(subdomains_find)
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -45,22 +44,19 @@ class CheckCert(Module):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
logger.log('DEBUG', f'结束执行{self.source}检查{self.domain}域的证书中的子域') logger.log('DEBUG', f'结束执行{self.source}检查{self.domain}域的证书中的子域')
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
check = CheckCert(domain) check = CheckCert(domain)
check.run(rx_queue) check.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+6 -10
View File
@@ -2,8 +2,8 @@
""" """
检查内容安全策略收集子域名收集子域名 检查内容安全策略收集子域名收集子域名
""" """
import queue
import requests import requests
from common import utils from common import utils
from common.module import Module from common.module import Module
from config import logger from config import logger
@@ -45,7 +45,7 @@ class CheckCSP(Module):
logger.log('DEBUG', f'{self.domain}域的响应头存在内容安全策略字段') logger.log('DEBUG', f'{self.domain}域的响应头存在内容安全策略字段')
self.subdomains = utils.match_subdomain(self.domain, csp) self.subdomains = utils.match_subdomain(self.domain, csp)
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -54,25 +54,21 @@ class CheckCSP(Module):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
logger.log('DEBUG', f'结束执行{self.source}检查{self.domain}域响应头中的内容安全策略字段') logger.log('DEBUG', f'结束执行{self.source}检查{self.domain}域响应头中的内容安全策略字段')
self.finish() self.finish()
def do(domain, rx_queue, header=None): # 统一入口名字 方便多线程调用 def do(domain, header=None): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
:param dict or None header: 响应头 :param dict or None header: 响应头
""" """
check = CheckCSP(domain, header) check = CheckCSP(domain, header)
check.run(rx_queue) check.run()
if __name__ == '__main__': if __name__ == '__main__':
# resp = requests.get('https://content-security-policy.com/') resp = requests.get('https://content-security-policy.com/')
result_queue = queue.Queue() do('google-analytics.com', resp.headers)
resp = requests.get('https://www.baidu.com/')
do('google-analytics.com', result_queue, resp.headers)
+6 -8
View File
@@ -1,6 +1,6 @@
# coding=utf-8 # coding=utf-8
import queue
import cdx_toolkit import cdx_toolkit
from common.crawl import Crawl from common.crawl import Crawl
from config import logger from config import logger
@@ -31,7 +31,7 @@ class ArchiveCrawl(Crawl):
subdomains_find = self.match(self.register(domain), url + resp.text) subdomains_find = self.match(self.register(domain), url + resp.text)
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -44,23 +44,21 @@ class ArchiveCrawl(Crawl):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
crawl = ArchiveCrawl(domain) crawl = ArchiveCrawl(domain)
crawl.run(rx_queue) crawl.run()
logger.log('INFOR', f'{crawl.source}模块耗时{crawl.elapsed}秒发现{crawl.domain}的子域{len(crawl.subdomains)}') logger.log('INFOR', f'{crawl.source}模块耗时{crawl.elapsed}秒发现{crawl.domain}的子域{len(crawl.subdomains)}')
logger.log('DEBUG', f'{crawl.source}模块发现{crawl.domain}的子域 {crawl.subdomains}') logger.log('DEBUG', f'{crawl.source}模块发现{crawl.domain}的子域 {crawl.subdomains}')
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+5 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import cdx_toolkit import cdx_toolkit
from tqdm import tqdm from tqdm import tqdm
@@ -33,7 +32,7 @@ class CommonCrawl(Crawl):
subdomains_find = self.match(self.register(domain), resp.text) subdomains_find = self.match(self.register(domain), resp.text)
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -46,23 +45,21 @@ class CommonCrawl(Crawl):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
crawl = CommonCrawl(domain) crawl = CommonCrawl(domain)
crawl.run(rx_queue) crawl.run()
logger.log('INFOR', f'{crawl.source}模块耗时{crawl.elapsed}秒发现{crawl.domain}的子域{len(crawl.subdomains)}') logger.log('INFOR', f'{crawl.source}模块耗时{crawl.elapsed}秒发现{crawl.domain}的子域{len(crawl.subdomains)}')
logger.log('DEBUG', f'{crawl.source}模块发现{crawl.domain}的子域 {crawl.subdomains}') logger.log('DEBUG', f'{crawl.source}模块发现{crawl.domain}的子域 {crawl.subdomains}')
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+7 -12
View File
@@ -1,9 +1,8 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
import config import config
from common.query import Query from common.query import Query
from config import logger
class BinaryEdgeAPI(Query): class BinaryEdgeAPI(Query):
@@ -30,34 +29,30 @@ class BinaryEdgeAPI(Query):
subdomains_find = self.match(self.domain, str(resp.json())) subdomains_find = self.match(self.domain, str(resp.json()))
self.subdomains = self.subdomains.union(subdomains_find) self.subdomains = self.subdomains.union(subdomains_find)
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not self.api: if not self.check(self.api):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
self.begin() self.begin()
self.query() self.query()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = BinaryEdgeAPI(domain) query = BinaryEdgeAPI(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+7 -8
View File
@@ -1,6 +1,6 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
from common.query import Query from common.query import Query
@@ -26,7 +26,7 @@ class BufferOver(Query):
subdomains_find = self.match(self.domain, resp.text) subdomains_find = self.match(self.domain, resp.text)
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -35,21 +35,20 @@ class BufferOver(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = BufferOver(domain) query = BufferOver(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+5 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import time import time
from common.query import Query from common.query import Query
@@ -27,7 +26,7 @@ class Chinaz(Query):
subdomains_find = self.match(self.domain, resp.text) subdomains_find = self.match(self.domain, resp.text)
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -36,21 +35,19 @@ class Chinaz(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = Chinaz(domain) query = Chinaz(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+7 -12
View File
@@ -1,9 +1,8 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
import config import config
from common.query import Query from common.query import Query
from config import logger
class ChinazAPI(Query): class ChinazAPI(Query):
@@ -29,34 +28,30 @@ class ChinazAPI(Query):
subdomains_find = self.match(self.domain, str(resp.json())) subdomains_find = self.match(self.domain, str(resp.json()))
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not self.api: if not self.check(self.api):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
self.begin() self.begin()
self.query() self.query()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = ChinazAPI(domain) query = ChinazAPI(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+8 -9
View File
@@ -1,6 +1,6 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
import config import config
from common.query import Query from common.query import Query
@@ -28,31 +28,30 @@ class CirclAPI(Query):
subdomains_find = self.match(self.domain, str(resp.json())) subdomains_find = self.match(self.domain, str(resp.json()))
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not self.check(self.user, self.pwd):
return
self.begin() self.begin()
if self.user and self.pwd:
self.query() self.query()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = CirclAPI(domain) query = CirclAPI(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+6 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import random import random
import time import time
@@ -43,7 +42,7 @@ class DNSdb(Query):
subdomains_find = self.match(self.domain, resp.text) subdomains_find = self.match(self.domain, resp.text)
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -52,21 +51,20 @@ class DNSdb(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = DNSdb(domain) query = DNSdb(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+9 -13
View File
@@ -1,10 +1,9 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
import config import config
from common.query import Query
from common import utils from common import utils
from config import logger from common.query import Query
class DNSdbAPI(Query): class DNSdbAPI(Query):
@@ -32,34 +31,31 @@ class DNSdbAPI(Query):
subdomains_find = utils.match_subdomain(self.domain, resp.text) subdomains_find = utils.match_subdomain(self.domain, resp.text)
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not self.api: if not self.check(self.api):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
self.begin() self.begin()
self.query() self.query()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = DNSdbAPI(domain) query = DNSdbAPI(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+6 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import time import time
from common import utils from common import utils
@@ -38,7 +37,7 @@ class DNSdumpster(Query):
if subdomains_find: if subdomains_find:
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -47,21 +46,20 @@ class DNSdumpster(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = DNSdumpster(domain) query = DNSdumpster(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+6 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
from common import utils from common import utils
from common.query import Query from common.query import Query
@@ -28,7 +27,7 @@ class HackerTarget(Query):
if subdomains_find: if subdomains_find:
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -37,21 +36,20 @@ class HackerTarget(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = HackerTarget(domain) query = HackerTarget(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+6 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import config import config
from common.query import Query from common.query import Query
@@ -40,7 +39,7 @@ class IPv4InfoAPI(Query):
if page >= 50: # ipv4info子域查询接口最多允许查询50页 if page >= 50: # ipv4info子域查询接口最多允许查询50页
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -49,21 +48,20 @@ class IPv4InfoAPI(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = IPv4InfoAPI(domain) query = IPv4InfoAPI(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+6 -8
View File
@@ -1,6 +1,5 @@
# coding=utf-8 # coding=utf-8
import hashlib import hashlib
import queue
import re import re
import time import time
from urllib import parse from urllib import parse
@@ -52,7 +51,7 @@ class NetCraft(Query):
last = re.search(r'&last=.*' + self.domain, resp.text).group(0) last = re.search(r'&last=.*' + self.domain, resp.text).group(0)
self.page_num += self.per_page_num self.page_num += self.per_page_num
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -61,21 +60,20 @@ class NetCraft(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = NetCraft(domain) query = NetCraft(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+5 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import random import random
from common import utils from common import utils
@@ -30,7 +29,7 @@ class PTRArchive(Query):
if subdomains_find: if subdomains_find:
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -39,21 +38,19 @@ class PTRArchive(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = PTRArchive(domain) query = PTRArchive(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+5 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import time import time
from common.query import Query from common.query import Query
@@ -27,7 +26,7 @@ class Riddler(Query):
subdomains_find = self.match(self.domain, resp.text) subdomains_find = self.match(self.domain, resp.text)
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -36,21 +35,19 @@ class Riddler(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = Riddler(domain) query = Riddler(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+5 -8
View File
@@ -1,6 +1,5 @@
# coding=utf-8 # coding=utf-8
import json import json
import queue
import time import time
from common.query import Query from common.query import Query
@@ -38,7 +37,7 @@ class Robtex(Query):
if subdomains_find: if subdomains_find:
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -47,21 +46,19 @@ class Robtex(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = Robtex(domain) query = Robtex(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
@@ -1,9 +1,8 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
import config import config
from common.query import Query from common.query import Query
from config import logger
class SecurityTrailsAPI(Query): class SecurityTrailsAPI(Query):
@@ -33,34 +32,31 @@ class SecurityTrailsAPI(Query):
if subdomains_find: if subdomains_find:
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not self.api: if not self.check(self.api):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
self.begin() self.begin()
self.query() self.query()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = SecurityTrailsAPI(domain) query = SecurityTrailsAPI(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+5 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import time import time
from common.query import Query from common.query import Query
@@ -36,7 +35,7 @@ class SiteDossier(Query):
break break
self.page_num += self.per_page_num self.page_num += self.per_page_num
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -45,21 +44,19 @@ class SiteDossier(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = SiteDossier(domain) query = SiteDossier(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+6 -8
View File
@@ -7,7 +7,6 @@
import asyncio import asyncio
import json import json
import queue
import aiodns import aiodns
@@ -70,7 +69,7 @@ class BruteSRV(Module):
if not len(self.subdomains): if not len(self.subdomains):
logger.log('DEBUG', f'没有找到{self.domain}的SRV记录') logger.log('DEBUG', f'没有找到{self.domain}的SRV记录')
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -80,21 +79,20 @@ class BruteSRV(Module):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
logger.log('DEBUG', f'结束枚举{self.domain}域的SRV记录') logger.log('DEBUG', f'结束枚举{self.domain}域的SRV记录')
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
brute = BruteSRV(domain) brute = BruteSRV(domain)
brute.run(rx_queue) brute.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+9 -14
View File
@@ -1,9 +1,7 @@
# coding=utf-8 # coding=utf-8
import queue
import config import config
from common.query import Query from common.query import Query
from config import logger
class RiskIQ(Query): class RiskIQ(Query):
@@ -13,7 +11,7 @@ class RiskIQ(Query):
self.module = 'Intelligence' self.module = 'Intelligence'
self.source = 'RiskIQQuery' self.source = 'RiskIQQuery'
self.addr = 'https://api.passivetotal.org/v2/enrichment/subdomains' self.addr = 'https://api.passivetotal.org/v2/enrichment/subdomains'
self.username = config.riskiq_api_username self.user = config.riskiq_api_username
self.key = config.riskiq_api_key self.key = config.riskiq_api_key
def query(self): def query(self):
@@ -23,7 +21,7 @@ class RiskIQ(Query):
self.header = self.get_header() self.header = self.get_header()
self.proxy = self.get_proxy(self.source) self.proxy = self.get_proxy(self.source)
params = {'query': self.domain} params = {'query': self.domain}
resp = self.get(url=self.addr, params=params, auth=(self.username, self.key)) resp = self.get(url=self.addr, params=params, auth=(self.user, self.key))
if not resp: if not resp:
return return
resp_json = resp.json() resp_json = resp.json()
@@ -31,34 +29,31 @@ class RiskIQ(Query):
if subdomains_find: if subdomains_find:
self.subdomains = set(map(lambda x: x + '.' + self.domain, subdomains_find)) self.subdomains = set(map(lambda x: x + '.' + self.domain, subdomains_find))
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not self.username or not self.key: if not self.check(self.user, self.key):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
self.begin() self.begin()
self.query() self.query()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = RiskIQ(domain) query = RiskIQ(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import time import time
from common.query import Query from common.query import Query
@@ -27,7 +26,7 @@ class ThreatMiner(Query):
subdomains_find = self.match(self.domain, resp.text) subdomains_find = self.match(self.domain, resp.text)
self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果 self.subdomains = self.subdomains.union(subdomains_find) # 合并搜索子域名搜索结果
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -36,21 +35,19 @@ class ThreatMiner(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = ThreatMiner(domain) query = ThreatMiner(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+6 -8
View File
@@ -1,5 +1,4 @@
# coding=utf-8 # coding=utf-8
import queue
import time import time
from common.query import Query from common.query import Query
@@ -50,7 +49,7 @@ class VirusTotal(Query):
else: else:
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
@@ -59,21 +58,20 @@ class VirusTotal(Query):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = VirusTotal(domain) query = VirusTotal(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
@@ -1,9 +1,7 @@
# coding=utf-8 # coding=utf-8
import queue
import config import config
from common.query import Query from common.query import Query
from config import logger
class VirusTotalAPI(Query): class VirusTotalAPI(Query):
@@ -29,34 +27,31 @@ class VirusTotalAPI(Query):
subdomain_find = set(resp_json.get('subdomains')) subdomain_find = set(resp_json.get('subdomains'))
self.subdomains = self.subdomains.union(subdomain_find) self.subdomains = self.subdomains.union(subdomain_find)
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not self.key: if not self.check(self.key):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
self.begin() self.begin()
self.query(self.domain) self.query(self.domain)
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
self.finish() self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
query = VirusTotalAPI(domain) query = VirusTotalAPI(domain)
query.run(rx_queue) query.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+7 -14
View File
@@ -1,8 +1,7 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
from common.search import Search from common.search import Search
from config import logger
class Ask(Search): class Ask(Search):
@@ -44,14 +43,12 @@ class Ask(Search):
if '>Next<' not in resp.text: if '>Next<' not in resp.text:
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
# 排除同一子域搜索结果过多的子域以发现新的子域 # 排除同一子域搜索结果过多的子域以发现新的子域
for statement in self.filter(self.domain, self.subdomains): for statement in self.filter(self.domain, self.subdomains):
self.search(self.domain, filtered_subdomain=statement) self.search(self.domain, filtered_subdomain=statement)
@@ -62,25 +59,21 @@ class Ask(Search):
for subdomain in self.subdomains: for subdomain in self.subdomains:
if subdomain.count('.') - self.domain.count('.') == layer_num: # 进行下一层子域搜索的限制条件 if subdomain.count('.') - self.domain.count('.') == layer_num: # 进行下一层子域搜索的限制条件
self.search(subdomain) self.search(subdomain)
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = Ask(domain) search = Ask(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+9 -12
View File
@@ -1,9 +1,9 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
from common.search import Search
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from config import logger
from common.search import Search
class Baidu(Search): class Baidu(Search):
@@ -65,11 +65,11 @@ class Baidu(Search):
if self.page_num >= self.limit_num: # 搜索条数限制 if self.page_num >= self.limit_num: # 搜索条数限制
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
@@ -87,21 +87,18 @@ class Baidu(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = Baidu(domain) search = Baidu(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+8 -11
View File
@@ -1,8 +1,7 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
from common.search import Search from common.search import Search
from config import logger
class Bing(Search): class Bing(Search):
@@ -51,11 +50,11 @@ class Bing(Search):
if self.page_num >= self.limit_num: # 搜索条数限制 if self.page_num >= self.limit_num: # 搜索条数限制
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
@@ -73,21 +72,19 @@ class Bing(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域') self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = Bing(domain) search = Bing(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+8 -15
View File
@@ -1,9 +1,8 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
import config import config
from common.search import Search from common.search import Search
from config import logger
class BingAPI(Search): class BingAPI(Search):
@@ -49,16 +48,13 @@ class BingAPI(Search):
if self.page_num >= self.limit_num: # 搜索条数限制 if self.page_num >= self.limit_num: # 搜索条数限制
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not (self.id and self.key): if not self.check(self.id, self.key):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
# 排除同一子域搜索结果过多的子域以发现新的子域 # 排除同一子域搜索结果过多的子域以发现新的子域
@@ -75,21 +71,18 @@ class BingAPI(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = BingAPI(domain) search = BingAPI(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+8 -10
View File
@@ -1,7 +1,7 @@
# coding=utf-8 # coding=utf-8
import re import re
import time import time
import queue
from common.search import Search from common.search import Search
from config import logger from config import logger
@@ -47,11 +47,11 @@ class DuckDuckGO(Search):
break break
data.update({'s': s, 'nextParams': '', 'o': 'json', 'dc': dc, 'api': '/d.js'}) data.update({'s': s, 'nextParams': '', 'o': 'json', 'dc': dc, 'api': '/d.js'})
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
@@ -69,22 +69,20 @@ class DuckDuckGO(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
# return # 暂时还有点问题 # return # 暂时还有点问题
search = DuckDuckGO(domain) search = DuckDuckGO(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue()
do('example.com', result_queue) do('example.com')
+9 -12
View File
@@ -1,9 +1,8 @@
# coding=utf-8 # coding=utf-8
import time
import queue
import random import random
import time
from common.search import Search from common.search import Search
from config import logger
class Exalead(Search): class Exalead(Search):
@@ -47,11 +46,11 @@ class Exalead(Search):
if 'title="Go to the next page"' not in resp.text: if 'title="Go to the next page"' not in resp.text:
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
@@ -70,21 +69,19 @@ class Exalead(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域') self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = Exalead(domain) search = Exalead(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+8 -13
View File
@@ -1,6 +1,5 @@
# coding=utf-8 # coding=utf-8
import base64 import base64
import queue
import time import time
import config import config
@@ -37,34 +36,30 @@ class FoFa(Search):
self.subdomains = self.subdomains.union(subdomain_find) self.subdomains = self.subdomains.union(subdomain_find)
self.page_num += 1 self.page_num += 1
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not self.email or not self.key:
logger.log('ERROR', f'{self.source}模块API配置错误') if not self.check(self.email, self.key):
logger.log('ALERT', f'不执行{self.source}模块')
return return
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search() self.search()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = FoFa(domain) search = FoFa(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+8 -12
View File
@@ -1,9 +1,8 @@
# coding=utf-8 # coding=utf-8
import time
import queue
import random import random
import time
from common.search import Search from common.search import Search
from config import logger
class Google(Search): class Google(Search):
@@ -56,11 +55,11 @@ class Google(Search):
if '302 Moved' in resp.text: if '302 Moved' in resp.text:
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
@@ -78,21 +77,18 @@ class Google(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = Google(domain) search = Google(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+8 -15
View File
@@ -1,9 +1,8 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
import config import config
from common.search import Search from common.search import Search
from config import logger
class GoogleAPI(Search): class GoogleAPI(Search):
@@ -48,16 +47,13 @@ class GoogleAPI(Search):
if self.page_num > 100: # 免费的API只能查询前100条结果 if self.page_num > 100: # 免费的API只能查询前100条结果
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not (self.cx and self.key): if not self.check(self.cx, self.key):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
# 排除同一子域搜索结果过多的子域以发现新的子域 # 排除同一子域搜索结果过多的子域以发现新的子域
@@ -74,21 +70,18 @@ class GoogleAPI(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = GoogleAPI(domain) search = GoogleAPI(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+7 -16
View File
@@ -1,10 +1,8 @@
# coding=utf-8 # coding=utf-8
import queue
import config import config
# from shodan import Shodan # from shodan import Shodan
from common.search import Search from common.search import Search
from config import logger
class ShodanAPI(Search): class ShodanAPI(Search):
@@ -34,36 +32,29 @@ class ShodanAPI(Search):
self.subdomains = self.subdomains.union(subdomain_find) self.subdomains = self.subdomains.union(subdomain_find)
page += 1 page += 1
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not self.key: if not self.check(self.key):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search() self.search()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = ShodanAPI(domain) search = ShodanAPI(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
results = queue.Queue() do('example.com')
do('qq.com', results)
+7 -11
View File
@@ -1,8 +1,7 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
from common.search import Search from common.search import Search
from config import logger
class So(Search): class So(Search):
@@ -46,11 +45,11 @@ class So(Search):
if self.page_num * self.per_page_num >= self.limit_num: # 搜索条数限制 if self.page_num * self.per_page_num >= self.limit_num: # 搜索条数限制
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
@@ -68,21 +67,18 @@ class So(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = So(domain) search = So(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+6 -11
View File
@@ -1,8 +1,6 @@
# coding=utf-8 # coding=utf-8
import queue
from common.search import Search from common.search import Search
from config import logger
class Sogou(Search): class Sogou(Search):
@@ -44,11 +42,11 @@ class Sogou(Search):
if self.page_num * self.per_page_num >= self.limit_num: # 搜索条数限制 if self.page_num * self.per_page_num >= self.limit_num: # 搜索条数限制
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
@@ -66,21 +64,18 @@ class Sogou(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = Sogou(domain) search = Sogou(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+8 -11
View File
@@ -1,8 +1,7 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
from common.search import Search from common.search import Search
from config import logger
class Yahoo(Search): class Yahoo(Search):
@@ -52,11 +51,11 @@ class Yahoo(Search):
if self.page_num >= self.limit_num: # 搜索条数限制 if self.page_num >= self.limit_num: # 搜索条数限制
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
@@ -74,21 +73,19 @@ class Yahoo(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results)
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域') self.finish()
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = Yahoo(domain) search = Yahoo(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+11 -12
View File
@@ -1,8 +1,7 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
from common.search import Search from common.search import Search
from config import logger
class Yandex(Search): class Yandex(Search):
@@ -25,7 +24,10 @@ class Yandex(Search):
:param bool full_search: 全量搜索 :param bool full_search: 全量搜索
""" """
self.page_num = 0 # 二次搜索重新置0 self.page_num = 0 # 二次搜索重新置0
self.cookie = self.get(self.init).cookies # 获取cookie bing在搜索时需要带上cookie resp = self.get(self.init)
if not resp:
return
self.cookie = resp.cookies # 获取cookie
while True: while True:
time.sleep(self.delay) time.sleep(self.delay)
self.header = self.get_header() self.header = self.get_header()
@@ -48,11 +50,11 @@ class Yandex(Search):
if self.page_num >= self.limit_num: # 搜索条数限制 if self.page_num >= self.limit_num: # 搜索条数限制
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search(self.domain, full_search=True) self.search(self.domain, full_search=True)
@@ -70,21 +72,18 @@ class Yandex(Search):
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = Yandex(domain) search = Yandex(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)
+7 -16
View File
@@ -1,6 +1,5 @@
# coding=utf-8 # coding=utf-8
import time import time
import queue
import config import config
from common.search import Search from common.search import Search
from config import logger from config import logger
@@ -20,7 +19,6 @@ class ZoomEyeAPI(Search):
def login(self): def login(self):
""" """
登陆获取查询taken 登陆获取查询taken
:return:
""" """
url = 'https://api.zoomeye.org/user/login' url = 'https://api.zoomeye.org/user/login'
data = {'username': self.user, 'password': self.pwd} data = {'username': self.user, 'password': self.pwd}
@@ -59,36 +57,29 @@ class ZoomEyeAPI(Search):
if resp.status_code == 403: if resp.status_code == 403:
break break
def run(self, rx_queue): def run(self):
""" """
类执行入口 类执行入口
""" """
if not (self.user and self.pwd): if not self.check(self.user, self.pwd):
logger.log('ERROR', f'{self.source}模块API配置错误')
logger.log('ALERT', f'不执行{self.source}模块')
return return
logger.log('DEBUG', f'开始执行{self.source}模块搜索{self.domain}的子域') self.begin()
self.search() self.search()
self.save_json() self.save_json()
self.gen_result() self.gen_result()
self.save_db() self.save_db()
rx_queue.put(self.results) self.finish()
logger.log('DEBUG', f'结束执行{self.source}模块搜索{self.domain}的子域')
def do(domain, rx_queue): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口
:param str domain: 域名 :param str domain: 域名
:param rx_queue: 结果集队列
""" """
search = ZoomEyeAPI(domain) search = ZoomEyeAPI(domain)
search.run(rx_queue) search.run()
if __name__ == '__main__': if __name__ == '__main__':
result_queue = queue.Queue() do('example.com')
do('example.com', result_queue)