mirror of
https://github.com/shmilylty/OneForAll.git
synced 2026-08-25 20:37:48 +08:00
优化导出
This commit is contained in:
@@ -18,7 +18,7 @@ import tenacity
|
|||||||
from dns.exception import Timeout
|
from dns.exception import Timeout
|
||||||
from dns.resolver import NXDOMAIN, YXDOMAIN, NoAnswer, NoNameservers
|
from dns.resolver import NXDOMAIN, YXDOMAIN, NoAnswer, NoNameservers
|
||||||
|
|
||||||
import dbexport
|
import export
|
||||||
from common import utils
|
from common import utils
|
||||||
from common import similarity
|
from common import similarity
|
||||||
from config import settings
|
from config import settings
|
||||||
@@ -517,7 +517,7 @@ def is_valid_subdomain(ip, ttl, times, wc_ips, wc_ttl, cname):
|
|||||||
|
|
||||||
def save_brute_dict(dict_path, dict_set):
|
def save_brute_dict(dict_path, dict_set):
|
||||||
dict_data = '\n'.join(dict_set)
|
dict_data = '\n'.join(dict_set)
|
||||||
if not utils.save_data(dict_path, dict_data):
|
if not utils.save_to_file(dict_path, dict_data):
|
||||||
logger.log('FATAL', 'Saving dictionary error')
|
logger.log('FATAL', 'Saving dictionary error')
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
@@ -758,8 +758,7 @@ class Brute(Module):
|
|||||||
self.path = settings.result_save_dir.joinpath(name)
|
self.path = settings.result_save_dir.joinpath(name)
|
||||||
# 数据库导出
|
# 数据库导出
|
||||||
if self.export:
|
if self.export:
|
||||||
dbexport.export(self.domain,
|
export.export_data(self.domain,
|
||||||
type='table',
|
|
||||||
alive=self.alive,
|
alive=self.alive,
|
||||||
limit='resolve',
|
limit='resolve',
|
||||||
path=self.path,
|
path=self.path,
|
||||||
|
|||||||
+2
-2
@@ -58,13 +58,13 @@ def save_db(name, data):
|
|||||||
:param list data: data to be saved
|
:param list data: data to be saved
|
||||||
"""
|
"""
|
||||||
logger.log('INFOR', f'Saving resolved results')
|
logger.log('INFOR', f'Saving resolved results')
|
||||||
utils.save_db(name, data, 'resolve')
|
utils.save_to_db(name, data, 'resolve')
|
||||||
|
|
||||||
|
|
||||||
def save_subdomains(save_path, subdomain_list):
|
def save_subdomains(save_path, subdomain_list):
|
||||||
logger.log('DEBUG', f'Saving resolved subdomain')
|
logger.log('DEBUG', f'Saving resolved subdomain')
|
||||||
subdomain_data = '\n'.join(subdomain_list)
|
subdomain_data = '\n'.join(subdomain_list)
|
||||||
if not utils.save_data(save_path, subdomain_data):
|
if not utils.save_to_file(save_path, subdomain_data):
|
||||||
logger.log('FATAL', 'Save resolved subdomain error')
|
logger.log('FATAL', 'Save resolved subdomain error')
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
|||||||
+5
-21
@@ -163,7 +163,6 @@ def get_domains(target, targets=None):
|
|||||||
domains = list(target_domains.union(targets_domains))
|
domains = list(target_domains.union(targets_domains))
|
||||||
if targets_domains:
|
if targets_domains:
|
||||||
domains = sorted(domains, key=targets_domains.index) # 按照targets原本的index排序
|
domains = sorted(domains, key=targets_domains.index) # 按照targets原本的index排序
|
||||||
logger.log('INFOR', f'Get {len(domains)} domains')
|
|
||||||
if not domains:
|
if not domains:
|
||||||
logger.log('ERROR', f'Did not get a valid domain name')
|
logger.log('ERROR', f'Did not get a valid domain name')
|
||||||
logger.log('DEBUG', f'The obtained domains \n{domains}')
|
logger.log('DEBUG', f'The obtained domains \n{domains}')
|
||||||
@@ -225,7 +224,7 @@ def load_json(path):
|
|||||||
return json.load(fp)
|
return json.load(fp)
|
||||||
|
|
||||||
|
|
||||||
def save_db(name, data, module):
|
def save_to_db(name, data, module):
|
||||||
"""
|
"""
|
||||||
Save request results to database
|
Save request results to database
|
||||||
|
|
||||||
@@ -240,7 +239,7 @@ def save_db(name, data, module):
|
|||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
def save_data(path, data):
|
def save_to_file(path, data):
|
||||||
"""
|
"""
|
||||||
保存数据到文件
|
保存数据到文件
|
||||||
|
|
||||||
@@ -261,21 +260,6 @@ def save_data(path, data):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def remove_data(path):
|
|
||||||
"""
|
|
||||||
删除保存数据的文件
|
|
||||||
|
|
||||||
:param path: 路径
|
|
||||||
:return: 删除成功与否
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
path.unlink()
|
|
||||||
except Exception as e:
|
|
||||||
logger.log('ERROR', e.args)
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def check_response(method, resp):
|
def check_response(method, resp):
|
||||||
"""
|
"""
|
||||||
检查响应 输出非正常响应返回json的信息
|
检查响应 输出非正常响应返回json的信息
|
||||||
@@ -346,7 +330,7 @@ def export_all_results(path, name, fmt, datas):
|
|||||||
row_list.append(Record(keys, values))
|
row_list.append(Record(keys, values))
|
||||||
rows = RecordCollection(iter(row_list))
|
rows = RecordCollection(iter(row_list))
|
||||||
content = rows.export(fmt)
|
content = rows.export(fmt)
|
||||||
save_data(path, content)
|
save_to_file(path, content)
|
||||||
|
|
||||||
|
|
||||||
def export_all_subdomains(alive, path, name, datas):
|
def export_all_subdomains(alive, path, name, datas):
|
||||||
@@ -362,7 +346,7 @@ def export_all_subdomains(alive, path, name, datas):
|
|||||||
else:
|
else:
|
||||||
subdomains.add(subdomain)
|
subdomains.add(subdomain)
|
||||||
data = '\n'.join(subdomains)
|
data = '\n'.join(subdomains)
|
||||||
save_data(path, data)
|
save_to_file(path, data)
|
||||||
|
|
||||||
|
|
||||||
def export_all(alive, fmt, path, datas):
|
def export_all(alive, fmt, path, datas):
|
||||||
@@ -796,5 +780,5 @@ def get_ns_path(in_china=None, enable_wildcard=None, ns_ip_list=None):
|
|||||||
return path
|
return path
|
||||||
path = settings.authoritative_dns_path
|
path = settings.authoritative_dns_path
|
||||||
ns_data = '\n'.join(ns_ip_list)
|
ns_data = '\n'.join(ns_ip_list)
|
||||||
save_data(path, ns_data)
|
save_to_file(path, ns_data)
|
||||||
return path
|
return path
|
||||||
|
|||||||
-81
@@ -1,81 +0,0 @@
|
|||||||
#!/usr/bin/python3
|
|
||||||
# coding=utf-8
|
|
||||||
|
|
||||||
"""
|
|
||||||
OneForAll export from database module
|
|
||||||
|
|
||||||
:copyright: Copyright (c) 2019, Jing Ling. All rights reserved.
|
|
||||||
:license: GNU General Public License v3.0, see LICENSE for more details.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import fire
|
|
||||||
|
|
||||||
from common import utils
|
|
||||||
from common.database import Database
|
|
||||||
from config.log import logger
|
|
||||||
|
|
||||||
|
|
||||||
def export(target, type='target', db=None, alive=False, limit=None, path=None, fmt='csv', show=False):
|
|
||||||
"""
|
|
||||||
OneForAll export from database module
|
|
||||||
|
|
||||||
Example:
|
|
||||||
python3 dbexport.py --target name --fmt csv --dir= ./result.csv
|
|
||||||
python3 dbexport.py --db result.db --target name --show False
|
|
||||||
python3 dbexport.py --target table_name --tb True --show False
|
|
||||||
|
|
||||||
Note:
|
|
||||||
--fmt csv/json (result format)
|
|
||||||
--path Result directory (default directory is ./results)
|
|
||||||
|
|
||||||
:param str target: Table to be exported
|
|
||||||
:param str type: Type of target
|
|
||||||
:param str db: Database path to be exported (default ./results/result.sqlite3)
|
|
||||||
:param bool alive: Only export the results of alive subdomains (default False)
|
|
||||||
:param str limit: Export limit (default None)
|
|
||||||
:param str fmt: Result format (default csv)
|
|
||||||
:param str path: Result directory (default None)
|
|
||||||
:param bool show: Displays the exported data in terminal (default False)
|
|
||||||
"""
|
|
||||||
|
|
||||||
if type == 'target':
|
|
||||||
database = Database(db)
|
|
||||||
domains = utils.get_domains(target)
|
|
||||||
datas = []
|
|
||||||
if domains:
|
|
||||||
for domain in domains:
|
|
||||||
table_name = domain_to_table(domain)
|
|
||||||
rows = database.export_data(table_name, alive, limit)
|
|
||||||
if rows is None:
|
|
||||||
continue
|
|
||||||
data = export_data(fmt, path, rows, show, table_name, target)
|
|
||||||
datas.extend(data)
|
|
||||||
database.close()
|
|
||||||
if len(domains) > 1:
|
|
||||||
utils.export_all(alive, fmt, path, datas)
|
|
||||||
elif type == 'table':
|
|
||||||
database = Database(db)
|
|
||||||
rows = database.export_data(target, alive, limit)
|
|
||||||
data, _, _ = export_data(fmt, path, rows, show, target, target)
|
|
||||||
database.close()
|
|
||||||
return data
|
|
||||||
|
|
||||||
|
|
||||||
def export_data(fmt, path, rows, show, table_name, target):
|
|
||||||
fmt = utils.check_format(fmt)
|
|
||||||
path = utils.check_path(path, target, fmt)
|
|
||||||
if show:
|
|
||||||
print(rows.dataset)
|
|
||||||
data = rows.export(fmt)
|
|
||||||
utils.save_data(path, data)
|
|
||||||
logger.log('ALERT', f'The subdomain result for {table_name}: {path}')
|
|
||||||
data = rows.as_dict()
|
|
||||||
return data, fmt, path
|
|
||||||
|
|
||||||
|
|
||||||
def domain_to_table(table):
|
|
||||||
return table.replace('.', '_') + "_now_result"
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
fire.Fire(export)
|
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
# coding=utf-8
|
||||||
|
|
||||||
|
"""
|
||||||
|
OneForAll export from database module
|
||||||
|
|
||||||
|
:copyright: Copyright (c) 2019, Jing Ling. All rights reserved.
|
||||||
|
:license: GNU General Public License v3.0, see LICENSE for more details.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import fire
|
||||||
|
|
||||||
|
from common import utils
|
||||||
|
from common.database import Database
|
||||||
|
from config.log import logger
|
||||||
|
|
||||||
|
|
||||||
|
def export_data(target, db=None, alive=False, limit=None, path=None, fmt='csv', show=False):
|
||||||
|
"""
|
||||||
|
OneForAll export from database module
|
||||||
|
|
||||||
|
Example:
|
||||||
|
python3 export.py --target name --fmt csv --dir= ./result.csv
|
||||||
|
python3 export.py --target name --tb True --show False
|
||||||
|
python3 export.py --db result.db --target name --show False
|
||||||
|
|
||||||
|
Note:
|
||||||
|
--fmt csv/json (result format)
|
||||||
|
--path Result directory (default directory is ./results)
|
||||||
|
|
||||||
|
:param str target: Table to be exported
|
||||||
|
:param str db: Database path to be exported (default ./results/result.sqlite3)
|
||||||
|
:param bool alive: Only export the results of alive subdomains (default False)
|
||||||
|
:param str limit: Export limit (default None)
|
||||||
|
:param str fmt: Result format (default csv)
|
||||||
|
:param str path: Result directory (default None)
|
||||||
|
:param bool show: Displays the exported data in terminal (default False)
|
||||||
|
"""
|
||||||
|
|
||||||
|
database = Database(db)
|
||||||
|
domains = utils.get_domains(target)
|
||||||
|
datas = list()
|
||||||
|
if domains:
|
||||||
|
for domain in domains:
|
||||||
|
table_name = domain.replace('.', '_')
|
||||||
|
rows = database.export_data(table_name, alive, limit)
|
||||||
|
if rows is None:
|
||||||
|
continue
|
||||||
|
data, _, _ = do_export(fmt, path, rows, show, table_name, target)
|
||||||
|
datas.extend(data)
|
||||||
|
database.close()
|
||||||
|
if len(domains) > 1:
|
||||||
|
utils.export_all(alive, fmt, path, datas)
|
||||||
|
return datas
|
||||||
|
|
||||||
|
|
||||||
|
def do_export(fmt, path, rows, show, table_name, target):
|
||||||
|
fmt = utils.check_format(fmt)
|
||||||
|
path = utils.check_path(path, target, fmt)
|
||||||
|
if show:
|
||||||
|
print(rows.dataset)
|
||||||
|
data = rows.export(fmt)
|
||||||
|
utils.save_to_file(path, data)
|
||||||
|
logger.log('ALERT', f'The subdomain result for {table_name}: {path}')
|
||||||
|
data = rows.as_dict()
|
||||||
|
return data, fmt, path
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
fire.Fire(export_data)
|
||||||
+1
-1
@@ -196,4 +196,4 @@ class Altdns(Module):
|
|||||||
resolved_data = resolve.run_resolve(self.domain, self.results)
|
resolved_data = resolve.run_resolve(self.domain, self.results)
|
||||||
request.run_request(self.domain, resolved_data, port)
|
request.run_request(self.domain, resolved_data, port)
|
||||||
logger.log('INFOR', f'Saving altdns results')
|
logger.log('INFOR', f'Saving altdns results')
|
||||||
utils.save_db(self.domain, data, 'altdns')
|
utils.save_to_db(self.domain, data, 'altdns')
|
||||||
|
|||||||
+13
-11
@@ -12,7 +12,7 @@ import fire
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
import dbexport
|
import export
|
||||||
from brute import Brute
|
from brute import Brute
|
||||||
from common import utils, resolve, request
|
from common import utils, resolve, request
|
||||||
from modules.collect import Collect
|
from modules.collect import Collect
|
||||||
@@ -129,15 +129,14 @@ class OneForAll(object):
|
|||||||
logger.log('FATAL', 'You must provide either target or targets parameter')
|
logger.log('FATAL', 'You must provide either target or targets parameter')
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
def export(self, table):
|
def export_data(self):
|
||||||
"""
|
"""
|
||||||
Export data from the database
|
Export data from the database
|
||||||
|
|
||||||
:param table: table name
|
:return: exported data
|
||||||
:return: export data
|
|
||||||
:rtype: list
|
:rtype: list
|
||||||
"""
|
"""
|
||||||
return dbexport.export(table, type='table', alive=self.alive, fmt=self.fmt)
|
return export.export_data(self.domain, alive=self.alive, fmt=self.fmt)
|
||||||
|
|
||||||
def main(self):
|
def main(self):
|
||||||
"""
|
"""
|
||||||
@@ -167,7 +166,7 @@ class OneForAll(object):
|
|||||||
utils.deal_data(self.domain)
|
utils.deal_data(self.domain)
|
||||||
# Export results without resolve
|
# Export results without resolve
|
||||||
if not self.dns:
|
if not self.dns:
|
||||||
return self.export(self.domain)
|
return self.export_data()
|
||||||
|
|
||||||
self.data = utils.get_data(self.domain)
|
self.data = utils.get_data(self.domain)
|
||||||
|
|
||||||
@@ -179,7 +178,7 @@ class OneForAll(object):
|
|||||||
|
|
||||||
# Export results without HTTP request
|
# Export results without HTTP request
|
||||||
if not self.req:
|
if not self.req:
|
||||||
return self.export(self.domain)
|
return self.export_data()
|
||||||
|
|
||||||
# HTTP request
|
# HTTP request
|
||||||
utils.clear_data(self.domain)
|
utils.clear_data(self.domain)
|
||||||
@@ -201,7 +200,7 @@ class OneForAll(object):
|
|||||||
enrich.run()
|
enrich.run()
|
||||||
|
|
||||||
# Export
|
# Export
|
||||||
self.datas.extend(self.export(self.domain))
|
self.datas.extend(self.export_data())
|
||||||
|
|
||||||
# Scan subdomain takeover
|
# Scan subdomain takeover
|
||||||
if self.takeover:
|
if self.takeover:
|
||||||
@@ -230,13 +229,16 @@ class OneForAll(object):
|
|||||||
self.config_param()
|
self.config_param()
|
||||||
self.check_param()
|
self.check_param()
|
||||||
self.domains = utils.get_domains(self.target, self.targets)
|
self.domains = utils.get_domains(self.target, self.targets)
|
||||||
if self.domains:
|
count = len(self.domains)
|
||||||
|
logger.log('INFOR', f'Got {count} domains')
|
||||||
|
if not count:
|
||||||
|
logger.log('FATAL', 'Failed to obtain domain')
|
||||||
|
exit(1)
|
||||||
for domain in self.domains:
|
for domain in self.domains:
|
||||||
self.domain = utils.get_main_domain(domain)
|
self.domain = utils.get_main_domain(domain)
|
||||||
self.main()
|
self.main()
|
||||||
|
if count > 1:
|
||||||
utils.export_all(self.alive, self.fmt, self.path, self.datas)
|
utils.export_all(self.alive, self.fmt, self.path, self.datas)
|
||||||
else:
|
|
||||||
logger.log('FATAL', 'Failed to obtain domain')
|
|
||||||
logger.log('INFOR', 'Finished OneForAll')
|
logger.log('INFOR', 'Finished OneForAll')
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|||||||
+1
-1
@@ -80,7 +80,7 @@ class Takeover(Module):
|
|||||||
data = str(self.results)
|
data = str(self.results)
|
||||||
else:
|
else:
|
||||||
data = self.results.export(self.fmt)
|
data = self.results.export(self.fmt)
|
||||||
utils.save_data(self.path, data)
|
utils.save_to_file(self.path, data)
|
||||||
|
|
||||||
def compare(self, subdomain, cname, responses):
|
def compare(self, subdomain, cname, responses):
|
||||||
domain_resp = self.get('http://' + subdomain, check=False, ignore=True)
|
domain_resp = self.get('http://' + subdomain, check=False, ignore=True)
|
||||||
|
|||||||
@@ -6,11 +6,10 @@ Example
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from oneforall import OneForAll
|
from oneforall import OneForAll
|
||||||
from dbexport import export
|
|
||||||
|
|
||||||
|
|
||||||
def oneforall(target):
|
def oneforall(domain):
|
||||||
test = OneForAll(target=target)
|
test = OneForAll(target=domain)
|
||||||
test.brute = True
|
test.brute = True
|
||||||
test.req = True
|
test.req = True
|
||||||
test.takeover = True
|
test.takeover = True
|
||||||
@@ -18,6 +17,4 @@ def oneforall(target):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
TARGET = 'freebuf.com'
|
oneforall('freebuf.com')
|
||||||
oneforall(target=TARGET)
|
|
||||||
export(target=TARGET)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user