diff --git a/oneforall/config.py b/oneforall/config.py index d5763f4..8c63da3 100644 --- a/oneforall/config.py +++ b/oneforall/config.py @@ -27,7 +27,8 @@ enable_partial_module = [] # 启用部分模块 必须禁用enable_all_module # 爆破模块设置 enable_brute_module = False # 使用爆破模块(默认禁用) -enable_verify_subdomain = True # 验证子域有效性(默认True) +enable_dns_resolve = True # DNS解析子域(默认True) +enable_http_request = True # HTTP请求子域(默认True) enable_wildcard_check = True # 开启泛解析检测 会去掉泛解析的子域 # 爆破时使用的进程数(根据系统中CPU数量情况设置 不宜大于CPU数量 默认为系统中的CPU数量) brute_process_num = os.cpu_count() diff --git a/oneforall/oneforall.py b/oneforall/oneforall.py index 8ce4bf5..23bdefc 100644 --- a/oneforall/oneforall.py +++ b/oneforall/oneforall.py @@ -52,44 +52,42 @@ class OneForAll(object): python3 oneforall.py --target example.com --brute True run python3 oneforall.py --target example.com --port medium run python3 oneforall.py --target example.com --format csv run - python3 oneforall.py --target example.com --verify False run + python3 oneforall.py --target example.com --dns False run + python3 oneforall.py --target example.com --req False run python3 oneforall.py --target example.com --takeover False run python3 oneforall.py --target example.com --show True run Note: 参数valid可选值1,0,None分别表示导出有效,无效,全部子域 - 参数verify为True会尝试解析和请求子域并根据结果给子域有效性打上标签 参数port可选值有'default', 'small', 'medium', 'large', 详见config.py配置 参数format可选格式有'txt', 'rst', 'csv', 'tsv', 'json', 'yaml', 'html', 'jira', 'xls', 'xlsx', 'dbf', 'latex', 'ods' :param str target: 单个域名或者每行一个域名的文件路径(必需参数) :param bool brute: 使用爆破模块(默认False) - :param bool verify: 验证子域有效性(默认True) + :param bool dns: DNS解析子域(默认True) + :param bool req: HTTP请求子域(默认True) :param str port: 请求验证子域的端口范围(默认只探测80端口) :param int valid: 导出子域的有效性(默认1) :param str format: 导出格式(默认csv) :param bool show: 终端显示导出数据(默认False) """ - def __init__(self, target, brute=None, verify=None, port='default', + def __init__(self, target, brute=None, dns=None, req=None, port='default', valid=1, format='csv', takeover=True, show=False): self.target = target self.port = port self.domains = set() self.domain = str() self.data = list() - self.brute = brute - self.verify = verify + self.brute = brute or config.enable_brute_module + self.dns = dns or config.enable_dns_resolve + self.req = req or config.enable_http_request self.takeover = takeover self.valid = valid self.format = format self.show = show def main(self): - if self.brute is None: - self.brute = config.enable_brute_module - if self.verify is None: - self.verify = config.enable_verify_subdomain old_table = self.domain + '_last' new_table = self.domain + '_now' collect = Collect(self.domain, export=False) @@ -111,16 +109,17 @@ class OneForAll(object): db.rename_table(new_table, old_table) # 新表重命名为旧表 old_data = db.get_data(old_table).as_dict() - # 不验证子域的情况 - if not self.verify: + # 不解析子域直接导出结果 + if not self.dns: # 数据库导出 self.valid = None dbexport.export(self.domain, valid=self.valid, format=self.format, show=self.show) db.drop_table(new_table) db.rename_table(self.domain, new_table) + db.close() return - # 开始验证子域工作 + self.data = db.get_data(self.domain).as_dict() # 标记新发现子域 @@ -129,7 +128,7 @@ class OneForAll(object): loop = asyncio.get_event_loop() asyncio.set_event_loop(loop) - # 解析域名地址 + # 解析子域 task = resolve.bulk_query_a(self.data) self.data = loop.run_until_complete(task) @@ -139,14 +138,26 @@ class OneForAll(object): db.create_table(resolve_table) db.save_db(resolve_table, self.data, 'resolve') - # 请求域名地址 + # 不请求子域直接导出结果 + if not self.req: + # 数据库导出 + self.valid = None + dbexport.export(self.domain, valid=self.valid, + format=self.format, show=self.show) + db.drop_table(new_table) + db.rename_table(self.domain, new_table) + db.close() + return + + # 请求子域 task = request.bulk_get_request(self.data, self.port) self.data = loop.run_until_complete(task) # 在关闭事件循环前加入一小段延迟让底层连接得到关闭的缓冲时间 loop.run_until_complete(asyncio.sleep(0.25)) + # 保存请求结果 db.clear_table(self.domain) - db.save_db(self.domain, self.data) + db.save_db(self.domain, self.data, 'request') # 数据库导出 dbexport.export(self.domain, valid=self.valid, @@ -154,8 +165,8 @@ class OneForAll(object): db.drop_table(new_table) db.rename_table(self.domain, new_table) db.close() - # 子域接管检查 + # 子域接管检查 if self.takeover: subdomains = set(map(lambda x: x.get('subdomain'), self.data)) takeover = Takeover(subdomains)