bbot 2.2.0.5263rc0__tar.gz → 2.2.0.5309rc0__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.2.0.5309rc0}/PKG-INFO +4 -4
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/__init__.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/cli.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/engine.py +2 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/event/base.py +23 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/bloom.py +8 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/depsinstaller/installer.py +8 -5
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/dns/helpers.py +2 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/helper.py +4 -3
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/misc.py +29 -5
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/regexes.py +2 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/web/web.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/defaults.yml +3 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/anubisdb.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/baddns.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/bevigil.py +2 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/binaryedge.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/bufferoverrun.py +2 -3
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/builtwith.py +2 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/c99.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/certspotter.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/chaos.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/columbus.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/crt.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/digitorus.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/dnscaa.py +3 -3
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/fullhunt.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/hackertarget.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/internal/excavate.py +2 -3
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/internal/speculate.py +34 -24
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/leakix.py +6 -5
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/myssl.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/otx.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/passivetotal.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/rapiddns.py +2 -7
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/securitytrails.py +4 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/shodan_dns.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/subdomaincenter.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/templates/subdomain_enum.py +3 -3
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/trickest.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/virustotal.py +2 -7
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/zoomeye.py +5 -3
- bbot-2.2.0.5309rc0/bbot/presets/fast.yml +16 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/spider.yml +4 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/manager.py +1 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/preset/args.py +20 -4
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/preset/path.py +3 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/preset/preset.py +18 -12
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/scanner.py +7 -2
- bbot-2.2.0.5309rc0/bbot/scanner/target.py +345 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/bbot_fixtures.py +5 -2
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/conftest.py +95 -83
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_bloom_filter.py +2 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_cli.py +36 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_dns.py +2 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_events.py +16 -3
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_helpers.py +17 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -3
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_presets.py +51 -38
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_python_api.py +4 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_scan.py +8 -2
- bbot-2.2.0.5309rc0/bbot/test/test_step_1/test_target.py +407 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_web.py +3 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -6
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +1 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +5 -1
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/pyproject.toml +5 -5
- 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-2.2.0.5309rc0}/LICENSE +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/README.md +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/config/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/config/files.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/config/logger.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/core.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/event/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/event/helpers.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/flags.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/async_helpers.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/cache.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/command.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/diff.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/dns/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/dns/brute.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/dns/dns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/dns/engine.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/dns/mock.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/files.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/interactsh.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/libmagic.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/names_generator.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/ntlm.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/process.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/ratelimiter.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/regex.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/url.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/validators.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/web/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/web/client.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/web/engine.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/helpers/wordcloud.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/modules.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/multiprocess.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/core/shared_deps.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/db/sql/models.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/errors.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/logger.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/ajaxpro.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/apkpure.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/azure_realm.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/azure_tenant.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/baddns_direct.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/baddns_zone.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/badsecrets.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/base.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/bucket_amazon.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/bucket_azure.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/bucket_digitalocean.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/bucket_file_enum.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/bucket_firebase.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/bucket_google.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/bypass403.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/censys.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/code_repository.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/credshed.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/deadly/dastardly.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/deadly/ffuf.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/deadly/nuclei.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/deadly/vhost.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/dehashed.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/dnsbimi.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/dnsbrute.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/dnscommonsrv.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/dnsdumpster.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/docker_pull.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/dockerhub.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/dotnetnuke.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/emailformat.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/extractous.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/ffuf_shortnames.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/filedownload.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/fingerprintx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/generic_ssrf.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/git.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/git_clone.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/github_codesearch.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/github_org.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/github_workflows.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/gitlab.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/google_playstore.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/gowitness.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/host_header.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/httpx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/hunt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/hunterio.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/iis_shortnames.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/internal/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/internal/aggregate.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/internal/base.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/internal/cloudcheck.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/internal/dnsresolve.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/internetdb.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/ip2location.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/ipneighbor.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/ipstack.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/jadx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/newsletters.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/ntlm.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/oauth.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/asset_inventory.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/base.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/csv.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/discord.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/emails.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/http.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/json.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/neo4j.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/python.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/slack.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/splunk.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/sqlite.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/stdout.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/subdomains.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/teams.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/txt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/web_report.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/output/websocket.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/paramminer_cookies.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/paramminer_getparams.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/paramminer_headers.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/pgp.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/portscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/postman.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/postman_download.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/report/affiliates.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/report/asn.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/report/base.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/robots.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/secretsdb.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/securitytxt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/sitedossier.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/skymem.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/smuggler.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/social.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/sslcert.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/subdomainradar.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/telerik.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/templates/bucket.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/templates/github.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/templates/postman.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/templates/shodan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/templates/sql.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/templates/webhook.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/trufflehog.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/url_manipulation.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/urlscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/viewdns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/wafw00f.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/wappalyzer.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/wayback.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/modules/wpscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/baddns-thorough.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/cloud-enum.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/code-enum.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/email-enum.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/kitchen-sink.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/subdomain-enum.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/web/dirbust-light.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/web/paramminer.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/web-basic.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/web-screenshots.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/presets/web-thorough.yml +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/dispatcher.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/preset/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/preset/conditions.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/preset/environ.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scanner/stats.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/scripts/docs.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/coverage.cfg +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/fastapi_test.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/owasp_mastg.apk +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/run_tests.sh +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test.conf +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_output.ndjson +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_bbot_fastapi.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_command.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_config.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_docs.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_engine.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_files.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_1/test_scope.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/base.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_extractous.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_jadx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_sqlite.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/testsslcert.pem +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/test/testsslkey.pem +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/wordlists/devops_mutations.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/wordlists/nameservers.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
- {bbot-2.2.0.5263rc0 → bbot-2.2.0.5309rc0}/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.2.0.
|
|
3
|
+
Version: 2.2.0.5309rc0
|
|
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)
|
|
@@ -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
|
|
|
@@ -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):
|
|
@@ -32,10 +32,11 @@ class speculate(BaseInternalModule):
|
|
|
32
32
|
"author": "@liquidsec",
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
options = {"max_hosts": 65536, "ports": "80,443"}
|
|
35
|
+
options = {"max_hosts": 65536, "ports": "80,443", "essential_only": False}
|
|
36
36
|
options_desc = {
|
|
37
37
|
"max_hosts": "Max number of IP_RANGE hosts to convert into IP_ADDRESS events",
|
|
38
38
|
"ports": "The set of ports to speculate on",
|
|
39
|
+
"essential_only": "Only enable essential speculate features (no extra discovery)",
|
|
39
40
|
}
|
|
40
41
|
scope_distance_modifier = 1
|
|
41
42
|
_priority = 4
|
|
@@ -52,6 +53,7 @@ class speculate(BaseInternalModule):
|
|
|
52
53
|
self.emit_open_ports = self.open_port_consumers and not self.portscanner_enabled
|
|
53
54
|
self.range_to_ip = True
|
|
54
55
|
self.dns_disable = self.scan.config.get("dns", {}).get("disable", False)
|
|
56
|
+
self.essential_only = self.config.get("essential_only", False)
|
|
55
57
|
self.org_stubs_seen = set()
|
|
56
58
|
|
|
57
59
|
port_string = self.config.get("ports", "80,443")
|
|
@@ -63,7 +65,7 @@ class speculate(BaseInternalModule):
|
|
|
63
65
|
if not self.portscanner_enabled:
|
|
64
66
|
self.info(f"No portscanner enabled. Assuming open ports: {', '.join(str(x) for x in self.ports)}")
|
|
65
67
|
|
|
66
|
-
target_len = len(self.scan.target)
|
|
68
|
+
target_len = len(self.scan.target.seeds)
|
|
67
69
|
if target_len > self.config.get("max_hosts", 65536):
|
|
68
70
|
if not self.portscanner_enabled:
|
|
69
71
|
self.hugewarning(
|
|
@@ -75,6 +77,14 @@ class speculate(BaseInternalModule):
|
|
|
75
77
|
return True
|
|
76
78
|
|
|
77
79
|
async def handle_event(self, event):
|
|
80
|
+
### BEGIN ESSENTIAL SPECULATION ###
|
|
81
|
+
# These features are required for smooth operation of bbot
|
|
82
|
+
# I.e. they are not "osinty" or intended to discover anything, they only compliment other modules
|
|
83
|
+
|
|
84
|
+
# we speculate on distance-1 stuff too, because distance-1 open ports are needed by certain modules like sslcert
|
|
85
|
+
event_in_scope_distance = event.scope_distance <= (self.scan.scope_search_distance + 1)
|
|
86
|
+
speculate_open_ports = self.emit_open_ports and event_in_scope_distance
|
|
87
|
+
|
|
78
88
|
# generate individual IP addresses from IP range
|
|
79
89
|
if event.type == "IP_RANGE" and self.range_to_ip:
|
|
80
90
|
net = ipaddress.ip_network(event.data)
|
|
@@ -89,6 +99,28 @@ class speculate(BaseInternalModule):
|
|
|
89
99
|
context=f"speculate converted range into individual IP_ADDRESS: {ip}",
|
|
90
100
|
)
|
|
91
101
|
|
|
102
|
+
# IP_ADDRESS / DNS_NAME --> OPEN_TCP_PORT
|
|
103
|
+
if speculate_open_ports:
|
|
104
|
+
# don't act on unresolved DNS_NAMEs
|
|
105
|
+
usable_dns = False
|
|
106
|
+
if event.type == "DNS_NAME":
|
|
107
|
+
if self.dns_disable or ("a-record" in event.tags or "aaaa-record" in event.tags):
|
|
108
|
+
usable_dns = True
|
|
109
|
+
|
|
110
|
+
if event.type == "IP_ADDRESS" or usable_dns:
|
|
111
|
+
for port in self.ports:
|
|
112
|
+
await self.emit_event(
|
|
113
|
+
self.helpers.make_netloc(event.data, port),
|
|
114
|
+
"OPEN_TCP_PORT",
|
|
115
|
+
parent=event,
|
|
116
|
+
internal=True,
|
|
117
|
+
context="speculated {event.type}: {event.data}",
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
### END ESSENTIAL SPECULATION ###
|
|
121
|
+
if self.essential_only:
|
|
122
|
+
return
|
|
123
|
+
|
|
92
124
|
# parent domains
|
|
93
125
|
if event.type.startswith("DNS_NAME"):
|
|
94
126
|
parent = self.helpers.parent_domain(event.host_original)
|
|
@@ -97,10 +129,6 @@ class speculate(BaseInternalModule):
|
|
|
97
129
|
parent, "DNS_NAME", parent=event, context=f"speculated parent {{event.type}}: {{event.data}}"
|
|
98
130
|
)
|
|
99
131
|
|
|
100
|
-
# we speculate on distance-1 stuff too, because distance-1 open ports are needed by certain modules like sslcert
|
|
101
|
-
event_in_scope_distance = event.scope_distance <= (self.scan.scope_search_distance + 1)
|
|
102
|
-
speculate_open_ports = self.emit_open_ports and event_in_scope_distance
|
|
103
|
-
|
|
104
132
|
# URL --> OPEN_TCP_PORT
|
|
105
133
|
event_is_url = event.type == "URL"
|
|
106
134
|
if event_is_url or (event.type == "URL_UNVERIFIED" and self.open_port_consumers):
|
|
@@ -144,24 +172,6 @@ class speculate(BaseInternalModule):
|
|
|
144
172
|
context="speculated {event.type}: {event.data}",
|
|
145
173
|
)
|
|
146
174
|
|
|
147
|
-
# IP_ADDRESS / DNS_NAME --> OPEN_TCP_PORT
|
|
148
|
-
if speculate_open_ports:
|
|
149
|
-
# don't act on unresolved DNS_NAMEs
|
|
150
|
-
usable_dns = False
|
|
151
|
-
if event.type == "DNS_NAME":
|
|
152
|
-
if self.dns_disable or ("a-record" in event.tags or "aaaa-record" in event.tags):
|
|
153
|
-
usable_dns = True
|
|
154
|
-
|
|
155
|
-
if event.type == "IP_ADDRESS" or usable_dns:
|
|
156
|
-
for port in self.ports:
|
|
157
|
-
await self.emit_event(
|
|
158
|
-
self.helpers.make_netloc(event.data, port),
|
|
159
|
-
"OPEN_TCP_PORT",
|
|
160
|
-
parent=event,
|
|
161
|
-
internal=True,
|
|
162
|
-
context="speculated {event.type}: {event.data}",
|
|
163
|
-
)
|
|
164
|
-
|
|
165
175
|
# ORG_STUB from TLD, SOCIAL, AZURE_TENANT
|
|
166
176
|
org_stubs = set()
|
|
167
177
|
if event.type == "DNS_NAME" and event.scope_distance == 0:
|