示例#1
0
 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')
示例#2
0
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)