def run(self): print(banner) dt = datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(f'[*] Starting OneForAll @ {dt}\n') logger.log('INFOR', f'开始运行OneForAll') self.domains = utils.get_domains(self.target) if self.domains: for self.domain in self.domains: collect = Collect(self.domain, export=False) collect.run() if self.brute: # 由于爆破会有大量dns解析请求 并发常常会导致其他任务中的网络请求超时 brute = AIOBrute(self.domain) brute.run() table_name = self.domain.replace('.', '_') db_conn = database.connect_db() self.datas = database.get_data(db_conn, table_name).as_dict() loop = asyncio.get_event_loop() asyncio.set_event_loop(loop) self.datas = loop.run_until_complete(resolve.bulk_query_a(self.datas)) self.datas = loop.run_until_complete(request.bulk_get_request(self.datas, self.port)) loop.run_until_complete(asyncio.sleep(0.25)) # 在关闭事件循环前加入一小段延迟让底层连接得到关闭的缓冲时间 loop.close() database.clear_table(db_conn, table_name) database.save_db(db_conn, table_name, self.datas) # 数据库导出 if not self.path: self.path = config.result_save_path.joinpath(f'{self.domain}.{self.format}') dbexport.export(table_name, db_conn, self.valid, self.path, self.format, self.output) db_conn.close() else: logger.log('FATAL', f'获取域名失败') logger.log('INFOR', f'结束运行OneForAll')
def export(table, db=None, valid=None, path=None, format='xlsx', output=False): """ OneForAll数据库导出模块 Example: python dbexport.py --db result.db --table name --format csv --output False python dbexport.py --db result.db --table name --format csv --path= ./result.csv Note: 参数valid可选值1,0,None,分别表示导出有效,无效,全部子域 参数format可选格式:'csv', 'tsv', 'json', 'yaml', 'html', 'xls', 'xlsx', 'dbf', 'latex', 'ods' 参数path为None会根据format参数和域名名称在项目结果目录生成相应文件 :param str table: 要导出的表 :param str db: 要导出的数据库路径(默认为results/result.sqlite3) :param int valid: 导出子域的有效性(默认None) :param str format: 导出格式(默认xlsx) :param str path: 导出路径(默认None) :param bool output: 是否将导出数据输出到终端(默认False) """ db_conn = database.connect_db(db) if valid is None: rows = database.get_data(db_conn, table) elif isinstance(valid, int): rows = database.get_subdomain(db_conn, table, valid) else: rows = database.get_data(db_conn, table) # 意外情况导出全部子域 if output: print(rows.dataset) if not path: path = 'export.' + format logger.log('INFOR', f'正在将数据库中{table}表导出') try: with open(path, 'w') as file: file.write(rows.export(format)) logger.log('INFOR', '成功完成导出') logger.log('INFOR', path) except TypeError: with open(path, 'wb') as file: file.write(rows.export(format)) logger.log('INFOR', '成功完成导出') logger.log('INFOR', path) except Exception as e: logger.log('ERROR', e)