mirror of
https://github.com/shmilylty/OneForAll.git
synced 2026-08-26 12:57:50 +08:00
使用多线程重写
This commit is contained in:
@@ -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): # 统一入口名字 方便多线程调用
|
||||||
"""
|
"""
|
||||||
类统一调用入口
|
类统一调用入口
|
||||||
|
|||||||
Reference in New Issue
Block a user