Showing preview only (8,414K chars total). Download the full file or copy to clipboard to get everything.
Repository: komomon/Komo
Branch: main
Commit: 73954bf6ce38
Files: 265
Total size: 7.9 MB
Directory structure:
gitextract_qo8womg3/
├── Komo.py
├── common/
│ ├── __init__.py
│ └── getconfig.py
├── config/
│ ├── config.yaml
│ ├── log_template.json
│ ├── supplementary_files/
│ │ └── vulmap/
│ │ └── licenses.txt
│ ├── tools_linux.yaml
│ └── tools_windows.yaml
├── core/
│ ├── download/
│ │ ├── __init__.py
│ │ ├── download_tools.py
│ │ ├── tools.yaml
│ │ ├── tools2.yaml
│ │ ├── tools_linux.yaml
│ │ └── tools_windows.yaml
│ └── tools/
│ ├── domain/
│ │ ├── OneForAll/
│ │ │ ├── .github/
│ │ │ │ ├── ISSUE_TEMPLATE/
│ │ │ │ │ ├── bug_report.md
│ │ │ │ │ ├── bug_report_zh.md
│ │ │ │ │ └── feature_request.md
│ │ │ │ └── workflows/
│ │ │ │ └── test.yml
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── Dockerfile
│ │ │ ├── LICENSE
│ │ │ ├── Pipfile
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── brute.py
│ │ │ ├── common/
│ │ │ │ ├── check.py
│ │ │ │ ├── crawl.py
│ │ │ │ ├── database.py
│ │ │ │ ├── domain.py
│ │ │ │ ├── ipasn.py
│ │ │ │ ├── ipreg.py
│ │ │ │ ├── lookup.py
│ │ │ │ ├── module.py
│ │ │ │ ├── query.py
│ │ │ │ ├── records.py
│ │ │ │ ├── request.py
│ │ │ │ ├── resolve.py
│ │ │ │ ├── search.py
│ │ │ │ ├── similarity.py
│ │ │ │ ├── tablib/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── format.py
│ │ │ │ │ └── tablib.py
│ │ │ │ ├── tldextract.py
│ │ │ │ └── utils.py
│ │ │ ├── config/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── api.py
│ │ │ │ ├── default.py
│ │ │ │ ├── log.py
│ │ │ │ └── setting.py
│ │ │ ├── data/
│ │ │ │ ├── altdns_wordlist.txt
│ │ │ │ ├── authoritative_dns.txt
│ │ │ │ ├── cdn_asn_list.json
│ │ │ │ ├── cdn_cname_keywords.json
│ │ │ │ ├── cdn_header_keys.json
│ │ │ │ ├── cdn_ip_cidr.json
│ │ │ │ ├── common_js_library.json
│ │ │ │ ├── fingerprints.json
│ │ │ │ ├── nameservers.txt
│ │ │ │ ├── nameservers_cn.txt
│ │ │ │ ├── srv_prefixes.json
│ │ │ │ ├── subnames.txt
│ │ │ │ ├── subnames_medium.txt
│ │ │ │ └── subnames_next.txt
│ │ │ ├── docs/
│ │ │ │ ├── changes.md
│ │ │ │ ├── collection_modules.md
│ │ │ │ ├── contributors.md
│ │ │ │ ├── dictionary_source.md
│ │ │ │ ├── directory_structure.md
│ │ │ │ ├── en-us/
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── usage_help.md
│ │ │ │ ├── field.md
│ │ │ │ ├── installation_dependency.md
│ │ │ │ ├── todo.md
│ │ │ │ ├── troubleshooting.md
│ │ │ │ └── usage_help.md
│ │ │ ├── export.py
│ │ │ ├── modules/
│ │ │ │ ├── altdns.py
│ │ │ │ ├── amass_dange.py
│ │ │ │ ├── autotake/
│ │ │ │ │ └── github.py
│ │ │ │ ├── certificates/
│ │ │ │ │ ├── censys_api.py
│ │ │ │ │ ├── certspotter.py
│ │ │ │ │ ├── crtsh.py
│ │ │ │ │ └── google.py
│ │ │ │ ├── check/
│ │ │ │ │ ├── axfr.py
│ │ │ │ │ ├── cdx.py
│ │ │ │ │ ├── cert.py
│ │ │ │ │ ├── csp.py
│ │ │ │ │ ├── nsec.py
│ │ │ │ │ ├── robots.py
│ │ │ │ │ └── sitemap.py
│ │ │ │ ├── collect.py
│ │ │ │ ├── crawl/
│ │ │ │ │ ├── archivecrawl.py
│ │ │ │ │ └── commoncrawl.py
│ │ │ │ ├── datasets/
│ │ │ │ │ ├── anubis.py
│ │ │ │ │ ├── bevigil.py
│ │ │ │ │ ├── binaryedge_api.py
│ │ │ │ │ ├── cebaidu.py
│ │ │ │ │ ├── chinaz.py
│ │ │ │ │ ├── chinaz_api.py
│ │ │ │ │ ├── circl_api.py
│ │ │ │ │ ├── cloudflare_api.py
│ │ │ │ │ ├── dnsdb_api.py
│ │ │ │ │ ├── dnsdumpster.py
│ │ │ │ │ ├── fullhunt.py
│ │ │ │ │ ├── hackertarget.py
│ │ │ │ │ ├── ip138.py
│ │ │ │ │ ├── ipv4info_api.py
│ │ │ │ │ ├── netcraft.py
│ │ │ │ │ ├── passivedns_api.py
│ │ │ │ │ ├── qianxun.py
│ │ │ │ │ ├── rapiddns.py
│ │ │ │ │ ├── riddler.py
│ │ │ │ │ ├── robtex.py
│ │ │ │ │ ├── securitytrails_api.py
│ │ │ │ │ ├── sitedossier.py
│ │ │ │ │ ├── spyse_api.py
│ │ │ │ │ └── sublist3r.py
│ │ │ │ ├── dnsquery/
│ │ │ │ │ ├── mx.py
│ │ │ │ │ ├── ns.py
│ │ │ │ │ ├── soa.py
│ │ │ │ │ ├── spf.py
│ │ │ │ │ └── txt.py
│ │ │ │ ├── enrich.py
│ │ │ │ ├── finder.py
│ │ │ │ ├── intelligence/
│ │ │ │ │ ├── alienvault.py
│ │ │ │ │ ├── riskiq_api.py
│ │ │ │ │ ├── threatbook_api.py
│ │ │ │ │ ├── threatminer.py
│ │ │ │ │ ├── virustotal.py
│ │ │ │ │ └── virustotal_api.py
│ │ │ │ ├── iscdn.py
│ │ │ │ ├── other_tools.py
│ │ │ │ ├── search/
│ │ │ │ │ ├── ask.py
│ │ │ │ │ ├── baidu.py
│ │ │ │ │ ├── bing.py
│ │ │ │ │ ├── bing_api.py
│ │ │ │ │ ├── fofa_api.py
│ │ │ │ │ ├── gitee.py
│ │ │ │ │ ├── github_api.py
│ │ │ │ │ ├── google.py
│ │ │ │ │ ├── google_api.py
│ │ │ │ │ ├── hunter.py
│ │ │ │ │ ├── shodan_api.py
│ │ │ │ │ ├── so.py
│ │ │ │ │ ├── sogou.py
│ │ │ │ │ ├── yahoo.py
│ │ │ │ │ ├── yandex.py
│ │ │ │ │ └── zoomeye_api.py
│ │ │ │ ├── srv.py
│ │ │ │ └── wildcard.py
│ │ │ ├── oneforall.py
│ │ │ ├── requirements.txt
│ │ │ ├── results/
│ │ │ │ ├── result.sqlite3
│ │ │ │ └── temp/
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_102952.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_103024.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_103609.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_103641.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_103854.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_103925.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104236.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104307.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104548.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104620.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104839.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104911.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_135147.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_135221.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_140104.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_140134.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_140659.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_140731.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_142514.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_142545.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_142845.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_142916.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_143118.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_143151.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_143716.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_143748.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_144026.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_144059.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220909_160351.txt
│ │ │ │ ├── collected_subdomains_tiqianle.com_20220909_160424.txt
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_102952.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_103024.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_103609.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_103641.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_103854.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_103925.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_104236.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_104307.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_104548.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_104620.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_104839.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_104911.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_135147.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_135221.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_140104.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_140134.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_140659.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_140731.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_142514.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_142545.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_142845.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_142916.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_143118.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_143151.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_143716.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_143748.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_144026.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220902_144059.json
│ │ │ │ ├── resolved_result_tiqianle.com_20220909_160351.json
│ │ │ │ └── resolved_result_tiqianle.com_20220909_160424.json
│ │ │ ├── takeover.py
│ │ │ ├── test.py
│ │ │ └── thirdparty/
│ │ │ └── massdns/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── massdns_darwin_arm64
│ │ │ ├── massdns_darwin_x86_64
│ │ │ ├── massdns_linux_i686
│ │ │ └── massdns_linux_x86_64
│ │ ├── ctfr/
│ │ │ ├── __init__.py
│ │ │ └── ctfr.py
│ │ └── domain_main.py
│ ├── finger/
│ │ ├── Ehole/
│ │ │ ├── config.ini
│ │ │ └── finger.json
│ │ └── finger_main.py
│ ├── portscan/
│ │ ├── portscan_main.py
│ │ └── top1000port.txt
│ ├── sensitiveinfo/
│ │ ├── chrome-win/
│ │ │ └── 下载地址.txt
│ │ ├── emailall/
│ │ │ ├── README.md
│ │ │ ├── common/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── output.py
│ │ │ │ ├── search.py
│ │ │ │ └── utils.py
│ │ │ ├── config/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── api.py
│ │ │ │ ├── log.py
│ │ │ │ └── setting.py
│ │ │ ├── docs/
│ │ │ │ └── changes.md
│ │ │ ├── emailall.log
│ │ │ ├── emailall.py
│ │ │ ├── modules/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── collect.py
│ │ │ │ ├── datasets/
│ │ │ │ │ ├── Emailf.py
│ │ │ │ │ ├── phonebook.py
│ │ │ │ │ ├── skymem.py
│ │ │ │ │ ├── snov.py
│ │ │ │ │ └── veryvp.py
│ │ │ │ ├── module.py
│ │ │ │ └── search/
│ │ │ │ ├── ask.py
│ │ │ │ ├── baidu.py
│ │ │ │ ├── bingcn.py
│ │ │ │ ├── githubapi.py
│ │ │ │ ├── google.py
│ │ │ │ ├── qwant.py
│ │ │ │ ├── so.py
│ │ │ │ └── sogou.py
│ │ │ ├── requirements.txt
│ │ │ └── result/
│ │ │ └── READEME.MD
│ │ └── sensitiveinfo_main.py
│ └── vulscan/
│ └── vulscan_main.py
├── readme.md
└── requirement.txt
================================================
FILE CONTENTS
================================================
================================================
FILE: Komo.py
================================================
import hashlib
import json
import os
import random
import shutil
import string
import fire
import datetime
from loguru import logger
from core.tools.domain import domain_main
from core.tools.finger import finger_main
from core.tools.sensitiveinfo import sensitiveinfo_main
from core.tools.vulscan import vulscan_main
from core.tools.portscan import portscan_main
from core.download import download_tools
# from common.getconfig import *
# import common
yellow = '\033[01;33m'
white = '\033[01;37m'
green = '\033[01;32m'
blue = '\033[01;34m'
red = '\033[1;31m'
end = '\033[0m'
version = 'v1.0'
message = white + '{' + red + version + ' #dev' + white + '}'
banner = f"""
{red}Komo is a comprehensive asset collection and vulnerability scanning tool{yellow}
██╗ ██╗ ██████╗ ███╗ ███╗ ██████╗ {message}{green}
██║ ██╔╝██╔═══██╗████╗ ████║██╔═══██╗
█████╔╝ ██║ ██║██╔████╔██║██║ ██║{blue}
██╔═██╗ ██║ ██║██║╚██╔╝██║██║ ██║
██║ ██╗╚██████╔╝██║ ╚═╝ ██║╚██████╔╝
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ {white} By Komomon
{end}
"""
# all_config = getconfig()
# Xray_Port = int(all_config['tools']['other']['xray']['listenport'])
def create_logfile():
if os.path.exists(f'{os.getcwd()}/log') is False:
os.makedirs(f'{os.getcwd()}/log')
logger.add(sink='log/runtime.log', level='INFO', encoding='utf-8')
logger.add(sink='log/error.log', level='ERROR', encoding='utf-8')
# 进度记录,基于json
def progress_record(date=None, module=None, value=None):
logfile = f"result/{date}/log.json"
if os.path.exists(logfile) is False:
shutil.copy("config/log_template.json", f"result/{date}/log.json")
with open(logfile, 'r', encoding='utf-8') as f1:
log_json = json.loads(f1.read())
log_json[module] = value
with open(logfile, "w", encoding="utf-8") as f:
f.write(json.dumps(log_json))
return True
# if module in dict(log_json).keys() and target:
class Komo(object):
'''
Komo help summary page
Komo is an automated scanning tool set
mode:
install Download the required tools
all all scan and attack:subdomain, survival detection, finger, portscan, email collect, sensitive(crawl urls), pocscan, Weak password scanning, to_xray
--domain one domain
--domains a domain file
all2 run scan and attack except domain collection: survival detection, finger, portscan, email collect, sensitive(crawl urls), pocscan, Weak password scanning, to_xray
--subdomain one subdomain
--subdomains a subdomain file
collect run all collection modules :subdomain, survival detection, finger, port, email collect, sensitive(crawl urls), pocscan, to_xray
--domain one domain
--domains a domain file
collect1 run collection modules :subdomain, survival detection, finger
--domain one domain
--domains a domain file
collect2 run collection modules :subdomain, survival detection, finger, portscan
--domain one domain
--domains a domain file
subdomain only collect subdomain
--domain one domain
--domains a domains file
finger only collect the survival URL and fingerprint
--url one url
--urls an urls file
portscan only collect port from ip or ips
--ip one ip
--ips an ips file
sensitive only collect directory with crawl,email
--url one url
--urls an urls file
webattack only attack web from url or urls: pocscan, Weak password scanning, crawl urls to xray
--url one url
--urls an urls file
webattack2 only poc scan from url or urls: pocscan, Weak password scanning
--url one url
--urls an urls file
hostattack only attack ip from ip or ips
--ip one ip
--ips an ips file
attack run webattack and hostattack: crawl url to xray, pocscan, Weak password scanning
Example:
python3 Komo.py install
python3 Komo.py --domain example.com all
python3 Komo.py --domains ./domains.txt all
python3 Komo.py --domain example.com collect
python3 Komo.py --domains ./domains.txt collect
python3 Komo.py --domain example.com collect1
python3 Komo.py --domains ./domains.txt collect1
python3 Komo.py --domain example.com collect2
python3 Komo.py --domains ./domains.txt collect2
python3 Komo.py --domain example.com subdomain
python3 Komo.py --domains ./domains.txt subdomain
python3 Komo.py --subdomain aaa.example.com all2
python3 Komo.py --subdomains ./subdomains.txt all2
python3 Komo.py --url http://example.com finger
python3 Komo.py --urls ./urls.txt finger
python3 Komo.py --url http://example.com sensitive
python3 Komo.py --urls ./urls.txt sensitive
python3 Komo.py --url http://example.com webattack
python3 Komo.py --urls ./urls.txt webattack
python3 Komo.py --url http://example.com webattack2
python3 Komo.py --urls ./urls.txt webattack2
python3 Komo.py --ip example.com portscan
python3 Komo.py --ips ./domains.txt portscan
python3 Komo.py --ip example.com hostattack
python3 Komo.py --ips ./domains.txt hostattack
:param domain:
:param domains:
:param subdomain:
:param subdomains:
:param url:
:param urls:
:param ip:
:param ips:
:param attackflag:
:param date:
'''
def __init__(self, domain=None, domains=None, subdomain=None, subdomains=None, url=None, urls=None, ip=None,
ips=None, attackflag=False, date=None, proxy=None):
date1 = str(datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))
self.domain = domain
self.domains = domains # domainsfile
self.subdomain = subdomain
self.subdomains = subdomains
self.url = url
self.urlsfile = urls
self.ip = ip
self.ips = ips
self.attackflag = attackflag
self.date = date if date else date1
self.proxy = proxy
self.domains_list = []
# self.command = "python3 Komo.py"
self.params = {
"domain": self.domain,
"domains": self.domains,
"subdomain": self.subdomain,
"subdomains": self.subdomains,
"url": self.url,
"urls": self.urlsfile,
"ip": self.ip,
"ips": self.ips,
"attackflag": self.attackflag,
"date": self.date
}
# for i in [self.domain,self.domains,self.subdomain,self.subdomains,self.url,self.urlsfile,self.ip,self.ips,self.date]:
# if i is not None:
# self.command += "--{}".format(i)
create_logfile()
print(banner)
self.randomstr = hashlib.md5(bytes(self.date, encoding='utf-8')).hexdigest()
# 创建结果文件夹
self.result_folder = f"result/{self.date}"
if os.path.exists(self.result_folder) is False:
os.makedirs(self.result_folder)
if self.domain and self.domains is None:
self.domains_list.append(self.domain)
elif self.domains and self.domain is None:
with open(self.domains, 'r', encoding='utf-8') as f:
for line in f.readlines():
line = line.strip()
self.domains_list.append(line)
self.domains_list = list(set(self.domains_list))
elif self.subdomain and self.subdomains is None:
with open(f"result/{self.date}/{self.randomstr}.final.subdomains.txt", "w", encoding="utf-8") as f:
f.write(str(self.subdomain))
elif self.subdomains and self.subdomain is None:
if os.path.exists(self.subdomains):
shutil.copy(self.subdomains, f"result/{self.date}/{self.randomstr}.final.subdomains.txt")
else:
logger.error(f"[-] {self.subdomains} Not found and exit!")
exit(1)
# 变成绝对路径
if self.domains is not None:
if os.path.isabs(self.domains) is False:
newpath = os.path.realpath(os.getcwd() + '/' + self.domains)
if os.path.exists(newpath):
self.domains = newpath
if self.urlsfile is not None:
if os.path.isabs(self.urlsfile) is False:
newpath = os.path.realpath(os.getcwd() + '/' + self.urlsfile)
if os.path.exists(newpath):
self.urlsfile = newpath
if self.ips is not None:
if os.path.isabs(self.ips) is False:
newpath = os.path.realpath(os.getcwd() + '/' + self.ips)
if os.path.exists(newpath):
self.ips = newpath
progress_record(self.date, "date", self.date)
progress_record(self.date, "params", self.params)
def install(self):
# download tools
dd = download_tools.Download(proxy=self.proxy)
dd.run()
# 只进行子域扫描
def subdomain(self):
# self.command += "--{}".format(self.subdomain)
if self.domains_list:
for domain in self.domains_list:
domain_main.manager(domain=domain, date=self.date)
else:
logger.error("[-] Please check --domain or --domains")
def finger(self):
if self.url:
finger_main.manager(domain=None, url=self.url, urlsfile=None, date=self.date)
elif self.urlsfile:
finger_main.manager(domain=None, url=None, urlsfile=self.urlsfile, date=self.date)
else:
logger.error("[-] Please check --url or --urls")
def portscan(self):
if self.ip:
portscan_main.manager(domain=None, ip=self.ip, ipfile=None, date=self.date)
elif self.ips:
portscan_main.manager(domain=None, ip=None, ipfile=self.ips, date=self.date)
else:
logger.error("[-] Please check --ip or --ips")
# 敏感信息收集
def sensitive(self):
self.attackflag = False
if self.url:
sensitiveinfo_main.manager(domain=None, url=self.url, urlsfile=None, attackflag=self.attackflag,
date=self.date)
elif self.urlsfile:
sensitiveinfo_main.manager(domain=None, url=None, urlsfile=self.urlsfile, attackflag=self.attackflag,
date=self.date)
else:
logger.error("[-] Please check --url or --urls")
# 对urls进行漏洞扫描
def webattack(self):
self.attackflag = True
if self.url:
sensitiveinfo_main.manager(domain=None, url=self.url, urlsfile=None, attackflag=self.attackflag,
date=self.date) # toxray
vulscan_main.webmanager(domain=None, url=self.url, urlsfile=None, date=self.date)
elif self.urlsfile:
sensitiveinfo_main.manager(domain=None, url=None, urlsfile=self.urlsfile, attackflag=self.attackflag,
date=self.date)
vulscan_main.webmanager(domain=None, url=None, urlsfile=self.urlsfile, date=self.date)
else:
logger.error("[-] Please check --url or --urls")
def webattack1(self):
self.attackflag = True
if self.url:
sensitiveinfo_main.manager(domain=None, url=self.url, urlsfile=None, attackflag=self.attackflag,
date=self.date) # toxray
elif self.urlsfile:
sensitiveinfo_main.manager(domain=None, url=None, urlsfile=self.urlsfile, attackflag=self.attackflag,
date=self.date)
else:
logger.error("[-] Please check --url or --urls")
# only poc scan
def webattack2(self):
self.attackflag = True
if self.url:
vulscan_main.webmanager(domain=None, url=self.url, urlsfile=None, date=self.date)
elif self.urlsfile:
vulscan_main.webmanager(domain=None, url=None, urlsfile=self.urlsfile, date=self.date)
else:
logger.error("[-] Please check --url or --urls")
# 对主机ip攻击
def hostattack(self):
self.attackflag = True
if self.ip:
vulscan_main.hostmanager(domain=None, ip=self.ip, ipfile=None, date=self.date)
# sensitiveinfo_main.manager(domain=None, url=self.url, urlsfile=None, attackflag=self.attackflag,
# date=self.date)
elif self.ips:
vulscan_main.hostmanager(domain=None, ip=None, ipfile=self.ips, date=self.date)
else:
logger.error("[-] Please check --ip or --ips")
def attack(self):
self.webattack()
self.hostattack()
# 只扫描,不攻击 提供主域名或者主域名文件,顺序执行
def collect(self):
'''
python main.py --domain tiqianle.com collect
python main.py --domains file collect
:return:
'''
self.attackflag = False
if self.domains_list:
for domain in self.domains_list:
domain_main.manager(domain=domain, date=self.date)
finger_main.manager(domain=domain, url=None, urlsfile=None, date=self.date)
portscan_main.manager(domain=domain, ip=None, ipfile=None, date=self.date)
sensitiveinfo_main.manager(domain=domain, url=None, urlsfile=None, attackflag=self.attackflag,
date=self.date)
# vulscan_main.webmanager(domain=self.domain, url=None, urlsfile=None, date=self.date)
else:
logger.error("[-] Please check --domain or --domains")
def collect1(self):
# self.attackflag = False
if self.domains_list:
for domain in self.domains_list:
domain_main.manager(domain=domain, date=self.date)
finger_main.manager(domain=domain, url=None, urlsfile=None, date=self.date)
# portscan_main.manager(domain=domain, ip=None, ipfile=None, date=self.date)
else:
logger.error("[-] Please check --domain or --domains")
def collect2(self):
# self.attackflag = False
if self.domains_list:
for domain in self.domains_list:
domain_main.manager(domain=domain, date=self.date)
finger_main.manager(domain=domain, url=None, urlsfile=None, date=self.date)
portscan_main.manager(domain=domain, ip=None, ipfile=None, date=self.date)
else:
logger.error("[-] Please check --domain or --domains")
# 扫描+攻击 all_scan
def all(self):
'''
python main.py --domain tiqianle.com all
python main.py --domains tiqianle.com all
:return:
'''
self.attackflag = True
if self.domains_list:
for domain in self.domains_list:
domain_main.manager(domain=domain, date=self.date)
finger_main.manager(domain=domain, urlsfile=None, date=self.date)
portscan_main.manager(domain=domain, ip=None, ipfile=None, date=self.date)
vulscan_main.webmanager(domain=domain, url=None, urlsfile=None, date=self.date)
vulscan_main.hostmanager(domain=domain, ip=None, ipfile=None, date=self.date)
sensitiveinfo_main.manager(domain=domain, url=None, urlsfile=None, attackflag=self.attackflag,
date=self.date)
else:
logger.error("[-] Please check --domain or --domains")
# 扫描+攻击 提供子域名列表,不扫描子域
def all2(self):
'''
python main.py --subdomain aaa.tiqianle.com all2
python main.py --subdomains tiqianle.com.txt all2
:return:
'''
self.attackflag = True
if self.subdomain or self.subdomains:
# for domain in self.domains_list:
# domain_main.manager(domain=domain, date=self.date)
finger_main.manager(domain=self.randomstr, urlsfile=None, date=self.date)
portscan_main.manager(domain=self.randomstr, ip=None, ipfile=None, date=self.date)
vulscan_main.webmanager(domain=self.randomstr, url=None, urlsfile=None, date=self.date)
vulscan_main.hostmanager(domain=self.randomstr, ip=None, ipfile=None, date=self.date)
sensitiveinfo_main.manager(domain=self.randomstr, url=None, urlsfile=None, attackflag=self.attackflag,
date=self.date)
else:
logger.error("[-] Please check --subdomain or --subdomains")
if __name__ == '__main__':
fire.Fire(Komo)
# fire.Fire(ctfr)
# fire.Fire(test1.b)
# test1.a()
# fire.Fire(test1.ooo)
# test1.a()
# fire.Fire(oneforall.OneForAll)
# class ooo(object):
# def __init__(self, target=None, targets=None, brute=None, dns=None, req=None,
# port=None, alive=None, fmt=None, path=None, takeover=None):
# self.target = target
# self.targets = targets
# self.brute = brute
# self.dns = dns
# self.req = req
# self.port = port
# self.alive = alive
# self.fmt = fmt
# self.path = path
# self.takeover = takeover
# self.domain = str() # The domain currently being collected
# self.domains = set() # All domains that are to be collected
# self.data = list() # The subdomain results of the current domain
# self.datas = list() # All subdomain results of the domain
# self.in_china = None
# self.access_internet = False
# self.enable_wildcard = False
# print(self.target)
#
# def run(self):
#
#
# os.system("python3 core/test1/test1.py")
# domain_main.manager("tiqianle.com", date)
#
# test1.yoyo()
# test1.Yoyo().yoyoketang()
# test1.sss()
================================================
FILE: common/__init__.py
================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author:Komomon
# @Time:2022/12/27 12:22
================================================
FILE: common/getconfig.py
================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author:Komomon
# @Time:2022/12/27 12:45
import os
import platform
import yaml
from loguru import logger
ostype = platform.system().lower()
pwd_and_file = os.path.abspath(__file__)
pwd = os.path.dirname(pwd_and_file) # E:\ccode\python\006_lunzi\core\tools\domain
root_path = os.path.realpath(f'{pwd}/../')
# 获取当前目录的前三级目录,即到domain目录下,来寻找exe domain目录下
# grader_father = os.path.abspath(os.path.dirname(pwd_and_file) + os.path.sep + "../..")
# print(grader_father) # E:\ccode\python\006_lunzi\core
def getconfig():
toolsyaml_path = f"{root_path}/config/config.yaml"
# toolsyaml_path = "tools_linux.yaml"
if os.path.exists(toolsyaml_path):
with open(toolsyaml_path, 'r', encoding='utf-8') as f:
all_config = yaml.load(f, Loader=yaml.FullLoader)
return all_config
# tools_config =all_config['tools']
# print(tools_config)
else:
logger.error(f"[-] not found {toolsyaml_path}")
logger.error("Exit!")
exit(1)
if __name__ == '__main__':
getconfig()
================================================
FILE: config/config.yaml
================================================
tools:
domain:
amass:
toolname: amass
ksubdomain:
toolname: ksubdomain
subfinder:
toolname: subfinder
oneforall:
toolname: oneforall
ip2location:
toolname: ip2location
subnames_big:
# https://raw.githubusercontent.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z
toolname: subnames_big
ip2region:
toolname: ip2region
finger:
ehole:
toolname: ehole
httpx:
toolname: httpx
webanalyze:
toolname: webanalyze
portscan:
TxPortMap:
toolname: TxPortMap
# 暂不使用
dismap:
toolname: dismap
naabu:
toolname: naabu
sensitiveinfo:
chrome-win:
toolname: chrome-win
emailall:
# https://github.com/Taonn/EmailAll/archive/refs/heads/master.zip 修改过
toolname: emailall
crawlergo:
toolname: crawlergo
runtime: 900
rad:
toolname: rad
runtime: 900
gospider:
toolname: gospider
runtime: 600
hakrawler:
# 修改了加了-f参数
toolname: hakrawler
runtime: 600
dirsearch:
# zanbuyong,不移动 dirsearch-master/ /
toolname: dirsearch
gau:
toolname: gau
runtime: 600
urlcollector:
toolname: urlcollector
runtime: 600
URLFinder:
toolname: URLFinder
runtime: 600
vulscan:
afrog:
toolname: afrog
goon:
toolname: goon
nuclei:
toolname: nuclei
SweetBabyScan:
toolname: SweetBabyScan
vulmap:
# py
toolname: vulmap
vscan:
toolname: vscan
other:
xray:
toolname: xray
listenport: 7777
================================================
FILE: config/log_template.json
================================================
{
"date": "",
"command": [],
"params": {
"domain": "",
"domains": "",
"subdomain": "",
"subdomains": "",
"url": "",
"urls": "",
"ip": "",
"ips": "",
"attackflag": "",
"date": ""
},
"file": {
"domain": "",
"domain_file": "",
"subdomain": "",
"subdomain_file": "",
"port_file": "",
"links_file": "",
"ip_file": ""
},
"domain": {
"scanning_target": "",
"scanned_targets": []
},
"finger": false,
"portscan": false,
"sensitiveinfo": {
"scanning_target": "",
"scanned_targets": []
},
"vulscan": {
"webattack": false,
"hostattack": false
}
}
================================================
FILE: config/supplementary_files/vulmap/licenses.txt
================================================
1672052447366
================================================
FILE: config/tools_linux.yaml
================================================
# amass:
# toolname: amass gongjvname
# whetherdownload: True 是否下载
# link: https://github.com/OWASP/Amass/releases/download/v3.20.0/amass_windows_amd64.zip 二进制文件路径
# downloadfile: amass.zip 下载后存储的文件exe或zip或.tar.gz 的文件名和后缀
# unzipsubfile: amass_windows_amd64 解压的指定子目录
# source_name: amass.exe 下载后压缩包中文件的名称
# final_name: amass.exe 最终移动到的位置格式化为的文件名称,如果两者不相同,则move修改为final_name的名称,移动文件夹或者文件
# tool_main_filename: /gospider.exe 最终二进制文件或某个文件的名称,如果不存在,则说明没解压到对应目录或者没下载,用于下载的文件中包含一层文件夹的情况
# topath:
# - core/tools/domain/amass/ # 存储路径,整体使用的时候的存储路径
# - amass/ # 存储路径,单模块使用的时候的存储路径
# 由于有些工具比如amass gospider vulmap, 解压后下面还有一层目录,为了让最后工具目录结构为 core/tools/mukuai/toolname/toolname.exe
# eg core/tools/domain/amass/amass.exe,所以通过下面的source_name,final_name topath进行调整保证最终目录结构符合上述结构要求
# topath为解压到的工具目录,对于压缩包子目录下才是工具的情况,topath要往上一层,这样解压到目录的是子目录
# source_name为压缩包子目录或者下载的工具压缩包或二进制exe文件的名称,final_name为最终修改为的名称,使用rename修改名称
download:
domain:
amass:
toolname: amass
whetherdownload: True
link: https://github.com/OWASP/Amass/releases/download/v3.21.2/amass_linux_amd64.zip
downloadfile: amass.zip
# unzipsubfile: amass_windows_amd64
source_name: amass_linux_amd64/
final_name: amass/
tool_main_filename: amass
topath:
- core/tools/domain/
- /
# - core/tools/domain/amass/
# - amass/
ksubdomain:
toolname: ksubdomain
whetherdownload: True
link: https://github.com/boy-hack/ksubdomain/releases/download/v1.9.5/KSubdomain-v1.9.5-linux.tar
downloadfile: ksubdomain.tar
source_name: ksubdomain
final_name: ksubdomain
tool_main_filename: ksubdomain
topath:
- core/tools/domain/ksubdomain/
- ksubdomain/
subfinder:
toolname: subfinder
whetherdownload: True
link: https://github.com/projectdiscovery/subfinder/releases/download/v2.5.5/subfinder_2.5.5_linux_amd64.zip
downloadfile: subfinder.zip
source_name: subfinder
final_name: subfinder
tool_main_filename: subfinder
topath:
- core/tools/domain/subfinder/
- subfinder/
oneforall:
toolname: oneforall
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename: oneforall.py
topath:
- core/tools/domain/OneForAll/
- OneForAll/
ip2location:
toolname: ip2location
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/ip2location.zip?raw=true
downloadfile: ip2location.zip
source_name: ip2location.db
final_name: ip2location.db
tool_main_filename: ip2location.db
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
subnames_big:
# https://raw.githubusercontent.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z
toolname: subnames_big
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z?raw=true
downloadfile: subnames_big.7z
source_name: subnames_big.7z
final_name: subnames_big.7z
tool_main_filename: subnames_big.7z
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
ip2region:
toolname: ip2region
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/ip2region.db?raw=true
downloadfile: ip2region.db
source_name: ip2region.db
final_name: ip2region.db
tool_main_filename: ip2region.db
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
finger:
ehole:
toolname: ehole
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/finger/Ehole/
- Ehole/
httpx:
toolname: httpx
whetherdownload: True
link: https://github.com/projectdiscovery/httpx/releases/download/v1.2.4/httpx_1.2.4_linux_amd64.zip
downloadfile: httpx.zip
source_name: httpx
final_name: httpx
tool_main_filename: httpx
topath:
- core/tools/finger/httpx/
- httpx/
webanalyze:
toolname: webanalyze
whetherdownload: True
link: https://github.com/rverton/webanalyze/releases/download/v0.3.8/webanalyze_0.3.8_Linux_x86_64.tar.gz
downloadfile: webanalyze.tar.gz
source_name: webanalyze
final_name: webanalyze
tool_main_filename: webanalyze
topath:
- core/tools/finger/webanalyze/
- webanalyze/
portscan:
TxPortMap:
toolname: TxPortMap
whetherdownload: True
link: https://github.com/4dogs-cn/TXPortMap/releases/download/v1.1.2/TxPortMap_linux_x64
downloadfile: TxPortMap
source_name: TxPortMap
final_name: TxPortMap
tool_main_filename: TxPortMap
topath:
- core/tools/portscan/TxPortMap/
- TxPortMap/
# 暂不使用
dismap:
toolname: dismap
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/portscan/dismap/
- dismap/
naabu:
toolname: naabu
whetherdownload: True
link: https://github.com/projectdiscovery/naabu/releases/download/v2.1.1/naabu_2.1.1_linux_amd64.zip
downloadfile: naabu.zip
source_name: naabu
final_name: naabu
tool_main_filename: naabu
topath:
- core/tools/portscan/naabu/
- naabu/
sensitiveinfo:
chrome-linux:
toolname: chrome-linux
whetherdownload: True
link: https://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/1086242/chrome-linux.zip
downloadfile: chrome-linux.zip
source_name: chrome-linux/
final_name: chrome-linux/
tool_main_filename: chrome
topath:
- core/tools/sensitiveinfo/
- /
crawlergo:
toolname: crawlergo
whetherdownload: True
link: https://github.com/Qianlitp/crawlergo/releases/download/v0.4.4/crawlergo_linux_amd64
downloadfile: crawlergo
source_name: crawlergo
final_name: crawlergo
tool_main_filename: crawlergo
topath:
- core/tools/sensitiveinfo/crawlergo/
- crawlergo/
rad:
toolname: rad
whetherdownload: True
link: https://github.com/chaitin/rad/releases/download/0.4/rad_linux_amd64.zip
downloadfile: rad.zip
source_name: rad_linux_amd64
final_name: rad
tool_main_filename: rad
topath:
- core/tools/sensitiveinfo/rad/
- rad/
emailall:
# https://github.com/Taonn/EmailAll/archive/refs/heads/master.zip 修改过
toolname: emailall
whetherdownload: False
link:
downloadfile: emailall.zip
source_name:
final_name:
tool_main_filename: emailall.py
topath:
- core/tools/sensitiveinfo/emailall/
- emailall/
gospider:
toolname: gospider
whetherdownload: True
link: https://github.com/jaeles-project/gospider/releases/download/v1.1.6/gospider_v1.1.6_linux_x86_64.zip
downloadfile: gospider.zip
source_name: gospider_v1.1.6_linux_x86_64/
final_name: gospider/
tool_main_filename: gospider
topath:
- core/tools/sensitiveinfo/
- /
# - core/tools/sensitiveinfo/gospider/
# - gospider/
hakrawler:
# 修改了加了-f参数
toolname: hakrawler
whetherdownload: True
link: https://github.com/komomon/hakrawler_plus/blob/main/hakrawler?raw=true
downloadfile: hakrawler
source_name: hakrawler
final_name: hakrawler
tool_main_filename: hakrawler
topath:
- core/tools/sensitiveinfo/hakrawler/
- hakrawler/
dirsearch:
# zanbuyong,不移动 dirsearch-master/ /
toolname: dirsearch
whetherdownload: False
link: https://github.com/maurosoria/dirsearch/archive/refs/heads/master.zip
downloadfile: dirsearch.zip
source_name:
final_name:
tool_main_filename: dirsearch.py
topath:
- core/tools/sensitiveinfo/dirsearch/
- dirsearch/
gau:
toolname: gau
whetherdownload: True
link: https://github.com/lc/gau/releases/download/v2.1.2/gau_2.1.2_linux_amd64.tar.gz
downloadfile: gau.tar.gz
source_name: gau
final_name: gau
tool_main_filename: gau
topath:
- core/tools/sensitiveinfo/gau/
- gau/
urlcollector:
toolname: urlcollector
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/sensitiveinfo/urlcollector/
- urlcollector/
URLFinder:
toolname: URLFinder
whetherdownload: True
link: https://github.com/pingc0y/URLFinder/blob/master/URLFinder-linux-amd64?raw=true
downloadfile: URLFinder
source_name: URLFinder
final_name: URLFinder
tool_main_filename: URLFinder
topath:
- core/tools/sensitiveinfo/URLFinder/
- URLFinder/
vulscan:
afrog:
toolname: afrog
whetherdownload: True
link: https://github.com/zan8in/afrog/releases/download/v2.1.1/afrog_2.1.1_linux_amd64.zip
downloadfile: afrog.zip
source_name: afrog
final_name: afrog
tool_main_filename: afrog
topath:
- core/tools/vulscan/afrog/
- afrog/
goon:
toolname: goon
whetherdownload: True
link: https://github.com/i11us0ry/goon/releases/download/v3.5/goon3_lin_amd64.zip
downloadfile: goon.zip
source_name: goon3_lin_amd64
final_name: goon
tool_main_filename: goon
topath:
- core/tools/vulscan/goon/
- goon/
nuclei:
toolname: nuclei
whetherdownload: True
link: https://github.com/projectdiscovery/nuclei/releases/download/v2.8.3/nuclei_2.8.3_linux_amd64.zip
downloadfile: nuclei.zip
source_name: nuclei
final_name: nuclei
tool_main_filename: nuclei
topath:
- core/tools/vulscan/nuclei/
- nuclei/
SweetBabyScan:
toolname: SweetBabyScan
whetherdownload: True
link: https://github.com/inbug-team/SweetBabyScan/releases/download/v0.1.0/SbScanLinuxAmd64
downloadfile: SweetBabyScan
# source_name: SbScanAmd64.exe
source_name: SweetBabyScan
final_name: SweetBabyScan
tool_main_filename: SweetBabyScan
topath:
- core/tools/vulscan/SweetBabyScan/
- SweetBabyScan/
vulmap:
# py
toolname: vulmap
whetherdownload: True
link: https://github.com/zhzyker/vulmap/archive/refs/tags/v0.9.zip
downloadfile: vulmap.zip
source_name: vulmap-0.9/
final_name: vulmap/
tool_main_filename: vulmap.py
topath:
- core/tools/vulscan/
- /
# - core/tools/vulscan/vulmap/
# - vulmap/
vscan:
toolname: vscan
whetherdownload: True
link: https://github.com/veo/vscan/releases/download/v2.1.0/vscan_2.1.0_linux_amd64.zip
downloadfile: vscan.zip
source_name: vscan
final_name: vscan
tool_main_filename: vscan
topath:
- core/tools/vulscan/vscan/
- vscan/
================================================
FILE: config/tools_windows.yaml
================================================
# amass:
# toolname: amass gongjvname
# whetherdownload: True 是否下载
# link: https://github.com/OWASP/Amass/releases/download/v3.20.0/amass_windows_amd64.zip 二进制文件路径
# downloadfile: amass.zip 下载后存储的文件exe或zip或.tar.gz 的文件名和后缀
# unzipsubfile: amass_windows_amd64 解压的指定子目录
# source_name: amass.exe 下载后压缩包中文件的名称
# final_name: amass.exe 最终移动到的位置格式化为的文件名称,如果两者不相同,则move修改为final_name的名称,移动文件夹或者文件
# tool_main_filename: /gospider.exe 最终二进制文件或某个文件的名称,如果不存在,则说明没解压到对应目录或者没下载,用于下载的文件中包含一层文件夹的情况
# topath:
# - core/tools/domain/amass/ # 存储路径,整体使用的时候的存储路径
# - amass/ # 存储路径,单模块使用的时候的存储路径
# 由于有些工具比如amass gospider vulmap, 解压后下面还有一层目录,为了让最后工具目录结构为 core/tools/mukuai/toolname/toolname.exe
# eg core/tools/domain/amass/amass.exe,所以通过下面的source_name,final_name topath进行调整保证最终目录结构符合上述结构要求
# topath为解压到的工具目录,对于压缩包子目录下才是工具的情况,topath要往上一层,这样解压到目录的是子目录
# source_name为压缩包子目录或者下载的工具压缩包或二进制exe文件的名称,final_name为最终修改为的名称,使用rename修改名称
download:
domain:
amass:
toolname: amass
whetherdownload: True
link: https://github.com/OWASP/Amass/releases/download/v3.21.2/amass_windows_amd64.zip
downloadfile: amass.zip
# unzipsubfile: amass_windows_amd64
source_name: amass_windows_amd64/
final_name: amass/
tool_main_filename: amass.exe
topath:
- core/tools/domain/
- /
# - core/tools/domain/amass/
# - amass/
ksubdomain:
toolname: ksubdomain
whetherdownload: True
link: https://github.com/boy-hack/ksubdomain/releases/download/v1.9.5/KSubdomain-windows.tar
downloadfile: ksubdomain.tar
source_name: ksubdomain.exe
final_name: ksubdomain.exe
tool_main_filename: ksubdomain.exe
topath:
- core/tools/domain/ksubdomain/
- ksubdomain/
subfinder:
toolname: subfinder
whetherdownload: True
link: https://github.com/projectdiscovery/subfinder/releases/download/v2.5.3/subfinder_2.5.3_windows_amd64.zip
downloadfile: subfinder.zip
source_name: subfinder.exe
final_name: subfinder.exe
tool_main_filename: subfinder.exe
topath:
- core/tools/domain/subfinder/
- subfinder/
oneforall:
toolname: oneforall
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename: oneforall.py
topath:
- core/tools/domain/OneForAll/
- OneForAll/
ip2location:
toolname: ip2location
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/ip2location.zip?raw=true
downloadfile: ip2location.zip
source_name: ip2location.db
final_name: ip2location.db
tool_main_filename: ip2location.db
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
subnames_big:
# https://raw.githubusercontent.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z
toolname: subnames_big
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z?raw=true
downloadfile: subnames_big.7z
source_name: subnames_big.7z
final_name: subnames_big.7z
tool_main_filename: subnames_big.7z
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
ip2region:
toolname: ip2region
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/ip2region.db?raw=true
downloadfile: ip2region.db
source_name: ip2region.db
final_name: ip2region.db
tool_main_filename: ip2region.db
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
finger:
ehole:
toolname: ehole
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/finger/Ehole/
- Ehole/
httpx:
toolname: httpx
whetherdownload: True
link: https://github.com/projectdiscovery/httpx/releases/download/v1.2.4/httpx_1.2.4_windows_amd64.zip
downloadfile: httpx.zip
source_name: httpx.exe
final_name: httpx.exe
tool_main_filename: httpx.exe
topath:
- core/tools/finger/httpx/
- httpx/
webanalyze:
toolname: webanalyze
whetherdownload: True
link: https://github.com/rverton/webanalyze/releases/download/v0.3.8/webanalyze_0.3.8_Windows_x86_64.tar.gz
downloadfile: webanalyze.tar.gz
source_name: webanalyze.exe
final_name: webanalyze.exe
tool_main_filename: webanalyze.exe
topath:
- core/tools/finger/webanalyze/
- webanalyze/
portscan:
TxPortMap:
toolname: TxPortMap
whetherdownload: True
link: https://github.com/4dogs-cn/TXPortMap/releases/download/v1.1.2/TxPortMap_windows_x64.exe
downloadfile: TxPortMap.exe
source_name: TxPortMap.exe
final_name: TxPortMap.exe
tool_main_filename: TxPortMap.exe
topath:
- core/tools/portscan/TxPortMap/
- TxPortMap/
# 暂不使用
dismap:
toolname: dismap
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/portscan/dismap/
- dismap/
naabu:
toolname: naabu
whetherdownload: True
link: https://github.com/projectdiscovery/naabu/releases/download/v2.1.1/naabu_2.1.1_windows_amd64.zip
downloadfile: naabu.zip
source_name: naabu.exe
final_name: naabu.exe
tool_main_filename: naabu.exe
topath:
- core/tools/portscan/naabu/
- naabu/
sensitiveinfo:
chrome-win:
toolname: chrome-win
whetherdownload: True
link: https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win_x64/1051001/chrome-win.zip
downloadfile: chrome-win.zip
source_name: chrome-win/
final_name: chrome-win/
tool_main_filename: chrome.exe
topath:
- core/tools/sensitiveinfo/
- /
crawlergo:
toolname: crawlergo
whetherdownload: True
link: https://github.com/Qianlitp/crawlergo/releases/download/v0.4.4/crawlergo_win_amd64.exe
downloadfile: crawlergo.exe
source_name: crawlergo.exe
final_name: crawlergo.exe
tool_main_filename: crawlergo.exe
topath:
- core/tools/sensitiveinfo/crawlergo/
- crawlergo/
rad:
toolname: rad
whetherdownload: True
link: https://github.com/chaitin/rad/releases/download/0.4/rad_windows_amd64.exe.zip
downloadfile: rad.zip
source_name: rad_windows_amd64.exe
final_name: rad.exe
tool_main_filename: rad.exe
topath:
- core/tools/sensitiveinfo/rad/
- rad/
emailall:
# https://github.com/Taonn/EmailAll/archive/refs/heads/master.zip 修改过
toolname: emailall
whetherdownload: False
link:
downloadfile: emailall.zip
source_name:
final_name:
tool_main_filename: emailall.py
topath:
- core/tools/sensitiveinfo/emailall/
- emailall/
gospider:
toolname: gospider
whetherdownload: True
link: https://github.com/jaeles-project/gospider/releases/download/v1.1.6/gospider_v1.1.6_windows_x86_64.zip
downloadfile: gospider.zip
source_name: gospider_v1.1.6_windows_x86_64/
final_name: gospider/
tool_main_filename: gospider.exe
topath:
- core/tools/sensitiveinfo/
- /
# - core/tools/sensitiveinfo/gospider/
# - gospider/
hakrawler:
# 修改了加了-f参数
toolname: hakrawler
whetherdownload: True
link: https://github.com/komomon/hakrawler_plus/blob/main/hakrawler.exe?raw=true
downloadfile: hakrawler.exe
source_name: hakrawler.exe
final_name: hakrawler.exe
tool_main_filename: hakrawler.exe
topath:
- core/tools/sensitiveinfo/hakrawler/
- hakrawler/
dirsearch:
# zanbuyong,不移动 dirsearch-master/ /
toolname: dirsearch
whetherdownload: False
link: https://github.com/maurosoria/dirsearch/archive/refs/heads/master.zip
downloadfile: dirsearch.zip
source_name:
final_name:
tool_main_filename: dirsearch.py
topath:
- core/tools/sensitiveinfo/dirsearch/
- dirsearch/
gau:
toolname: gau
whetherdownload: True
link: https://github.com/lc/gau/releases/download/v2.1.2/gau_2.1.2_windows_amd64.zip
downloadfile: gau.zip
source_name: gau.exe
final_name: gau.exe
tool_main_filename: gau.exe
topath:
- core/tools/sensitiveinfo/gau/
- gau/
urlcollector:
toolname: urlcollector
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/sensitiveinfo/urlcollector/
- urlcollector/
URLFinder:
toolname: URLFinder
whetherdownload: True
link: https://github.com/pingc0y/URLFinder/blob/master/URLFinder-windows-amd64.exe?raw=true
downloadfile: URLFinder.exe
source_name: URLFinder.exe
final_name: URLFinder.exe
tool_main_filename: URLFinder.exe
topath:
- core/tools/sensitiveinfo/URLFinder/
- URLFinder/
vulscan:
afrog:
toolname: afrog
whetherdownload: True
link: https://github.com/zan8in/afrog/releases/download/v2.1.1/afrog_2.1.1_windows_amd64.zip
downloadfile: afrog.zip
source_name: afrog.exe
final_name: afrog.exe
tool_main_filename: afrog.exe
topath:
- core/tools/vulscan/afrog/
- afrog/
goon:
toolname: goon
whetherdownload: True
link: https://github.com/i11us0ry/goon/releases/download/v3.5/goon3_win_amd64.zip
downloadfile: goon.zip
source_name: goon3_win_amd64.exe
final_name: goon.exe
tool_main_filename: goon.exe
topath:
- core/tools/vulscan/goon/
- goon/
nuclei:
toolname: nuclei
whetherdownload: True
link: https://github.com/projectdiscovery/nuclei/releases/download/v2.8.3/nuclei_2.8.3_windows_amd64.zip
downloadfile: nuclei.zip
source_name: nuclei.exe
final_name: nuclei.exe
tool_main_filename: nuclei.exe
topath:
- core/tools/vulscan/nuclei/
- nuclei/
SweetBabyScan:
toolname: SweetBabyScan
whetherdownload: True
link: https://github.com/inbug-team/SweetBabyScan/releases/download/v0.1.0/SbScanAmd64.exe
downloadfile: SweetBabyScan.exe
# source_name: SbScanAmd64.exe
source_name: SweetBabyScan.exe
final_name: SweetBabyScan.exe
tool_main_filename: SweetBabyScan.exe
topath:
- core/tools/vulscan/SweetBabyScan/
- SweetBabyScan/
vulmap:
# py
toolname: vulmap
whetherdownload: True
link: https://github.com/zhzyker/vulmap/archive/refs/tags/v0.9.zip
downloadfile: vulmap.zip
source_name: vulmap-0.9/
final_name: vulmap/
tool_main_filename: vulmap.py
topath:
- core/tools/vulscan/
- /
# - core/tools/vulscan/vulmap/
# - vulmap/
vscan:
toolname: vscan
whetherdownload: True
link: https://github.com/veo/vscan/releases/download/v2.1.0/vscan_2.1.0_windows_amd64.zip
downloadfile: vscan.zip
source_name: vscan.exe
final_name: vscan.exe
tool_main_filename: vscan.exe
topath:
- core/tools/vulscan/vscan/
- vscan/
================================================
FILE: core/download/__init__.py
================================================
================================================
FILE: core/download/download_tools.py
================================================
import os
import sys
from pprint import pprint
import shutil
import tarfile
import threading
import time
import traceback
import zipfile
import py7zr
from pathlib import Path
import platform
import yaml
import requests
from loguru import logger
from concurrent.futures import ThreadPoolExecutor, ALL_COMPLETED, wait, as_completed
def get_system():
# global suffix
platform = sys.platform
if platform == 'win32':
return "windows"
elif "linux" in platform:
return "linux"
else:
print("get system type error")
exit(1)
def executor_callback(worker):
logger.info("called worker callback function")
worker_exception = worker.exception()
result = worker.result()
if worker_exception:
print(worker_exception)
# logger.exception("Worker return exception: {}".format(worker_exception))
if result:
print(result)
class Download:
def __init__(self, proxy=None):
# logger.info('检查是否已安装工具,如缺少将进行安装; tips: github网速可能不好,如下载频繁失败,建议百度云获取。')
self.download_path = "download_tmp"
self.proxy = proxy
self.tools_dict = {}
self.rootpath = os.getcwd()
self.pwd = os.path.dirname(os.path.abspath(__file__))
self.ostype = platform.system().lower()
self.suffix = ".exe" if "windows" == self.ostype else ""
self.executor = ThreadPoolExecutor(max_workers=5)
self.tools_installed = {}
self.getconfig()
if os.path.exists(self.download_path) is False:
os.makedirs(self.download_path)
for k in self.tools_dict.keys():
if self.tools_dict[k]['whetherdownload'] is True:
self.tools_installed[k] = False
def getconfig(self):
# ostype = platform.system().lower() #get_system()
toolsyaml_path = f"{self.rootpath}/config/tools_{self.ostype}.yaml"
# toolsyaml_path = "tools_linux.yaml"
if os.path.exists(toolsyaml_path):
with open(toolsyaml_path, 'r', encoding='utf-8') as f:
msg = yaml.load(f, Loader=yaml.FullLoader)['download']
classify = ['domain', 'finger', 'portscan', 'sensitiveinfo', 'vulscan']
# classify = ['portscan']
for i in classify:
self.tools_dict.update(msg[i])
# {'amass': {'link': 'https://github.com/OWASP/Amass/releases/download/v3.20.0/amass_windows_amd64.zip',
# 'toolname': 'amass',
# 'topath': ['core/tools/domain/amass/',
# 'amass/'],
# 'whetherdownload': True}
# pprint(self.tools_dict)
else:
logger.error(f"[-] not found {toolsyaml_path}")
logger.error("Exit!")
exit(1)
# 解压到指定目录
def unzipfile(self, filename, dirs="."):
# if os.path.splitext(filename)[1] == ".zip":
if os.path.exists(dirs) is False:
os.makedirs(dirs)
if zipfile.is_zipfile(filename):
zf = zipfile.ZipFile(filename, 'r')
zf.extractall(path=dirs)
zf.close()
logger.info(f"[+] unzip {filename} success.")
elif tarfile.is_tarfile(filename):
t = tarfile.open(filename)
t.extractall(path=dirs)
t.close()
logger.info(f"[+] untar {filename} success.")
# elif py7zr.is_7zfile(filename):
# with py7zr.SevenZipFile(filename, mode='r') as z:
# z.extractall(path=dirs)
# 其他后缀的直接cp过去
elif os.path.splitext(filename)[1] in ["", ".exe", ".db", ".7z"]:
shutil.copy(filename, dirs)
else:
logger.error(f"[-] unzip {filename} to {dirs}failed.")
return
def downloadfile(self, url, dst_file, dst_path='download'):
# dst_file = os.path.split(url)[1]
target_filename = f'{dst_path}/{dst_file}'
# if os.path.exists(dst_path) is False:
# os.makedirs(dst_path)
if os.path.exists(target_filename) is False:
try:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"}
proxies = {
'http': self.proxy,
'https': self.proxy
}
response = requests.get(url, headers=headers, proxies=proxies, stream=True)
# response = requests.get(url, headers=headers, stream=True)
handle = open(target_filename, "wb")
for chunk in response.iter_content(chunk_size=512):
if chunk: # filter out keep-alive new chunks
handle.write(chunk)
handle.close()
logger.info(f"[+] Download {dst_file} success.")
# self.unzipfile(target_filename,dst_path)
return target_filename
except Exception as e:
# print(e)
logger.error(e)
# logger.error(traceback.format_exc())
logger.error(f"[-] Download {dst_file} fail!")
return False
else:
logger.info(f"[*] {target_filename} already exists. Skip download.")
return target_filename
# def move(self,srcfile,dst_path):
# if os.path.exists(srcfile):
# if os.path.exists(dst_path):
# os.makedirs(dst_path)
# shutil.move(srcfile,dst_path)
def handle(self, toolinfo):
installflag = False
try:
if toolinfo['whetherdownload']:
# 判断工具是否已经存在对应目录,不存在则下载,如果有则不再下载解压和重命名
tool_filename = f"{toolinfo['topath'][0]}/{toolinfo['final_name']}"
# dis whether exist
if os.path.exists(tool_filename) is False:
installflag = True
else: # exists
# print("tool_filename:",tool_filename)
if os.path.isdir(tool_filename):
tool_filename = f"{toolinfo['topath'][0]}/{toolinfo['final_name']}/{toolinfo['tool_main_filename']}"
if os.path.exists(tool_filename) is False:
installflag = True
shutil.rmtree(f"{toolinfo['topath'][0]}/{toolinfo['final_name']}") # 如果存在则删除文件夹,否则不能rename
else:
installflag = False
else: # not dir
installflag = False
# installflag is True-> install tools
if installflag is True:
zip_path = self.downloadfile(url=toolinfo['link'], dst_file=toolinfo['downloadfile'],
dst_path=self.download_path)
time.sleep(2)
if zip_path:
# 检查最终目录是否存在最终的文件夹,如果有则不再解压和重命名
# if os.path.exists(f"{toolinfo['topath'][0]}/{toolinfo['final_name']}"):
self.unzipfile(filename=zip_path, dirs=toolinfo['topath'][0])
time.sleep(2)
if toolinfo['source_name'] != toolinfo['final_name']:
# shutil.move(f"{toolinfo['topath'][0]}/{toolinfo['source_name']}",f"{toolinfo['topath'][0]}/{toolinfo['final_name']}")
os.rename(f"{os.getcwd()}/{toolinfo['topath'][0]}/{toolinfo['source_name']}",
f"{os.getcwd()}/{toolinfo['topath'][0]}/{toolinfo['final_name']}")
# os.remove(f"{toolinfo['topath'][0]}/{toolinfo['source_name']}")
self.tools_installed[toolinfo['toolname']] = True
else:
self.tools_installed[toolinfo['toolname']] = True
logger.info(f"[*] {tool_filename} already exists. Skip download and unzip.")
# 赋权
if "linux" in sys.platform:
tool_filename = f"{toolinfo['topath'][0]}/{toolinfo['final_name']}"
if os.path.exists(tool_filename) is True:
if os.path.isdir(tool_filename):
tool_filename = f"{toolinfo['topath'][0]}/{toolinfo['final_name']}/{toolinfo['tool_main_filename']}"
if os.path.exists(tool_filename) is True:
os.system(f"chmod +x {tool_filename}")
logger.info(f"[+] chmod +x {tool_filename} success!")
else:
logger.error(f"[-] {tool_filename} non-existent, chmod +x {tool_filename} failed!")
else: # not dir
os.system(f"chmod +x {tool_filename}")
logger.info(f"[+] chmod +x {tool_filename} success!")
else:
logger.error(f"[-] {tool_filename} non-existent, chmod +x {tool_filename} failed!")
except KeyboardInterrupt:
return False
# 工具初始化
def tools_init(self):
if os.path.exists(f"core/tools/vulscan/vulmap/module/licenses"):
if os.path.exists(f"core/tools/vulscan/vulmap/module/licenses/licenses.txt") is False:
shutil.copy("config/supplementary_files/vulmap/licenses.txt",
"core/tools/vulscan/vulmap/module/licenses")
logger.info(f"[+] {self.rootpath}/core/tools/vulscan/vulmap/vulmap.py initialization is complete")
if os.path.exists(f"core/tools/vulscan/goon/goon{self.suffix}"):
os.system(os.path.realpath(f"{self.rootpath}/core/tools/vulscan/goon/goon{self.suffix}"))
logger.info(f"[+] {self.rootpath}/core/tools/vulscan/goon/goon{self.suffix} initialization is complete")
if os.path.exists(f"core/tools/vulscan/afrog/afrog{self.suffix}"):
os.system(f"{self.rootpath}/core/tools/vulscan/afrog/afrog{self.suffix}")
logger.info(f"[+] {self.rootpath}/core/tools/vulscan/afrog/afrog{self.suffix} initialization is complete")
# 可以捕获异常
def run(self):
flag = 0
all_task = [self.executor.submit(self.handle, tinfo) for tinfo in self.tools_dict.values()]
# done,notdone = wait(all_task, return_when=ALL_COMPLETED)
for future in as_completed(all_task):
try:
result = future.result()
except Exception as e:
logger.exception(f"ThreadPoolExecutor:\n{e}")
print(e)
# logger.error(f"ThreadPoolExecutor:\n{e}")
# else:
# print(result)
# time.sleep(5)
# 检查是否所有tools安装好了,否则退出
for k, v in self.tools_installed.items():
if v is False:
logger.error(f"[-] {k} install failed")
flag += 1
if flag != 0:
logger.error(f"[-] Please install tools that are not installed before using Komo")
exit()
else:
logger.info(f"\n[+] All tools are installed\n")
# 部分工具初始化
self.tools_init()
# pass,找的c+c终止的方法,不太好用https://www.jianshu.com/p/45e526c792c3
def run1(self):
flag = 0
all_task = [self.executor.submit(self.handle, tinfo) for tinfo in self.tools_dict.values()]
try:
while not list(reversed(all_task))[0].done(): # 判断最后一个任务是否取消/完成
# 代替 wait(threadPool, return_when=FIRST_EXCEPTION)
# 利用 while 堵塞且能够接收 KeyboardInterrupt 异常
time.sleep(2)
except KeyboardInterrupt:
# 接收 KeyboardInterrupt 并取消剩余线程任务
print('KeyboardInterrupt')
for task in reversed(all_task):
task.cancel()
# time.sleep(5)
# 检查是否所有tools安装好了,否则退出
for k, v in self.tools_installed.items():
if v is False:
logger.error(f"[-] {k} install failed")
flag += 1
if flag != 0:
logger.error(f"[-] Please install tools that are not installed before using Komo")
exit()
else:
logger.info(f"\n[+] All tools are installed\n")
def run2(self):
flag = 0
for tinfo in self.tools_dict.values():
self.handle(tinfo)
# all_task = [self.executor.submit(self.handle, tinfo) for tinfo in self.tools_dict.values()]
# done,notdone = wait(all_task, return_when=ALL_COMPLETED)
# time.sleep(5)
# 检查是否所有tools安装好了,否则退出
for k, v in self.tools_installed.items():
if v is False:
logger.error(f"[-] {k} install failed")
flag += 1
if flag != 0:
logger.error(f"[-] Please install tools that are not installed before using Komo")
exit()
else:
logger.info(f"\n[+] All tools are installed\n")
if __name__ == '__main__':
dd = Download()
dd.run()
================================================
FILE: core/download/tools.yaml
================================================
download:
domain:
amass:
toolname: amass
whetherdownload: True
link: https://github.com/OWASP/Amass/releases/download/v3.20.0/amass_windows_amd64.zip
downloadfile: amass.zip
# unzipsubfile: amass_windows_amd64
source_name: amass_windows_amd64/
final_name: amass/
tool_main_filename: amass.exe
topath:
- core/tools/domain/
- /
# - core/tools/domain/amass/
# - amass/
ksubdomain:
toolname: ksubdomain
whetherdownload: True
link: https://github.com/boy-hack/ksubdomain/releases/download/v1.9.5/KSubdomain-windows.tar
downloadfile: ksubdomain.tar
source_name: ksubdomain.exe
final_name: ksubdomain.exe
tool_main_filename: ksubdomain.exe
topath:
- core/tools/domain/ksubdomain/
- ksubdomain/
subfinder:
toolname: subfinder
whetherdownload: True
link: https://github.com/projectdiscovery/subfinder/releases/download/v2.5.3/subfinder_2.5.3_windows_amd64.zip
downloadfile: subfinder.zip
source_name: subfinder.exe
final_name: subfinder.exe
tool_main_filename: subfinder.exe
topath:
- core/tools/domain/subfinder/
- subfinder/
oneforall:
toolname: oneforall
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename: oneforall.py
topath:
- core/tools/domain/OneForAll/
- OneForAll/
ip2location:
toolname: ip2location
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/ip2location.zip?raw=true
downloadfile: ip2location.zip
source_name: ip2location.db
final_name: ip2location.db
tool_main_filename: ip2location.db
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
subnames_big:
# https://raw.githubusercontent.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z
toolname: subnames_big
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z?raw=true
downloadfile: subnames_big.7z
source_name: subnames_big.txt
final_name: subnames_big.txt
tool_main_filename: subnames_big.txt
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
ip2region:
toolname: ip2region
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/ip2region.db?raw=true
downloadfile: ip2region.db
source_name: ip2region.db
final_name: ip2region.db
tool_main_filename: ip2region.db
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
finger:
ehole:
toolname: ehole
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/finger/Ehole/
- Ehole/
httpx:
toolname: httpx
whetherdownload: True
link: https://github.com/projectdiscovery/httpx/releases/download/v1.2.4/httpx_1.2.4_windows_amd64.zip
downloadfile: httpx.zip
source_name: httpx.exe
final_name: httpx.exe
tool_main_filename: httpx.exe
topath:
- core/tools/finger/httpx/
- httpx/
webanalyze:
toolname: webanalyze
whetherdownload: True
link: https://github.com/rverton/webanalyze/releases/download/v0.3.7/webanalyze_0.3.7_Windows_x86_64.tar.gz
downloadfile: webanalyze.tar.gz
source_name: webanalyze.exe
final_name: webanalyze.exe
tool_main_filename: webanalyze.exe
topath:
- core/tools/finger/webanalyze/
- webanalyze/
portscan:
TxPortMap:
toolname: TxPortMap
whetherdownload: True
link: https://github.com/4dogs-cn/TXPortMap/releases/download/v1.1.2/TxPortMap_windows_x64.exe
downloadfile: TxPortMap.exe
source_name: TxPortMap.exe
final_name: TxPortMap.exe
tool_main_filename: TxPortMap.exe
topath:
- core/tools/portscan/TxPortMap/
- TxPortMap/
# 暂不使用
dismap:
toolname: dismap
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/portscan/dismap/
- dismap/
naabu:
toolname: naabu
whetherdownload: True
link: https://github.com/projectdiscovery/naabu/releases/download/v2.1.0/naabu_2.1.0_windows_amd64.zip
downloadfile: naabu.zip
source_name: naabu.exe
final_name: naabu.exe
tool_main_filename: naabu.exe
topath:
- core/tools/portscan/naabu/
- naabu/
sensitiveinfo:
chrome-win:
toolname: chrome-win
whetherdownload: True
link: https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win_x64/1051001/chrome-win.zip
downloadfile: chrome-win.zip
source_name: chrome-win/
final_name: chrome-win/
tool_main_filename: chrome.exe
topath:
- core/tools/sensitiveinfo/
- /
crawlergo:
toolname: crawlergo
whetherdownload: True
link: https://github.com/Qianlitp/crawlergo/releases/download/v0.4.3/crawlergo_windows_amd64.exe
downloadfile: crawlergo.exe
source_name: crawlergo.exe
final_name: crawlergo.exe
tool_main_filename: crawlergo.exe
topath:
- core/tools/sensitiveinfo/crawlergo/
- crawlergo/
rad:
toolname: rad
whetherdownload: True
link: https://github.com/chaitin/rad/releases/download/0.4/rad_windows_amd64.exe.zip
downloadfile: rad.zip
source_name: rad_windows_amd64.exe
final_name: rad.exe
tool_main_filename: rad.exe
topath:
- core/tools/sensitiveinfo/rad/
- rad/
emailall:
# https://github.com/Taonn/EmailAll/archive/refs/heads/master.zip 修改过
toolname: emailall
whetherdownload: False
link:
downloadfile: emailall.zip
source_name:
final_name:
tool_main_filename: emailall.py
topath:
- core/tools/sensitiveinfo/emailall/
- emailall/
gospider:
toolname: gospider
whetherdownload: True
link: https://github.com/jaeles-project/gospider/releases/download/v1.1.6/gospider_v1.1.6_windows_x86_64.zip
downloadfile: gospider.zip
source_name: gospider_v1.1.6_windows_x86_64/
final_name: gospider/
tool_main_filename: gospider.exe
topath:
- core/tools/sensitiveinfo/
- /
# - core/tools/sensitiveinfo/gospider/
# - gospider/
hakrawler:
# 修改了加了-f参数
toolname: hakrawler
whetherdownload: False
link:
downloadfile:
source_name: hakrawler.exe
final_name: hakrawler.exe
tool_main_filename: hakrawler.exe
topath:
- core/tools/sensitiveinfo/hakrawler/
- hakrawler/
dirsearch:
# zanbuyong,不移动 dirsearch-master/ /
toolname: dirsearch
whetherdownload: False
link: https://github.com/maurosoria/dirsearch/archive/refs/heads/master.zip
downloadfile: dirsearch.zip
source_name:
final_name:
tool_main_filename: dirsearch.py
topath:
- core/tools/sensitiveinfo/dirsearch/
- dirsearch/
gau:
toolname: gau
whetherdownload: True
link: https://github.com/lc/gau/releases/download/v2.1.2/gau_2.1.2_windows_amd64.zip
downloadfile: gau.zip
source_name: gau.exe
final_name: gau.exe
tool_main_filename: gau.exe
topath:
- core/tools/sensitiveinfo/gau/
- gau/
urlcollector:
toolname: urlcollector
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/sensitiveinfo/urlcollector/
- urlcollector/
URLFinder:
toolname: URLFinder
whetherdownload: True
link: https://github.com/pingc0y/URLFinder/blob/master/URLFinder-windows64.exe?raw=true
downloadfile: URLFinder.exe
source_name: URLFinder.exe
final_name: URLFinder.exe
tool_main_filename: URLFinder.exe
topath:
- core/tools/sensitiveinfo/URLFinder/
- URLFinder/
vulscan:
afrog:
toolname: afrog
whetherdownload: True
link: https://github.com/zan8in/afrog/releases/download/v1.3.7/afrog_win.zip
downloadfile: afrog.zip
source_name: afrog.exe
final_name: afrog.exe
tool_main_filename: afrog.exe
topath:
- core/tools/vulscan/afrog/
- afrog/
goon:
toolname: goon
whetherdownload: True
link: https://github.com/i11us0ry/goon/releases/download/v3.5/goon3_win_amd64.zip
downloadfile: goon.zip
source_name: goon3_win_amd64.exe
final_name: goon.exe
tool_main_filename: goon.exe
topath:
- core/tools/vulscan/goon/
- goon/
nuclei:
toolname: nuclei
whetherdownload: True
link: https://github.com/projectdiscovery/nuclei/releases/download/v2.7.7/nuclei_2.7.7_windows_amd64.zip
downloadfile: nuclei.zip
source_name: nuclei.exe
final_name: nuclei.exe
tool_main_filename: nuclei.exe
topath:
- core/tools/vulscan/nuclei/
- nuclei/
SweetBabyScan:
toolname: SweetBabyScan
whetherdownload: True
link: https://github.com/inbug-team/SweetBabyScan/releases/download/v0.1.0/SbScanAmd64.exe
downloadfile: SweetBabyScan.exe
# source_name: SbScanAmd64.exe
source_name: SweetBabyScan.exe
final_name: SweetBabyScan.exe
tool_main_filename: SweetBabyScan.exe
topath:
- core/tools/vulscan/SweetBabyScan/
- SweetBabyScan/
vulmap:
# py
toolname: vulmap
whetherdownload: True
link: https://github.com/zhzyker/vulmap/archive/refs/tags/v0.9.zip
downloadfile: vulmap.zip
source_name: vulmap-0.9/
final_name: vulmap/
tool_main_filename: vulmap.py
topath:
- core/tools/vulscan/
- /
# - core/tools/vulscan/vulmap/
# - vulmap/
vscan:
toolname: vscan
whetherdownload: True
link: https://github.com/veo/vscan/releases/download/v2.1.0/vscan_2.1.0_windows_amd64.zip
downloadfile: vscan.zip
source_name: vscan.exe
final_name: vscan.exe
tool_main_filename: vscan.exe
topath:
- core/tools/vulscan/vscan/
- vscan/
================================================
FILE: core/download/tools2.yaml
================================================
download:
domain:
amass:
toolname: amass
whetherdownload: True
link: https://github.com/OWASP/Amass/releases/download/v3.20.0/amass_windows_amd64.zip
source_name: amass.exe
final_name: amass.exe
topath:
- core/tools/domain/amass/
- amass/
ksubdomain:
toolname: ksubdomain
whetherdownload: True
link: https://github.com/boy-hack/ksubdomain/releases/download/v1.9.5/KSubdomain-windows.tar
source_name: ksubdomain.exe
final_name: ksubdomain.exe
topath:
- core/tools/domain/ksubdomain/
- ksubdomain/
subfinder:
toolname: subfinder
whetherdownload: True
link: https://github.com/projectdiscovery/subfinder/releases/download/v2.5.3/subfinder_2.5.3_windows_amd64.zip
source_name: subfinder.exe
final_name: subfinder.exe
topath:
- core/tools/domain/subfinder/
- subfinder/
oneforall:
toolname: oneforall
whetherdownload: False
link:
source_name:
final_name:
topath:
- core/tools/domain/oneforall/
- oneforall/
finger:
ehole:
toolname: ehole
whetherdownload: False
link:
source_name:
final_name:
topath:
- core/tools/finger/Ehole/
- Ehole/
httpx:
toolname: httpx
whetherdownload: True
link: https://github.com/projectdiscovery/httpx/releases/download/v1.2.4/httpx_1.2.4_windows_amd64.zip
source_name: httpx.exe
final_name: httpx.exe
topath:
- core/tools/finger/httpx/
- httpx/
webanalyze:
toolname: webanalyze
whetherdownload: True
link: https://github.com/rverton/webanalyze/releases/download/v0.3.7/webanalyze_0.3.7_Windows_x86_64.tar.gz
source_name: webanalyze.exe
final_name: webanalyze.exe
topath:
- core/tools/finger/webanalyze/
- webanalyze/
portscan:
# 暂不使用
dismap:
toolname: dismap
whetherdownload: False
link:
source_name:
final_name:
topath:
- core/tools/portscan/dismap/
- dismap/
naabu:
toolname: naabu
whetherdownload: True
link: https://github.com/projectdiscovery/naabu/releases/download/v2.1.0/naabu_2.1.0_windows_amd64.zip
source_name: naabu.exe
final_name: naabu.exe
topath:
- core/tools/portscan/naabu/
- naabu/
sensitiveinfo:
chrome-win:
toolname: chrome-win
whetherdownload: True
link: https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win_x64/1051001/chrome-win.zip
source_name:
final_name:
topath:
- core/tools/sensitiveinfo/chrome-win
- chrome-win/
crawlergo:
toolname: crawlergo
whetherdownload: True
link: https://github.com/Qianlitp/crawlergo/releases/download/v0.4.3/crawlergo_windows_amd64.exe
source_name: crawlergo_windows_amd64.exe
final_name: crawlergo.exe
topath:
- core/tools/sensitiveinfo/crawlergo/
- crawlergo/
emailall:
# https://github.com/Taonn/EmailAll/archive/refs/heads/master.zip 修改过
toolname: emailall
whetherdownload: False
link:
source_name:
final_name:
topath:
- core/tools/sensitiveinfo/emailall/
- emailall/
gospider:
toolname: gospider
whetherdownload: True
link: https://github.com/jaeles-project/gospider/releases/download/v1.1.6/gospider_v1.1.6_windows_x86_64.zip
source_name: gospider.exe
final_name: gospider.exe
topath:
- core/tools/sensitiveinfo/gospider/
- gospider/
hakrawler:
# 修改了加了-f参数
toolname: hakrawler
whetherdownload: False
link:
source_name: naabu.exe
final_name: naabu.exe
topath:
- core/tools/sensitiveinfo/hakrawler/
- hakrawler/
dirsearch:
# zanbuyong
toolname: dirsearch
whetherdownload: False
link: https://github.com/maurosoria/dirsearch/archive/refs/heads/master.zip
source_name:
final_name:
topath:
- core/tools/sensitiveinfo/dirsearch/
- dirsearch/
gau:
toolname: gau
whetherdownload: True
link: https://github.com/lc/gau/releases/download/v2.1.2/gau_2.1.2_windows_amd64.zip
source_name: gau.exe
final_name: gau.exe
topath:
- core/tools/sensitiveinfo/gau/
- gau/
urlcollector:
toolname: urlcollector
whetherdownload: False
link:
source_name:
final_name:
topath:
- core/tools/sensitiveinfo/urlcollector/
- urlcollector/
URLFinder:
toolname: URLFinder
whetherdownload: True
link: https://github.com/pingc0y/URLFinder/blob/master/URLFinder-windows64.exe?raw=true
source_name: URLFinder-windows64.exe
final_name: URLFinder.exe
topath:
- core/tools/sensitiveinfo/URLFinder/
- URLFinder/
vulscan:
afrog:
toolname: afrog
whetherdownload: True
link: https://github.com/zan8in/afrog/releases/download/v1.3.7/afrog_win.zip
source_name: afrog.exe
final_name: afrog.exe
topath:
- core/tools/vulscan/afrog/
- afrog/
goon:
toolname: goon
whetherdownload: True
link: https://github.com/i11us0ry/goon/releases/download/v3.5/goon3_win_amd64.zip
source_name: goon3_win_amd64.exe
final_name: goon.exe
topath:
- core/tools/vulscan/goon/
- goon/
nuclei:
toolname: nuclei
whetherdownload: True
link: https://github.com/projectdiscovery/nuclei/releases/download/v2.7.7/nuclei_2.7.7_windows_amd64.zip
source_name: nuclei.exe
final_name: nuclei.exe
topath:
- core/tools/vulscan/nuclei/
- nuclei/
SweetBabyScan:
toolname: SweetBabyScan
whetherdownload: True
link: https://github.com/inbug-team/SweetBabyScan/releases/download/v0.1.0/SbScanAmd64.exe
source_name: SbScanAmd64.exe
final_name: SweetBabyScan.exe
topath:
- core/tools/vulscan/SweetBabyScan/
- SweetBabyScan/
vscan:
toolname: vscan
whetherdownload: True
link: https://github.com/veo/vscan/releases/download/v2.1.0/vscan_2.1.0_windows_amd64.zip
source_name: vscan.exe
final_name: vscan.exe
topath:
- core/tools/vulscan/vscan/
- vscan/
vulmap:
# py
toolname: vulmap
whetherdownload: True
link: https://github.com/zhzyker/vulmap/archive/refs/tags/v0.9.zip
source_name:
final_name:
topath:
- core/tools/vulscan/vulmap/
- vulmap/
================================================
FILE: core/download/tools_linux.yaml
================================================
# amass:
# toolname: amass gongjvname
# whetherdownload: True 是否下载
# link: https://github.com/OWASP/Amass/releases/download/v3.20.0/amass_windows_amd64.zip 二进制文件路径
# downloadfile: amass.zip 下载后存储的文件exe或zip或.tar.gz 的文件名和后缀
# unzipsubfile: amass_windows_amd64 解压的指定子目录
# source_name: amass.exe 下载后压缩包中文件的名称
# final_name: amass.exe 最终移动到的位置格式化为的文件名称,如果两者不相同,则move修改为final_name的名称,移动文件夹或者文件
# tool_main_filename: /gospider.exe 最终二进制文件或某个文件的名称,如果不存在,则说明没解压到对应目录或者没下载,用于下载的文件中包含一层文件夹的情况
# topath:
# - core/tools/domain/amass/ # 存储路径,整体使用的时候的存储路径
# - amass/ # 存储路径,单模块使用的时候的存储路径
# 由于有些工具比如amass gospider vulmap, 解压后下面还有一层目录,为了让最后工具目录结构为 core/tools/mukuai/toolname/toolname.exe
# eg core/tools/domain/amass/amass.exe,所以通过下面的source_name,final_name topath进行调整保证最终目录结构符合上述结构要求
# topath为解压到的工具目录,对于压缩包子目录下才是工具的情况,topath要往上一层,这样解压到目录的是子目录
# source_name为压缩包子目录或者下载的工具压缩包或二进制exe文件的名称,final_name为最终修改为的名称,使用rename修改名称
download:
domain:
amass:
toolname: amass
whetherdownload: True
link: https://github.com/OWASP/Amass/releases/download/v3.21.2/amass_linux_amd64.zip
downloadfile: amass.zip
# unzipsubfile: amass_windows_amd64
source_name: amass_linux_amd64/
final_name: amass/
tool_main_filename: amass
topath:
- core/tools/domain/
- /
# - core/tools/domain/amass/
# - amass/
ksubdomain:
toolname: ksubdomain
whetherdownload: True
link: https://github.com/boy-hack/ksubdomain/releases/download/v1.9.5/KSubdomain-v1.9.5-linux.tar
downloadfile: ksubdomain.tar
source_name: ksubdomain
final_name: ksubdomain
tool_main_filename: ksubdomain
topath:
- core/tools/domain/ksubdomain/
- ksubdomain/
subfinder:
toolname: subfinder
whetherdownload: True
link: https://github.com/projectdiscovery/subfinder/releases/download/v2.5.5/subfinder_2.5.5_linux_amd64.zip
downloadfile: subfinder.zip
source_name: subfinder
final_name: subfinder
tool_main_filename: subfinder
topath:
- core/tools/domain/subfinder/
- subfinder/
oneforall:
toolname: oneforall
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename: oneforall.py
topath:
- core/tools/domain/OneForAll/
- OneForAll/
ip2location:
toolname: ip2location
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/ip2location.zip?raw=true
downloadfile: ip2location.zip
source_name: ip2location.db
final_name: ip2location.db
tool_main_filename: ip2location.db
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
subnames_big:
# https://raw.githubusercontent.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z
toolname: subnames_big
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z?raw=true
downloadfile: subnames_big.7z
source_name: subnames_big.7z
final_name: subnames_big.7z
tool_main_filename: subnames_big.7z
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
ip2region:
toolname: ip2region
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/ip2region.db?raw=true
downloadfile: ip2region.db
source_name: ip2region.db
final_name: ip2region.db
tool_main_filename: ip2region.db
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
finger:
ehole:
toolname: ehole
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/finger/Ehole/
- Ehole/
httpx:
toolname: httpx
whetherdownload: True
link: https://github.com/projectdiscovery/httpx/releases/download/v1.2.4/httpx_1.2.4_linux_amd64.zip
downloadfile: httpx.zip
source_name: httpx
final_name: httpx
tool_main_filename: httpx
topath:
- core/tools/finger/httpx/
- httpx/
webanalyze:
toolname: webanalyze
whetherdownload: True
link: https://github.com/rverton/webanalyze/releases/download/v0.3.8/webanalyze_0.3.8_Linux_x86_64.tar.gz
downloadfile: webanalyze.tar.gz
source_name: webanalyze
final_name: webanalyze
tool_main_filename: webanalyze
topath:
- core/tools/finger/webanalyze/
- webanalyze/
portscan:
TxPortMap:
toolname: TxPortMap
whetherdownload: True
link: https://github.com/4dogs-cn/TXPortMap/releases/download/v1.1.2/TxPortMap_linux_x64
downloadfile: TxPortMap
source_name: TxPortMap
final_name: TxPortMap
tool_main_filename: TxPortMap
topath:
- core/tools/portscan/TxPortMap/
- TxPortMap/
# 暂不使用
dismap:
toolname: dismap
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/portscan/dismap/
- dismap/
naabu:
toolname: naabu
whetherdownload: True
link: https://github.com/projectdiscovery/naabu/releases/download/v2.1.1/naabu_2.1.1_linux_amd64.zip
downloadfile: naabu.zip
source_name: naabu
final_name: naabu
tool_main_filename: naabu
topath:
- core/tools/portscan/naabu/
- naabu/
sensitiveinfo:
chrome-linux:
toolname: chrome-linux
whetherdownload: True
link: https://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/1086242/chrome-linux.zip
downloadfile: chrome-linux.zip
source_name: chrome-linux/
final_name: chrome-linux/
tool_main_filename: chrome
topath:
- core/tools/sensitiveinfo/
- /
crawlergo:
toolname: crawlergo
whetherdownload: True
link: https://github.com/Qianlitp/crawlergo/releases/download/v0.4.4/crawlergo_linux_amd64
downloadfile: crawlergo
source_name: crawlergo
final_name: crawlergo
tool_main_filename: crawlergo
topath:
- core/tools/sensitiveinfo/crawlergo/
- crawlergo/
rad:
toolname: rad
whetherdownload: True
link: https://github.com/chaitin/rad/releases/download/0.4/rad_linux_amd64.zip
downloadfile: rad.zip
source_name: rad_linux_amd64
final_name: rad
tool_main_filename: rad
topath:
- core/tools/sensitiveinfo/rad/
- rad/
emailall:
# https://github.com/Taonn/EmailAll/archive/refs/heads/master.zip 修改过
toolname: emailall
whetherdownload: False
link:
downloadfile: emailall.zip
source_name:
final_name:
tool_main_filename: emailall.py
topath:
- core/tools/sensitiveinfo/emailall/
- emailall/
gospider:
toolname: gospider
whetherdownload: True
link: https://github.com/jaeles-project/gospider/releases/download/v1.1.6/gospider_v1.1.6_linux_x86_64.zip
downloadfile: gospider.zip
source_name: gospider_v1.1.6_linux_x86_64/
final_name: gospider/
tool_main_filename: gospider
topath:
- core/tools/sensitiveinfo/
- /
# - core/tools/sensitiveinfo/gospider/
# - gospider/
hakrawler:
# 修改了加了-f参数
toolname: hakrawler
whetherdownload: True
link: https://github.com/komomon/hakrawler_plus/blob/main/hakrawler?raw=true
downloadfile: hakrawler
source_name: hakrawler
final_name: hakrawler
tool_main_filename: hakrawler
topath:
- core/tools/sensitiveinfo/hakrawler/
- hakrawler/
dirsearch:
# zanbuyong,不移动 dirsearch-master/ /
toolname: dirsearch
whetherdownload: False
link: https://github.com/maurosoria/dirsearch/archive/refs/heads/master.zip
downloadfile: dirsearch.zip
source_name:
final_name:
tool_main_filename: dirsearch.py
topath:
- core/tools/sensitiveinfo/dirsearch/
- dirsearch/
gau:
toolname: gau
whetherdownload: True
link: https://github.com/lc/gau/releases/download/v2.1.2/gau_2.1.2_linux_amd64.tar.gz
downloadfile: gau.tar.gz
source_name: gau
final_name: gau
tool_main_filename: gau
topath:
- core/tools/sensitiveinfo/gau/
- gau/
urlcollector:
toolname: urlcollector
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/sensitiveinfo/urlcollector/
- urlcollector/
URLFinder:
toolname: URLFinder
whetherdownload: True
link: https://github.com/pingc0y/URLFinder/blob/master/URLFinder-linux-amd64?raw=true
downloadfile: URLFinder
source_name: URLFinder
final_name: URLFinder
tool_main_filename: URLFinder
topath:
- core/tools/sensitiveinfo/URLFinder/
- URLFinder/
vulscan:
afrog:
toolname: afrog
whetherdownload: True
link: https://github.com/zan8in/afrog/releases/download/v2.1.1/afrog_2.1.1_linux_amd64.zip
downloadfile: afrog.zip
source_name: afrog
final_name: afrog
tool_main_filename: afrog
topath:
- core/tools/vulscan/afrog/
- afrog/
goon:
toolname: goon
whetherdownload: True
link: https://github.com/i11us0ry/goon/releases/download/v3.5/goon3_lin_amd64.zip
downloadfile: goon.zip
source_name: goon3_lin_amd64
final_name: goon
tool_main_filename: goon
topath:
- core/tools/vulscan/goon/
- goon/
nuclei:
toolname: nuclei
whetherdownload: True
link: https://github.com/projectdiscovery/nuclei/releases/download/v2.8.3/nuclei_2.8.3_linux_amd64.zip
downloadfile: nuclei.zip
source_name: nuclei
final_name: nuclei
tool_main_filename: nuclei
topath:
- core/tools/vulscan/nuclei/
- nuclei/
SweetBabyScan:
toolname: SweetBabyScan
whetherdownload: True
link: https://github.com/inbug-team/SweetBabyScan/releases/download/v0.1.0/SbScanLinuxAmd64
downloadfile: SweetBabyScan
# source_name: SbScanAmd64.exe
source_name: SweetBabyScan
final_name: SweetBabyScan
tool_main_filename: SweetBabyScan
topath:
- core/tools/vulscan/SweetBabyScan/
- SweetBabyScan/
vulmap:
# py
toolname: vulmap
whetherdownload: True
link: https://github.com/zhzyker/vulmap/archive/refs/tags/v0.9.zip
downloadfile: vulmap.zip
source_name: vulmap-0.9/
final_name: vulmap/
tool_main_filename: vulmap.py
topath:
- core/tools/vulscan/
- /
# - core/tools/vulscan/vulmap/
# - vulmap/
vscan:
toolname: vscan
whetherdownload: True
link: https://github.com/veo/vscan/releases/download/v2.1.0/vscan_2.1.0_linux_amd64.zip
downloadfile: vscan.zip
source_name: vscan
final_name: vscan
tool_main_filename: vscan
topath:
- core/tools/vulscan/vscan/
- vscan/
================================================
FILE: core/download/tools_windows.yaml
================================================
# amass:
# toolname: amass gongjvname
# whetherdownload: True 是否下载
# link: https://github.com/OWASP/Amass/releases/download/v3.20.0/amass_windows_amd64.zip 二进制文件路径
# downloadfile: amass.zip 下载后存储的文件exe或zip或.tar.gz 的文件名和后缀
# unzipsubfile: amass_windows_amd64 解压的指定子目录
# source_name: amass.exe 下载后压缩包中文件的名称
# final_name: amass.exe 最终移动到的位置格式化为的文件名称,如果两者不相同,则move修改为final_name的名称,移动文件夹或者文件
# tool_main_filename: /gospider.exe 最终二进制文件或某个文件的名称,如果不存在,则说明没解压到对应目录或者没下载,用于下载的文件中包含一层文件夹的情况
# topath:
# - core/tools/domain/amass/ # 存储路径,整体使用的时候的存储路径
# - amass/ # 存储路径,单模块使用的时候的存储路径
# 由于有些工具比如amass gospider vulmap, 解压后下面还有一层目录,为了让最后工具目录结构为 core/tools/mukuai/toolname/toolname.exe
# eg core/tools/domain/amass/amass.exe,所以通过下面的source_name,final_name topath进行调整保证最终目录结构符合上述结构要求
# topath为解压到的工具目录,对于压缩包子目录下才是工具的情况,topath要往上一层,这样解压到目录的是子目录
# source_name为压缩包子目录或者下载的工具压缩包或二进制exe文件的名称,final_name为最终修改为的名称,使用rename修改名称
download:
domain:
amass:
toolname: amass
whetherdownload: True
link: https://github.com/OWASP/Amass/releases/download/v3.21.2/amass_windows_amd64.zip
downloadfile: amass.zip
# unzipsubfile: amass_windows_amd64
source_name: amass_windows_amd64/
final_name: amass/
tool_main_filename: amass.exe
topath:
- core/tools/domain/
- /
# - core/tools/domain/amass/
# - amass/
ksubdomain:
toolname: ksubdomain
whetherdownload: True
link: https://github.com/boy-hack/ksubdomain/releases/download/v1.9.5/KSubdomain-windows.tar
downloadfile: ksubdomain.tar
source_name: ksubdomain.exe
final_name: ksubdomain.exe
tool_main_filename: ksubdomain.exe
topath:
- core/tools/domain/ksubdomain/
- ksubdomain/
subfinder:
toolname: subfinder
whetherdownload: True
link: https://github.com/projectdiscovery/subfinder/releases/download/v2.5.3/subfinder_2.5.3_windows_amd64.zip
downloadfile: subfinder.zip
source_name: subfinder.exe
final_name: subfinder.exe
tool_main_filename: subfinder.exe
topath:
- core/tools/domain/subfinder/
- subfinder/
oneforall:
toolname: oneforall
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename: oneforall.py
topath:
- core/tools/domain/OneForAll/
- OneForAll/
ip2location:
toolname: ip2location
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/ip2location.zip?raw=true
downloadfile: ip2location.zip
source_name: ip2location.db
final_name: ip2location.db
tool_main_filename: ip2location.db
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
subnames_big:
# https://raw.githubusercontent.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z
toolname: subnames_big
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/subnames_big.7z?raw=true
downloadfile: subnames_big.7z
source_name: subnames_big.7z
final_name: subnames_big.7z
tool_main_filename: subnames_big.7z
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
ip2region:
toolname: ip2region
whetherdownload: True
link: https://github.com/shmilylty/OneForAll/blob/master/data/ip2region.db?raw=true
downloadfile: ip2region.db
source_name: ip2region.db
final_name: ip2region.db
tool_main_filename: ip2region.db
topath:
- core/tools/domain/OneForAll/data/
- OneForAll/data/
finger:
ehole:
toolname: ehole
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/finger/Ehole/
- Ehole/
httpx:
toolname: httpx
whetherdownload: True
link: https://github.com/projectdiscovery/httpx/releases/download/v1.2.4/httpx_1.2.4_windows_amd64.zip
downloadfile: httpx.zip
source_name: httpx.exe
final_name: httpx.exe
tool_main_filename: httpx.exe
topath:
- core/tools/finger/httpx/
- httpx/
webanalyze:
toolname: webanalyze
whetherdownload: True
link: https://github.com/rverton/webanalyze/releases/download/v0.3.8/webanalyze_0.3.8_Windows_x86_64.tar.gz
downloadfile: webanalyze.tar.gz
source_name: webanalyze.exe
final_name: webanalyze.exe
tool_main_filename: webanalyze.exe
topath:
- core/tools/finger/webanalyze/
- webanalyze/
portscan:
TxPortMap:
toolname: TxPortMap
whetherdownload: True
link: https://github.com/4dogs-cn/TXPortMap/releases/download/v1.1.2/TxPortMap_windows_x64.exe
downloadfile: TxPortMap.exe
source_name: TxPortMap.exe
final_name: TxPortMap.exe
tool_main_filename: TxPortMap.exe
topath:
- core/tools/portscan/TxPortMap/
- TxPortMap/
# 暂不使用
dismap:
toolname: dismap
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/portscan/dismap/
- dismap/
naabu:
toolname: naabu
whetherdownload: True
link: https://github.com/projectdiscovery/naabu/releases/download/v2.1.1/naabu_2.1.1_windows_amd64.zip
downloadfile: naabu.zip
source_name: naabu.exe
final_name: naabu.exe
tool_main_filename: naabu.exe
topath:
- core/tools/portscan/naabu/
- naabu/
sensitiveinfo:
chrome-win:
toolname: chrome-win
whetherdownload: True
link: https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win_x64/1051001/chrome-win.zip
downloadfile: chrome-win.zip
source_name: chrome-win/
final_name: chrome-win/
tool_main_filename: chrome.exe
topath:
- core/tools/sensitiveinfo/
- /
crawlergo:
toolname: crawlergo
whetherdownload: True
link: https://github.com/Qianlitp/crawlergo/releases/download/v0.4.4/crawlergo_win_amd64.exe
downloadfile: crawlergo.exe
source_name: crawlergo.exe
final_name: crawlergo.exe
tool_main_filename: crawlergo.exe
topath:
- core/tools/sensitiveinfo/crawlergo/
- crawlergo/
rad:
toolname: rad
whetherdownload: True
link: https://github.com/chaitin/rad/releases/download/0.4/rad_windows_amd64.exe.zip
downloadfile: rad.zip
source_name: rad_windows_amd64.exe
final_name: rad.exe
tool_main_filename: rad.exe
topath:
- core/tools/sensitiveinfo/rad/
- rad/
emailall:
# https://github.com/Taonn/EmailAll/archive/refs/heads/master.zip 修改过
toolname: emailall
whetherdownload: False
link:
downloadfile: emailall.zip
source_name:
final_name:
tool_main_filename: emailall.py
topath:
- core/tools/sensitiveinfo/emailall/
- emailall/
gospider:
toolname: gospider
whetherdownload: True
link: https://github.com/jaeles-project/gospider/releases/download/v1.1.6/gospider_v1.1.6_windows_x86_64.zip
downloadfile: gospider.zip
source_name: gospider_v1.1.6_windows_x86_64/
final_name: gospider/
tool_main_filename: gospider.exe
topath:
- core/tools/sensitiveinfo/
- /
# - core/tools/sensitiveinfo/gospider/
# - gospider/
hakrawler:
# 修改了加了-f参数
toolname: hakrawler
whetherdownload: True
link: https://github.com/komomon/hakrawler_plus/blob/main/hakrawler.exe?raw=true
downloadfile: hakrawler.exe
source_name: hakrawler.exe
final_name: hakrawler.exe
tool_main_filename: hakrawler.exe
topath:
- core/tools/sensitiveinfo/hakrawler/
- hakrawler/
dirsearch:
# zanbuyong,不移动 dirsearch-master/ /
toolname: dirsearch
whetherdownload: False
link: https://github.com/maurosoria/dirsearch/archive/refs/heads/master.zip
downloadfile: dirsearch.zip
source_name:
final_name:
tool_main_filename: dirsearch.py
topath:
- core/tools/sensitiveinfo/dirsearch/
- dirsearch/
gau:
toolname: gau
whetherdownload: True
link: https://github.com/lc/gau/releases/download/v2.1.2/gau_2.1.2_windows_amd64.zip
downloadfile: gau.zip
source_name: gau.exe
final_name: gau.exe
tool_main_filename: gau.exe
topath:
- core/tools/sensitiveinfo/gau/
- gau/
urlcollector:
toolname: urlcollector
whetherdownload: False
link:
downloadfile:
source_name:
final_name:
tool_main_filename:
topath:
- core/tools/sensitiveinfo/urlcollector/
- urlcollector/
URLFinder:
toolname: URLFinder
whetherdownload: True
link: https://github.com/pingc0y/URLFinder/blob/master/URLFinder-windows-amd64.exe?raw=true
downloadfile: URLFinder.exe
source_name: URLFinder.exe
final_name: URLFinder.exe
tool_main_filename: URLFinder.exe
topath:
- core/tools/sensitiveinfo/URLFinder/
- URLFinder/
vulscan:
afrog:
toolname: afrog
whetherdownload: True
link: https://github.com/zan8in/afrog/releases/download/v2.1.1/afrog_2.1.1_windows_amd64.zip
downloadfile: afrog.zip
source_name: afrog.exe
final_name: afrog.exe
tool_main_filename: afrog.exe
topath:
- core/tools/vulscan/afrog/
- afrog/
goon:
toolname: goon
whetherdownload: True
link: https://github.com/i11us0ry/goon/releases/download/v3.5/goon3_win_amd64.zip
downloadfile: goon.zip
source_name: goon3_win_amd64.exe
final_name: goon.exe
tool_main_filename: goon.exe
topath:
- core/tools/vulscan/goon/
- goon/
nuclei:
toolname: nuclei
whetherdownload: True
link: https://github.com/projectdiscovery/nuclei/releases/download/v2.8.3/nuclei_2.8.3_windows_amd64.zip
downloadfile: nuclei.zip
source_name: nuclei.exe
final_name: nuclei.exe
tool_main_filename: nuclei.exe
topath:
- core/tools/vulscan/nuclei/
- nuclei/
SweetBabyScan:
toolname: SweetBabyScan
whetherdownload: True
link: https://github.com/inbug-team/SweetBabyScan/releases/download/v0.1.0/SbScanAmd64.exe
downloadfile: SweetBabyScan.exe
# source_name: SbScanAmd64.exe
source_name: SweetBabyScan.exe
final_name: SweetBabyScan.exe
tool_main_filename: SweetBabyScan.exe
topath:
- core/tools/vulscan/SweetBabyScan/
- SweetBabyScan/
vulmap:
# py
toolname: vulmap
whetherdownload: True
link: https://github.com/zhzyker/vulmap/archive/refs/tags/v0.9.zip
downloadfile: vulmap.zip
source_name: vulmap-0.9/
final_name: vulmap/
tool_main_filename: vulmap.py
topath:
- core/tools/vulscan/
- /
# - core/tools/vulscan/vulmap/
# - vulmap/
vscan:
toolname: vscan
whetherdownload: True
link: https://github.com/veo/vscan/releases/download/v2.1.0/vscan_2.1.0_windows_amd64.zip
downloadfile: vscan.zip
source_name: vscan.exe
final_name: vscan.exe
tool_main_filename: vscan.exe
topath:
- core/tools/vulscan/vscan/
- vscan/
================================================
FILE: core/tools/domain/OneForAll/.github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Please use this English template to submit Bug
about: "Be sure to submit the Bug according to the template\U0001F64F"
title: Please fill in the BUG title
labels: bug
assignees: shmilylty
---
**Whether the latest code is used**
Yes or no (if not, try to clone the latest code and run again!)
**Bug description**
Clear and concise Bug description(required)
**Operation environment**
- System information: [e.g. Windows 10 x64] (required)
- Python version: [e.g. 3.7.1] (required)
- OneForAll version: [e.g. 0.3.0] (required)
**How to reproduce**
1. Step (optional)
2. Command (required)
**Error text**
Copy the complete error text (required)
**Expected results**
A clear and concise description of the expected results (optional, such as what a normal situation should look like)
**Actual results**
A clear and concise description of the actual results (optional, such as any errors)
**Screenshot**
Screenshot of complete OneForAll execution process (recommended upload)
**Log upload**
Upload oneforall.log files (it is recommended to upload logs in case of complex problems)
**Supplementary information**
Some other supplementary notes about bug
================================================
FILE: core/tools/domain/OneForAll/.github/ISSUE_TEMPLATE/bug_report_zh.md
================================================
---
name: 请使用这个中文模板提交Bug
about: "请务必按照模板提交Bug\U0001F64F"
title: 请填写BUG标题
labels: bug
assignees: shmilylty
---
**是否使用了最新代码**
是或否(如果不是的话尝试克隆最新的代码再跑一下!)
**Bug描述**
清晰而简洁的Bug描述(必写)
**运行环境**
- 系统:[例如Windows 10 x64](必写)
- Python版本:[例如3.7.1](必写)
- OneForAll版本:[例如0.3.0](必写)
**如何复现**
复现步骤(选写)
复现命令(必写)
**报错文本**
复制完整的报错文本(必写)
**预期结果**
清晰而简洁的预期结果描述(选写,如正常情况应该是怎么样的)
**实际结果**
清晰而简洁的实际结果描述(选写,如出现什么错误)
**屏幕截图**
完整OneForAll执行流程截图(建议上传)
**日志上传**
上传oneforall.log日志文件(复杂问题建议上传)
**其他补充**
关于bug的其他一些补充说明
================================================
FILE: core/tools/domain/OneForAll/.github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: core/tools/domain/OneForAll/.github/workflows/test.yml
================================================
name: OneForAll test
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up Python 3.8
uses: actions/setup-python@v1
with:
python-version: 3.8
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install uvloop
pip install -r requirements.txt
- name: Lint with flake8
run: |
pip install flake8
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
# - name: Test with pytest
# run: |
# pip install pytest
# pytest
- name: Test with example
run: |
pip install coverage
coverage run test.py
================================================
FILE: core/tools/domain/OneForAll/.gitignore
================================================
# Created by https://www.gitignore.io/api/python,windows,pycharm
# Edit at https://www.gitignore.io/?templates=python,windows,pycharm
### PyCharm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### PyCharm Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr
# Sonarlint plugin
.idea/sonarlint
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
### Windows ###
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# End of https://www.gitignore.io/api/python,windows,pycharm
================================================
FILE: core/tools/domain/OneForAll/.travis.yml
================================================
notifications:
email: false
language: python
jobs:
include:
- name: "Python 3.6 on Linux"
os: linux
dist: xenial
python: 3.6 # this works for Linux but is ignored on macOS or Windows
before_install:
- pip3 install -U pip
- name: "Python 3.7 on Xenial Linux"
os: linux
dist: xenial # required for Python >= 3.7
python: 3.7 # this works for Linux but is ignored on macOS or Windows
before_install:
- pip3 install -U pip
- name: "Python 3.8 on Xenial Linux"
os: linux
dist: xenial # required for Python >= 3.7
python: 3.8 # this works for Linux but is ignored on macOS or Windows
before_install:
- pip3 install -U pip
- name: "Python 3.9 on Xenial Linux"
os: linux
dist: xenial # required for Python >= 3.7
python: 3.9-dev # this works for Linux but is ignored on macOS or Windows
before_install:
- pip3 install -U pip
- name: "Python 3.6 on MacOS"
os: osx
osx_image: xcode9.4 # Python 3.6 running on macOS 10.13
language: shell # 'language: python' is an error on Travis CI macOS
before_install:
- python3 --version
- pip3 install -U pip
- name: "Python 3.7 on MacOS"
os: osx
osx_image: xcode10.2 # Python 3.7 running on macOS 10.14
language: shell # 'language: python' is an error on Travis CI macOS
before_install:
- python3 --version
- pip3 install -U pip
- name: "Python 3.8 on MacOS"
os: osx
osx_image: xcode12.2 # Python 3.7 running on macOS 10.15
language: shell # 'language: python' is an error on Travis CI macOS
before_install:
- python3 --version
- pip3 install -U pip
- name: "Python 3.6 on Windows"
os: windows
language: shell
before_install:
- choco install python --version 3.6.1
- python -m pip install --upgrade pip
- chcp.com 65001
env:
- PATH=/c/Python36:/c/Python36/Scripts:$PATH
- PYTHONIOENCODING=UTF-8
- name: "Python 3.7 on Windows"
os: windows
language: shell
before_install:
- choco install python --version 3.7.0
- python -m pip install --upgrade pip
- chcp.com 65001
env:
- PATH=/c/Python37:/c/Python37/Scripts:$PATH
- PYTHONIOENCODING=UTF-8
- name: "Python 3.8 on Windows"
os: windows # Windows 10.0.17134 N/A Build 17134
language: shell
before_install:
- choco install python --version 3.8.0
- python -m pip install --upgrade pip
- chcp.com 65001
env:
- PATH=/c/Python38:/c/Python38/Scripts:$PATH
- PYTHONIOENCODING=UTF-8
- name: "Python 3.9 on Windows"
os: windows # Windows 10.0.17134 N/A Build 17134
language: shell
before_install:
- choco install python --version 3.9.0
- python -m pip install --upgrade pip
- chcp.com 65001
env:
- PATH=/c/Python39:/c/Python39/Scripts:$PATH
- PYTHONIOENCODING=UTF-8
install:
- pip3 install codecov
- pip3 install -r requirements.txt
script:
- coverage run test.py
after_success:
- codecov
================================================
FILE: core/tools/domain/OneForAll/Dockerfile
================================================
FROM python:3.8-alpine3.10
MAINTAINER milktea@vmoe.info
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update && apk --no-cache add git build-base libffi-dev libxml2-dev libxslt-dev libressl-dev
ADD requirements.txt /requirements.txt
RUN pip install uvloop -i https://mirrors.aliyun.com/pypi/simple/
RUN pip install -r /requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
RUN git clone https://github.com/blechschmidt/massdns
WORKDIR /massdns
RUN make
ADD . /OneForAll/
RUN mv /massdns/bin/massdns /OneForAll/thirdparty/massdns/massdns_linux_x86_64
RUN mkdir /OneForAll/results
WORKDIR /OneForAll/
ENTRYPOINT ["python", "oneforall.py"]
================================================
FILE: core/tools/domain/OneForAll/LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: core/tools/domain/OneForAll/Pipfile
================================================
[[source]]
name = "pypi"
url = "https://mirrors.aliyun.com/pypi/simple/"
verify_ssl = true
[dev-packages]
[packages]
tqdm = "*"
loguru = "*"
dnspython = "*"
exrex = "*"
fire = "*"
bs4 = "*"
tenacity = "*"
treelib = "*"
sqlalchemy = "*"
requests = "*"
pysocks = "*"
[requires]
python_version = "3.8"
================================================
FILE: core/tools/domain/OneForAll/README.md
================================================
# OneForAll
[](https://travis-ci.org/shmilylty/OneForAll)
[](https://codecov.io/gh/shmilylty/OneForAll)
[](https://codeclimate.com/github/shmilylty/OneForAll/maintainability)
[](https://github.com/shmilylty/OneForAll/tree/master/LICENSE)
[](https://github.com/shmilylty/OneForAll/tree/master/)
[](https://github.com/shmilylty/OneForAll/releases)
👊**OneForAll是一款功能强大的子域收集工具** 📝[English Document](https://github.com/shmilylty/OneForAll/tree/master/docs/en-us/README.md)

## 🚀上手指南
📢 请务必花一点时间阅读此文档,有助于你快速熟悉OneForAll!
<details>
<summary><b>🐍安装要求</b></summary>
OneForAll基于[Python 3.6.0]( https://www.python.org/downloads/release/python-360/ )开发和测试,OneForAll需要高于Python 3.6.0的版本才能运行。
安装Python环境可以参考[Python 3 安装指南](https://pythonguidecn.readthedocs.io/zh/latest/starting/installation.html#python-3)。运行以下命令检查Python和pip3版本:
```bash
python -V
pip3 -V
```
如果你看到类似以下的输出便说明Python环境没有问题:
```bash
Python 3.6.0
pip 19.2.2 from C:\Users\shmilylty\AppData\Roaming\Python\Python36\site-packages\pip (python 3.6)
```
</details>
<details>
<summary><b>✔安装步骤(git 版)</b></summary>
1. **下载**
由于该项目**处于开发中**,会不断进行更新迭代,下载时请使用`git clone`**克隆**最新代码仓库,也方便后续的更新,不推荐从Releases下载,因为Releases里版本更新缓慢,也不方便更新,
本项目已经在[码云](https://gitee.com/shmilylty/OneForAll.git)(Gitee)镜像了一份,国内推荐使用码云进行克隆比较快:
```bash
git clone https://gitee.com/shmilylty/OneForAll.git
```
或者:
```bash
git clone https://github.com/shmilylty/OneForAll.git
```
2. **安装**
你可以通过pip3安装OneForAll的依赖,以下为**Windows系统**下使用**pip3**安装依赖的示例:注意:如果你的Python3安装在系统Program Files目录下,如:`C:\Program Files\Python36`,那么请以管理员身份运行命令提示符cmd执行以下命令!
```bash
cd OneForAll/
python3 -m pip install -U pip setuptools wheel -i https://mirrors.aliyun.com/pypi/simple/
pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
python3 oneforall.py --help
```
其他系统平台的请参考[依赖安装](https://github.com/shmilylty/OneForAll/tree/master/docs/installation_dependency.md),如果在安装依赖过程中发现编译某个依赖库失败时可以参考[常见问题与回答.md](https://github.com/shmilylty/OneForAll/tree/master/docs/troubleshooting.md)文档中解决方法,如果依然不能解决欢迎加群反馈问题。
3. **更新**
执行以下命令**更新**项目(可保存对`/config/setting.py`和`/config/api.py`的修改):
```bash
git stash # 暂存本地的修改
git fetch --all # 拉取项目更新
git pull # 下载覆盖
git stash pop # 释放本地修改
```
</details>
<details>
<summary><b>✔安装步骤(docker 版)</b></summary>
首先下载并编辑配置文件,添加自己的`api`和个性化设置,并保留原始文件结构
```
config
├── api.py
├── log.py
└── setting.py
```
拉取镜像并执行,其中`~/.config`替换为你自己配置文件所在文件夹的路径
```shell
docker pull shmilylty/oneforall
docker run -it --rm -v ~/results:/OneForAll/results -v ~/.config:/OneForAll/config shmilylty/oneforall --target example.com run
```
参数直接加在指令末尾,结果会输出在本地目录`~/results`,如需保存到其他位置,可以自行修改
</details>
<details>
<summary><b>✨使用演示</b></summary>
如果你是通过pip3安装的依赖则使用以下命令运行示例:
```bash
python3 oneforall.py --target example.com run
python3 oneforall.py --targets ./example.txt run
```

</details>
<details>
<summary><b>🧐结果说明</b></summary>
我们以`python3 oneforall.py --target example.com run`命令为例,OneForAll在默认参数正常执行完毕会在results目录生成相应结果:

`example.com.csv`是每个主域下的子域收集结果。
`all_subdomain_result_1583034493.csv`是每次运行OneForAll收集到子域的汇总结果,包含`example.com.csv`,方便在批量收集场景中获取全部结果。
`result.sqlite3`是存放每次运行OneForAll收集到子域的SQLite3结果数据库,其数据库结构如下图:

其中类似`example_com_origin_result`表存放每个模块最初子域收集结果。
其中类似`example_com_resolve_result`表存放对子域进行解析后的结果。
其中类似`example_com_last_result`表存放上一次子域收集结果(需要收集两次以上才会生成)。
其中类似`example_com_now_result`表存放现在子域收集结果,一般情况关注这张表就可以了。
更多信息请参阅[字段解释说明](./docs/field.md)。
</details>
<details>
<summary><b>🤔使用帮助</b></summary>
命令行参数只提供了一些常用参数,更多详细的参数配置请见[setting.py](https://github.com/shmilylty/OneForAll/tree/master/config/setting.py),如果你认为有些参数是命令界面经常使用到的或缺少了什么参数等问题非常欢迎反馈。由于众所周知的原因,如果要使用一些被墙的收集接口请先到[setting.py](https://github.com/shmilylty/OneForAll/tree/master/config/setting.py)配置代理,有些收集模块需要提供API(大多都是可以注册账号免费获取),如果需要使用请到[api.py](https://github.com/shmilylty/OneForAll/tree/master/config/api.py)配置API信息,如果不使用请忽略有关报错提示。(详细模块请阅读[收集模块说明](https://github.com/shmilylty/OneForAll/tree/master/docs/collection_modules.md))
OneForAll命令行界面基于[Fire](https://github.com/google/python-fire/)实现,有关Fire更高级使用方法请参阅[使用Fire CLI](https://github.com/google/python-fire/blob/master/docs/using-cli.md)。
[oneforall.py](https://github.com/shmilylty/OneForAll/tree/master/oneforall.py)是主程序入口,oneforall.py可以调用[brute.py](https://github.com/shmilylty/OneForAll/tree/master/brute.py),[takerover.py](https://github.com/shmilylty/OneForAll/tree/master/takerover.py)及[dbexport.py](https://github.com/shmilylty/OneForAll/tree/master/dbexport.py)等模块,为了方便进行子域爆破独立出了brute.py,为了方便进行子域接管风险检查独立出了takerover.py,为了方便数据库导出独立出了dbexport.py,这些模块都可以单独运行,并且所接受参数要更丰富一点,如果要单独使用这些模块请参考[使用帮助](https://github.com/shmilylty/OneForAll/tree/master/docs/usage_help.md)
❗注意:当你在使用过程中遇到一些问题或者疑惑时,请先到[Issues](https://github.com/shmilylty/OneForAll/issues)里使用搜索找找答案,还可以参阅[常见问题与回答](https://github.com/shmilylty/OneForAll/tree/master/docs/troubleshooting.md)。
**oneforall.py使用帮助**
以下帮助信息可能不是最新的,你可以使用`python oneforall.py --help`获取最新的帮助信息。
```bash
python oneforall.py --help
```
```bash
NAME
oneforall.py - OneForAll帮助信息
SYNOPSIS
oneforall.py COMMAND | --target=TARGET <flags>
DESCRIPTION
OneForAll是一款功能强大的子域收集工具
Example:
python3 oneforall.py version
python3 oneforall.py --target example.com run
python3 oneforall.py --targets ./domains.txt run
python3 oneforall.py --target example.com --valid None run
python3 oneforall.py --target example.com --brute True run
python3 oneforall.py --target example.com --port small run
python3 oneforall.py --target example.com --fmt csv 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:
参数alive可选值True,False分别表示导出存活,全部子域结果
参数port可选值有'default', 'small', 'large', 详见config.py配置
参数fmt可选格式有 'csv','json'
参数path默认None使用OneForAll结果目录生成路径
ARGUMENTS
TARGET
单个域名(二选一必需参数)
TARGETS
每行一个域名的文件路径(二选一必需参数)
FLAGS
--brute=BRUTE
s
--dns=DNS
DNS解析子域(默认True)
--req=REQ
HTTP请求子域(默认True)
--port=PORT
请求验证子域的端口范围(默认只探测80端口)
--valid=VALID
只导出存活的子域结果(默认False)
--fmt=FMT
结果保存格式(默认csv)
--path=PATH
结果保存路径(默认None)
--takeover=TAKEOVER
检查子域接管(默认False)
```
</details>
## 🎉项目简介
项目地址:[https://github.com/shmilylty/OneForAll](https://github.com/shmilylty/OneForAll)
在渗透测试中信息收集的重要性不言而喻,子域收集是信息收集中必不可少且非常重要的一环,目前网上也开源了许多子域收集的工具,但是总是存在以下部分问题:
* **不够强大**,子域收集的接口不够多,不能做到对批量子域自动收集,没有自动子域解析,验证,FUZZ以及信息拓展等功能。
* **不够友好**,固然命令行模块比较方便,但是当可选的参数很多,要实现的操作复杂,用命令行模式就有点不够友好,如果有交互良好,高可操作的前端那么使用体验就会好很多。
* **缺少维护**,很多工具几年没有更新过一次,issues和PR是啥,不存在的。
* **效率问题**,没有利用多进程,多线程以及异步协程技术,速度较慢。
为了解决以上痛点,此项目应用而生,正如其名,我希望OneForAll是一款集百家之长,功能强大的全面快速子域收集终极神器🔨。
目前OneForAll还在开发中,肯定有不少问题和需要改进的地方,欢迎大佬们提交[Issues](https://github.com/shmilylty/OneForAll/issues)和[PR](https://github.com/shmilylty/OneForAll/pulls),用着还行给个小星星✨吧,目前有一个专门用于OneForAll交流和反馈QQ群👨👨👦👦::[**824414244**](//shang.qq.com/wpa/qunwpa?idkey=125d3689b60445cdbb11e4ddff38036b7f6f2abbf4f7957df5dddba81aa90771)(加群验证:信息收集)。
## 👍功能特性
* **收集能力强大**,详细模块请阅读[收集模块说明](https://github.com/shmilylty/OneForAll/tree/master/docs/collection_modules.md)。
1. 利用证书透明度收集子域(目前有6个模块:`censys_api`,`certspotter`,`crtsh`,`entrust`,`google`,`spyse_api`)
2. 常规检查收集子域(目前有4个模块:域传送漏洞利用`axfr`,检查跨域策略文件`cdx`,检查HTTPS证书`cert`,检查内容安全策略`csp`,检查robots文件`robots`,检查sitemap文件`sitemap`,利用NSEC记录遍历DNS域`dnssec`,后续会添加NSEC3记录等模块)
3. 利用网上爬虫档案收集子域(目前有2个模块:`archivecrawl`,`commoncrawl`,此模块还在调试,该模块还有待添加和完善)
4. 利用DNS数据集收集子域(目前有24个模块:`bevigil_api`, `binaryedge_api`, `bufferover`, `cebaidu`, `chinaz`, `chinaz_api`, `circl_api`, `cloudflare`, `dnsdb_api`, `dnsdumpster`, `hackertarget`, `ip138`, `ipv4info_api`, `netcraft`, `passivedns_api`, `ptrarchive`, `qianxun`, `rapiddns`, `riddler`, `robtex`, `securitytrails_api`, `sitedossier`, `threatcrowd`, `wzpc`, `ximcx`)
5. 利用DNS查询收集子域(目前有5个模块:通过枚举常见的SRV记录并做查询来收集子域`srv`,以及通过查询域名的DNS记录中的MX,NS,SOA,TXT记录来收集子域)
6. 利用威胁情报平台数据收集子域(目前有6个模块:`alienvault`, `riskiq_api`,`threatbook_api`,`threatminer`,`virustotal`,`virustotal_api`该模块还有待添加和完善)
7. 利用搜索引擎发现子域(目前有18个模块:`ask`, `baidu`, `bing`, `bing_api`, `duckduckgo`, `exalead`, `fofa_api`, `gitee`, `github`, `github_api`, `google`, `google_api`, `shodan_api`, `so`, `sogou`, `yahoo`, `yandex`, `zoomeye_api`),在搜索模块中除特殊搜索引擎,通用的搜索引擎都支持自动排除搜索,全量搜索,递归搜索。
* **支持子域爆破**,该模块有常规的字典爆破,也有自定义的fuzz模式,支持批量爆破和递归爆破,自动判断泛解析并处理。
* **支持子域验证**,默认开启子域验证,自动解析子域DNS,自动请求子域获取title和banner,并综合判断子域存活情况。
* **支持子域爬取**,根据已有的子域,请求子域响应体以及响应体里的JS,从中再次发现新的子域。
* **支持子域置换**,根据已有的子域,使用子域替换技术再次发现新的子域。
* **支持子域接管**,默认开启子域接管风险检查,支持子域自动接管(目前只有Github,有待完善),支持批量检查。
* **处理功能强大**,发现的子域结果支持自动去除,自动DNS解析,HTTP请求探测,自动筛选出有效子域,拓展子域的Banner信息,最终支持的导出格式有`txt`, `csv`, `json`。
* **速度极快**,[收集模块](https://github.com/shmilylty/OneForAll/tree/master/collect.py)使用多线程调用,[爆破模块](https://github.com/shmilylty/OneForAll/tree/master/brute.py)使用[massdns](https://github.com/blechschmidt/massdns),DNS解析速度每秒可解析350000以上个域名,子域验证中DNS解析和HTTP请求使用异步多协程,多线程检查[子域接管](https://github.com/shmilylty/OneForAll/tree/master/takeover.py)风险。
* **体验良好**,各模块都有进度条,异步保存各模块结果。
如果你有其他很棒的想法请务必告诉我!😎
## 🌲目录结构
更多信息请参阅[目录结构说明](https://github.com/shmilylty/OneForAll/tree/master/docs/directory_structure.md)。
本项目[docs](https://github.com/shmilylty/OneForAll/tree/master/docs/)目录下还提供了一些帮助与说明,如[子域字典来源说明](https://github.com/shmilylty/OneForAll/tree/master/docs/dictionary_source.md)、[泛解析判断流程](https://github.com/shmilylty/OneForAll/tree/master/docs/wildcard_judgment.png)。
## 👏用到框架
* [aiohttp](https://github.com/aio-libs/aiohttp) - 异步http客户端/服务器框架
* [beautifulsoup4](https://pypi.org/project/beautifulsoup4/) - 可以轻松从HTML或XML文件中提取数据的Python库
* [fire](https://github.com/google/python-fire) - Python Fire是一个纯粹根据任何Python对象自动生成命令行界面(CLI)的库
* [loguru](https://github.com/Delgan/loguru) - 旨在带来愉快的日志记录Python库
* [massdns](https://github.com/blechschmidt/massdns) - 高性能的DNS解析器
* [records](https://github.com/kennethreitz/records) - Records是一个非常简单但功能强大的库,用于对大多数关系数据库进行最原始SQL查询。
* [requests](https://github.com/psf/requests) - Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
* [tqdm](https://github.com/tqdm/tqdm) - 适用于Python和CLI的快速,可扩展的进度条库
感谢这些伟大优秀的Python库!
## 🔖版本控制
该项目使用[SemVer](https://semver.org/)语言化版本格式进行版本管理,你可以参阅[变更记录说明](https://github.com/shmilylty/OneForAll/tree/master/docs/changes.md)了解历史变更情况。
## ⌛后续计划
- [ ] 各模块持续优化和完善
- [ ] 操作强大交互人性的前端界面实现
更多信息请参阅[后续开发计划](https://github.com/shmilylty/OneForAll/tree/master/docs/todo.md)。
## 🙏贡献
非常热烈欢迎各位大佬一起完善本项目!
## 👨💻贡献者
* **[Jing Ling](https://github.com/shmilylty)**
* 核心开发
你可以在[贡献者文档](https://github.com/shmilylty/OneForAll/tree/master/docs/contributors.md)中查看所有贡献者以及他们所做出的贡献,感谢他们让OneForAll变得更强大好用。
## ☕赞赏
如果你觉得这个项目帮助到了你,你可以打赏一杯咖啡以资鼓励:)

## 📄版权
该项目签署了GPL-3.0授权许可,详情请参阅[LICENSE](https://github.com/shmilylty/OneForAll/blob/master/LICENSE)。
## 😘鸣谢
感谢网上开源的各个子域收集项目!
感谢[A-Team](https://github.com/QAX-A-Team)大哥们热情无私的问题解答!
## 📜免责声明
本工具仅能在取得足够合法授权的企业安全建设中使用,在使用本工具过程中,您应确保自己所有行为符合当地的法律法规。
如您在使用本工具的过程中存在任何非法行为,您将自行承担所有后果,本工具所有开发者和所有贡献者不承担任何法律及连带责任。
除非您已充分阅读、完全理解并接受本协议所有条款,否则,请您不要安装并使用本工具。
您的使用行为或者您以其他任何明示或者默示方式表示接受本协议的,即视为您已阅读并同意本协议的约束。
## 💖Star趋势
[](https://starchart.cc/shmilylty/OneForAll)
================================================
FILE: core/tools/domain/OneForAll/__init__.py
================================================
================================================
FILE: core/tools/domain/OneForAll/brute.py
================================================
#!/usr/bin/python3
# coding=utf-8
"""
OneForAll subdomain brute module
:copyright: Copyright (c) 2019, Jing Ling. All rights reserved.
:license: GNU General Public License v3.0, see LICENSE for more details.
"""
import gc
import json
import time
import exrex
import fire
import export
from common import utils
from config import settings
from common.module import Module
from modules import wildcard
from config.log import logger
def gen_subdomains(expression, path):
"""
Generate subdomains
:param str expression: generate subdomains expression
:param str path: path of wordlist
:return set subdomains: list of subdomains
"""
subdomains = set()
with open(path, encoding='utf-8', errors='ignore') as fd:
for line in fd:
word = line.strip().lower()
if len(word) == 0:
continue
if not utils.is_subname(word):
continue
if word.startswith('.'):
word = word[1:]
if word.endswith('.'):
word = word[:-1]
subdomain = expression.replace('*', word)
subdomains.add(subdomain)
size = len(subdomains)
logger.log('DEBUG', f'The size of the dictionary generated by {path} is {size}')
if size == 0:
logger.log('ALERT', 'Please check the dictionary content!')
else:
utils.check_random_subdomain(subdomains)
return subdomains
def gen_fuzz_subdomains(expression, rule, fuzzlist):
"""
Generate subdomains based on fuzz mode
:param str expression: generate subdomains expression
:param str rule: regexp rule
:param str fuzzlist: fuzz dictionary
:return set subdomains: list of subdomains
"""
subdomains = set()
if fuzzlist:
fuzz_domain = gen_subdomains(expression, fuzzlist)
subdomains.update(fuzz_domain)
if rule:
fuzz_count = exrex.count(rule)
if fuzz_count > 10000000:
logger.log('ALERT', f'The dictionary generated by this rule is too large: '
f'{fuzz_count} > 10000000')
for fuzz_string in exrex.generate(rule):
fuzz_string = fuzz_string.lower()
if not fuzz_string.isalnum():
continue
fuzz_domain = expression.replace('*', fuzz_string)
subdomains.add(fuzz_domain)
utils.check_random_subdomain(subdomains)
logger.log('DEBUG', f'Dictionary size based on fuzz mode: {len(subdomains)}')
return subdomains
def gen_word_subdomains(expression, path):
"""
Generate subdomains based on word mode
:param str expression: generate subdomains expression
:param str path: path of wordlist
:return set subdomains: list of subdomains
"""
subdomains = gen_subdomains(expression, path)
logger.log('DEBUG', f'Dictionary based on word mode size: {len(subdomains)}')
return subdomains
def query_domain_ns_a(ns_list):
logger.log('INFOR', f'Querying A record from authoritative name server: {ns_list} ')
if not isinstance(ns_list, list):
return list()
ns_ip_list = []
resolver = utils.dns_resolver()
for ns in ns_list:
try:
answer = resolver.query(ns, 'A')
except Exception as e:
logger.log('ERROR', e.args)
logger.log('ERROR', f'Query authoritative name server {ns} A record error')
continue
if answer:
for item in answer:
ns_ip_list.append(item.address)
logger.log('INFOR', f'Authoritative name server A record result: {ns_ip_list}')
return ns_ip_list
def query_domain_ns(domain):
logger.log('INFOR', f'Querying NS records of {domain}')
domain = utils.get_main_domain(domain)
resolver = utils.dns_resolver()
try:
answer = resolver.query(domain, 'NS')
except Exception as e:
logger.log('ERROR', e.args)
logger.log('ERROR', f'Querying NS records of {domain} error')
return list()
ns = [item.to_text() for item in answer]
logger.log('INFOR', f'{domain}\'s authoritative name server is {ns}')
return ns
def check_dict():
if not settings.enable_check_dict:
return
sec = settings.check_time
logger.log('ALERT', f'You have {sec} seconds to check '
f'whether the configuration is correct or not')
logger.log('ALERT', f'If you want to exit, please use `Ctrl + C`')
try:
time.sleep(sec)
except KeyboardInterrupt:
logger.log('INFOR', 'Due to configuration incorrect, exited')
exit(0)
def gen_result_infos(items, infos, subdomains, appear_times, wc_ips, wc_ttl):
qname = items.get('name')[:-1] # 去除最右边的`.`点号
reason = items.get('status')
resolver = items.get('resolver')
data = items.get('data')
answers = data.get('answers')
info = dict()
cnames = list()
ips = list()
ip_times = list()
cname_times = list()
ttls = list()
is_valid_flags = list()
have_a_record = False
for answer in answers:
if answer.get('type') != 'A':
continue
have_a_record = True
ttl = answer.get('ttl')
ttls.append(ttl)
name = answer.get('name') # 去除最右边的`.`点号
cname = name[:-1].lower() # 去除最右边的`.`点号
cnames.append(cname)
cname_num = appear_times.get(cname)
cname_times.append(cname_num)
ip = answer.get('data')
ips.append(ip)
ip_num = appear_times.get(ip)
ip_times.append(ip_num)
isvalid, reason = wildcard.is_valid_subdomain(ip, ip_num, cname, cname_num, ttl, wc_ttl, wc_ips)
logger.log('TRACE', f'{ip} effective: {isvalid} reason: {reason}')
is_valid_flags.append(isvalid)
if not have_a_record:
logger.log('TRACE', f'All query result of {qname} no A record{answers}')
# 为了优化内存 只添加有A记录且通过判断的子域到记录中
if have_a_record and all(is_valid_flags):
info['resolve'] = 1
info['reason'] = reason
info['ttl'] = ttls
info['cname'] = cnames
info['ip'] = ips
info['ip_times'] = ip_times
info['cname_times'] = cname_times
info['resolver'] = resolver
infos[qname] = info
subdomains.append(qname)
return infos, subdomains
def stat_appear_times(result_path):
logger.log('INFOR', f'Counting IP cname appear times')
times = dict()
logger.log('DEBUG', f'Reading {result_path}')
with open(result_path) as fd:
for line in fd:
line = line.strip()
try:
items = json.loads(line)
except Exception as e:
logger.log('ERROR', e.args)
logger.log('ERROR', f'Error parsing {result_path} '
f'line {line} Skip this line')
continue
status = items.get('status')
if status != 'NOERROR':
continue
data = items.get('data')
if 'answers' not in data:
continue
answers = data.get('answers')
for answer in answers:
if answer.get('type') == 'A':
ip = answer.get('data')
# 取值 如果是首次出现的IP集合 出现次数先赋值0
value_one = times.setdefault(ip, 0)
times[ip] = value_one + 1
name = answer.get('data')
cname = name[:-1].lower() # 去除最右边的`.`点号
# 取值 如果是首次出现的IP集合 出现次数先赋值0
value_two = times.setdefault(cname, 0)
times[cname] = value_two + 1
if answer.get('type') == 'CNAME':
name = answer.get('data')
cname = name[:-1].lower() # 去除最右边的`.`点号
# 取值 如果是首次出现的IP集合 出现次数先赋值0
value_three = times.setdefault(cname, 0)
times[cname] = value_three + 1
return times
def deal_output(output_path, appear_times, wildcard_ips, wildcard_ttl):
logger.log('INFOR', f'Processing result')
infos = dict() # 用来记录所有域名有关信息
subdomains = list() # 用来保存所有通过有效性检查的子域
logger.log('DEBUG', f'Processing {output_path}')
with open(output_path) as fd:
for line in fd:
line = line.strip()
try:
items = json.loads(line)
except Exception as e:
logger.log('ERROR', e.args)
logger.log('ERROR', f'Error parsing {line} Skip this line')
continue
qname = items.get('name')[:-1] # 去除最右边的`.`点号
status = items.get('status')
if status != 'NOERROR':
logger.log('TRACE', f'Found {qname}\'s result {status} '
f'while processing {line}')
continue
data = items.get('data')
if 'answers' not in data:
logger.log('TRACE', f'Processing {line}, {qname} no response')
continue
infos, subdomains = gen_result_infos(items, infos, subdomains,
appear_times, wildcard_ips,
wildcard_ttl)
return infos, subdomains
def save_brute_dict(dict_path, dict_set):
dict_data = '\n'.join(dict_set)
if not utils.save_to_file(dict_path, dict_data):
logger.log('FATAL', 'Saving dictionary error')
exit(1)
def delete_file(dict_path, output_path):
if settings.delete_generated_dict:
dict_path.unlink()
if settings.delete_massdns_result:
output_path.unlink()
class Brute(Module):
"""
OneForAll subdomain brute module
Example:
brute.py --target domain.com --word True run
brute.py --targets ./domains.txt --word True run
brute.py --target domain.com --word True --concurrent 2000 run
brute.py --target domain.com --word True --wordlist subnames.txt run
brute.py --target domain.com --word True --recursive True --depth 2 run
brute.py --target d.com --fuzz True --place m.*.d.com --rule '[a-z]' run
brute.py --target d.com --fuzz True --place m.*.d.com --fuzzlist subnames.txt run
Note:
--fmt csv/json (result format)
--path Result path (default None, automatically generated)
:param str target: One domain (target or targets must be provided)
:param str targets: File path of one domain per line
:param int concurrent: Number of concurrent (default 2000)
:param bool word: Use word mode generate dictionary (default False)
:param str wordlist: Dictionary path used in word mode (default use ./config/default.py)
:param bool recursive: Use recursion (default False)
:param int depth: Recursive depth (default 2)
:param str nextlist: Dictionary file path used by recursive (default use ./config/default.py)
:param bool fuzz: Use fuzz mode generate dictionary (default False)
:param bool alive: Only export alive subdomains (default False)
:param str place: Designated fuzz position (required if use fuzz mode)
:param str rule: Specify the regexp rules used in fuzz mode (required if use fuzz mode)
:param str fuzzlist: Dictionary path used in fuzz mode (default use ./config/default.py)
:param bool export: Export the results (default True)
:param str fmt: Result format (default csv)
:param str path: Result directory (default None)
"""
def __init__(self, target=None, targets=None, concurrent=None,
word=False, wordlist=None, recursive=False, depth=None,
nextlist=None, fuzz=False, place=None, rule=None, fuzzlist=None,
export=True, alive=True, fmt='csv', path=None):
Module.__init__(self)
self.module = 'Brute'
self.source = 'Brute'
self.target = target
self.targets = targets
self.concurrent_num = concurrent or settings.brute_concurrent_num
self.word = word
self.wordlist = wordlist or settings.brute_wordlist_path
self.recursive_brute = recursive or settings.enable_recursive_brute
self.recursive_depth = depth or settings.brute_recursive_depth
self.recursive_nextlist = nextlist or settings.recursive_nextlist_path
self.fuzz = fuzz or settings.enable_fuzz
self.place = place or settings.fuzz_place
self.rule = rule or settings.fuzz_rule
self.fuzzlist = fuzzlist or settings.fuzz_list
self.export = export
self.alive = alive
self.fmt = fmt
self.path = path
self.bulk = False # 是否是批量爆破场景
self.domains = list() # 待爆破的所有域名集合
self.domain = str() # 当前正在进行爆破的域名
self.ips_times = dict() # IP集合出现次数
self.enable_wildcard = None # 当前域名是否使用泛解析
self.quite = False
self.in_china = None
def gen_brute_dict(self, domain):
logger.log('INFOR', f'Generating dictionary for {domain}')
dict_set = set()
# 如果domain不是self.subdomain 而是self.domain的子域则生成递归爆破字典
if self.word:
self.place = ''
if not self.place:
self.place = '*.' + domain
wordlist = self.wordlist
main_domain = utils.get_main_domain(domain)
if domain != main_domain:
wordlist = self.recursive_nextlist
if self.word:
word_subdomains = gen_word_subdomains(self.place, wordlist)
dict_set.update(word_subdomains)
if self.fuzz:
fuzz_subdomains = gen_fuzz_subdomains(self.place, self.rule, self.fuzzlist)
dict_set.update(fuzz_subdomains)
count = len(dict_set)
logger.log('INFOR', f'Dictionary size: {count}')
if count > 10000000:
logger.log('ALERT', f'The generated dictionary is '
f'too large {count} > 10000000')
return dict_set
def check_brute_params(self):
if not (self.word or self.fuzz):
logger.log('FATAL', f'Please specify at least one brute mode')
exit(1)
if len(self.domains) > 1:
self.bulk = True
if self.fuzz:
if self.place is None:
logger.log('FATAL', f'No fuzz position specified')
exit(1)
if self.rule is None and self.fuzzlist is None:
logger.log('FATAL', f'No fuzz rules or fuzz dictionary specified')
exit(1)
if self.bulk:
logger.log('FATAL', f'Cannot use fuzz mode in the bulk brute')
exit(1)
if self.recursive_brute:
logger.log('FATAL', f'Cannot use recursive brute in fuzz mode')
exit(1)
fuzz_count = self.place.count('*')
if fuzz_count < 1:
logger.log('FATAL', f'No fuzz position specified')
exit(1)
if fuzz_count > 1:
logger.log('FATAL', f'Only one fuzz position can be specified')
exit(1)
if self.domain not in self.place:
logger.log('FATAL', f'Incorrect domain for fuzz')
exit(1)
def init_dict_path(self):
data_dir = settings.data_storage_dir
if self.wordlist is None:
self.wordlist = settings.brute_wordlist_path or data_dir.joinpath('subnames.txt')
if self.recursive_nextlist is None:
self.recursive_nextlist = settings.recursive_nextlist_path or data_dir.joinpath('subnames_next.txt')
def main(self, domain):
start = time.time()
logger.log('INFOR', f'Blasting {domain} ')
massdns_dir = settings.third_party_dir.joinpath('massdns')
result_dir = settings.result_save_dir
temp_dir = result_dir.joinpath('temp')
utils.check_dir(temp_dir)
massdns_path = utils.get_massdns_path(massdns_dir)
timestring = utils.get_timestring()
wildcard_ips = list() # 泛解析IP列表
wildcard_ttl = int() # 泛解析TTL整型值
ns_list = query_domain_ns(self.domain)
ns_ip_list = query_domain_ns_a(ns_list) # DNS权威名称服务器对应A记录列表
if self.enable_wildcard is None:
self.enable_wildcard = wildcard.detect_wildcard(domain)
if self.enable_wildcard:
wildcard_ips, wildcard_ttl = wildcard.collect_wildcard_record(domain, ns_ip_list)
ns_path = utils.get_ns_path(self.in_china, self.enable_wildcard, ns_ip_list)
dict_set = self.gen_brute_dict(domain)
dict_name = f'generated_subdomains_{domain}_{timestring}.txt'
dict_path = temp_dir.joinpath(dict_name)
save_brute_dict(dict_path, dict_set)
del dict_set
gc.collect()
output_name = f'resolved_result_{domain}_{timestring}.json'
output_path = temp_dir.joinpath(output_name)
log_path = result_dir.joinpath('massdns.log')
check_dict()
logger.log('INFOR', f'Running massdns to brute subdomains')
utils.call_massdns(massdns_path, dict_path, ns_path, output_path,
log_path, quiet_mode=self.quite,
concurrent_num=self.concurrent_num)
appear_times = stat_appear_times(output_path)
self.infos, self.subdomains = deal_output(output_path, appear_times,
wildcard_ips, wildcard_ttl)
delete_file(dict_path, output_path)
end = time.time()
self.elapse = round(end - start, 1)
logger.log('ALERT', f'{self.source} module takes {self.elapse} seconds, '
f'found {len(self.subdomains)} subdomains of {domain}')
logger.log('DEBUG', f'{self.source} module found subdomains of {domain}: '
f'{self.subdomains}')
self.gen_result()
self.save_db()
return self.subdomains
def run(self):
logger.log('INFOR', f'Start running {self.source} module')
if self.in_china is None:
_, self.in_china = utils.get_net_env()
self.domains = utils.get_domains(self.target, self.targets)
for self.domain in self.domains:
self.results = list() # 置空
all_subdomains = list()
self.init_dict_path()
self.check_brute_params()
if self.recursive_brute:
logger.log('INFOR', f'Start recursively brute the 1 layer subdomain'
f' of {self.domain}')
valid_subdomains = self.main(self.domain)
all_subdomains.extend(valid_subdomains)
# 递归爆破下一层的子域
# fuzz模式不使用递归爆破
if self.recursive_brute:
for layer_num in range(1, self.recursive_depth):
# 之前已经做过1层子域爆破 当前实际递归层数是layer+1
logger.log('INFOR', f'Start recursively brute the {layer_num + 1} '
f'layer subdomain of {self.domain}')
for subdomain in all_subdomains:
self.place = '*.' + subdomain
# 进行下一层子域爆破的限制条件
num = subdomain.count('.') - self.domain.count('.')
if num == layer_num:
valid_subdomains = self.main(subdomain)
all_subdomains.extend(valid_subdomains)
logger.log('INFOR', f'Finished {self.source} module to brute {self.domain}')
if not self.path:
name = f'{self.domain}_brute_result.{self.fmt}'
self.path = settings.result_save_dir.joinpath(name)
# 数据库导出
if self.export:
export.export_data(self.domain,
alive=self.alive,
limit='resolve',
path=self.path,
fmt=self.fmt)
if __name__ == '__main__':
fire.Fire(Brute)
================================================
FILE: core/tools/domain/OneForAll/common/check.py
================================================
import requests
from config.log import logger
from common.module import Module
class Check(Module):
"""
Check base class
"""
def __init__(self):
Module.__init__(self)
self.request_status = 1
def to_check(self, filenames):
urls = set()
urls_www = set()
for filename in filenames:
urls.update((
f'http://{self.domain}/{filename}',
f'https://{self.domain}/{filename}',
))
urls_www.update((
f'http://www.{self.domain}/{filename}',
f'https://www.{self.domain}/{filename}'
))
self.check_loop(urls)
self.check_loop(urls_www)
def check_loop(self, urls):
for url in urls:
self.header = self.get_header()
self.proxy = self.get_proxy(self.source)
try:
resp = self.get(url, check=False, ignore=True, raise_error=True)
except requests.exceptions.ConnectTimeout:
logger.log('DEBUG', f'Connection to {url} timed out, so break check')
break
self.subdomains = self.collect_subdomains(resp)
if self.subdomains:
break
================================================
FILE: core/tools/domain/OneForAll/common/crawl.py
================================================
from common.module import Module
class Crawl(Module):
"""
Crawl base class
"""
def __init__(self):
Module.__init__(self)
================================================
FILE: core/tools/domain/OneForAll/common/database.py
================================================
"""
SQLite database initialization and operation
"""
from common import records
from common.records import Connection
from config.log import logger
from config import settings
class Database(object):
def __init__(self, db_path=None):
self.conn = self.get_conn(db_path)
@staticmethod
def get_conn(db_path):
"""
Get database connection
:param db_path: Database path
:return: db_conn: SQLite database connection
"""
logger.log('TRACE', f'Establishing database connection')
if isinstance(db_path, Connection):
return db_path
protocol = 'sqlite:///'
if not db_path: # 数据库路径为空连接默认数据库
db_path = f'{protocol}{settings.result_save_dir}/result.sqlite3'
else:
db_path = f'{protocol}{db_path}'
db = records.Database(db_path) # 不存在数据库时会新建一个数据库
logger.log('TRACE', f'Use the database: {db_path}')
return db.get_connection()
def query(self, sql):
try:
results = self.conn.query(sql)
except Exception as e:
logger.log('ERROR', e.args)
return None
return results
def create_table(self, table_name):
"""
Create table
:param str table_name: table name
"""
table_name = table_name.replace('.', '_')
if self.exist_table(table_name):
logger.log('TRACE', f'{table_name} table already exists')
return
logger.log('TRACE', f'Creating {table_name} table')
self.query(f'create table "{table_name}" ('
f'id integer primary key,'
f'alive int,'
f'request int,'
f'resolve int,'
f'url text,'
f'subdomain text,'
f'port int,'
f'level int,'
f'cname text,'
f'ip text,'
f'public int,'
f'cdn int,'
f'status int,'
f'reason text,'
f'title text,'
f'banner text,'
f'header text,'
f'history text,'
f'response text,'
f'ip_times text,'
f'cname_times text,'
f'ttl text,'
f'cidr text,'
f'asn text,'
f'org text,'
f'addr text,'
f'isp text,'
f'resolver text,'
f'module text,'
f'source text,'
f'elapse float,'
f'find int)')
def insert_table(self, table_name, result):
table_name = table_name.replace('.', '_')
self.conn.query(
f'insert into "{table_name}" '
f'(id, alive, resolve, request, url, subdomain, port, level,'
f'cname, ip, public, cdn, status, reason, title, banner, header,'
f'history, response, ip_times, cname_times, ttl, cidr, asn, org,'
f'addr, isp, resolver, module, source, elapse, find) '
f'values (:id, :alive, :resolve, :request, :url,'
f':subdomain, :port, :level, :cname, :ip, :public, :cdn,'
f':status, :reason, :title, :banner, :header, :history, :response,'
f':ip_times, :cname_times, :ttl, :cidr, :asn, :org, :addr, :isp,'
f':resolver, :module, :source, :elapse, :find)', **result)
def save_db(self, table_name, results, module_name=None):
"""
Save the results of each module in the database
:param str table_name: table name
:param list results: results list
:param str module_name: module
"""
logger.log('TRACE', f'Saving the subdomain results of {table_name} '
f'found by module {module_name} into database')
table_name = table_name.replace('.', '_')
if results:
try:
self.conn.bulk_query(
f'insert into "{table_name}" '
f'(id, alive, resolve, request, url, subdomain, port, level, '
f'cname, ip, public, cdn, status, reason, title, banner, header, '
f'history, response, ip_times, cname_times, ttl, cidr, asn, org, '
f'addr, isp, resolver, module, source, elapse, find) '
f'values (:id, :alive, :resolve, :request, :url, '
f':subdomain, :port, :level, :cname, :ip, :public, :cdn,'
f':status, :reason, :title, :banner, :header, :history, :response, '
f':ip_times, :cname_times, :ttl, :cidr, :asn, :org, :addr, :isp, '
f':resolver, :module, :source, :elapse, :find)', results)
except Exception as e:
logger.log('ERROR', e)
def exist_table(self, table_name):
"""
Determine table exists
:param str table_name: table name
:return bool: Whether table exists
"""
table_name = table_name.replace('.', '_')
logger.log('TRACE', f'Determining whether the {table_name} table exists')
results = self.query(f'select count() from sqlite_master where type = "table" and'
f' name = "{table_name}"')
if results.scalar() == 0:
return False
else:
return True
def copy_table(self, table_name, bak_table_name):
"""
Copy table to create backup
:param str table_name: table name
:param str bak_table_name: new table name
"""
table_name = table_name.replace('.', '_')
bak_table_name = bak_table_name.replace('.', '_')
logger.log('TRACE', f'Copying {table_name} table to {bak_table_name} new table')
self.query(f'drop table if exists "{bak_table_name}"')
self.query(f'create table "{bak_table_name}" '
f'as select * from "{table_name}"')
def clear_table(self, table_name):
"""
Clear the table
:param str table_name: table name
"""
table_name = table_name.replace('.', '_')
logger.log('TRACE', f'Clearing data in table {table_name}')
self.query(f'delete from "{table_name}"')
def drop_table(self, table_name):
"""
Delete table
:param str table_name: table name
"""
table_name = table_name.replace('.', '_')
logger.log('TRACE', f'Deleting {table_name} table')
self.query(f'drop table if exists "{table_name}"')
def rename_table(self, table_name, new_table_name):
"""
Rename table name
:param str table_name: old table name
:param str new_table_name: new table name
"""
table_name = table_name.replace('.', '_')
new_table_name = new_table_name.replace('.', '_')
logger.log('TRACE', f'Renaming {table_name} table to {new_table_name} table')
self.query(f'alter table "{table_name}" '
f'rename to "{new_table_name}"')
def deduplicate_subdomain(self, table_name):
"""
Deduplicate subdomains in the table
:param str table_name: table name
"""
table_name = table_name.replace('.', '_')
logger.log('TRACE', f'Deduplicating subdomains in {table_name} table')
self.query(f'delete from "{table_name}" where '
f'id not in (select min(id) '
f'from "{table_name}" group by subdomain)')
def remove_invalid(self, table_name):
"""
Remove nulls or invalid subdomains in the table
:param str table_name: table name
"""
table_name = table_name.replace('.', '_')
logger.log('TRACE', f'Removing invalid subdomains in {table_name} table')
self.query(f'delete from "{table_name}" where '
f'subdomain is null or resolve == 0')
def get_data(self, table_name):
"""
Get all the data in the table
:param str table_name: table name
"""
table_name = table_name.replace('.', '_')
logger.log('TRACE', f'Get all the data from {table_name} table')
return self.query(f'select * from "{table_name}"')
def export_data(self, table_name, alive, limit):
"""
Get part of the data in the table
:param str table_name: table name
:param any alive: alive flag
:param str limit: limit value
"""
table_name = table_name.replace('.', '_')
sql = f'select id, alive, request, resolve, url, subdomain, level,' \
f'cname, ip, public, cdn, port, status, reason, title, banner,' \
f'cidr, asn, org, addr, isp, source from "{table_name}" '
if alive and limit:
if limit in ['resolve', 'request']:
where = f' where {limit} = 1'
sql += where
elif alive:
where = f' where alive = 1'
sql += where
sql += ' order by subdomain'
logger.log('TRACE', f'Get the data from {table_name} table')
return self.query(sql)
def count_alive(self, table_name):
table_name = table_name.replace('.', '_')
sql = f'select count() from "{table_name}" where alive = 1'
return self.query(sql)
def get_resp_by_url(self, table_name, url):
table_name = table_name.replace('.', '_')
sql = f'select response from "{table_name}" where url = "{url}"'
logger.log('TRACE', f'Get response data from {url}')
return self.query(sql).scalar()
def get_data_by_fields(self, table_name, fields):
table_name = table_name.replace('.', '_')
field_str = ', '.join(fields)
sql = f'select {field_str} from "{table_name}"'
logger.log('TRACE', f'Get specified field data {fields} from {table_name} table')
return self.query(sql)
def update_data_by_url(self, table_name, info, url):
table_name = table_name.replace('.', '_')
field_str = ', '.join(map(lambda kv: f'{kv[0]} = "{kv[1]}"', info.items()))
sql = f'update "{table_name}" set {field_str} where url = "{url}"'
return self.query(sql)
def close(self):
"""
Close the database connection
"""
self.conn.close()
================================================
FILE: core/tools/domain/OneForAll/common/domain.py
================================================
import re
from common import tldextract
from config import settings
class Domain(object):
"""
Processing domain class
:param str string: input string
"""
def __init__(self, string):
self.string = str(string)
self.regexp = r'\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b'
self.domain = None
def match(self):
"""
match domain
:return : result
"""
result = re.search(self.regexp, self.string, re.I)
if result:
return result.group()
return None
def extract(self):
"""
extract domain
>>> d = Domain('www.example.com')
<domain.Domain object>
>>> d.extract()
ExtractResult(subdomain='www', domain='example', suffix='com')
:return: extracted domain results
"""
data_storage_dir = settings.data_storage_dir
extract_cache_file = data_storage_dir.joinpath('public_suffix_list.dat')
ext = tldextract.TLDExtract(extract_cache_file)
result = self.match()
if result:
return ext(result)
return None
def registered(self):
"""
registered domain
>>> d = Domain('www.example.com')
<domain.Domain object>
>>> d.registered()
example.com
:return: registered domain result
"""
result = self.extract()
if result:
return result.registered_domain
return None
================================================
FILE: core/tools/domain/OneForAll/common/ipasn.py
================================================
import zipfile
from common.utils import ip_to_int
from config.setting import data_storage_dir
from common.database import Database
def get_db_path():
zip_path = data_storage_dir.joinpath('ip2location.zip')
db_path = data_storage_dir.joinpath('ip2location.db')
if db_path.exists():
return db_path
zf = zipfile.ZipFile(str(zip_path))
zf.extract('ip2location.db', data_storage_dir)
return db_path
class IPAsnInfo(Database):
def __init__(self):
path = get_db_path()
Database.__init__(self, path)
def find(self, ip):
info = {'cidr': '', 'asn': '', 'org': ''}
if isinstance(ip, (int, str)):
ip = ip_to_int(ip)
else:
return info
sql = f'SELECT * FROM asn WHERE ip_from <= {ip} AND ip_to >= {ip} LIMIT 1;'
result = self.query(sql)
if not hasattr(result, 'dataset'):
return info
asn = result.as_dict()
info['cidr'] = asn[0]['cidr']
info['asn'] = f"AS{asn[0]['asn']}"
info['org'] = asn[0]['as']
return info
if __name__ == "__main__":
asn_info = IPAsnInfo()
print(asn_info.find("188.81.94.77"))
================================================
FILE: core/tools/domain/OneForAll/common/ipreg.py
================================================
"""
" ip2region python searcher client module
"
" Author: koma<komazhang@foxmail.com>
" Date : 2015-11-06
"""
import io
import sys
import socket
import struct
from config import settings
class IpRegInfo(object):
__INDEX_BLOCK_LENGTH = 12
__TOTAL_HEADER_LENGTH = 8192
__f = None
__headerSip = []
__headerPtr = []
__headerLen = 0
__indexSPtr = 0
__indexLPtr = 0
__indexCount = 0
__dbBinStr = ''
def __init__(self, db_file):
self.init_database(db_file)
def memory_search(self, ip):
"""
" memory search method
" param: ip
"""
if not ip.isdigit():
ip = self.ip2long(ip)
if self.__dbBinStr == '':
self.__dbBinStr = self.__f.read() # read all the contents in file
self.__indexSPtr = self.get_long(self.__dbBinStr, 0)
self.__indexLPtr = self.get_long(self.__dbBinStr, 4)
self.__indexCount = int((self.__indexLPtr - self.__indexSPtr) /
self.__INDEX_BLOCK_LENGTH) + 1
l, h, data_ptr = (0, self.__indexCount, 0)
while l <= h:
m = int((l + h) >> 1)
p = self.__indexSPtr + m * self.__INDEX_BLOCK_LENGTH
sip = self.get_long(self.__dbBinStr, p)
if ip < sip:
h = m - 1
else:
eip = self.get_long(self.__dbBinStr, p + 4)
if ip > eip:
l = m + 1
else:
data_ptr = self.get_long(self.__dbBinStr, p + 8)
break
if data_ptr == 0:
raise Exception("Data pointer not found")
return self.return_data(data_ptr)
def init_database(self, db_file):
"""
" initialize the database for search
" param: dbFile
"""
try:
self.__f = io.open(db_file, "rb")
except IOError as e:
print("[Error]: %s" % e)
sys.exit()
def return_data(self, data_ptr):
"""
" get ip data from db file by data start ptr
" param: data ptr
"""
data_len = (data_ptr >> 24) & 0xFF
data_ptr = data_ptr & 0x00FFFFFF
self.__f.seek(data_ptr)
data = self.__f.read(data_len)
info = {"city_id": self.get_long(data, 0),
"region": data[4:].decode('utf-8')}
return info
@staticmethod
def ip2long(ip):
_ip = socket.inet_aton(ip)
return struct.unpack("!L", _ip)[0]
@staticmethod
def is_ip(ip):
p = ip.split(".")
if len(p) != 4:
return False
for pp in p:
if not pp.isdigit():
return False
if len(pp) > 3:
return False
if int(pp) > 255:
return False
return True
@staticmethod
def get_long(b, offset):
if len(b[offset:offset + 4]) == 4:
return struct.unpack('I', b[offset:offset + 4])[0]
return 0
def close(self):
if self.__f is not None:
self.__f.close()
self.__dbBinStr = None
self.__headerPtr = None
self.__headerSip = None
class IpRegData(IpRegInfo):
def __init__(self):
path = settings.data_storage_dir.joinpath('ip2region.db')
IpRegInfo.__init__(self, path)
def query(self, ip):
result = self.memory_search(ip)
addr_list = result.get('region').split('|')
addr = ''.join(filter(lambda x: x != '0', addr_list[:-1]))
isp = addr_list[-1]
if isp == '0':
isp = '未知'
info = {'addr': addr, 'isp': isp}
return info
=================================
gitextract_qo8womg3/ ├── Komo.py ├── common/ │ ├── __init__.py │ └── getconfig.py ├── config/ │ ├── config.yaml │ ├── log_template.json │ ├── supplementary_files/ │ │ └── vulmap/ │ │ └── licenses.txt │ ├── tools_linux.yaml │ └── tools_windows.yaml ├── core/ │ ├── download/ │ │ ├── __init__.py │ │ ├── download_tools.py │ │ ├── tools.yaml │ │ ├── tools2.yaml │ │ ├── tools_linux.yaml │ │ └── tools_windows.yaml │ └── tools/ │ ├── domain/ │ │ ├── OneForAll/ │ │ │ ├── .github/ │ │ │ │ ├── ISSUE_TEMPLATE/ │ │ │ │ │ ├── bug_report.md │ │ │ │ │ ├── bug_report_zh.md │ │ │ │ │ └── feature_request.md │ │ │ │ └── workflows/ │ │ │ │ └── test.yml │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── Dockerfile │ │ │ ├── LICENSE │ │ │ ├── Pipfile │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── brute.py │ │ │ ├── common/ │ │ │ │ ├── check.py │ │ │ │ ├── crawl.py │ │ │ │ ├── database.py │ │ │ │ ├── domain.py │ │ │ │ ├── ipasn.py │ │ │ │ ├── ipreg.py │ │ │ │ ├── lookup.py │ │ │ │ ├── module.py │ │ │ │ ├── query.py │ │ │ │ ├── records.py │ │ │ │ ├── request.py │ │ │ │ ├── resolve.py │ │ │ │ ├── search.py │ │ │ │ ├── similarity.py │ │ │ │ ├── tablib/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── format.py │ │ │ │ │ └── tablib.py │ │ │ │ ├── tldextract.py │ │ │ │ └── utils.py │ │ │ ├── config/ │ │ │ │ ├── __init__.py │ │ │ │ ├── api.py │ │ │ │ ├── default.py │ │ │ │ ├── log.py │ │ │ │ └── setting.py │ │ │ ├── data/ │ │ │ │ ├── altdns_wordlist.txt │ │ │ │ ├── authoritative_dns.txt │ │ │ │ ├── cdn_asn_list.json │ │ │ │ ├── cdn_cname_keywords.json │ │ │ │ ├── cdn_header_keys.json │ │ │ │ ├── cdn_ip_cidr.json │ │ │ │ ├── common_js_library.json │ │ │ │ ├── fingerprints.json │ │ │ │ ├── nameservers.txt │ │ │ │ ├── nameservers_cn.txt │ │ │ │ ├── srv_prefixes.json │ │ │ │ ├── subnames.txt │ │ │ │ ├── subnames_medium.txt │ │ │ │ └── subnames_next.txt │ │ │ ├── docs/ │ │ │ │ ├── changes.md │ │ │ │ ├── collection_modules.md │ │ │ │ ├── contributors.md │ │ │ │ ├── dictionary_source.md │ │ │ │ ├── directory_structure.md │ │ │ │ ├── en-us/ │ │ │ │ │ ├── README.md │ │ │ │ │ └── usage_help.md │ │ │ │ ├── field.md │ │ │ │ ├── installation_dependency.md │ │ │ │ ├── todo.md │ │ │ │ ├── troubleshooting.md │ │ │ │ └── usage_help.md │ │ │ ├── export.py │ │ │ ├── modules/ │ │ │ │ ├── altdns.py │ │ │ │ ├── amass_dange.py │ │ │ │ ├── autotake/ │ │ │ │ │ └── github.py │ │ │ │ ├── certificates/ │ │ │ │ │ ├── censys_api.py │ │ │ │ │ ├── certspotter.py │ │ │ │ │ ├── crtsh.py │ │ │ │ │ └── google.py │ │ │ │ ├── check/ │ │ │ │ │ ├── axfr.py │ │ │ │ │ ├── cdx.py │ │ │ │ │ ├── cert.py │ │ │ │ │ ├── csp.py │ │ │ │ │ ├── nsec.py │ │ │ │ │ ├── robots.py │ │ │ │ │ └── sitemap.py │ │ │ │ ├── collect.py │ │ │ │ ├── crawl/ │ │ │ │ │ ├── archivecrawl.py │ │ │ │ │ └── commoncrawl.py │ │ │ │ ├── datasets/ │ │ │ │ │ ├── anubis.py │ │ │ │ │ ├── bevigil.py │ │ │ │ │ ├── binaryedge_api.py │ │ │ │ │ ├── cebaidu.py │ │ │ │ │ ├── chinaz.py │ │ │ │ │ ├── chinaz_api.py │ │ │ │ │ ├── circl_api.py │ │ │ │ │ ├── cloudflare_api.py │ │ │ │ │ ├── dnsdb_api.py │ │ │ │ │ ├── dnsdumpster.py │ │ │ │ │ ├── fullhunt.py │ │ │ │ │ ├── hackertarget.py │ │ │ │ │ ├── ip138.py │ │ │ │ │ ├── ipv4info_api.py │ │ │ │ │ ├── netcraft.py │ │ │ │ │ ├── passivedns_api.py │ │ │ │ │ ├── qianxun.py │ │ │ │ │ ├── rapiddns.py │ │ │ │ │ ├── riddler.py │ │ │ │ │ ├── robtex.py │ │ │ │ │ ├── securitytrails_api.py │ │ │ │ │ ├── sitedossier.py │ │ │ │ │ ├── spyse_api.py │ │ │ │ │ └── sublist3r.py │ │ │ │ ├── dnsquery/ │ │ │ │ │ ├── mx.py │ │ │ │ │ ├── ns.py │ │ │ │ │ ├── soa.py │ │ │ │ │ ├── spf.py │ │ │ │ │ └── txt.py │ │ │ │ ├── enrich.py │ │ │ │ ├── finder.py │ │ │ │ ├── intelligence/ │ │ │ │ │ ├── alienvault.py │ │ │ │ │ ├── riskiq_api.py │ │ │ │ │ ├── threatbook_api.py │ │ │ │ │ ├── threatminer.py │ │ │ │ │ ├── virustotal.py │ │ │ │ │ └── virustotal_api.py │ │ │ │ ├── iscdn.py │ │ │ │ ├── other_tools.py │ │ │ │ ├── search/ │ │ │ │ │ ├── ask.py │ │ │ │ │ ├── baidu.py │ │ │ │ │ ├── bing.py │ │ │ │ │ ├── bing_api.py │ │ │ │ │ ├── fofa_api.py │ │ │ │ │ ├── gitee.py │ │ │ │ │ ├── github_api.py │ │ │ │ │ ├── google.py │ │ │ │ │ ├── google_api.py │ │ │ │ │ ├── hunter.py │ │ │ │ │ ├── shodan_api.py │ │ │ │ │ ├── so.py │ │ │ │ │ ├── sogou.py │ │ │ │ │ ├── yahoo.py │ │ │ │ │ ├── yandex.py │ │ │ │ │ └── zoomeye_api.py │ │ │ │ ├── srv.py │ │ │ │ └── wildcard.py │ │ │ ├── oneforall.py │ │ │ ├── requirements.txt │ │ │ ├── results/ │ │ │ │ ├── result.sqlite3 │ │ │ │ └── temp/ │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_102952.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_103024.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_103609.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_103641.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_103854.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_103925.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104236.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104307.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104548.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104620.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104839.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_104911.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_135147.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_135221.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_140104.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_140134.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_140659.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_140731.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_142514.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_142545.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_142845.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_142916.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_143118.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_143151.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_143716.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_143748.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_144026.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220902_144059.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220909_160351.txt │ │ │ │ ├── collected_subdomains_tiqianle.com_20220909_160424.txt │ │ │ │ ├── resolved_result_tiqianle.com_20220902_102952.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_103024.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_103609.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_103641.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_103854.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_103925.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_104236.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_104307.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_104548.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_104620.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_104839.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_104911.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_135147.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_135221.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_140104.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_140134.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_140659.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_140731.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_142514.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_142545.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_142845.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_142916.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_143118.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_143151.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_143716.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_143748.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_144026.json │ │ │ │ ├── resolved_result_tiqianle.com_20220902_144059.json │ │ │ │ ├── resolved_result_tiqianle.com_20220909_160351.json │ │ │ │ └── resolved_result_tiqianle.com_20220909_160424.json │ │ │ ├── takeover.py │ │ │ ├── test.py │ │ │ └── thirdparty/ │ │ │ └── massdns/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── massdns_darwin_arm64 │ │ │ ├── massdns_darwin_x86_64 │ │ │ ├── massdns_linux_i686 │ │ │ └── massdns_linux_x86_64 │ │ ├── ctfr/ │ │ │ ├── __init__.py │ │ │ └── ctfr.py │ │ └── domain_main.py │ ├── finger/ │ │ ├── Ehole/ │ │ │ ├── config.ini │ │ │ └── finger.json │ │ └── finger_main.py │ ├── portscan/ │ │ ├── portscan_main.py │ │ └── top1000port.txt │ ├── sensitiveinfo/ │ │ ├── chrome-win/ │ │ │ └── 下载地址.txt │ │ ├── emailall/ │ │ │ ├── README.md │ │ │ ├── common/ │ │ │ │ ├── __init__.py │ │ │ │ ├── output.py │ │ │ │ ├── search.py │ │ │ │ └── utils.py │ │ │ ├── config/ │ │ │ │ ├── __init__.py │ │ │ │ ├── api.py │ │ │ │ ├── log.py │ │ │ │ └── setting.py │ │ │ ├── docs/ │ │ │ │ └── changes.md │ │ │ ├── emailall.log │ │ │ ├── emailall.py │ │ │ ├── modules/ │ │ │ │ ├── __init__.py │ │ │ │ ├── collect.py │ │ │ │ ├── datasets/ │ │ │ │ │ ├── Emailf.py │ │ │ │ │ ├── phonebook.py │ │ │ │ │ ├── skymem.py │ │ │ │ │ ├── snov.py │ │ │ │ │ └── veryvp.py │ │ │ │ ├── module.py │ │ │ │ └── search/ │ │ │ │ ├── ask.py │ │ │ │ ├── baidu.py │ │ │ │ ├── bingcn.py │ │ │ │ ├── githubapi.py │ │ │ │ ├── google.py │ │ │ │ ├── qwant.py │ │ │ │ ├── so.py │ │ │ │ └── sogou.py │ │ │ ├── requirements.txt │ │ │ └── result/ │ │ │ └── READEME.MD │ │ └── sensitiveinfo_main.py │ └── vulscan/ │ └── vulscan_main.py ├── readme.md └── requirement.txt
SYMBOL INDEX (932 symbols across 127 files)
FILE: Komo.py
function create_logfile (line 49) | def create_logfile():
function progress_record (line 57) | def progress_record(date=None, module=None, value=None):
class Komo (line 70) | class Komo(object):
method __init__ (line 161) | def __init__(self, domain=None, domains=None, subdomain=None, subdomai...
method install (line 239) | def install(self):
method subdomain (line 245) | def subdomain(self):
method finger (line 253) | def finger(self):
method portscan (line 261) | def portscan(self):
method sensitive (line 270) | def sensitive(self):
method webattack (line 282) | def webattack(self):
method webattack1 (line 295) | def webattack1(self):
method webattack2 (line 307) | def webattack2(self):
method hostattack (line 317) | def hostattack(self):
method attack (line 328) | def attack(self):
method collect (line 333) | def collect(self):
method collect1 (line 351) | def collect1(self):
method collect2 (line 361) | def collect2(self):
method all (line 372) | def all(self):
method all2 (line 392) | def all2(self):
FILE: common/getconfig.py
function getconfig (line 20) | def getconfig():
FILE: core/download/download_tools.py
function get_system (line 19) | def get_system():
function executor_callback (line 31) | def executor_callback(worker):
class Download (line 42) | class Download:
method __init__ (line 43) | def __init__(self, proxy=None):
method getconfig (line 61) | def getconfig(self):
method unzipfile (line 84) | def unzipfile(self, filename, dirs="."):
method downloadfile (line 108) | def downloadfile(self, url, dst_file, dst_path='download'):
method handle (line 147) | def handle(self, toolinfo):
method tools_init (line 206) | def tools_init(self):
method run (line 220) | def run(self):
method run1 (line 248) | def run1(self):
method run2 (line 273) | def run2(self):
FILE: core/tools/domain/OneForAll/brute.py
function gen_subdomains (line 25) | def gen_subdomains(expression, path):
function gen_fuzz_subdomains (line 56) | def gen_fuzz_subdomains(expression, rule, fuzzlist):
function gen_word_subdomains (line 85) | def gen_word_subdomains(expression, path):
function query_domain_ns_a (line 98) | def query_domain_ns_a(ns_list):
function query_domain_ns (line 118) | def query_domain_ns(domain):
function check_dict (line 133) | def check_dict():
function gen_result_infos (line 147) | def gen_result_infos(items, infos, subdomains, appear_times, wc_ips, wc_...
function stat_appear_times (line 196) | def stat_appear_times(result_path):
function deal_output (line 237) | def deal_output(output_path, appear_times, wildcard_ips, wildcard_ttl):
function save_brute_dict (line 267) | def save_brute_dict(dict_path, dict_set):
function delete_file (line 274) | def delete_file(dict_path, output_path):
class Brute (line 281) | class Brute(Module):
method __init__ (line 316) | def __init__(self, target=None, targets=None, concurrent=None,
method gen_brute_dict (line 347) | def gen_brute_dict(self, domain):
method check_brute_params (line 372) | def check_brute_params(self):
method init_dict_path (line 402) | def init_dict_path(self):
method main (line 409) | def main(self, domain):
method run (line 460) | def run(self):
FILE: core/tools/domain/OneForAll/common/check.py
class Check (line 6) | class Check(Module):
method __init__ (line 11) | def __init__(self):
method to_check (line 15) | def to_check(self, filenames):
method check_loop (line 30) | def check_loop(self, urls):
FILE: core/tools/domain/OneForAll/common/crawl.py
class Crawl (line 4) | class Crawl(Module):
method __init__ (line 9) | def __init__(self):
FILE: core/tools/domain/OneForAll/common/database.py
class Database (line 12) | class Database(object):
method __init__ (line 13) | def __init__(self, db_path=None):
method get_conn (line 17) | def get_conn(db_path):
method query (line 36) | def query(self, sql):
method create_table (line 44) | def create_table(self, table_name):
method insert_table (line 89) | def insert_table(self, table_name, result):
method save_db (line 103) | def save_db(self, table_name, results, module_name=None):
method exist_table (line 130) | def exist_table(self, table_name):
method copy_table (line 146) | def copy_table(self, table_name, bak_table_name):
method clear_table (line 160) | def clear_table(self, table_name):
method drop_table (line 170) | def drop_table(self, table_name):
method rename_table (line 180) | def rename_table(self, table_name, new_table_name):
method deduplicate_subdomain (line 193) | def deduplicate_subdomain(self, table_name):
method remove_invalid (line 205) | def remove_invalid(self, table_name):
method get_data (line 216) | def get_data(self, table_name):
method export_data (line 226) | def export_data(self, table_name, alive, limit):
method count_alive (line 249) | def count_alive(self, table_name):
method get_resp_by_url (line 254) | def get_resp_by_url(self, table_name, url):
method get_data_by_fields (line 260) | def get_data_by_fields(self, table_name, fields):
method update_data_by_url (line 267) | def update_data_by_url(self, table_name, info, url):
method close (line 273) | def close(self):
FILE: core/tools/domain/OneForAll/common/domain.py
class Domain (line 6) | class Domain(object):
method __init__ (line 12) | def __init__(self, string):
method match (line 17) | def match(self):
method extract (line 28) | def extract(self):
method registered (line 47) | def registered(self):
FILE: core/tools/domain/OneForAll/common/ipasn.py
function get_db_path (line 8) | def get_db_path():
class IPAsnInfo (line 18) | class IPAsnInfo(Database):
method __init__ (line 19) | def __init__(self):
method find (line 23) | def find(self, ip):
FILE: core/tools/domain/OneForAll/common/ipreg.py
class IpRegInfo (line 15) | class IpRegInfo(object):
method __init__ (line 28) | def __init__(self, db_file):
method memory_search (line 31) | def memory_search(self, ip):
method init_database (line 67) | def init_database(self, db_file):
method return_data (line 78) | def return_data(self, data_ptr):
method ip2long (line 94) | def ip2long(ip):
method is_ip (line 99) | def is_ip(ip):
method get_long (line 113) | def get_long(b, offset):
method close (line 118) | def close(self):
class IpRegData (line 126) | class IpRegData(IpRegInfo):
method __init__ (line 127) | def __init__(self):
method query (line 131) | def query(self, ip):
FILE: core/tools/domain/OneForAll/common/lookup.py
class Lookup (line 6) | class Lookup(Module):
method __init__ (line 11) | def __init__(self):
method query (line 15) | def query(self):
FILE: core/tools/domain/OneForAll/common/module.py
class Module (line 18) | class Module(object):
method __init__ (line 19) | def __init__(self):
method have_api (line 36) | def have_api(self, *apis):
method begin (line 48) | def begin(self):
method finish (line 55) | def finish(self):
method head (line 68) | def head(self, url, params=None, check=True, **kwargs):
method get (line 98) | def get(self, url, params=None, check=True, ignore=False, raise_error=...
method post (line 137) | def post(self, url, data=None, check=True, **kwargs):
method delete (line 167) | def delete(self, url, check=True, **kwargs):
method get_header (line 195) | def get_header(self):
method get_proxy (line 207) | def get_proxy(self, module):
method match_subdomains (line 227) | def match_subdomains(self, resp, distinct=True, fuzzy=True):
method collect_subdomains (line 237) | def collect_subdomains(self, resp):
method save_json (line 242) | def save_json(self):
method gen_result (line 267) | def gen_result(self):
method save_db (line 359) | def save_db(self):
FILE: core/tools/domain/OneForAll/common/query.py
class Query (line 4) | class Query(Module):
method __init__ (line 8) | def __init__(self):
FILE: core/tools/domain/OneForAll/common/records.py
function is_exception (line 12) | def is_exception(obj):
class Record (line 23) | class Record(object):
method __init__ (line 27) | def __init__(self, keys, values):
method keys (line 34) | def keys(self):
method values (line 38) | def values(self):
method __repr__ (line 42) | def __repr__(self):
method __getitem__ (line 45) | def __getitem__(self, key):
method __getattr__ (line 59) | def __getattr__(self, key):
method __dir__ (line 65) | def __dir__(self):
method get (line 70) | def get(self, key, default=None):
method as_dict (line 77) | def as_dict(self, ordered=False):
method dataset (line 84) | def dataset(self):
method export (line 94) | def export(self, format, **kwargs):
class RecordCollection (line 99) | class RecordCollection(object):
method __init__ (line 102) | def __init__(self, rows):
method __repr__ (line 107) | def __repr__(self):
method __iter__ (line 110) | def __iter__(self):
method next (line 129) | def next(self):
method __next__ (line 132) | def __next__(self):
method __getitem__ (line 141) | def __getitem__(self, key):
method __len__ (line 160) | def __len__(self):
method export (line 163) | def export(self, format, **kwargs):
method dataset (line 168) | def dataset(self):
method all (line 188) | def all(self, as_dict=False, as_ordereddict=False):
method as_dict (line 202) | def as_dict(self, ordered=False):
method first (line 205) | def first(self, default=None, as_dict=False, as_ordereddict=False):
method one (line 226) | def one(self, default=None, as_dict=False, as_ordereddict=False):
method scalar (line 242) | def scalar(self, default=None):
class Database (line 248) | class Database(object):
method __init__ (line 253) | def __init__(self, db_url=None, **kwargs):
method close (line 264) | def close(self):
method __enter__ (line 269) | def __enter__(self):
method __exit__ (line 272) | def __exit__(self, exc, val, traceback):
method __repr__ (line 275) | def __repr__(self):
method get_table_names (line 278) | def get_table_names(self):
method get_connection (line 284) | def get_connection(self):
method query (line 293) | def query(self, query, fetchall=False, **params):
method bulk_query (line 301) | def bulk_query(self, query, *multiparams):
class Connection (line 308) | class Connection(object):
method __init__ (line 311) | def __init__(self, connection):
method close (line 315) | def close(self):
method __enter__ (line 319) | def __enter__(self):
method __exit__ (line 322) | def __exit__(self, exc, val, traceback):
method __repr__ (line 325) | def __repr__(self):
method query (line 328) | def query(self, query, fetchall=False, **params):
method bulk_query (line 349) | def bulk_query(self, query, *multiparams):
function _reduce_datetimes (line 355) | def _reduce_datetimes(row):
FILE: core/tools/domain/OneForAll/common/request.py
function req_thread_count (line 15) | def req_thread_count():
function get_port_seq (line 25) | def get_port_seq(port):
function gen_req_url (line 43) | def gen_req_url(domain, port):
function gen_req_data (line 55) | def gen_req_data(data, ports):
function get_html_title (line 75) | def get_html_title(markup):
function get_jump_urls (line 115) | def get_jump_urls(history):
function get_progress_bar (line 122) | def get_progress_bar(total):
function get_resp (line 130) | def get_resp(url, session):
function request (line 142) | def request(urls_queue, resp_queue, session):
function progress (line 150) | def progress(bar, total, urls_queue):
function get_session (line 160) | def get_session():
function gen_new_info (line 172) | def gen_new_info(info, resp):
function save (line 199) | def save(name, total, req_data, resp_queue):
function bulk_request (line 216) | def bulk_request(domain, req_data, ret=False):
function run_request (line 249) | def run_request(domain, data, port):
FILE: core/tools/domain/OneForAll/common/resolve.py
function filter_subdomain (line 9) | def filter_subdomain(data):
function update_data (line 26) | def update_data(data, infos):
function save_db (line 54) | def save_db(name, data):
function save_subdomains (line 65) | def save_subdomains(save_path, subdomain_list):
function gen_infos (line 73) | def gen_infos(data, qname, info, infos):
function deal_output (line 103) | def deal_output(output_path):
function run_resolve (line 134) | def run_resolve(domain, data):
FILE: core/tools/domain/OneForAll/common/search.py
class Search (line 5) | class Search(Module):
method __init__ (line 9) | def __init__(self):
method filter (line 18) | def filter(domain, subdomain):
method match_location (line 36) | def match_location(self, url):
method check_subdomains (line 54) | def check_subdomains(self, subdomains):
method recursive_subdomain (line 69) | def recursive_subdomain(self):
FILE: core/tools/domain/OneForAll/common/similarity.py
class DOMTree (line 12) | class DOMTree(object):
method __init__ (line 13) | def __init__(self, label, attrs):
class HTMLParser (line 18) | class HTMLParser(object):
method __init__ (line 19) | def __init__(self, html):
method get_dom_structure_tree (line 24) | def get_dom_structure_tree(self):
method recursive_descendants (line 31) | def recursive_descendants(self, descendants, parent_id):
class Converter (line 44) | class Converter(object):
method __init__ (line 45) | def __init__(self, dom_tree, dimension):
method get_eigenvector (line 53) | def get_eigenvector(self):
method create_feature (line 63) | def create_feature(node):
method feature_hash (line 72) | def feature_hash(node_feature):
method calculate_weight (line 75) | def calculate_weight(self, node, node_id, feature_hash):
method construct_eigenvector (line 90) | def construct_eigenvector(self, feature_hash, node_weight):
function calc_pseudodistance (line 95) | def calc_pseudodistance(dom1_eigenvector, dom2_eigenvector, dimension):
function get_pseudodistance (line 105) | def get_pseudodistance(html_doc1, html_doc2, dimension=5000):
function is_similar (line 125) | def is_similar(html_doc1, html_doc2, dimension=5000):
FILE: core/tools/domain/OneForAll/common/tablib/format.py
class Registry (line 12) | class Registry:
method register (line 15) | def register(self, key, format_or_path):
method register_builtins (line 22) | def register_builtins(self):
method get_format (line 27) | def get_format(self, key):
function serialize_objects_handler (line 36) | def serialize_objects_handler(obj):
class JSONFormat (line 50) | class JSONFormat:
method export_set (line 55) | def export_set(cls, dataset):
class CSVFormat (line 64) | class CSVFormat:
method export_stream_set (line 71) | def export_stream_set(cls, dataset, **kwargs):
method export_set (line 86) | def export_set(cls, dataset, **kwargs):
FILE: core/tools/domain/OneForAll/common/tablib/tablib.py
class Row (line 5) | class Row:
method __init__ (line 10) | def __init__(self, row=None, tags=None):
method __iter__ (line 18) | def __iter__(self):
method __len__ (line 21) | def __len__(self):
method __repr__ (line 24) | def __repr__(self):
method __getitem__ (line 27) | def __getitem__(self, i):
method __setitem__ (line 30) | def __setitem__(self, i, value):
method __delitem__ (line 33) | def __delitem__(self, i):
method __getstate__ (line 36) | def __getstate__(self):
method __setstate__ (line 46) | def __setstate__(self, state):
method rpush (line 50) | def rpush(self, value):
method append (line 53) | def append(self, value):
method insert (line 56) | def insert(self, index, value):
method __contains__ (line 59) | def __contains__(self, item):
method tuple (line 63) | def tuple(self):
class Dataset (line 68) | class Dataset:
method __init__ (line 115) | def __init__(self, *args, **kwargs):
method __len__ (line 129) | def __len__(self):
method _validate (line 132) | def _validate(self, row=None, col=None, safety=False):
method _package (line 150) | def _package(self, dicts=True, ordered=True):
method _get_headers (line 185) | def _get_headers(self):
method _set_headers (line 193) | def _set_headers(self, collection):
method _get_dict (line 206) | def _get_dict(self):
method _set_dict (line 219) | def _set_dict(self, pickle):
method height (line 252) | def height(self):
method width (line 259) | def width(self):
method export (line 272) | def export(self, format, **kwargs):
method insert (line 289) | def insert(self, index, row, tags=None):
method rpush (line 303) | def rpush(self, row, tags=None):
method append (line 312) | def append(self, row, tags=None):
method extend (line 321) | def extend(self, rows, tags=None):
method remove_duplicates (line 335) | def remove_duplicates(self):
method wipe (line 342) | def wipe(self):
class InvalidDimensions (line 351) | class InvalidDimensions(Exception):
class InvalidDatasetIndex (line 355) | class InvalidDatasetIndex(Exception):
class UnsupportedFormat (line 359) | class UnsupportedFormat(NotImplementedError):
FILE: core/tools/domain/OneForAll/common/tldextract.py
class ExtractResult (line 66) | class ExtractResult(collections.namedtuple('ExtractResult', 'subdomain d...
method registered_domain (line 73) | def registered_domain(self):
method fqdn (line 87) | def fqdn(self):
method ipv4 (line 102) | def ipv4(self):
class TLDExtract (line 118) | class TLDExtract(object):
method __init__ (line 121) | def __init__(self, cache_file=None):
method __call__ (line 130) | def __call__(self, url):
method tlds (line 164) | def tlds(self):
method _get_tld_extractor (line 167) | def _get_tld_extractor(self):
method _get_cached_tlds (line 185) | def _get_cached_tlds(self):
function extract (line 200) | def extract(url):
class _PublicSuffixListTLDExtractor (line 204) | class _PublicSuffixListTLDExtractor(object):
method __init__ (line 208) | def __init__(self, tlds):
method suffix_index (line 211) | def suffix_index(self, lower_spl):
function _decode_punycode (line 232) | def _decode_punycode(label):
FILE: core/tools/domain/OneForAll/common/utils.py
function gen_random_ip (line 43) | def gen_random_ip():
function gen_fake_header (line 53) | def gen_fake_header():
function get_random_header (line 67) | def get_random_header():
function get_random_proxy (line 77) | def get_random_proxy():
function get_proxy (line 87) | def get_proxy():
function split_list (line 96) | def split_list(ls, size):
function match_main_domain (line 112) | def match_main_domain(domain):
function read_target_file (line 119) | def read_target_file(target):
function get_from_target (line 131) | def get_from_target(target):
function get_from_targets (line 144) | def get_from_targets(targets):
function get_domains (line 159) | def get_domains(target, targets=None):
function check_dir (line 172) | def check_dir(dir_path):
function check_path (line 178) | def check_path(path, name, fmt):
function check_format (line 206) | def check_format(fmt):
function load_json (line 222) | def load_json(path):
function save_to_db (line 227) | def save_to_db(name, data, module):
function save_to_file (line 242) | def save_to_file(path, data):
function check_response (line 263) | def check_response(method, resp):
function mark_subdomain (line 286) | def mark_subdomain(old_data, now_data):
function remove_invalid_string (line 314) | def remove_invalid_string(string):
function export_all_results (line 319) | def export_all_results(path, name, fmt, datas):
function export_all_subdomains (line 336) | def export_all_subdomains(alive, path, name, datas):
function export_all (line 352) | def export_all(alive, fmt, path, datas):
function dns_resolver (line 368) | def dns_resolver():
function dns_query (line 379) | def dns_query(qname, qtype):
function get_timestamp (line 400) | def get_timestamp():
function get_timestring (line 404) | def get_timestring():
function get_classname (line 408) | def get_classname(classobj):
function python_version (line 412) | def python_version():
function calc_alive (line 416) | def calc_alive(data):
function count_alive (line 420) | def count_alive(name):
function get_subdomains (line 428) | def get_subdomains(data):
function set_id_none (line 432) | def set_id_none(data):
function get_filtered_data (line 440) | def get_filtered_data(data):
function get_sample_banner (line 449) | def get_sample_banner(headers):
function check_ip_public (line 464) | def check_ip_public(ip_list):
function ip_is_public (line 472) | def ip_is_public(ip_str):
function get_request_count (line 479) | def get_request_count():
function uniq_dict_list (line 483) | def uniq_dict_list(dict_list):
function delete_file (line 487) | def delete_file(*paths):
function check_net (line 497) | def check_net():
function check_dep (line 522) | def check_dep():
function get_net_env (line 534) | def get_net_env():
function check_version (line 545) | def check_version(local):
function get_main_domain (line 573) | def get_main_domain(domain):
function call_massdns (line 579) | def call_massdns(massdns_path, dict_path, ns_path, output_path, log_path,
function get_massdns_path (line 601) | def get_massdns_path(massdns_dir):
function is_subname (line 624) | def is_subname(name):
function ip_to_int (line 632) | def ip_to_int(ip):
function match_subdomains (line 643) | def match_subdomains(domain, html, distinct=True, fuzzy=True):
function check_random_subdomain (line 680) | def check_random_subdomain(subdomains):
function get_url_resp (line 690) | def get_url_resp(url):
function decode_resp_text (line 705) | def decode_resp_text(resp):
function sort_by_subdomain (line 722) | def sort_by_subdomain(data):
function looks_like_ip (line 726) | def looks_like_ip(maybe_ip):
function deal_data (line 741) | def deal_data(domain):
function get_data (line 748) | def get_data(domain):
function clear_data (line 755) | def clear_data(domain):
function get_ns_path (line 761) | def get_ns_path(in_china=None, enable_wildcard=None, ns_ip_list=None):
function init_table (line 776) | def init_table(domain):
FILE: core/tools/domain/OneForAll/config/__init__.py
class Settings (line 5) | class Settings(object):
method __init__ (line 6) | def __init__(self):
FILE: core/tools/domain/OneForAll/export.py
function export_data (line 18) | def export_data(target, db=None, alive=False, limit=None, path=None, fmt...
function do_export (line 57) | def do_export(fmt, path, rows, show, domain, target):
FILE: core/tools/domain/OneForAll/modules/altdns.py
function split_domain (line 19) | def split_domain(domain):
class Altdns (line 35) | class Altdns(Module):
method __init__ (line 36) | def __init__(self, domain):
method get_words (line 48) | def get_words(self):
method extract_words (line 56) | def extract_words(self):
method increase_num (line 69) | def increase_num(self, subname):
method decrease_num (line 90) | def decrease_num(self, subname):
method insert_word (line 115) | def insert_word(self, parts):
method add_word (line 136) | def add_word(self, subnames):
method replace_word (line 161) | def replace_word(self, subname):
method gen_new_subdomains (line 185) | def gen_new_subdomains(self):
method run (line 202) | def run(self, data, port):
FILE: core/tools/domain/OneForAll/modules/amass_dange.py
class OwaspAamss (line 10) | class OwaspAamss(Module):
method __init__ (line 11) | def __init__(self, domain):
method do_brute (line 17) | def do_brute(self):
method run (line 53) | def run(self):
function run (line 63) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/autotake/github.py
function github_takeover (line 22) | def github_takeover(url):
FILE: core/tools/domain/OneForAll/modules/certificates/censys_api.py
class CensysAPI (line 6) | class CensysAPI(Query):
method __init__ (line 7) | def __init__(self, domain):
method query (line 17) | def query(self):
method run (line 44) | def run(self):
function run (line 58) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/certificates/certspotter.py
class CertSpotter (line 4) | class CertSpotter(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 12) | def query(self):
method run (line 24) | def run(self):
function run (line 36) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/certificates/crtsh.py
class Crtsh (line 4) | class Crtsh(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 12) | def query(self):
method run (line 26) | def run(self):
function run (line 38) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/certificates/google.py
class Google (line 4) | class Google(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 13) | def query(self):
method run (line 25) | def run(self):
function run (line 37) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/check/axfr.py
class AXFR (line 18) | class AXFR(Check):
method __init__ (line 19) | def __init__(self, domain):
method axfr (line 26) | def axfr(self, server):
method check (line 56) | def check(self):
method run (line 73) | def run(self):
function run (line 85) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/check/cdx.py
class CrossDomain (line 7) | class CrossDomain(Check):
method __init__ (line 8) | def __init__(self, domain):
method check (line 14) | def check(self):
method run (line 21) | def run(self):
function run (line 33) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/check/cert.py
class CertInfo (line 11) | class CertInfo(Check):
method __init__ (line 12) | def __init__(self, domain):
method check (line 18) | def check(self):
method run (line 35) | def run(self):
function run (line 47) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/check/csp.py
class CSP (line 10) | class CSP(Check):
method __init__ (line 15) | def __init__(self, domain, header):
method grab_header (line 23) | def grab_header(self):
method grab_loop (line 40) | def grab_loop(self, csp_header, urls):
method check (line 53) | def check(self):
method run (line 69) | def run(self):
function run (line 81) | def run(domain, header=None):
FILE: core/tools/domain/OneForAll/modules/check/nsec.py
class NSEC (line 8) | class NSEC(Check):
method __init__ (line 9) | def __init__(self, domain):
method walk (line 15) | def walk(self):
method run (line 35) | def run(self):
function run (line 47) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/check/robots.py
class Robots (line 7) | class Robots(Check):
method __init__ (line 8) | def __init__(self, domain):
method check (line 14) | def check(self):
method run (line 21) | def run(self):
function run (line 33) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/check/sitemap.py
class Sitemap (line 7) | class Sitemap(Check):
method __init__ (line 8) | def __init__(self, domain):
method check (line 14) | def check(self):
method run (line 21) | def run(self):
function run (line 33) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/collect.py
class Collect (line 8) | class Collect(object):
method __init__ (line 9) | def __init__(self, domain):
method get_mod (line 14) | def get_mod(self):
method import_func (line 30) | def import_func(self):
method run (line 40) | def run(self):
FILE: core/tools/domain/OneForAll/modules/crawl/archivecrawl.py
class ArchiveCrawl (line 6) | class ArchiveCrawl(Crawl):
method __init__ (line 7) | def __init__(self, domain):
method crawl (line 13) | def crawl(self, domain, limit):
method run (line 32) | def run(self):
function run (line 48) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/crawl/commoncrawl.py
class CommonCrawl (line 7) | class CommonCrawl(Crawl):
method __init__ (line 8) | def __init__(self, domain):
method crawl (line 14) | def crawl(self, domain, limit):
method run (line 32) | def run(self):
function run (line 48) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/anubis.py
class Anubis (line 4) | class Anubis(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 12) | def query(self):
method run (line 22) | def run(self):
function run (line 34) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/bevigil.py
class BeVigilAPI (line 5) | class BeVigilAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 14) | def query(self):
method run (line 26) | def run(self):
function run (line 40) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/binaryedge_api.py
class BinaryEdgeAPI (line 5) | class BinaryEdgeAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 14) | def query(self):
method run (line 25) | def run(self):
function run (line 39) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/cebaidu.py
class CeBaidu (line 4) | class CeBaidu(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 12) | def query(self):
method run (line 22) | def run(self):
function run (line 34) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/chinaz.py
class Chinaz (line 4) | class Chinaz(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 12) | def query(self):
method run (line 22) | def run(self):
function run (line 34) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/chinaz_api.py
class ChinazAPI (line 5) | class ChinazAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 14) | def query(self):
method run (line 24) | def run(self):
function run (line 38) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/circl_api.py
class CirclAPI (line 5) | class CirclAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 15) | def query(self):
method run (line 24) | def run(self):
function run (line 38) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/cloudflare_api.py
class CloudFlareAPI (line 7) | class CloudFlareAPI(Query):
method __init__ (line 9) | def __init__(self, domain):
method query (line 21) | def query(self):
method create_zone (line 61) | def create_zone(self, account_id):
method list_dns (line 75) | def list_dns(self, zone_id):
method run (line 105) | def run(self):
function run (line 119) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/dnsdb_api.py
class DNSdbAPI (line 5) | class DNSdbAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 14) | def query(self):
method run (line 25) | def run(self):
function run (line 39) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/dnsdumpster.py
class DNSDumpster (line 4) | class DNSDumpster(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 12) | def query(self):
method run (line 29) | def run(self):
function run (line 41) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/fullhunt.py
class FullHuntAPI (line 5) | class FullHuntAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 13) | def query(self):
method run (line 24) | def run(self):
function run (line 36) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/hackertarget.py
class HackerTarget (line 4) | class HackerTarget(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 12) | def query(self):
method run (line 22) | def run(self):
function run (line 34) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/ip138.py
class IP138 (line 4) | class IP138(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 12) | def query(self):
method run (line 22) | def run(self):
function run (line 34) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/ipv4info_api.py
class IPv4InfoAPI (line 6) | class IPv4InfoAPI(Query):
method __init__ (line 7) | def __init__(self, domain):
method query (line 15) | def query(self):
method run (line 48) | def run(self):
function run (line 62) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/netcraft.py
class NetCraft (line 9) | class NetCraft(Query):
method __init__ (line 10) | def __init__(self, domain):
method query (line 19) | def query(self):
method run (line 43) | def run(self):
function run (line 55) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/passivedns_api.py
class PassiveDnsAPI (line 5) | class PassiveDnsAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 14) | def query(self):
method run (line 25) | def run(self):
function run (line 40) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/qianxun.py
class QianXun (line 4) | class QianXun(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 11) | def query(self):
method run (line 38) | def run(self):
function run (line 50) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/rapiddns.py
class RapidDNS (line 4) | class RapidDNS(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 11) | def query(self):
method run (line 22) | def run(self):
function run (line 34) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/riddler.py
class Riddler (line 4) | class Riddler(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 12) | def query(self):
method run (line 22) | def run(self):
function run (line 34) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/robtex.py
class Robtex (line 7) | class Robtex(Query):
method __init__ (line 8) | def __init__(self, domain):
method query (line 14) | def query(self):
method run (line 35) | def run(self):
function run (line 47) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/securitytrails_api.py
class SecurityTrailsAPI (line 5) | class SecurityTrailsAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 15) | def query(self):
method run (line 31) | def run(self):
function run (line 45) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/sitedossier.py
class SiteDossier (line 5) | class SiteDossier(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 16) | def query(self):
method run (line 34) | def run(self):
function run (line 46) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/spyse_api.py
class SpyseAPI (line 5) | class SpyseAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 13) | def query(self):
method run (line 37) | def run(self):
function run (line 51) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/datasets/sublist3r.py
class Sublist3r (line 4) | class Sublist3r(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 11) | def query(self):
method run (line 22) | def run(self):
function run (line 34) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/dnsquery/mx.py
class QueryMX (line 4) | class QueryMX(Lookup):
method __init__ (line 5) | def __init__(self, domain):
method run (line 12) | def run(self):
function run (line 24) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/dnsquery/ns.py
class QueryNS (line 4) | class QueryNS(Lookup):
method __init__ (line 5) | def __init__(self, domain):
method run (line 12) | def run(self):
function run (line 24) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/dnsquery/soa.py
class QuerySOA (line 4) | class QuerySOA(Lookup):
method __init__ (line 5) | def __init__(self, domain):
method run (line 12) | def run(self):
function run (line 24) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/dnsquery/spf.py
class QuerySPF (line 4) | class QuerySPF(Lookup):
method __init__ (line 5) | def __init__(self, domain):
method run (line 12) | def run(self):
function run (line 24) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/dnsquery/txt.py
class QueryTXT (line 4) | class QueryTXT(Lookup):
method __init__ (line 5) | def __init__(self, domain):
method run (line 12) | def run(self):
function run (line 24) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/enrich.py
function get_ips (line 8) | def get_ips(info):
function enrich_info (line 16) | def enrich_info(data):
class Enrich (line 47) | class Enrich(object):
method __init__ (line 48) | def __init__(self, domain):
method get_data (line 51) | def get_data(self):
method save_db (line 58) | def save_db(self, data):
method run (line 68) | def run(self):
FILE: core/tools/domain/OneForAll/modules/finder.py
class Finder (line 15) | class Finder(Module):
method __init__ (line 16) | def __init__(self):
method run (line 22) | def run(self, domain, data, port):
function find_new_urls (line 64) | def find_new_urls(html):
function convert_url (line 75) | def convert_url(req_url, rel_url):
function filter_name (line 100) | def filter_name(path):
function filter_url (line 118) | def filter_url(domain, url):
function match_subdomains (line 144) | def match_subdomains(domain, text):
function find_in_resp (line 154) | def find_in_resp(domain, url, html):
function find_in_history (line 159) | def find_in_history(domain, url, history):
function find_js_urls (line 164) | def find_js_urls(domain, req_url, rsp_html):
function convert_to_dict (line 176) | def convert_to_dict(url_list):
function find_subdomains (line 182) | def find_subdomains(domain, data):
FILE: core/tools/domain/OneForAll/modules/intelligence/alienvault.py
class AlienVault (line 4) | class AlienVault(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 11) | def query(self):
method run (line 27) | def run(self):
function run (line 39) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/intelligence/riskiq_api.py
class RiskIQ (line 5) | class RiskIQ(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 15) | def query(self):
method run (line 33) | def run(self):
function run (line 47) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/intelligence/threatbook_api.py
class ThreatBookAPI (line 5) | class ThreatBookAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 14) | def query(self):
method run (line 25) | def run(self):
function run (line 39) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/intelligence/threatminer.py
class ThreatMiner (line 4) | class ThreatMiner(Query):
method __init__ (line 5) | def __init__(self, domain):
method query (line 12) | def query(self):
method run (line 22) | def run(self):
function run (line 34) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/intelligence/virustotal.py
class VirusTotal (line 8) | class VirusTotal(Query):
method __init__ (line 9) | def __init__(self, domain):
method query (line 15) | def query(self):
method run (line 37) | def run(self):
function run (line 49) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/intelligence/virustotal_api.py
class VirusTotalAPI (line 5) | class VirusTotalAPI(Query):
method __init__ (line 6) | def __init__(self, domain):
method query (line 13) | def query(self):
method run (line 34) | def run(self):
function run (line 48) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/iscdn.py
function check_cname_keyword (line 21) | def check_cname_keyword(cname):
function check_header_key (line 31) | def check_header_key(header):
function check_cdn_cidr (line 43) | def check_cdn_cidr(ips):
function check_cdn_asn (line 59) | def check_cdn_asn(asn):
function do_check (line 66) | def do_check(data):
FILE: core/tools/domain/OneForAll/modules/other_tools.py
class CustomDomainTools (line 13) | class CustomDomainTools(Module):
method __init__ (line 14) | def __init__(self, domain):
method do_brute (line 20) | def do_brute(self):
method run (line 38) | def run(self):
function run (line 49) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/ask.py
class Ask (line 5) | class Ask(Search):
method __init__ (line 6) | def __init__(self, domain):
method search (line 15) | def search(self, domain, filtered_subdomain=''):
method run (line 38) | def run(self):
function run (line 58) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/baidu.py
class Baidu (line 6) | class Baidu(Search):
method __init__ (line 7) | def __init__(self, domain):
method redirect_match (line 15) | def redirect_match(self, html):
method search (line 31) | def search(self, domain, filtered_subdomain=''):
method run (line 65) | def run(self):
function run (line 85) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/bing.py
class Bing (line 5) | class Bing(Search):
method __init__ (line 6) | def __init__(self, domain):
method search (line 15) | def search(self, domain, filtered_subdomain=''):
method run (line 47) | def run(self):
function run (line 68) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/bing_api.py
class BingAPI (line 6) | class BingAPI(Search):
method __init__ (line 7) | def __init__(self, domain):
method search (line 18) | def search(self, domain, filtered_subdomain=''):
method run (line 44) | def run(self):
function run (line 67) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/fofa_api.py
class FoFa (line 8) | class FoFa(Search):
method __init__ (line 9) | def __init__(self, domain):
method search (line 19) | def search(self):
method run (line 49) | def run(self):
function run (line 63) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/gitee.py
class Gitee (line 7) | class Gitee(Search):
method __init__ (line 8) | def __init__(self, domain):
method search (line 15) | def search(self):
method run (line 48) | def run(self):
function run (line 60) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/github_api.py
class GithubAPI (line 8) | class GithubAPI(Search):
method __init__ (line 9) | def __init__(self, domain):
method search (line 18) | def search(self):
method run (line 61) | def run(self):
function run (line 75) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/google.py
class Google (line 6) | class Google(Search):
method __init__ (line 7) | def __init__(self, domain):
method search (line 15) | def search(self, domain, filtered_subdomain=''):
method run (line 50) | def run(self):
function run (line 72) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/google_api.py
class GoogleAPI (line 6) | class GoogleAPI(Search):
method __init__ (line 7) | def __init__(self, domain):
method search (line 18) | def search(self, domain, filtered_subdomain=''):
method run (line 43) | def run(self):
function run (line 66) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/hunter.py
class Hunter (line 8) | class Hunter(Search):
method __init__ (line 9) | def __init__(self, domain):
method search (line 18) | def search(self):
method run (line 47) | def run(self):
function run (line 61) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/shodan_api.py
class ShodanAPI (line 5) | class ShodanAPI(Search):
method __init__ (line 6) | def __init__(self, domain):
method search (line 13) | def search(self):
method run (line 28) | def run(self):
function run (line 42) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/so.py
class So (line 6) | class So(Search):
method __init__ (line 7) | def __init__(self, domain):
method search (line 16) | def search(self, domain, filtered_subdomain=''):
method run (line 43) | def run(self):
function run (line 64) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/sogou.py
class Sogou (line 4) | class Sogou(Search):
method __init__ (line 5) | def __init__(self, domain):
method search (line 13) | def search(self, domain, filtered_subdomain=''):
method run (line 40) | def run(self):
function run (line 61) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/yahoo.py
class Yahoo (line 5) | class Yahoo(Search):
method __init__ (line 6) | def __init__(self, domain):
method search (line 17) | def search(self, domain, filtered_subdomain=''):
method run (line 49) | def run(self):
function run (line 70) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/yandex.py
class Yandex (line 5) | class Yandex(Search):
method __init__ (line 6) | def __init__(self, domain):
method search (line 16) | def search(self, domain, filtered_subdomain=''):
method run (line 47) | def run(self):
function run (line 69) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/search/zoomeye_api.py
class ZoomEyeAPI (line 7) | class ZoomEyeAPI(Search):
method __init__ (line 8) | def __init__(self, domain):
method login (line 18) | def login(self):
method search (line 36) | def search(self):
method run (line 61) | def run(self):
function run (line 75) | def run(domain):
FILE: core/tools/domain/OneForAll/modules/srv.py
class BruteSRV (line 13) | class BruteSRV(Module):
method __init__ (line 14) | def __init__(self, domain):
method fill_queue (line 24) | def fill_queue(self):
method do_brute (line 30) | def do_brute(self):
method deal_answers (line 38) | def deal_answers(self):
method run (line 50) | def run(self):
class BruteThread (line 61) | class BruteThread(threading.Thread):
method __init__ (line 62) | def __init__(self, names_queue, answers_queue):
method run (line 67) | def run(self):
FILE: core/tools/domain/OneForAll/modules/wildcard.py
function gen_random_subdomains (line 13) | def gen_random_subdomains(domain, count):
function query_a_record (line 29) | def query_a_record(subdomain, resolver):
function all_resolve_success (line 52) | def all_resolve_success(subdomains):
function all_request_success (line 66) | def all_request_success(subdomains):
function any_similar_html (line 85) | def any_similar_html(resp_list):
function to_detect_wildcard (line 101) | def to_detect_wildcard(domain):
function detect_wildcard (line 118) | def detect_wildcard(domain):
function get_wildcard_record (line 128) | def get_wildcard_record(domain, resolver):
function collect_wildcard_record (line 159) | def collect_wildcard_record(domain, authoritative_ns):
function check_by_compare (line 215) | def check_by_compare(ip, ttl, wc_ips, wc_ttl):
function check_ip_times (line 233) | def check_ip_times(times):
function check_cname_times (line 245) | def check_cname_times(times):
function is_valid_subdomain (line 257) | def is_valid_subdomain(ip=None, ip_num=None, cname=None, cname_num=None,
function stat_times (line 275) | def stat_times(data):
function check_valid_subdomain (line 293) | def check_valid_subdomain(appear_times, info):
function deal_wildcard (line 313) | def deal_wildcard(data):
FILE: core/tools/domain/OneForAll/oneforall.py
class OneForAll (line 51) | class OneForAll(object):
method __init__ (line 87) | def __init__(self, target=None, targets=None, brute=None, dns=None, re...
method config_param (line 107) | def config_param(self):
method check_param (line 128) | def check_param(self):
method export_data (line 136) | def export_data(self):
method main (line 145) | def main(self):
method run (line 233) | def run(self):
method version (line 266) | def version():
method check (line 274) | def check():
FILE: core/tools/domain/OneForAll/takeover.py
function get_fingerprint (line 25) | def get_fingerprint():
function get_cname (line 32) | def get_cname(subdomain):
class Takeover (line 43) | class Takeover(Module):
method __init__ (line 62) | def __init__(self, target=None, targets=None, thread=20, path=None, fm...
method save (line 77) | def save(self):
method compare (line 85) | def compare(self, subdomain, cname, responses):
method worker (line 97) | def worker(self, subdomain):
method check (line 109) | def check(self):
method progress (line 115) | def progress(self):
method run (line 127) | def run(self):
FILE: core/tools/domain/OneForAll/test.py
function oneforall (line 11) | def oneforall(domain):
FILE: core/tools/domain/ctfr/ctfr.py
function save_subdomains (line 51) | def save_subdomains(subdomain, output_file):
function get_ctfr1 (line 57) | def get_ctfr1(domain,output=None):
function get_ctfr2 (line 69) | def get_ctfr2(domain,output=None):
function ctfr (line 86) | def ctfr(domain,output=None):
FILE: core/tools/domain/domain_main.py
function create_logfile (line 22) | def create_logfile():
function checkPanAnalysis (line 29) | def checkPanAnalysis(domain):
function get_system (line 42) | def get_system():
function printGetNewSubdomains (line 56) | def printGetNewSubdomains(old_subdomains, new_subdomains):
function additional (line 65) | def additional(func1):
function progress_init (line 76) | def progress_init(date=None, targets: list = []):
function progress_control (line 96) | def progress_control(module: str = None, target: str = None, finished: b...
function progress_record (line 123) | def progress_record(date=None,target=None,module=None,value=None,finishe...
function progress_record__ (line 145) | def progress_record__(date=None,target=None,module=None,finished=False):
function kill_process (line 164) | def kill_process(processname):
function __subprocess1 (line 186) | def __subprocess1(cmd, timeout=None, path=None):
function __subprocess2 (line 223) | def __subprocess2(cmd):
function manager (line 253) | def manager(domain=None, date="2022-09-02-00-01-39"):
function run (line 517) | def run(domain=None, domains=None, date=None):
FILE: core/tools/finger/finger_main.py
function create_logfile (line 17) | def create_logfile():
function get_system (line 24) | def get_system():
function __subprocess2 (line 39) | def __subprocess2(cmd):
function isexist (line 64) | def isexist(filepath):
function progress_record (line 73) | def progress_record(date=None,target=None,module=None,value=None,finishe...
function getips (line 94) | def getips(ipstr_list):
function manager (line 112) | def manager(domain=None, url=None, urlsfile=None, date="2022-09-02-00-01...
function run (line 327) | def run(url=None, urlfile=None, date=None):
FILE: core/tools/portscan/portscan_main.py
function create_logfile (line 12) | def create_logfile():
function get_system (line 19) | def get_system():
function progress_record (line 33) | def progress_record(date=None,target=None,module=None,value=None,finishe...
function manager (line 55) | def manager(domain=None, ip=None, ipfile=None, date="2022-09-02-00-01-39"):
function run (line 187) | def run(ip=None, ips=None, ipfile=None, date=None):
FILE: core/tools/sensitiveinfo/emailall/common/output.py
class Output (line 12) | class Output(object):
method __init__ (line 13) | def __init__(self):
method run (line 16) | def run(self, domain):
FILE: core/tools/sensitiveinfo/emailall/common/search.py
class Search (line 12) | class Search(Module):
method __init__ (line 14) | def __init__(self):
method match_location (line 20) | def match_location(self, url):
method save_json (line 34) | def save_json(self):
method save_res (line 55) | def save_res(self):
FILE: core/tools/sensitiveinfo/emailall/common/utils.py
function check_net (line 14) | def check_net():
function get_net_env (line 43) | def get_net_env():
function read_file (line 54) | def read_file(path):
function get_from_domain (line 72) | def get_from_domain(domain):
function get_from_domains (line 85) | def get_from_domains(domains):
function get_domains (line 100) | def get_domains(domain, domains=None):
function check_response (line 113) | def check_response(method, resp):
function match_emails (line 136) | def match_emails(domain, html):
function save_all (line 152) | def save_all(domain):
FILE: core/tools/sensitiveinfo/emailall/config/__init__.py
class Settings (line 3) | class Settings(object):
method __init__ (line 4) | def __init__(self):
FILE: core/tools/sensitiveinfo/emailall/emailall.py
class EmailAll (line 33) | class EmailAll(object):
method __init__ (line 46) | def __init__(self, domain=None, domains=None):
method main (line 53) | def main(self):
method run (line 64) | def run(self):
method version (line 89) | def version():
FILE: core/tools/sensitiveinfo/emailall/modules/collect.py
class Collect (line 12) | class Collect(object):
method __init__ (line 14) | def __init__(self, domain):
method get_mod (line 19) | def get_mod(self):
method import_func (line 31) | def import_func(self):
method run (line 41) | def run(self):
FILE: core/tools/sensitiveinfo/emailall/modules/datasets/Emailf.py
class EmailF (line 14) | class EmailF(Search):
method __init__ (line 15) | def __init__(self, domain):
method search (line 24) | def search(self):
method get_emails_rule (line 32) | def get_emails_rule(self):
method run (line 50) | def run(self):
function run (line 59) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/datasets/phonebook.py
class PhoneBook (line 12) | class PhoneBook(Search):
method __init__ (line 13) | def __init__(self, domain):
method search (line 22) | def search(self):
method run (line 62) | def run(self):
function run (line 70) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/datasets/skymem.py
class Skymem (line 12) | class Skymem(Search):
method __init__ (line 13) | def __init__(self, domain):
method search (line 20) | def search(self):
method run (line 36) | def run(self):
function run (line 44) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/datasets/snov.py
class Snov (line 16) | class Snov(Search):
method __init__ (line 17) | def __init__(self, domain):
method login (line 28) | def login(self):
method search (line 50) | def search(self):
method run (line 79) | def run(self):
function run (line 87) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/datasets/veryvp.py
class Veryvp (line 15) | class Veryvp(Search):
method __init__ (line 16) | def __init__(self, domain):
method search (line 24) | def search(self):
method run (line 59) | def run(self):
function run (line 67) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/module.py
class Module (line 35) | class Module(object):
method __init__ (line 36) | def __init__(self):
method begin (line 53) | def begin(self):
method finish (line 60) | def finish(self):
method get (line 71) | def get(self, url, params=None, check=True, ignore=False, raise_error=...
method post (line 123) | def post(self, url, data=None, check=True, **kwargs):
method match_emails (line 153) | def match_emails(self, resp):
method head (line 161) | def head(self, url, params=None, check=True, **kwargs):
FILE: core/tools/sensitiveinfo/emailall/modules/search/ask.py
class Ask (line 16) | class Ask(Search):
method __init__ (line 18) | def __init__(self, domain):
method get_urls (line 29) | def get_urls(self, html):
method search (line 35) | def search(self):
method run (line 59) | def run(self):
function run (line 66) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/search/baidu.py
class Baidu (line 15) | class Baidu(Search):
method __init__ (line 16) | def __init__(self, domain):
method get_url (line 26) | def get_url(self, html):
method search (line 37) | def search(self):
method run (line 61) | def run(self):
function run (line 69) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/search/bingcn.py
class Bingcn (line 15) | class Bingcn(Search):
method __init__ (line 16) | def __init__(self, domain):
method get_url (line 25) | def get_url(self, html):
method search (line 34) | def search(self):
method run (line 62) | def run(self):
function run (line 70) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/search/githubapi.py
class Github (line 16) | class Github(Search):
method __init__ (line 17) | def __init__(self, domain):
method match_emails (line 26) | def match_emails(self, content):
method search (line 30) | def search(self):
method run (line 74) | def run(self):
function run (line 82) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/search/google.py
class Google (line 15) | class Google(Search):
method __init__ (line 16) | def __init__(self, domain):
method get_url (line 25) | def get_url(self, html):
method search (line 34) | def search(self):
method run (line 73) | def run(self):
function run (line 81) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/search/qwant.py
class Qwant (line 18) | class Qwant(Search):
method __init__ (line 19) | def __init__(self, domain):
method search (line 29) | def search(self):
method run (line 61) | def run(self):
function run (line 69) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/search/so.py
class So (line 15) | class So(Search):
method __init__ (line 17) | def __init__(self, domain):
method match_location (line 28) | def match_location(self, url):
method get_url (line 44) | def get_url(self, html):
method search (line 56) | def search(self):
method run (line 84) | def run(self):
function run (line 92) | def run(domain):
FILE: core/tools/sensitiveinfo/emailall/modules/search/sogou.py
class Sogou (line 14) | class Sogou(Search):
method __init__ (line 15) | def __init__(self, domain):
method match_location (line 25) | def match_location(self, url):
method get_url (line 40) | def get_url(self, html):
method search (line 52) | def search(self):
method run (line 77) | def run(self):
function run (line 85) | def run(domain):
FILE: core/tools/sensitiveinfo/sensitiveinfo_main.py
function create_logfile (line 55) | def create_logfile():
function get_system (line 62) | def get_system():
function getconfig_ (line 76) | def getconfig_():
function progress_record (line 91) | def progress_record(date=None,target=None,module=None,submodule=None,val...
function progress_record_ (line 113) | def progress_record_(date=None, target=None, module=None, submodule=None...
function makedir0 (line 144) | def makedir0(path):
function additional (line 152) | def additional(func1):
function to_file (line 161) | def to_file(filename, data: list, mmode='a'):
function to_csv (line 168) | def to_csv(filename, data: list, mmode='a'):
function checkport (line 177) | def checkport(port):
function kill_process (line 196) | def kill_process(processname):
function request0 (line 227) | def request0(req_json):
function __subprocess (line 254) | def __subprocess(cmd):
function __subprocess1 (line 280) | def __subprocess1(cmd, timeout=None, path=None):
function __subprocess2 (line 312) | def __subprocess2(cmd):
function to_xray (line 341) | def to_xray(urls, attackflag=None,fromurl=None):
function manager (line 363) | def manager(domain=None, url=None, urlsfile=None, attackflag=False, date...
function run (line 925) | def run(url=None, urlfile=None, attack=False, date=None):
FILE: core/tools/vulscan/vulscan_main.py
function create_logfile (line 20) | def create_logfile():
function get_system (line 27) | def get_system():
function progress_record (line 43) | def progress_record(date=None, target=None, module=None, submodule=None,...
function isexist (line 62) | def isexist(filepath):
function getips (line 72) | def getips(ipstr_list):
function whether_update (line 90) | def whether_update(file):
function checkport (line 104) | def checkport(port):
function __subprocess (line 126) | def __subprocess(cmd):
function __subprocess1 (line 152) | def __subprocess1(cmd, timeout=None):
function __subprocess11 (line 179) | def __subprocess11(cmd, timeout=None, path=None):
function __subprocess2 (line 206) | def __subprocess2(cmd):
function request0 (line 232) | def request0(req_json):
function webmanager (line 258) | def webmanager(domain=None, url=None, urlsfile=None, date="2022-09-02-00...
function hostmanager (line 502) | def hostmanager(domain=None, ip=None, ipfile=None, date="2022-09-02-00-0...
function run (line 634) | def run(target=None, targets=None, mode='web', date=None):
Condensed preview — 265 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,446K chars).
[
{
"path": "Komo.py",
"chars": 17986,
"preview": "import hashlib\nimport json\nimport os\nimport random\nimport shutil\nimport string\n\nimport fire\nimport datetime\nfrom loguru "
},
{
"path": "common/__init__.py",
"chars": 95,
"preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# @Author:Komomon\n# @Time:2022/12/27 12:22\n\n\n\n\n\n\n"
},
{
"path": "common/getconfig.py",
"chars": 1097,
"preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# @Author:Komomon\n# @Time:2022/12/27 12:45\nimport os\nimport platform\nimpor"
},
{
"path": "config/config.yaml",
"chars": 1665,
"preview": "tools:\n domain:\n amass:\n toolname: amass\n ksubdomain:\n toolname: ksubdomain\n subfinder:\n toolna"
},
{
"path": "config/log_template.json",
"chars": 662,
"preview": "{\n \"date\": \"\",\n \"command\": [],\n \"params\": {\n \"domain\": \"\", \n \"domains\": \"\", \n \"subdomain\": \"\", \n \"subdoma"
},
{
"path": "config/supplementary_files/vulmap/licenses.txt",
"chars": 14,
"preview": "1672052447366\n"
},
{
"path": "config/tools_linux.yaml",
"chars": 11461,
"preview": "# amass:\n# toolname: amass gongjvname\n# whetherdownload: True 是否下载\n# link: https://github.com/OWASP/Amass"
},
{
"path": "config/tools_windows.yaml",
"chars": 11709,
"preview": "# amass:\n# toolname: amass gongjvname\n# whetherdownload: True 是否下载\n# link: https://github.com/OWASP/Amass"
},
{
"path": "core/download/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "core/download/download_tools.py",
"chars": 13147,
"preview": "import os\nimport sys\nfrom pprint import pprint\nimport shutil\nimport tarfile\nimport threading\nimport time\nimport tracebac"
},
{
"path": "core/download/tools.yaml",
"chars": 10634,
"preview": "download:\n domain:\n amass:\n toolname: amass\n whetherdownload: True\n link: https://github.com/OWASP/Am"
},
{
"path": "core/download/tools2.yaml",
"chars": 6767,
"preview": "download:\n domain:\n amass:\n toolname: amass\n whetherdownload: True\n link: https://github.com/OWASP/Am"
},
{
"path": "core/download/tools_linux.yaml",
"chars": 11461,
"preview": "# amass:\n# toolname: amass gongjvname\n# whetherdownload: True 是否下载\n# link: https://github.com/OWASP/Amass"
},
{
"path": "core/download/tools_windows.yaml",
"chars": 11709,
"preview": "# amass:\n# toolname: amass gongjvname\n# whetherdownload: True 是否下载\n# link: https://github.com/OWASP/Amass"
},
{
"path": "core/tools/domain/OneForAll/.github/ISSUE_TEMPLATE/bug_report.md",
"chars": 1171,
"preview": "---\nname: Please use this English template to submit Bug\nabout: \"Be sure to submit the Bug according to the template\\U00"
},
{
"path": "core/tools/domain/OneForAll/.github/ISSUE_TEMPLATE/bug_report_zh.md",
"chars": 500,
"preview": "---\nname: 请使用这个中文模板提交Bug\nabout: \"请务必按照模板提交Bug\\U0001F64F\"\ntitle: 请填写BUG标题\nlabels: bug\nassignees: shmilylty\n\n---\n\n**是否使用了最"
},
{
"path": "core/tools/domain/OneForAll/.github/ISSUE_TEMPLATE/feature_request.md",
"chars": 595,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
},
{
"path": "core/tools/domain/OneForAll/.github/workflows/test.yml",
"chars": 974,
"preview": "name: OneForAll test\n\non: [push]\n\njobs:\n build:\n\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v1"
},
{
"path": "core/tools/domain/OneForAll/.gitignore",
"chars": 3894,
"preview": "\n# Created by https://www.gitignore.io/api/python,windows,pycharm\n# Edit at https://www.gitignore.io/?templates=python,w"
},
{
"path": "core/tools/domain/OneForAll/.travis.yml",
"chars": 3326,
"preview": "notifications:\n email: false\n\nlanguage: python\n\njobs:\n include:\n - name: \"Python 3.6 on Linux\"\n os: linux\n "
},
{
"path": "core/tools/domain/OneForAll/Dockerfile",
"chars": 688,
"preview": "FROM python:3.8-alpine3.10\nMAINTAINER milktea@vmoe.info\n\nRUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc"
},
{
"path": "core/tools/domain/OneForAll/LICENSE",
"chars": 35140,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "core/tools/domain/OneForAll/Pipfile",
"chars": 302,
"preview": "[[source]]\nname = \"pypi\"\nurl = \"https://mirrors.aliyun.com/pypi/simple/\"\nverify_ssl = true\n\n[dev-packages]\n\n[packages]\nt"
},
{
"path": "core/tools/domain/OneForAll/README.md",
"chars": 12072,
"preview": "# OneForAll\n\n[](https://travis-ci.org/shmily"
},
{
"path": "core/tools/domain/OneForAll/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "core/tools/domain/OneForAll/brute.py",
"chars": 20082,
"preview": "#!/usr/bin/python3\n# coding=utf-8\n\n\"\"\"\nOneForAll subdomain brute module\n\n:copyright: Copyright (c) 2019, Jing Ling. All "
},
{
"path": "core/tools/domain/OneForAll/common/check.py",
"chars": 1240,
"preview": "import requests\nfrom config.log import logger\nfrom common.module import Module\n\n\nclass Check(Module):\n \"\"\"\n Check "
},
{
"path": "core/tools/domain/OneForAll/common/crawl.py",
"chars": 148,
"preview": "from common.module import Module\n\n\nclass Crawl(Module):\n \"\"\"\n Crawl base class\n \"\"\"\n\n def __init__(self):\n "
},
{
"path": "core/tools/domain/OneForAll/common/database.py",
"chars": 10446,
"preview": "\"\"\"\nSQLite database initialization and operation\n\"\"\"\n\nfrom common import records\n\nfrom common.records import Connection\n"
},
{
"path": "core/tools/domain/OneForAll/common/domain.py",
"chars": 1516,
"preview": "import re\nfrom common import tldextract\nfrom config import settings\n\n\nclass Domain(object):\n \"\"\"\n Processing domai"
},
{
"path": "core/tools/domain/OneForAll/common/ipasn.py",
"chars": 1180,
"preview": "import zipfile\n\nfrom common.utils import ip_to_int\nfrom config.setting import data_storage_dir\nfrom common.database impo"
},
{
"path": "core/tools/domain/OneForAll/common/ipreg.py",
"chars": 3702,
"preview": "\"\"\"\n\" ip2region python searcher client module\n\"\n\" Author: koma<komazhang@foxmail.com>\n\" Date : 2015-11-06\n\"\"\"\nimport io\n"
},
{
"path": "core/tools/domain/OneForAll/common/lookup.py",
"chars": 693,
"preview": "from common.module import Module\nfrom common import utils\nfrom config.log import logger\n\n\nclass Lookup(Module):\n \"\"\"\n"
},
{
"path": "core/tools/domain/OneForAll/common/module.py",
"chars": 13127,
"preview": "\"\"\"\nModule base class\n\"\"\"\n\nimport json\nimport threading\nimport time\n\nimport requests\nfrom config.log import logger\nfrom "
},
{
"path": "core/tools/domain/OneForAll/common/query.py",
"chars": 147,
"preview": "from common.module import Module\n\n\nclass Query(Module):\n \"\"\"\n Query base class\n \"\"\"\n def __init__(self):\n "
},
{
"path": "core/tools/domain/OneForAll/common/records.py",
"chars": 10973,
"preview": "import os\nfrom collections import OrderedDict\nfrom inspect import isclass\n\nfrom sqlalchemy import create_engine, exc, in"
},
{
"path": "core/tools/domain/OneForAll/common/request.py",
"chars": 7100,
"preview": "import json\nfrom threading import Thread\nfrom queue import Queue\n\nimport tqdm\nimport requests\nfrom bs4 import BeautifulS"
},
{
"path": "core/tools/domain/OneForAll/common/resolve.py",
"chars": 5214,
"preview": "import gc\nimport json\n\nfrom config.log import logger\nfrom config import settings\nfrom common import utils\n\n\ndef filter_s"
},
{
"path": "core/tools/domain/OneForAll/common/search.py",
"chars": 2410,
"preview": "from config import settings\nfrom common.module import Module\n\n\nclass Search(Module):\n \"\"\"\n Search base class\n \""
},
{
"path": "core/tools/domain/OneForAll/common/similarity.py",
"chars": 5018,
"preview": "\"\"\"\n根据网页结构判断页面相似性(Determine page similarity based on HTML page structure)\n判断方法:根据网页的DOM树确定网页的模板特征向量,对模板特征向量计算网页结构相似性。\n来源"
},
{
"path": "core/tools/domain/OneForAll/common/tablib/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "core/tools/domain/OneForAll/common/tablib/format.py",
"chars": 2059,
"preview": "import decimal\nimport json\nimport csv\nfrom io import StringIO\nfrom uuid import UUID\n\n\"\"\" Tablib - formats\n\"\"\"\nfrom colle"
},
{
"path": "core/tools/domain/OneForAll/common/tablib/tablib.py",
"chars": 10267,
"preview": "from collections import OrderedDict\nfrom .format import registry\n\n\nclass Row:\n \"\"\"Internal Row object. Mainly used fo"
},
{
"path": "core/tools/domain/OneForAll/common/tldextract.py",
"chars": 7543,
"preview": "# -*- coding: utf-8 -*-\n\"\"\"`tldextract` accurately separates the gTLD or ccTLD (generic or country code\ntop-level domain"
},
{
"path": "core/tools/domain/OneForAll/common/utils.py",
"chars": 21460,
"preview": "import os\nimport re\nimport sys\nimport time\nimport json\nimport socket\nimport random\nimport string\nimport platform\nimport "
},
{
"path": "core/tools/domain/OneForAll/config/__init__.py",
"chars": 497,
"preview": "import importlib\nfrom config import default\n\n\nclass Settings(object):\n def __init__(self):\n # 获取全局变量中的配置信息\n "
},
{
"path": "core/tools/domain/OneForAll/config/api.py",
"chars": 2173,
"preview": "# 模块API配置\n# Censys可以免费注册获取API:https://censys.io/api\ncensys_api_id = ''\ncensys_api_secret = ''\n\n# Binaryedge可以免费注册获取API:h"
},
{
"path": "core/tools/domain/OneForAll/config/default.py",
"chars": 9359,
"preview": "# coding=utf-8\n\"\"\"\nOneForAll默认配置\n\"\"\"\n\nimport pathlib\nimport warnings\n\n# 禁用所有警告信息\nwarnings.filterwarnings(\"ignore\")\n\n# 路径"
},
{
"path": "core/tools/domain/OneForAll/config/log.py",
"chars": 1603,
"preview": "import sys\nimport pathlib\n\nfrom loguru import logger\n\n# 路径设置\nrelative_directory = pathlib.Path(__file__).parent.parent "
},
{
"path": "core/tools/domain/OneForAll/config/setting.py",
"chars": 4055,
"preview": "# coding=utf-8\n\"\"\"\nOneForAll自定义配置\n\"\"\"\n\nimport pathlib\n\n# 路径设置\nrelative_directory = pathlib.Path(__file__).parent.parent "
},
{
"path": "core/tools/domain/OneForAll/data/altdns_wordlist.txt",
"chars": 2167,
"preview": "adm\nadmin\nalpha\napi\napi-docs\napp\nauth\nbackend\nbeta\nbrand\nbucket\ncdn\ncert\nchef\nci\nclient\ncms\nconfluence\ncontainer\ncontrol"
},
{
"path": "core/tools/domain/OneForAll/data/authoritative_dns.txt",
"chars": 380,
"preview": "47.254.51.88\n163.177.156.225\n161.117.97.232\n218.98.58.194\n117.91.188.195\n14.17.109.84\n58.52.135.164\n172.96.125.3\n106.38."
},
{
"path": "core/tools/domain/OneForAll/data/cdn_asn_list.json",
"chars": 2019,
"preview": "[\n \"AS10576\",\n \"AS10762\",\n \"AS11748\",\n \"AS131099\",\n \"AS132601\",\n \"AS133496\",\n \"AS134409\",\n \"AS13"
},
{
"path": "core/tools/domain/OneForAll/data/cdn_cname_keywords.json",
"chars": 6687,
"preview": "{\n \"cdn\": \"cdn\",\n \"cache\": \"cache\",\n \"tbcache.com\": \"Alibaba Cloud\",\n \"alicdn.com\": \"Alibaba Cloud\",\n \"tc"
},
{
"path": "core/tools/domain/OneForAll/data/cdn_header_keys.json",
"chars": 880,
"preview": "[\n \"xcs\",\n \"via\",\n \"x-via\",\n \"x-cdn\",\n \"x-cdn-forward\",\n \"x-ser\",\n \"x-cf1\",\n \"cache\",\n \"x-cac"
},
{
"path": "core/tools/domain/OneForAll/data/cdn_ip_cidr.json",
"chars": 12289,
"preview": "[\n \"223.99.255.0/24\",\n \"71.152.0.0/17\",\n \"219.153.73.0/24\",\n \"125.39.46.0/24\",\n \"190.93.240.0/20\",\n \"1"
},
{
"path": "core/tools/domain/OneForAll/data/common_js_library.json",
"chars": 11264,
"preview": "[\n \"npm.js\",\n \"bower.js\",\n \"component.js\",\n \"spm.js\",\n \"jam.js\",\n \"jspm.js\",\n \"ender.js\",\n \"volo"
},
{
"path": "core/tools/domain/OneForAll/data/fingerprints.json",
"chars": 8034,
"preview": "[\n {\n \"name\":\"github\", \n \"cname\":[\"github.io\", \"github.map.fastly.net\"], \n \"response\":[\"There is"
},
{
"path": "core/tools/domain/OneForAll/data/nameservers.txt",
"chars": 325,
"preview": "8.8.8.8\n8.8.4.4\n9.9.9.9\n9.9.9.10\n149.112.112.112\n4.2.2.1\n4.2.2.2\n4.2.2.3\n4.2.2.4\n4.2.2.5\n4.2.2.6\n1.1.1.1\n1.0.0.1\n1.0.0.2"
},
{
"path": "core/tools/domain/OneForAll/data/nameservers_cn.txt",
"chars": 93,
"preview": "223.5.5.5\n223.6.6.6\n114.114.114.114\n114.114.115.115\n180.76.76.76\n119.29.29.29\n182.254.116.116"
},
{
"path": "core/tools/domain/OneForAll/data/srv_prefixes.json",
"chars": 1798,
"preview": "[\n\"_afpovertcp._tcp.\",\n\"_aix._tcp.\",\n\"_autodiscover._tcp.\",\n\"_caldav._tcp.\",\n\"_certificates._tcp.\",\n\"_client._smtp.\",\n\"_"
},
{
"path": "core/tools/domain/OneForAll/data/subnames.txt",
"chars": 624471,
"preview": "www\nmail\nftp\nsmtp\npop\nm\nwebmail\npop3\nimap\nlocalhost\nautodiscover\nadmin\nbbs\ntest\nmx\nen\nus-en\nzh\nzh-cn\nemail\nwap\nblog\noa\nn"
},
{
"path": "core/tools/domain/OneForAll/data/subnames_medium.txt",
"chars": 6375200,
"preview": "www\nmail\nftp\nsmtp\npop\nm\nwebmail\npop3\nimap\nlocalhost\nautodiscover\nadmin\nbbs\ntest\nmx\nen\nemail\nwap\nblog\noa\nns1\nvpn\nns2\nwww2"
},
{
"path": "core/tools/domain/OneForAll/data/subnames_next.txt",
"chars": 7882,
"preview": "test\ntest2\nt\ndev\nuat\n1\n2\n3\ns1\ns2\ns3\nadmin\nadm\na\nht\nadminht\nwebht\nweb\ngm\nsys\nsystem\nmanage\nmanager\nmgr\nb\nc\npassport\nbata\n"
},
{
"path": "core/tools/domain/OneForAll/docs/changes.md",
"chars": 3209,
"preview": "# 更新日志\nOneForAll的所有值得注意的更改都将记录在此文件中。\n\nOneForAll的更新日志格式基于[Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)。\n\nOn"
},
{
"path": "core/tools/domain/OneForAll/docs/collection_modules.md",
"chars": 8744,
"preview": "# 收集模块说明 #\n\n如果要使用通过API收集子域的模块请先到[api.py](../config/api.py)配置相关信息,大多平台的API都是可以注册账号免费获取的。\n\n如果你指定使用某些模块可以在[api.py](../conf"
},
{
"path": "core/tools/domain/OneForAll/docs/contributors.md",
"chars": 498,
"preview": "# OneForAll贡献者\n\n* **[Jing Ling](https://github.com/shmilylty)**\n * 核心开发\n\n* **[Black Star](https://github.com/blackstar2"
},
{
"path": "core/tools/domain/OneForAll/docs/dictionary_source.md",
"chars": 744,
"preview": "关于子域字典来源的说明:\n1. 开源子域收集工具中的部分高频子域名字字典。\n2. 网上有关服务商公布的最流行子域列表。\n * [DNSPod](https://github.com/DNSPod/oh-my-free-data)\n3. 网上"
},
{
"path": "core/tools/domain/OneForAll/docs/directory_structure.md",
"chars": 3953,
"preview": "```\nD:.\n| .gitignore\n| .travis.yml\n| brute.py 可以单独运行的子域爆破模块\n| collect.py 各个收集模块上层调用\n| dbexport.py "
},
{
"path": "core/tools/domain/OneForAll/docs/en-us/README.md",
"chars": 17071,
"preview": "# OneForAll\n\n[](https://travis-ci.org/shmily"
},
{
"path": "core/tools/domain/OneForAll/docs/en-us/usage_help.md",
"chars": 9588,
"preview": "**🤔Help**\n\nThe command line parameters only provide some common parameters. For more detailed parameter configuration, p"
},
{
"path": "core/tools/domain/OneForAll/docs/field.md",
"chars": 771,
"preview": "注意:以下部分字段只存于结果数据库中\n\n### id\n\n标识作用无意义\n\n### new\n\n标记是否是新发现的子域名\n\n### alive\n\n是否存活,不存活的判定情况包含:无法解析IP、网络不可达、400、5XX等\n\n### reques"
},
{
"path": "core/tools/domain/OneForAll/docs/installation_dependency.md",
"chars": 1672,
"preview": "# 安装依赖\n\n## Windows系统\n\n注意:如果你的Python3安装在系统Program Files目录下,如:`C:\\Program Files\\Python38`,那么请以管理员身份运行命令提示符cmd执行以下命令!\n\n```b"
},
{
"path": "core/tools/domain/OneForAll/docs/todo.md",
"chars": 144,
"preview": "# OneForAll后续开发计划\n\n## 下一步计划\n\n- [ ] 各模块支持优化和完善\n- [x] 子域监控(标记每次新发现的子域)\n- [ ] 子域收集爬虫实现(包括从JS等静态资源文件中收集子域)\n- [ ] 操作强大交互人性的前端"
},
{
"path": "core/tools/domain/OneForAll/docs/troubleshooting.md",
"chars": 1297,
"preview": "# 常见问题与回答\n\n## 依赖问题\n\n**Q: 在安装依赖过程遇到编译某个依赖库失败,怎么解决?**\n\nA: 可以尝试以下方法:\n\n1. 到提供编译好的whl文件的第三方平台,找到对应库手动下载安装。第三方平台平台有: \n * [http"
},
{
"path": "core/tools/domain/OneForAll/docs/usage_help.md",
"chars": 7111,
"preview": "# 使用帮助\n\n命令行参数只提供了一些常用参数,更多详细的参数配置请见[config.py](https://github.com/shmilylty/OneForAll/tree/master/oneforall/config/setti"
},
{
"path": "core/tools/domain/OneForAll/export.py",
"chars": 2217,
"preview": "#!/usr/bin/python3\n# coding=utf-8\n\n\"\"\"\nOneForAll export from database module\n\n:copyright: Copyright (c) 2019, Jing Ling."
},
{
"path": "core/tools/domain/OneForAll/modules/altdns.py",
"chars": 8101,
"preview": "\"\"\"\nReference: https://github.com/ProjectAnte/dnsgen\n\"\"\"\nimport re\nimport time\nimport itertools\n\nfrom config import sett"
},
{
"path": "core/tools/domain/OneForAll/modules/amass_dange.py",
"chars": 2273,
"preview": "\"\"\"\n通过调用owasp amass 工具获得子域名列表结果\n\"\"\"\n#core.tools.domain.OneForAll.\nfrom common import utils\nfrom common.module import Mod"
},
{
"path": "core/tools/domain/OneForAll/modules/autotake/github.py",
"chars": 4236,
"preview": "#!/usr/bin/env python3\n# coding=utf-8\n\n\"\"\"\ngithub自动接管\n\"\"\"\n\nimport json\nimport base64\nimport requests\nfrom config import "
},
{
"path": "core/tools/domain/OneForAll/modules/certificates/censys_api.py",
"chars": 1928,
"preview": "from config import settings\nfrom common.query import Query\nfrom config.log import logger\n\n\nclass CensysAPI(Query):\n d"
},
{
"path": "core/tools/domain/OneForAll/modules/certificates/certspotter.py",
"chars": 1046,
"preview": "from common.query import Query\n\n\nclass CertSpotter(Query):\n def __init__(self, domain):\n Query.__init__(self)\n"
},
{
"path": "core/tools/domain/OneForAll/modules/certificates/crtsh.py",
"chars": 1054,
"preview": "from common.query import Query\n\n\nclass Crtsh(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/certificates/google.py",
"chars": 1108,
"preview": "from common.query import Query\n\n\nclass Google(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/check/axfr.py",
"chars": 2687,
"preview": "\"\"\"\n查询域名的NS记录(域名服务器记录,记录该域名由哪台域名服务器解析),检查查出的域名服务器是\n否开启DNS域传送,如果开启且没做访问控制和身份验证便加以利用获取域名的所有记录。\n\nDNS域传送(DNS zone transfer)指"
},
{
"path": "core/tools/domain/OneForAll/modules/check/cdx.py",
"chars": 769,
"preview": "\"\"\"\n检查crossdomain.xml文件收集子域名\n\"\"\"\nfrom common.check import Check\n\n\nclass CrossDomain(Check):\n def __init__(self, domai"
},
{
"path": "core/tools/domain/OneForAll/modules/check/cert.py",
"chars": 1215,
"preview": "\"\"\"\n检查域名证书收集子域名\n\"\"\"\nimport socket\nimport ssl\n\nfrom config.log import logger\nfrom common.check import Check\n\n\nclass CertI"
},
{
"path": "core/tools/domain/OneForAll/modules/check/csp.py",
"chars": 2541,
"preview": "\"\"\"\nCollect subdomains from ContentSecurityPolicy\n\"\"\"\nimport requests\n\nfrom config.log import logger\nfrom common.check i"
},
{
"path": "core/tools/domain/OneForAll/modules/check/nsec.py",
"chars": 1581,
"preview": "# https://www.icann.org/resources/pages/dnssec-what-is-it-why-important-2019-03-20-zh\n# https://appsecco.com/books/subdo"
},
{
"path": "core/tools/domain/OneForAll/modules/check/robots.py",
"chars": 743,
"preview": "\"\"\"\n检查内容安全策略收集子域名收集子域名\n\"\"\"\nfrom common.check import Check\n\n\nclass Robots(Check):\n def __init__(self, domain):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/check/sitemap.py",
"chars": 795,
"preview": "\"\"\"\n检查内容安全策略收集子域名收集子域名\n\"\"\"\nfrom common.check import Check\n\n\nclass Sitemap(Check):\n def __init__(self, domain):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/collect.py",
"chars": 2236,
"preview": "import threading\nimport importlib\n\nfrom config.log import logger\nfrom config import settings\n\n\nclass Collect(object):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/crawl/archivecrawl.py",
"chars": 1474,
"preview": "import cdx_toolkit\nfrom common.crawl import Crawl\nfrom config.log import logger\n\n\nclass ArchiveCrawl(Crawl):\n def __i"
},
{
"path": "core/tools/domain/OneForAll/modules/crawl/commoncrawl.py",
"chars": 1405,
"preview": "import cdx_toolkit\nfrom tqdm import tqdm\n\nfrom common.crawl import Crawl\n\n\nclass CommonCrawl(Crawl):\n def __init__(se"
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/anubis.py",
"chars": 928,
"preview": "from common.query import Query\n\n\nclass Anubis(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/bevigil.py",
"chars": 1129,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass BeVigilAPI(Query):\n def __init__(self, domain):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/binaryedge_api.py",
"chars": 1132,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass BinaryEdgeAPI(Query):\n def __init__(self, domain):"
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/cebaidu.py",
"chars": 948,
"preview": "from common.query import Query\n\n\nclass CeBaidu(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/chinaz.py",
"chars": 917,
"preview": "from common.query import Query\n\n\nclass Chinaz(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/chinaz_api.py",
"chars": 1093,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass ChinazAPI(Query):\n def __init__(self, domain):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/circl_api.py",
"chars": 1121,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass CirclAPI(Query):\n def __init__(self, domain):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/cloudflare_api.py",
"chars": 4627,
"preview": "from config import settings\nfrom common.query import Query\nfrom config.log import logger\nfrom time import sleep\n\n\nclass "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/dnsdb_api.py",
"chars": 1115,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass DNSdbAPI(Query):\n def __init__(self, domain):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/dnsdumpster.py",
"chars": 1207,
"preview": "from common.query import Query\n\n\nclass DNSDumpster(Query):\n def __init__(self, domain):\n Query.__init__(self)\n"
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/fullhunt.py",
"chars": 1031,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass FullHuntAPI(Query):\n def __init__(self, domain):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/hackertarget.py",
"chars": 950,
"preview": "from common.query import Query\n\n\nclass HackerTarget(Query):\n def __init__(self, domain):\n Query.__init__(self)"
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/ip138.py",
"chars": 944,
"preview": "from common.query import Query\n\n\nclass IP138(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/ipv4info_api.py",
"chars": 1945,
"preview": "from config import settings\nfrom common.query import Query\nfrom config.log import logger\n\n\nclass IPv4InfoAPI(Query):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/netcraft.py",
"chars": 1696,
"preview": "import hashlib\nimport re\nimport time\nfrom urllib import parse\n\nfrom common.query import Query\n\n\nclass NetCraft(Query):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/passivedns_api.py",
"chars": 1223,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass PassiveDnsAPI(Query):\n def __init__(self, domain):"
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/qianxun.py",
"chars": 1483,
"preview": "from common.query import Query\n\n\nclass QianXun(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/rapiddns.py",
"chars": 924,
"preview": "from common.query import Query\n\n\nclass RapidDNS(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/riddler.py",
"chars": 929,
"preview": "from common.query import Query\n\n\nclass Riddler(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/robtex.py",
"chars": 1347,
"preview": "import json\nimport time\n\nfrom common.query import Query\n\n\nclass Robtex(Query):\n def __init__(self, domain):\n Q"
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/securitytrails_api.py",
"chars": 1367,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass SecurityTrailsAPI(Query):\n def __init__(self, doma"
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/sitedossier.py",
"chars": 1341,
"preview": "\nfrom common.query import Query\n\n\nclass SiteDossier(Query):\n def __init__(self, domain):\n Query.__init__(self)"
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/spyse_api.py",
"chars": 1567,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass SpyseAPI(Query):\n def __init__(self, domain):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/datasets/sublist3r.py",
"chars": 930,
"preview": "from common.query import Query\n\n\nclass Sublist3r(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/dnsquery/mx.py",
"chars": 626,
"preview": "from common.lookup import Lookup\n\n\nclass QueryMX(Lookup):\n def __init__(self, domain):\n Lookup.__init__(self)\n"
},
{
"path": "core/tools/domain/OneForAll/modules/dnsquery/ns.py",
"chars": 627,
"preview": "from common.lookup import Lookup\n\n\nclass QueryNS(Lookup):\n def __init__(self, domain):\n Lookup.__init__(self)\n"
},
{
"path": "core/tools/domain/OneForAll/modules/dnsquery/soa.py",
"chars": 632,
"preview": "from common.lookup import Lookup\n\n\nclass QuerySOA(Lookup):\n def __init__(self, domain):\n Lookup.__init__(self)"
},
{
"path": "core/tools/domain/OneForAll/modules/dnsquery/spf.py",
"chars": 627,
"preview": "from common.lookup import Lookup\n\n\nclass QuerySPF(Lookup):\n def __init__(self, domain):\n Lookup.__init__(self)"
},
{
"path": "core/tools/domain/OneForAll/modules/dnsquery/txt.py",
"chars": 632,
"preview": "from common.lookup import Lookup\n\n\nclass QueryTXT(Lookup):\n def __init__(self, domain):\n Lookup.__init__(self)"
},
{
"path": "core/tools/domain/OneForAll/modules/enrich.py",
"chars": 2030,
"preview": "from modules import iscdn\nfrom common import utils\nfrom common.database import Database\nfrom common.ipasn import IPAsnIn"
},
{
"path": "core/tools/domain/OneForAll/modules/finder.py",
"chars": 6891,
"preview": "import re\nimport time\nfrom urllib import parse\nfrom requests import Response\n\nfrom common import utils\nfrom common impor"
},
{
"path": "core/tools/domain/OneForAll/modules/intelligence/alienvault.py",
"chars": 1089,
"preview": "from common.query import Query\n\n\nclass AlienVault(Query):\n def __init__(self, domain):\n Query.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/intelligence/riskiq_api.py",
"chars": 1493,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass RiskIQ(Query):\n def __init__(self, domain):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/intelligence/threatbook_api.py",
"chars": 1145,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass ThreatBookAPI(Query):\n def __init__(self, domain):"
},
{
"path": "core/tools/domain/OneForAll/modules/intelligence/threatminer.py",
"chars": 962,
"preview": "from common.query import Query\n\n\nclass ThreatMiner(Query):\n def __init__(self, domain):\n Query.__init__(self)\n"
},
{
"path": "core/tools/domain/OneForAll/modules/intelligence/virustotal.py",
"chars": 1428,
"preview": "from common.query import Query\n\n'''\n最多查询100条\n'''\n\n\nclass VirusTotal(Query):\n def __init__(self, domain):\n Quer"
},
{
"path": "core/tools/domain/OneForAll/modules/intelligence/virustotal_api.py",
"chars": 1494,
"preview": "from config import settings\nfrom common.query import Query\n\n\nclass VirusTotalAPI(Query):\n def __init__(self, domain):"
},
{
"path": "core/tools/domain/OneForAll/modules/iscdn.py",
"chars": 2361,
"preview": "import json\nimport ipaddress\n\nfrom config import settings\nfrom common import utils\nfrom common.database import Database\n"
},
{
"path": "core/tools/domain/OneForAll/modules/other_tools.py",
"chars": 1635,
"preview": "\"\"\"\n\n\"\"\"\n#core.tools.domain.OneForAll.\nfrom common import utils\nfrom common.module import Module\nimport os,json\n\n'''\n从其他"
},
{
"path": "core/tools/domain/OneForAll/modules/search/ask.py",
"chars": 1854,
"preview": "import time\nfrom common.search import Search\n\n\nclass Ask(Search):\n def __init__(self, domain):\n Search.__init_"
},
{
"path": "core/tools/domain/OneForAll/modules/search/baidu.py",
"chars": 2765,
"preview": "import time\nfrom bs4 import BeautifulSoup\nfrom common.search import Search\n\n\nclass Baidu(Search):\n def __init__(self,"
},
{
"path": "core/tools/domain/OneForAll/modules/search/bing.py",
"chars": 2247,
"preview": "import time\nfrom common.search import Search\n\n\nclass Bing(Search):\n def __init__(self, domain):\n Search.__init"
},
{
"path": "core/tools/domain/OneForAll/modules/search/bing_api.py",
"chars": 2254,
"preview": "import time\nfrom config import settings\nfrom common.search import Search\n\n\nclass BingAPI(Search):\n def __init__(self,"
},
{
"path": "core/tools/domain/OneForAll/modules/search/fofa_api.py",
"chars": 1908,
"preview": "import base64\nimport time\n\nfrom config import settings\nfrom common.search import Search\n\n\nclass FoFa(Search):\n def __"
},
{
"path": "core/tools/domain/OneForAll/modules/search/gitee.py",
"chars": 1859,
"preview": "import time\nfrom bs4 import BeautifulSoup\nfrom common.search import Search\nfrom config.log import logger\n\n\nclass Gitee(S"
},
{
"path": "core/tools/domain/OneForAll/modules/search/github_api.py",
"chars": 2324,
"preview": "import time\n\nfrom config import settings\nfrom common.search import Search\nfrom config.log import logger\n\n\nclass GithubAP"
},
{
"path": "core/tools/domain/OneForAll/modules/search/google.py",
"chars": 2377,
"preview": "import random\nimport time\nfrom common.search import Search\n\n\nclass Google(Search):\n def __init__(self, domain):\n "
},
{
"path": "core/tools/domain/OneForAll/modules/search/google_api.py",
"chars": 2189,
"preview": "import time\nfrom config import settings\nfrom common.search import Search\n\n\nclass GoogleAPI(Search):\n def __init__(sel"
},
{
"path": "core/tools/domain/OneForAll/modules/search/hunter.py",
"chars": 1870,
"preview": "import base64\nimport time\n\nfrom config import settings\nfrom common.search import Search\n\n\nclass Hunter(Search):\n def "
},
{
"path": "core/tools/domain/OneForAll/modules/search/shodan_api.py",
"chars": 1242,
"preview": "from config import settings\nfrom common.search import Search\n\n\nclass ShodanAPI(Search):\n def __init__(self, domain):\n"
},
{
"path": "core/tools/domain/OneForAll/modules/search/so.py",
"chars": 1986,
"preview": "import time\n\nfrom common.search import Search\n\n\nclass So(Search):\n def __init__(self, domain):\n Search.__init_"
},
{
"path": "core/tools/domain/OneForAll/modules/search/sogou.py",
"chars": 1973,
"preview": "from common.search import Search\n\n\nclass Sogou(Search):\n def __init__(self, domain):\n Search.__init__(self)\n "
},
{
"path": "core/tools/domain/OneForAll/modules/search/yahoo.py",
"chars": 2361,
"preview": "import time\nfrom common.search import Search\n\n\nclass Yahoo(Search):\n def __init__(self, domain):\n Search.__ini"
},
{
"path": "core/tools/domain/OneForAll/modules/search/yandex.py",
"chars": 2215,
"preview": "import time\nfrom common.search import Search\n\n\nclass Yandex(Search):\n def __init__(self, domain):\n Search.__in"
},
{
"path": "core/tools/domain/OneForAll/modules/search/zoomeye_api.py",
"chars": 2350,
"preview": "import time\nfrom config import settings\nfrom common.search import Search\nfrom config.log import logger\n\n\nclass ZoomEyeAP"
},
{
"path": "core/tools/domain/OneForAll/modules/srv.py",
"chars": 2263,
"preview": "\"\"\"\n通过枚举域名常见的SRV记录并做查询来发现子域\n\"\"\"\n\nimport queue\nimport threading\n\nfrom common import utils\nfrom common.module import Modul"
},
{
"path": "core/tools/domain/OneForAll/modules/wildcard.py",
"chars": 9877,
"preview": "import secrets\n\nimport tenacity\nfrom dns.exception import Timeout\nfrom dns.resolver import NXDOMAIN, YXDOMAIN, NoAnswer,"
},
{
"path": "core/tools/domain/OneForAll/oneforall.py",
"chars": 9400,
"preview": "#!/usr/bin/python3\n# coding=utf-8\n\n\"\"\"\nOneForAll is a powerful subdomain integration tool\n\n:copyright: Copyright (c) 201"
},
{
"path": "core/tools/domain/OneForAll/requirements.txt",
"chars": 346,
"preview": "beautifulsoup4==4.11.1\nbs4==0.0.1\ncertifi==2022.06.15\nchardet==5.0.0\ncolorama==0.4.4\ndnspython==2.2.1\nexrex==0.10.5\nfire"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_102952.txt",
"chars": 469,
"preview": "000.tiqianle.com\n000.000.tiqianle.com\ntiqianle.com\nmgm.tiqianle.com\nimg1.tiqianle.com\nwww.tiqianle.com\nm.tiqianle.com\ns."
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_103024.txt",
"chars": 303,
"preview": "img2.tiqianle.com\nimg4.tiqianle.com\ncimg0.tiqianle.com\ncimg4.tiqianle.com\nimgs3.tiqianle.com\nimgs0.tiqianle.com\ncimgs0.t"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_103609.txt",
"chars": 649,
"preview": "000.000.tiqianle.com\n000.tiqianle.com\ntiqianle.com\nlejieapp.tiqianle.com\ns.tiqianle.com\nstatic.tiqianle.com\nwww.tiqianle"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_103641.txt",
"chars": 303,
"preview": "cimgs0.tiqianle.com\nimg2.tiqianle.com\ncimg0.tiqianle.com\ncimg2.tiqianle.com\nimgs2.tiqianle.com\nimgs4.tiqianle.com\nimg3.t"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_103854.txt",
"chars": 469,
"preview": "000.000.tiqianle.com\n000.tiqianle.com\ntiqianle.com\nimg1.tiqianle.com\nm.tiqianle.com\nmgm.tiqianle.com\ns.tiqianle.com\nstat"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_103925.txt",
"chars": 303,
"preview": "imgs0.tiqianle.com\nimgs2.tiqianle.com\ncimgs0.tiqianle.com\nimg2.tiqianle.com\nimgs3.tiqianle.com\ncimg2.tiqianle.com\nimgs4."
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_104236.txt",
"chars": 601,
"preview": "000.tiqianle.com\n000.000.tiqianle.com\nmgm.tiqianle.com\ns.tiqianle.com\nwww.tiqianle.com\nlejieapp.tiqianle.com\nimg1.tiqian"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_104307.txt",
"chars": 303,
"preview": "imgs4.tiqianle.com\ncimgs3.tiqianle.com\nimgs0.tiqianle.com\ncimg3.tiqianle.com\ncimgs4.tiqianle.com\nimg3.tiqianle.com\nimg4."
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_104548.txt",
"chars": 601,
"preview": "000.tiqianle.com\n000.000.tiqianle.com\ntiqianle.com\nimgs1.tiqianle.com\nmail.tiqianle.com\nsale.tiqianle.com\nm.tiqianle.com"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_104620.txt",
"chars": 303,
"preview": "cimg3.tiqianle.com\nimgs0.tiqianle.com\ncimg2.tiqianle.com\nimgs4.tiqianle.com\nimgs2.tiqianle.com\nimg4.tiqianle.com\nimg2.ti"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_104839.txt",
"chars": 601,
"preview": "000.000.tiqianle.com\n000.tiqianle.com\nmail.tiqianle.com\nm.tiqianle.com\nr.tiqianle.com\nsale.tiqianle.com\nimgs1.tiqianle.c"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_104911.txt",
"chars": 303,
"preview": "imgs4.tiqianle.com\ncimgs3.tiqianle.com\nimgs2.tiqianle.com\ncimgs4.tiqianle.com\ncimg2.tiqianle.com\nimg3.tiqianle.com\ncimg3"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_135147.txt",
"chars": 601,
"preview": "000.000.tiqianle.com\n000.tiqianle.com\ns.tiqianle.com\nlejieapp.tiqianle.com\nwww.tiqianle.com\ntiqianle.com\nstatic.tiqianle"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_135221.txt",
"chars": 303,
"preview": "img0.tiqianle.com\nimgs0.tiqianle.com\nimg2.tiqianle.com\ncimgs0.tiqianle.com\ncimgs3.tiqianle.com\nimg3.tiqianle.com\ncimgs2."
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_140104.txt",
"chars": 601,
"preview": "000.tiqianle.com\n000.000.tiqianle.com\ntiqianle.com\nlejieapp.tiqianle.com\ns.tiqianle.com\nstatic.tiqianle.com\nmgm.tiqianle"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_140134.txt",
"chars": 303,
"preview": "cimgs2.tiqianle.com\ncimg0.tiqianle.com\nimgs3.tiqianle.com\ncimgs0.tiqianle.com\ncimg2.tiqianle.com\nimg0.tiqianle.com\nimgs2"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_140659.txt",
"chars": 601,
"preview": "000.tiqianle.com\n000.000.tiqianle.com\ntiqianle.com\nimgs1.tiqianle.com\nmail.tiqianle.com\napp.tiqianle.com\nsale.tiqianle.c"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_140731.txt",
"chars": 303,
"preview": "cimgs3.tiqianle.com\ncimg0.tiqianle.com\ncimg4.tiqianle.com\nimg2.tiqianle.com\nimgs4.tiqianle.com\ncimg3.tiqianle.com\nimgs3."
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_142514.txt",
"chars": 601,
"preview": "000.tiqianle.com\n000.000.tiqianle.com\ntiqianle.com\nimg1.tiqianle.com\nmgm.tiqianle.com\nwww.tiqianle.com\ns.tiqianle.com\nst"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_142545.txt",
"chars": 303,
"preview": "cimgs3.tiqianle.com\nimgs0.tiqianle.com\nimg0.tiqianle.com\nimgs4.tiqianle.com\nimg2.tiqianle.com\ncimg3.tiqianle.com\nimg4.ti"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_142845.txt",
"chars": 601,
"preview": "000.tiqianle.com\n000.000.tiqianle.com\ntiqianle.com\nstatic.tiqianle.com\nimg1.tiqianle.com\nm.tiqianle.com\nwww.tiqianle.com"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_142916.txt",
"chars": 303,
"preview": "imgs2.tiqianle.com\nimg0.tiqianle.com\ncimgs2.tiqianle.com\ncimgs3.tiqianle.com\ncimgs0.tiqianle.com\ncimgs4.tiqianle.com\nimg"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_143118.txt",
"chars": 706,
"preview": "000.tiqianle.com\n000.000.tiqianle.com\ntiqianle.com\nmgm.tiqianle.com\nlejieapp.tiqianle.com\nwww.tiqianle.com\nimg1.tiqianle"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_143151.txt",
"chars": 303,
"preview": "cimg3.tiqianle.com\ncimgs3.tiqianle.com\nimg2.tiqianle.com\nimgs3.tiqianle.com\ncimg2.tiqianle.com\nimgs2.tiqianle.com\ncimgs2"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_143716.txt",
"chars": 706,
"preview": "000.000.tiqianle.com\n000.tiqianle.com\ntiqianle.com\nimg1.tiqianle.com\nmgm.tiqianle.com\nlejieapp.tiqianle.com\ns.tiqianle.c"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_143748.txt",
"chars": 303,
"preview": "imgs3.tiqianle.com\nimg0.tiqianle.com\ncimgs4.tiqianle.com\nimg4.tiqianle.com\nimg2.tiqianle.com\nimgs2.tiqianle.com\ncimgs3.t"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_144026.txt",
"chars": 706,
"preview": "000.000.tiqianle.com\n000.tiqianle.com\ns.tiqianle.com\nlejieapp.tiqianle.com\nimg1.tiqianle.com\nstatic.tiqianle.com\nmgm.tiq"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220902_144059.txt",
"chars": 303,
"preview": "imgs2.tiqianle.com\nimgs3.tiqianle.com\nimg4.tiqianle.com\ncimg3.tiqianle.com\ncimgs3.tiqianle.com\ncimg4.tiqianle.com\nimg2.t"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220909_160351.txt",
"chars": 601,
"preview": "000.tiqianle.com\n000.000.tiqianle.com\ntiqianle.com\ns.tiqianle.com\npw.openvpn.tiqianle.com\nimg.tiqianle.com\nopenvpn.tiqia"
},
{
"path": "core/tools/domain/OneForAll/results/temp/collected_subdomains_tiqianle.com_20220909_160424.txt",
"chars": 303,
"preview": "imgs4.tiqianle.com\ncimg4.tiqianle.com\nimgs0.tiqianle.com\nimg4.tiqianle.com\ncimgs4.tiqianle.com\nimg3.tiqianle.com\ncimgs2."
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_102952.json",
"chars": 13386,
"preview": "{\"name\":\"s.tiqianle.com.\",\"type\":\"A\",\"class\":\"IN\",\"status\":\"NOERROR\",\"data\":{\"answers\":[{\"ttl\":600,\"type\":\"A\",\"class\":\"I"
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_103024.json",
"chars": 0,
"preview": ""
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_103609.json",
"chars": 13325,
"preview": "{\"name\":\"tiqianle.com.\",\"type\":\"A\",\"class\":\"IN\",\"status\":\"NOERROR\",\"data\":{\"answers\":[{\"ttl\":600,\"type\":\"A\",\"class\":\"IN\""
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_103641.json",
"chars": 0,
"preview": ""
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_103854.json",
"chars": 12638,
"preview": "{\"name\":\"cimg.tiqianle.com.\",\"type\":\"A\",\"class\":\"IN\",\"status\":\"NOERROR\",\"data\":{\"answers\":[{\"ttl\":600,\"type\":\"CNAME\",\"cl"
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_103925.json",
"chars": 0,
"preview": ""
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_104236.json",
"chars": 12662,
"preview": "{\"name\":\"r.tiqianle.com.\",\"type\":\"A\",\"class\":\"IN\",\"status\":\"NOERROR\",\"data\":{\"answers\":[{\"ttl\":600,\"type\":\"A\",\"class\":\"I"
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_104307.json",
"chars": 0,
"preview": ""
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_104548.json",
"chars": 12443,
"preview": "{\"name\":\"cimg1.tiqianle.com.\",\"type\":\"A\",\"class\":\"IN\",\"status\":\"NOERROR\",\"data\":{\"answers\":[{\"ttl\":600,\"type\":\"CNAME\",\"c"
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_104620.json",
"chars": 0,
"preview": ""
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_104839.json",
"chars": 12883,
"preview": "{\"name\":\"tiqianle.com.\",\"type\":\"A\",\"class\":\"IN\",\"status\":\"NOERROR\",\"data\":{\"answers\":[{\"ttl\":15,\"type\":\"A\",\"class\":\"IN\","
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_104911.json",
"chars": 0,
"preview": ""
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_135147.json",
"chars": 12871,
"preview": "{\"name\":\"static.tiqianle.com.\",\"type\":\"A\",\"class\":\"IN\",\"status\":\"NOERROR\",\"data\":{\"answers\":[{\"ttl\":600,\"type\":\"CNAME\",\""
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_135221.json",
"chars": 0,
"preview": ""
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_140104.json",
"chars": 12836,
"preview": "{\"name\":\"cres.tiqianle.com.\",\"type\":\"A\",\"class\":\"IN\",\"status\":\"NOERROR\",\"data\":{\"answers\":[{\"ttl\":600,\"type\":\"CNAME\",\"cl"
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_140134.json",
"chars": 0,
"preview": ""
},
{
"path": "core/tools/domain/OneForAll/results/temp/resolved_result_tiqianle.com_20220902_140659.json",
"chars": 12681,
"preview": "{\"name\":\"mail.tiqianle.com.\",\"type\":\"A\",\"class\":\"IN\",\"status\":\"NOERROR\",\"data\":{\"answers\":[{\"ttl\":600,\"type\":\"A\",\"class\""
}
]
// ... and 65 more files (download for full content)
About this extraction
This page contains the full source code of the komomon/Komo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 265 files (7.9 MB), approximately 2.1M tokens, and a symbol index with 932 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.