使用多线程重写

This commit is contained in:
shmilylty
2019-10-27 18:21:14 +08:00
parent f30f48aea2
commit 7627b53650
+59 -36
View File
@@ -5,7 +5,8 @@
""" """
import json import json
import asyncio import queue
import threading
from common import utils from common import utils
from common import resolve from common import resolve
@@ -19,48 +20,38 @@ class BruteSRV(Module):
self.domain = self.register(domain) self.domain = self.register(domain)
self.module = 'dnsquery' self.module = 'dnsquery'
self.source = "BruteSRV" self.source = "BruteSRV"
self.resolver = resolve.dns_resolver() self.thread_num = 10
self.names_que = queue.Queue()
self.answers_que = queue.Queue()
async def query(self, name): def gen_names(self):
"""
查询域名的SRV记录
:param str name: SRV记录
:return: 查询结果
"""
logger.log('TRACE', f'尝试查询{name}的SRV记录')
try:
answers = self.resolver.query(name, 'SRV')
except Exception as e:
logger.log('TRACE', e)
logger.log('TRACE', f'查询{name}的SRV记录失败')
return None
else:
logger.log('TRACE', f'查询{name}的SRV记录成功')
return answers
def brute(self):
"""
枚举域名的SRV记录
"""
path = data_storage_path.joinpath('srv_prefixes.json') path = data_storage_path.joinpath('srv_prefixes.json')
with open(path) as file: with open(path) as file:
prefixes = json.load(file) prefixes = json.load(file)
names = map(lambda prefix: prefix + self.domain, prefixes) names = map(lambda prefix: prefix + self.domain, prefixes)
tasks = []
for name in names: for name in names:
tasks.append(self.query(name)) self.names_que.put(name)
loop = asyncio.get_event_loop()
group = asyncio.gather(*tasks) def brute(self):
results = loop.run_until_complete(group) """
for answer in results: 枚举域名的SRV记录
if answer is None: """
continue self.gen_names()
for item in answer:
subdomains = utils.match_subdomain(self.domain, str(item)) for i in range(self.thread_num):
self.subdomains = self.subdomains.union(subdomains) thread = BruteThread(self.names_que, self.answers_que)
if not len(self.subdomains): thread.daemon = True
logger.log('DEBUG', f'没有找到{self.domain}的SRV记录') thread.start()
self.names_que.join()
while not self.answers_que.empty():
answer = self.answers_que.get()
if answer is not None:
for item in answer:
subdomains = utils.match_subdomain(self.domain, str(item))
self.subdomains = self.subdomains.union(subdomains)
def run(self): def run(self):
""" """
@@ -74,6 +65,38 @@ class BruteSRV(Module):
self.save_db() self.save_db()
class BruteThread(threading.Thread):
def __init__(self, names_que, answers_que):
threading.Thread.__init__(self)
self.names_que = names_que
self.answers_que = answers_que
self.resolver = resolve.dns_resolver()
def query(self, name):
"""
查询域名的SRV记录
:param str name: SRV记录
:return: 查询结果
"""
logger.log('TRACE', f'尝试查询{name}的SRV记录')
try:
answer = self.resolver.query(name, 'SRV')
except Exception as exception:
logger.log('TRACE', exception.args)
logger.log('TRACE', f'查询{name}的SRV记录失败')
return None
else:
logger.log('TRACE', f'查询{name}的SRV记录成功')
return answer
def run(self):
while True:
name = self.names_que.get()
answer = self.query(name)
self.answers_que.put(answer)
self.names_que.task_done()
def do(domain): # 统一入口名字 方便多线程调用 def do(domain): # 统一入口名字 方便多线程调用
""" """
类统一调用入口 类统一调用入口