bbot 2.2.0.5263rc0__tar.gz → 2.3.0.5328rc0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of bbot might be problematic. Click here for more details.
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/PKG-INFO +8 -4
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/README.md +4 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/__init__.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/cli.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/engine.py +2 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/base.py +23 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/bloom.py +8 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/installer.py +8 -5
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/helpers.py +2 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/helper.py +4 -3
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/misc.py +29 -5
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/regexes.py +2 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/web.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/db/sql/models.py +2 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/defaults.yml +3 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/anubisdb.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bevigil.py +2 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/binaryedge.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bufferoverrun.py +2 -3
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/builtwith.py +2 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/c99.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/certspotter.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/chaos.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/columbus.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/crt.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/digitorus.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnscaa.py +3 -3
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/fullhunt.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hackertarget.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/excavate.py +2 -3
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/speculate.py +34 -24
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/leakix.py +6 -5
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/myssl.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/otx.py +4 -2
- bbot-2.3.0.5328rc0/bbot/modules/output/postgres.py +49 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/sqlite.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/passivetotal.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/rapiddns.py +2 -7
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/securitytrails.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/shodan_dns.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/subdomaincenter.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/sql.py +13 -12
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/subdomain_enum.py +3 -3
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/trickest.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/trufflehog.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/virustotal.py +2 -7
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/zoomeye.py +5 -3
- bbot-2.3.0.5328rc0/bbot/presets/fast.yml +16 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/spider.yml +4 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/manager.py +1 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/args.py +20 -4
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/path.py +3 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/preset.py +18 -12
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/scanner.py +7 -2
- bbot-2.3.0.5328rc0/bbot/scanner/target.py +345 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/bbot_fixtures.py +5 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/conftest.py +95 -83
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_bloom_filter.py +2 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_cli.py +36 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_dns.py +2 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_events.py +16 -3
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_helpers.py +17 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -3
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_presets.py +51 -38
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_python_api.py +4 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_scan.py +8 -2
- bbot-2.3.0.5328rc0/bbot/test/test_step_1/test_target.py +407 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_web.py +3 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/base.py +6 -2
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +2 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -6
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +5 -1
- bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_postgres.py +74 -0
- bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_sqlite.py +18 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/pyproject.toml +6 -6
- bbot-2.2.0.5263rc0/bbot/scanner/target.py +0 -543
- bbot-2.2.0.5263rc0/bbot/test/test_step_1/test_target.py +0 -309
- bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_sqlite.py +0 -18
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/LICENSE +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/files.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/logger.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/core.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/helpers.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/flags.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/async_helpers.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/cache.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/command.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/diff.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/brute.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/dns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/engine.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/mock.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/files.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/interactsh.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/libmagic.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/names_generator.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/ntlm.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/process.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/ratelimiter.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/regex.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/url.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/validators.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/client.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/engine.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/wordcloud.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/modules.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/multiprocess.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/shared_deps.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/errors.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/logger.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ajaxpro.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/apkpure.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/azure_realm.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/azure_tenant.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns_direct.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns_zone.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/badsecrets.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/base.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_amazon.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_azure.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_digitalocean.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_file_enum.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_firebase.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_google.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bypass403.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/censys.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/code_repository.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/credshed.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/dastardly.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/ffuf.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/nuclei.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/vhost.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dehashed.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsbimi.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsbrute.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnscommonsrv.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsdumpster.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/docker_pull.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dockerhub.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dotnetnuke.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/emailformat.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/extractous.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ffuf_shortnames.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/filedownload.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/fingerprintx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/generic_ssrf.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/git.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/git_clone.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_codesearch.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_org.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_workflows.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/gitlab.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/google_playstore.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/gowitness.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/host_header.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/httpx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hunt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hunterio.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/iis_shortnames.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/aggregate.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/base.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/cloudcheck.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/dnsresolve.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internetdb.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ip2location.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ipneighbor.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ipstack.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/jadx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/newsletters.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ntlm.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/oauth.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/asset_inventory.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/base.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/csv.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/discord.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/emails.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/http.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/json.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/neo4j.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/python.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/slack.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/splunk.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/stdout.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/subdomains.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/teams.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/txt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/web_report.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/websocket.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_cookies.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_getparams.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_headers.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/pgp.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/portscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/postman.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/postman_download.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/affiliates.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/asn.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/base.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/robots.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/secretsdb.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/securitytxt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/sitedossier.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/skymem.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/smuggler.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/social.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/sslcert.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/subdomainradar.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/telerik.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/bucket.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/github.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/postman.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/shodan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/webhook.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/url_manipulation.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/urlscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/viewdns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wafw00f.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wappalyzer.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wayback.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wpscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/baddns-thorough.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/cloud-enum.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/code-enum.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/email-enum.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/kitchen-sink.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/subdomain-enum.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dirbust-light.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/paramminer.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-basic.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-screenshots.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-thorough.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/dispatcher.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/conditions.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/environ.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/stats.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scripts/docs.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/coverage.cfg +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/fastapi_test.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/owasp_mastg.apk +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/run_tests.sh +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test.conf +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_output.ndjson +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_bbot_fastapi.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_command.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_config.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_docs.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_engine.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_files.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_scope.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_extractous.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_jadx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/testsslcert.pem +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/testsslkey.pem +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/devops_mutations.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/nameservers.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: bbot
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0.5328rc0
|
|
4
4
|
Summary: OSINT automation for hackers.
|
|
5
5
|
Home-page: https://github.com/blacklanternsecurity/bbot
|
|
6
6
|
License: GPL-3.0
|
|
7
|
-
Keywords: python,cli,automation,osint,neo4j,scanner,python-library,hacking,recursion,pentesting,recon,command-line-tool,bugbounty,subdomains,security-tools,subdomain-scanner,osint-framework,attack-surface,subdomain-enumeration,osint-tool
|
|
7
|
+
Keywords: python,cli,automation,osint,threat-intel,intelligence,neo4j,scanner,python-library,hacking,recursion,pentesting,recon,command-line-tool,bugbounty,subdomains,security-tools,subdomain-scanner,osint-framework,attack-surface,subdomain-enumeration,osint-tool
|
|
8
8
|
Author: TheTechromancer
|
|
9
9
|
Requires-Python: >=3.9,<4.0
|
|
10
10
|
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
@@ -20,7 +20,7 @@ Requires-Dist: ansible (>=7.3,<9.0)
|
|
|
20
20
|
Requires-Dist: ansible-runner (>=2.3.2,<3.0.0)
|
|
21
21
|
Requires-Dist: beautifulsoup4 (>=4.12.2,<5.0.0)
|
|
22
22
|
Requires-Dist: cachetools (>=5.3.2,<6.0.0)
|
|
23
|
-
Requires-Dist: cloudcheck (>=
|
|
23
|
+
Requires-Dist: cloudcheck (>=6.0.0.602,<7.0.0.0)
|
|
24
24
|
Requires-Dist: deepdiff (>=6.2.3,<8.0.0)
|
|
25
25
|
Requires-Dist: dnspython (>=2.4.2,<3.0.0)
|
|
26
26
|
Requires-Dist: httpx (>=0.27.0,<0.28.0)
|
|
@@ -35,7 +35,7 @@ Requires-Dist: pycryptodome (>=3.17,<4.0)
|
|
|
35
35
|
Requires-Dist: pydantic (>=2.4.2,<3.0.0)
|
|
36
36
|
Requires-Dist: pyjwt (>=2.7.0,<3.0.0)
|
|
37
37
|
Requires-Dist: pyzmq (>=26.0.3,<27.0.0)
|
|
38
|
-
Requires-Dist: radixtarget (>=
|
|
38
|
+
Requires-Dist: radixtarget (>=2.0.0.50,<3.0.0.0)
|
|
39
39
|
Requires-Dist: regex (>=2024.4.16,<2025.0.0)
|
|
40
40
|
Requires-Dist: setproctitle (>=1.3.3,<2.0.0)
|
|
41
41
|
Requires-Dist: socksio (>=1.0.0,<2.0.0)
|
|
@@ -145,6 +145,10 @@ description: Recursive web spider
|
|
|
145
145
|
modules:
|
|
146
146
|
- httpx
|
|
147
147
|
|
|
148
|
+
blacklist:
|
|
149
|
+
# Prevent spider from invalidating sessions by logging out
|
|
150
|
+
- "RE:/.*(sign|log)[_-]?out"
|
|
151
|
+
|
|
148
152
|
config:
|
|
149
153
|
web:
|
|
150
154
|
# how many links to follow in a row
|
|
@@ -174,7 +174,7 @@ async def _main():
|
|
|
174
174
|
if sys.stdin.isatty():
|
|
175
175
|
|
|
176
176
|
# warn if any targets belong directly to a cloud provider
|
|
177
|
-
for event in scan.target.events:
|
|
177
|
+
for event in scan.target.seeds.events:
|
|
178
178
|
if event.type == "DNS_NAME":
|
|
179
179
|
cloudcheck_result = scan.helpers.cloudcheck(event.host)
|
|
180
180
|
if cloudcheck_result:
|
|
@@ -641,7 +641,7 @@ class EngineServer(EngineBase):
|
|
|
641
641
|
except BaseException as e:
|
|
642
642
|
if isinstance(e, (TimeoutError, asyncio.exceptions.TimeoutError)):
|
|
643
643
|
self.log.warning(f"{self.name}: Timeout after {timeout:,} seconds in finished_tasks({tasks})")
|
|
644
|
-
for task in tasks:
|
|
644
|
+
for task in list(tasks):
|
|
645
645
|
task.cancel()
|
|
646
646
|
self._await_cancelled_task(task)
|
|
647
647
|
else:
|
|
@@ -683,5 +683,5 @@ class EngineServer(EngineBase):
|
|
|
683
683
|
for client_id in list(self.tasks):
|
|
684
684
|
await self.cancel_task(client_id)
|
|
685
685
|
for client_id, tasks in self.child_tasks.items():
|
|
686
|
-
for task in tasks:
|
|
686
|
+
for task in list(tasks):
|
|
687
687
|
await self._await_cancelled_task(task)
|
|
@@ -341,6 +341,21 @@ class BaseEvent:
|
|
|
341
341
|
return self.host
|
|
342
342
|
return self._host_original
|
|
343
343
|
|
|
344
|
+
@property
|
|
345
|
+
def host_filterable(self):
|
|
346
|
+
"""
|
|
347
|
+
A string version of the event that's used for regex-based blacklisting.
|
|
348
|
+
|
|
349
|
+
For example, the user can specify "REGEX:.*.evilcorp.com" in their blacklist, and this regex
|
|
350
|
+
will be applied against this property.
|
|
351
|
+
"""
|
|
352
|
+
parsed_url = getattr(self, "parsed_url", None)
|
|
353
|
+
if parsed_url is not None:
|
|
354
|
+
return parsed_url.geturl()
|
|
355
|
+
if self.host is not None:
|
|
356
|
+
return str(self.host)
|
|
357
|
+
return ""
|
|
358
|
+
|
|
344
359
|
@property
|
|
345
360
|
def port(self):
|
|
346
361
|
self.host
|
|
@@ -1114,8 +1129,7 @@ class DnsEvent(BaseEvent):
|
|
|
1114
1129
|
class IP_RANGE(DnsEvent):
|
|
1115
1130
|
def __init__(self, *args, **kwargs):
|
|
1116
1131
|
super().__init__(*args, **kwargs)
|
|
1117
|
-
|
|
1118
|
-
self.add_tag(f"ipv{net.version}")
|
|
1132
|
+
self.add_tag(f"ipv{self.host.version}")
|
|
1119
1133
|
|
|
1120
1134
|
def sanitize_data(self, data):
|
|
1121
1135
|
return str(ipaddress.ip_network(str(data), strict=False))
|
|
@@ -1689,6 +1703,13 @@ def make_event(
|
|
|
1689
1703
|
if event_type == "USERNAME" and validators.soft_validate(data, "email"):
|
|
1690
1704
|
event_type = "EMAIL_ADDRESS"
|
|
1691
1705
|
tags.add("affiliate")
|
|
1706
|
+
# Convert single-host IP_RANGE to IP_ADDRESS
|
|
1707
|
+
if event_type == "IP_RANGE":
|
|
1708
|
+
with suppress(Exception):
|
|
1709
|
+
net = ipaddress.ip_network(data, strict=False)
|
|
1710
|
+
if net.prefixlen == net.max_prefixlen:
|
|
1711
|
+
event_type = "IP_ADDRESS"
|
|
1712
|
+
data = net.network_address
|
|
1692
1713
|
|
|
1693
1714
|
event_class = globals().get(event_type, DefaultEvent)
|
|
1694
1715
|
|
|
@@ -64,8 +64,15 @@ class BloomFilter:
|
|
|
64
64
|
hash = (hash * 0x01000193) % 2**32 # 16777619
|
|
65
65
|
return hash
|
|
66
66
|
|
|
67
|
-
def
|
|
67
|
+
def close(self):
|
|
68
|
+
"""Explicitly close the memory-mapped file."""
|
|
68
69
|
self.mmap_file.close()
|
|
69
70
|
|
|
71
|
+
def __del__(self):
|
|
72
|
+
try:
|
|
73
|
+
self.close()
|
|
74
|
+
except Exception:
|
|
75
|
+
pass
|
|
76
|
+
|
|
70
77
|
def __contains__(self, item):
|
|
71
78
|
return self.check(item)
|
|
@@ -14,7 +14,7 @@ from secrets import token_bytes
|
|
|
14
14
|
from ansible_runner.interface import run
|
|
15
15
|
from subprocess import CalledProcessError
|
|
16
16
|
|
|
17
|
-
from ..misc import can_sudo_without_password, os_platform, rm_at_exit
|
|
17
|
+
from ..misc import can_sudo_without_password, os_platform, rm_at_exit, get_python_constraints
|
|
18
18
|
|
|
19
19
|
log = logging.getLogger("bbot.core.helpers.depsinstaller")
|
|
20
20
|
|
|
@@ -176,10 +176,13 @@ class DepsInstaller:
|
|
|
176
176
|
|
|
177
177
|
command = [sys.executable, "-m", "pip", "install", "--upgrade"] + packages
|
|
178
178
|
|
|
179
|
-
if constraints
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
179
|
+
# if no custom constraints are provided, use the constraints of the currently installed version of bbot
|
|
180
|
+
if constraints is not None:
|
|
181
|
+
constraints = get_python_constraints()
|
|
182
|
+
|
|
183
|
+
constraints_tempfile = self.parent_helper.tempfile(constraints, pipe=False)
|
|
184
|
+
command.append("--constraint")
|
|
185
|
+
command.append(constraints_tempfile)
|
|
183
186
|
|
|
184
187
|
process = None
|
|
185
188
|
try:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
|
-
from bbot.core.helpers.regexes import
|
|
3
|
+
from bbot.core.helpers.regexes import dns_name_extraction_regex
|
|
4
4
|
from bbot.core.helpers.misc import clean_dns_record, smart_decode
|
|
5
5
|
|
|
6
6
|
log = logging.getLogger("bbot.core.helpers.dns")
|
|
@@ -198,7 +198,7 @@ def extract_targets(record):
|
|
|
198
198
|
elif rdtype == "TXT":
|
|
199
199
|
for s in record.strings:
|
|
200
200
|
s = smart_decode(s)
|
|
201
|
-
for match in
|
|
201
|
+
for match in dns_name_extraction_regex.finditer(s):
|
|
202
202
|
start, end = match.span()
|
|
203
203
|
host = s[start:end]
|
|
204
204
|
add_result(rdtype, host)
|
|
@@ -12,10 +12,11 @@ from .diff import HttpCompare
|
|
|
12
12
|
from .regex import RegexHelper
|
|
13
13
|
from .wordcloud import WordCloud
|
|
14
14
|
from .interactsh import Interactsh
|
|
15
|
-
from ...scanner.target import Target
|
|
16
15
|
from .depsinstaller import DepsInstaller
|
|
17
16
|
from .async_helpers import get_event_loop
|
|
18
17
|
|
|
18
|
+
from bbot.scanner.target import BaseTarget
|
|
19
|
+
|
|
19
20
|
log = logging.getLogger("bbot.core.helpers")
|
|
20
21
|
|
|
21
22
|
|
|
@@ -155,8 +156,8 @@ class ConfigAwareHelper:
|
|
|
155
156
|
_filter = lambda x: x.is_dir() and self.regexes.scan_name_regex.match(x.name)
|
|
156
157
|
self.clean_old(self.scans_dir, keep=self.keep_old_scans, filter=_filter)
|
|
157
158
|
|
|
158
|
-
def make_target(self, *
|
|
159
|
-
return
|
|
159
|
+
def make_target(self, *targets, **kwargs):
|
|
160
|
+
return BaseTarget(*targets, scan=self.scan, **kwargs)
|
|
160
161
|
|
|
161
162
|
@property
|
|
162
163
|
def config(self):
|
|
@@ -586,17 +586,18 @@ def is_dns_name(d, include_local=True):
|
|
|
586
586
|
if include_local:
|
|
587
587
|
if bbot_regexes.hostname_regex.match(d):
|
|
588
588
|
return True
|
|
589
|
-
if bbot_regexes.
|
|
589
|
+
if bbot_regexes.dns_name_validation_regex.match(d):
|
|
590
590
|
return True
|
|
591
591
|
return False
|
|
592
592
|
|
|
593
593
|
|
|
594
|
-
def is_ip(d, version=None):
|
|
594
|
+
def is_ip(d, version=None, include_network=False):
|
|
595
595
|
"""
|
|
596
596
|
Checks if the given string or object represents a valid IP address.
|
|
597
597
|
|
|
598
598
|
Args:
|
|
599
599
|
d (str or ipaddress.IPvXAddress): The IP address to check.
|
|
600
|
+
include_network (bool, optional): Whether to include network types (IPv4Network or IPv6Network). Defaults to False.
|
|
600
601
|
version (int, optional): The IP version to validate (4 or 6). Default is None.
|
|
601
602
|
|
|
602
603
|
Returns:
|
|
@@ -612,12 +613,17 @@ def is_ip(d, version=None):
|
|
|
612
613
|
>>> is_ip('evilcorp.com')
|
|
613
614
|
False
|
|
614
615
|
"""
|
|
616
|
+
ip = None
|
|
615
617
|
try:
|
|
616
618
|
ip = ipaddress.ip_address(d)
|
|
617
|
-
if version is None or ip.version == version:
|
|
618
|
-
return True
|
|
619
619
|
except Exception:
|
|
620
|
-
|
|
620
|
+
if include_network:
|
|
621
|
+
try:
|
|
622
|
+
ip = ipaddress.ip_network(d, strict=False)
|
|
623
|
+
except Exception:
|
|
624
|
+
pass
|
|
625
|
+
if ip is not None and (version is None or ip.version == version):
|
|
626
|
+
return True
|
|
621
627
|
return False
|
|
622
628
|
|
|
623
629
|
|
|
@@ -2807,3 +2813,21 @@ def safe_format(s, **kwargs):
|
|
|
2807
2813
|
Format string while ignoring unused keys (prevents KeyError)
|
|
2808
2814
|
"""
|
|
2809
2815
|
return s.format_map(SafeDict(kwargs))
|
|
2816
|
+
|
|
2817
|
+
|
|
2818
|
+
def get_python_constraints():
|
|
2819
|
+
req_regex = re.compile(r"([^(]+)\s*\((.*)\)", re.IGNORECASE)
|
|
2820
|
+
|
|
2821
|
+
def clean_requirement(req_string):
|
|
2822
|
+
# Extract package name and version constraints from format like "package (>=1.0,<2.0)"
|
|
2823
|
+
match = req_regex.match(req_string)
|
|
2824
|
+
if match:
|
|
2825
|
+
name, constraints = match.groups()
|
|
2826
|
+
return f"{name.strip()}{constraints}"
|
|
2827
|
+
|
|
2828
|
+
return req_string
|
|
2829
|
+
|
|
2830
|
+
from importlib.metadata import distribution
|
|
2831
|
+
|
|
2832
|
+
dist = distribution("bbot")
|
|
2833
|
+
return [clean_requirement(r) for r in dist.requires]
|
|
@@ -40,7 +40,8 @@ ip_range_regexes = list(re.compile(r, re.I) for r in _ip_range_regexes)
|
|
|
40
40
|
|
|
41
41
|
# dns names with periods
|
|
42
42
|
_dns_name_regex = r"(?:\w(?:[\w-]{0,100}\w)?\.)+(?:[xX][nN]--)?[^\W_]{1,63}\.?"
|
|
43
|
-
|
|
43
|
+
dns_name_extraction_regex = re.compile(_dns_name_regex, re.I)
|
|
44
|
+
dns_name_validation_regex = re.compile(r"^" + _dns_name_regex + r"$", re.I)
|
|
44
45
|
|
|
45
46
|
# dns names without periods
|
|
46
47
|
_hostname_regex = r"(?!\w*\.\w+)\w(?:[\w-]{0,100}\w)?"
|
|
@@ -58,7 +58,7 @@ class WebHelper(EngineClient):
|
|
|
58
58
|
self.ssl_verify = self.config.get("ssl_verify", False)
|
|
59
59
|
engine_debug = self.config.get("engine", {}).get("debug", False)
|
|
60
60
|
super().__init__(
|
|
61
|
-
server_kwargs={"config": self.config, "target": self.parent_helper.preset.target.
|
|
61
|
+
server_kwargs={"config": self.config, "target": self.parent_helper.preset.target.minimal},
|
|
62
62
|
debug=engine_debug,
|
|
63
63
|
)
|
|
64
64
|
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
import json
|
|
5
5
|
import logging
|
|
6
|
-
from datetime import datetime
|
|
7
6
|
from pydantic import ConfigDict
|
|
8
7
|
from typing import List, Optional
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
9
|
from typing_extensions import Annotated
|
|
10
10
|
from pydantic.functional_validators import AfterValidator
|
|
11
11
|
from sqlmodel import inspect, Column, Field, SQLModel, JSON, String, DateTime as SQLADateTime
|
|
@@ -114,6 +114,7 @@ class Event(BBOTBaseModel, table=True):
|
|
|
114
114
|
discovery_context: str = ""
|
|
115
115
|
discovery_path: List[str] = Field(default=[], sa_type=JSON)
|
|
116
116
|
parent_chain: List[str] = Field(default=[], sa_type=JSON)
|
|
117
|
+
inserted_at: NaiveUTC = Field(default_factory=lambda: datetime.now(timezone.utc))
|
|
117
118
|
|
|
118
119
|
|
|
119
120
|
### SCAN ###
|
|
@@ -14,6 +14,9 @@ folder_blobs: false
|
|
|
14
14
|
### SCOPE ###
|
|
15
15
|
|
|
16
16
|
scope:
|
|
17
|
+
# strict scope means only exact DNS names are considered in-scope
|
|
18
|
+
# subdomains are not included unless they are explicitly provided in the target list
|
|
19
|
+
strict: false
|
|
17
20
|
# Filter by scope distance which events are displayed in the output
|
|
18
21
|
# 0 == show only in-scope events (affiliates are always shown)
|
|
19
22
|
# 1 == show all events up to distance-1 (1 hop from target)
|
|
@@ -116,7 +116,7 @@ class baddns(BaseModule):
|
|
|
116
116
|
context=f'{{module}}\'s "{r_dict["module"]}" module found {{event.type}}: {r_dict["description"]}',
|
|
117
117
|
)
|
|
118
118
|
else:
|
|
119
|
-
self.warning(f"Got unrecognized confidence level: {
|
|
119
|
+
self.warning(f"Got unrecognized confidence level: {r_dict['confidence']}")
|
|
120
120
|
|
|
121
121
|
found_domains = r_dict.get("found_domains", None)
|
|
122
122
|
if found_domains:
|
|
@@ -60,14 +60,14 @@ class bevigil(subdomain_enum_apikey):
|
|
|
60
60
|
url = f"{self.base_url}/{self.helpers.quote(query)}/urls/"
|
|
61
61
|
return await self.api_request(url)
|
|
62
62
|
|
|
63
|
-
def parse_subdomains(self, r, query=None):
|
|
63
|
+
async def parse_subdomains(self, r, query=None):
|
|
64
64
|
results = set()
|
|
65
65
|
subdomains = r.json().get("subdomains")
|
|
66
66
|
if subdomains:
|
|
67
67
|
results.update(subdomains)
|
|
68
68
|
return results
|
|
69
69
|
|
|
70
|
-
def parse_urls(self, r, query=None):
|
|
70
|
+
async def parse_urls(self, r, query=None):
|
|
71
71
|
results = set()
|
|
72
72
|
urls = r.json().get("urls")
|
|
73
73
|
if urls:
|
|
@@ -37,6 +37,6 @@ class binaryedge(subdomain_enum_apikey):
|
|
|
37
37
|
url = f"{self.base_url}/query/domains/subdomain/{self.helpers.quote(query)}"
|
|
38
38
|
return await self.api_request(url)
|
|
39
39
|
|
|
40
|
-
def parse_results(self, r, query):
|
|
40
|
+
async def parse_results(self, r, query):
|
|
41
41
|
j = r.json()
|
|
42
42
|
return j.get("events", [])
|
|
@@ -33,7 +33,7 @@ class BufferOverrun(subdomain_enum_apikey):
|
|
|
33
33
|
url = f"{self.commercial_base_url if self.commercial else self.base_url}?q=.{query}"
|
|
34
34
|
return await self.api_request(url)
|
|
35
35
|
|
|
36
|
-
def parse_results(self, r, query):
|
|
36
|
+
async def parse_results(self, r, query):
|
|
37
37
|
j = r.json()
|
|
38
38
|
subdomains_set = set()
|
|
39
39
|
if isinstance(j, dict):
|
|
@@ -44,5 +44,4 @@ class BufferOverrun(subdomain_enum_apikey):
|
|
|
44
44
|
subdomain = parts[4].strip()
|
|
45
45
|
if subdomain and subdomain.endswith(f".{query}"):
|
|
46
46
|
subdomains_set.add(subdomain)
|
|
47
|
-
|
|
48
|
-
yield subdomain
|
|
47
|
+
return subdomains_set
|
|
@@ -62,7 +62,7 @@ class builtwith(subdomain_enum_apikey):
|
|
|
62
62
|
url = f"{self.base_url}/redirect1/api.json?KEY={{api_key}}&LOOKUP={query}"
|
|
63
63
|
return await self.api_request(url)
|
|
64
64
|
|
|
65
|
-
def parse_domains(self, r, query):
|
|
65
|
+
async def parse_domains(self, r, query):
|
|
66
66
|
"""
|
|
67
67
|
This method returns a set of subdomains.
|
|
68
68
|
Each subdomain is an "FQDN" that was reported in the "Detailed Technology Profile" page on builtwith.com
|
|
@@ -92,7 +92,7 @@ class builtwith(subdomain_enum_apikey):
|
|
|
92
92
|
self.verbose(f"No results for {query}: {error}")
|
|
93
93
|
return results_set
|
|
94
94
|
|
|
95
|
-
def parse_redirects(self, r, query):
|
|
95
|
+
async def parse_redirects(self, r, query):
|
|
96
96
|
"""
|
|
97
97
|
This method creates a set.
|
|
98
98
|
Each entry in the set is either an Inbound or Outbound Redirect reported in the "Redirect Profile" page on builtwith.com
|
|
@@ -26,7 +26,8 @@ class c99(subdomain_enum_apikey):
|
|
|
26
26
|
url = f"{self.base_url}/subdomainfinder?key={{api_key}}&domain={self.helpers.quote(query)}&json"
|
|
27
27
|
return await self.api_request(url)
|
|
28
28
|
|
|
29
|
-
def parse_results(self, r, query):
|
|
29
|
+
async def parse_results(self, r, query):
|
|
30
|
+
results = set()
|
|
30
31
|
j = r.json()
|
|
31
32
|
if isinstance(j, dict):
|
|
32
33
|
subdomains = j.get("subdomains", [])
|
|
@@ -34,4 +35,5 @@ class c99(subdomain_enum_apikey):
|
|
|
34
35
|
for s in subdomains:
|
|
35
36
|
subdomain = s.get("subdomain", "")
|
|
36
37
|
if subdomain:
|
|
37
|
-
|
|
38
|
+
results.add(subdomain)
|
|
39
|
+
return results
|
|
@@ -17,9 +17,11 @@ class certspotter(subdomain_enum):
|
|
|
17
17
|
url = f"{self.base_url}/issuances?domain={self.helpers.quote(query)}&include_subdomains=true&expand=dns_names"
|
|
18
18
|
return self.api_request(url, timeout=self.http_timeout + 30)
|
|
19
19
|
|
|
20
|
-
def parse_results(self, r, query):
|
|
20
|
+
async def parse_results(self, r, query):
|
|
21
|
+
results = set()
|
|
21
22
|
json = r.json()
|
|
22
23
|
if json:
|
|
23
24
|
for r in json:
|
|
24
25
|
for dns_name in r.get("dns_names", []):
|
|
25
|
-
|
|
26
|
+
results.add(dns_name.lstrip(".*").rstrip("."))
|
|
27
|
+
return results
|
|
@@ -26,7 +26,8 @@ class chaos(subdomain_enum_apikey):
|
|
|
26
26
|
url = f"{self.base_url}/{domain}/subdomains"
|
|
27
27
|
return await self.api_request(url)
|
|
28
28
|
|
|
29
|
-
def parse_results(self, r, query):
|
|
29
|
+
async def parse_results(self, r, query):
|
|
30
|
+
results = set()
|
|
30
31
|
j = r.json()
|
|
31
32
|
subdomains_set = set()
|
|
32
33
|
if isinstance(j, dict):
|
|
@@ -39,4 +40,5 @@ class chaos(subdomain_enum_apikey):
|
|
|
39
40
|
for s in subdomains_set:
|
|
40
41
|
full_subdomain = f"{s}.{domain}"
|
|
41
42
|
if full_subdomain and full_subdomain.endswith(f".{query}"):
|
|
42
|
-
|
|
43
|
+
results.add(full_subdomain)
|
|
44
|
+
return results
|
|
@@ -17,7 +17,7 @@ class columbus(subdomain_enum):
|
|
|
17
17
|
url = f"{self.base_url}/{self.helpers.quote(query)}?days=365"
|
|
18
18
|
return await self.api_request(url)
|
|
19
19
|
|
|
20
|
-
def parse_results(self, r, query):
|
|
20
|
+
async def parse_results(self, r, query):
|
|
21
21
|
results = set()
|
|
22
22
|
json = r.json()
|
|
23
23
|
if json and isinstance(json, list):
|
|
@@ -23,7 +23,8 @@ class crt(subdomain_enum):
|
|
|
23
23
|
url = self.helpers.add_get_params(self.base_url, params).geturl()
|
|
24
24
|
return await self.api_request(url, timeout=self.http_timeout + 30)
|
|
25
25
|
|
|
26
|
-
def parse_results(self, r, query):
|
|
26
|
+
async def parse_results(self, r, query):
|
|
27
|
+
results = set()
|
|
27
28
|
j = r.json()
|
|
28
29
|
for cert_info in j:
|
|
29
30
|
if not type(cert_info) == dict:
|
|
@@ -35,4 +36,5 @@ class crt(subdomain_enum):
|
|
|
35
36
|
domain = cert_info.get("name_value")
|
|
36
37
|
if domain:
|
|
37
38
|
for d in domain.splitlines():
|
|
38
|
-
|
|
39
|
+
results.add(d.lower())
|
|
40
|
+
return results
|
|
@@ -19,7 +19,7 @@ class digitorus(subdomain_enum):
|
|
|
19
19
|
url = f"{self.base_url}/{self.helpers.quote(query)}"
|
|
20
20
|
return await self.helpers.request(url)
|
|
21
21
|
|
|
22
|
-
def parse_results(self, r, query):
|
|
22
|
+
async def parse_results(self, r, query):
|
|
23
23
|
results = set()
|
|
24
24
|
content = getattr(r, "text", "")
|
|
25
25
|
extract_regex = re.compile(r"[\w.-]+\." + query, re.I)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
#
|
|
3
3
|
# Checks for and parses CAA DNS TXT records for IODEF reporting destination email addresses and/or URL's.
|
|
4
4
|
#
|
|
5
|
-
# NOTE: when the target domain is initially resolved basic "
|
|
5
|
+
# NOTE: when the target domain is initially resolved basic "dns_name_extraction_regex" matched targets will be extracted so we do not perform that again here.
|
|
6
6
|
#
|
|
7
7
|
# Example CAA records,
|
|
8
8
|
# 0 iodef "mailto:dnsadmin@example.com"
|
|
@@ -23,7 +23,7 @@ from bbot.modules.base import BaseModule
|
|
|
23
23
|
|
|
24
24
|
import re
|
|
25
25
|
|
|
26
|
-
from bbot.core.helpers.regexes import
|
|
26
|
+
from bbot.core.helpers.regexes import dns_name_extraction_regex, email_regex, url_regexes
|
|
27
27
|
|
|
28
28
|
# Handle '0 iodef "mailto:support@hcaptcha.com"'
|
|
29
29
|
# Handle '1 iodef "https://some.host.tld/caa;"'
|
|
@@ -109,7 +109,7 @@ class dnscaa(BaseModule):
|
|
|
109
109
|
|
|
110
110
|
elif caa_match.group("property").lower().startswith("issue"):
|
|
111
111
|
if self._dns_names:
|
|
112
|
-
for match in
|
|
112
|
+
for match in dns_name_extraction_regex.finditer(caa_match.group("text")):
|
|
113
113
|
start, end = match.span()
|
|
114
114
|
name = caa_match.group("text")[start:end]
|
|
115
115
|
|
|
@@ -18,12 +18,14 @@ class hackertarget(subdomain_enum):
|
|
|
18
18
|
response = await self.api_request(url)
|
|
19
19
|
return response
|
|
20
20
|
|
|
21
|
-
def parse_results(self, r, query):
|
|
21
|
+
async def parse_results(self, r, query):
|
|
22
|
+
results = set()
|
|
22
23
|
for line in r.text.splitlines():
|
|
23
24
|
host = line.split(",")[0]
|
|
24
25
|
try:
|
|
25
26
|
self.helpers.validators.validate_host(host)
|
|
26
|
-
|
|
27
|
+
results.add(host)
|
|
27
28
|
except ValueError:
|
|
28
29
|
self.debug(f"Error validating API result: {line}")
|
|
29
30
|
continue
|
|
31
|
+
return results
|
|
@@ -527,9 +527,8 @@ class excavate(BaseInternalModule, BaseInterceptModule):
|
|
|
527
527
|
async def process(self, yara_results, event, yara_rule_settings, discovery_context):
|
|
528
528
|
for identifier in yara_results.keys():
|
|
529
529
|
for csp_str in yara_results[identifier]:
|
|
530
|
-
domains = await self.
|
|
531
|
-
|
|
532
|
-
for domain in unique_domains:
|
|
530
|
+
domains = await self.excavate.scan.extract_in_scope_hostnames(csp_str)
|
|
531
|
+
for domain in domains:
|
|
533
532
|
await self.report(domain, event, yara_rule_settings, discovery_context, event_type="DNS_NAME")
|
|
534
533
|
|
|
535
534
|
class EmailExtractor(ExcavateRule):
|