bbot 2.1.2.5156rc0__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.1.2.5156rc0 → bbot-2.3.0.5328rc0}/PKG-INFO +10 -4
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/README.md +5 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/__init__.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/cli.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/logger.py +6 -3
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/core.py +20 -3
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/engine.py +5 -5
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/base.py +69 -26
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/bloom.py +8 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/command.py +4 -3
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/installer.py +14 -5
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/helpers.py +2 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/helper.py +4 -3
- bbot-2.3.0.5328rc0/bbot/core/helpers/libmagic.py +68 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/misc.py +29 -5
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/process.py +0 -18
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/regexes.py +2 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/web.py +1 -1
- bbot-2.3.0.5328rc0/bbot/core/multiprocess.py +58 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/shared_deps.py +46 -3
- bbot-2.3.0.5328rc0/bbot/db/sql/models.py +148 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/defaults.yml +3 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/anubisdb.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/apkpure.py +15 -5
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns.py +2 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns_direct.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns_zone.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/badsecrets.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bevigil.py +2 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/binaryedge.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bufferoverrun.py +2 -3
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/builtwith.py +2 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/c99.py +4 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/censys.py +9 -13
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/certspotter.py +4 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/chaos.py +4 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/columbus.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/crt.py +4 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/dastardly.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/digitorus.py +1 -1
- bbot-2.3.0.5328rc0/bbot/modules/dnsbimi.py +145 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnscaa.py +3 -3
- bbot-2.1.2.5156rc0/bbot/modules/unstructured.py → bbot-2.3.0.5328rc0/bbot/modules/extractous.py +23 -49
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/fullhunt.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hackertarget.py +4 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/dnsresolve.py +12 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/excavate.py +2 -3
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/speculate.py +34 -24
- bbot-2.3.0.5328rc0/bbot/modules/jadx.py +87 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/leakix.py +6 -5
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/myssl.py +1 -1
- {bbot-2.1.2.5156rc0 → 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.3.0.5328rc0/bbot/modules/output/sqlite.py +29 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/passivetotal.py +13 -13
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/rapiddns.py +2 -7
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/securitytrails.py +4 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/shodan_dns.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/subdomaincenter.py +1 -1
- bbot-2.3.0.5328rc0/bbot/modules/templates/sql.py +90 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/subdomain_enum.py +3 -3
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/trickest.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/trufflehog.py +1 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/virustotal.py +2 -7
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/zoomeye.py +5 -3
- bbot-2.3.0.5328rc0/bbot/presets/fast.yml +16 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/spider.yml +4 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/manager.py +1 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/args.py +20 -4
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/path.py +3 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/preset.py +21 -12
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/scanner.py +12 -4
- bbot-2.3.0.5328rc0/bbot/scanner/target.py +345 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/bbot_fixtures.py +5 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/conftest.py +95 -84
- bbot-2.3.0.5328rc0/bbot/test/fastapi_test.py +17 -0
- bbot-2.3.0.5328rc0/bbot/test/test_step_1/test_bbot_fastapi.py +82 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_bloom_filter.py +2 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_cli.py +36 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_dns.py +38 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_events.py +89 -3
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_helpers.py +17 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -3
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_presets.py +51 -38
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_python_api.py +4 -0
- {bbot-2.1.2.5156rc0 → 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.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_web.py +3 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/base.py +6 -2
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +6 -4
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +4 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +2 -1
- bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +103 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -6
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +6 -6
- bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_extractous.py +54 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +1 -1
- bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_jadx.py +55 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +5 -1
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +3 -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.1.2.5156rc0 → bbot-2.3.0.5328rc0}/pyproject.toml +10 -7
- bbot-2.1.2.5156rc0/bbot/scanner/target.py +0 -543
- bbot-2.1.2.5156rc0/bbot/test/test_step_1/test_target.py +0 -309
- bbot-2.1.2.5156rc0/bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -102
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/LICENSE +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/files.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/helpers.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/flags.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/async_helpers.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/cache.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/diff.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/brute.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/dns.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/engine.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/mock.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/files.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/interactsh.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/names_generator.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/ntlm.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/ratelimiter.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/regex.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/url.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/validators.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/client.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/engine.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/wordcloud.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/modules.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/errors.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/logger.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ajaxpro.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/azure_realm.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/azure_tenant.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/base.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_amazon.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_azure.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_digitalocean.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_file_enum.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_firebase.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_google.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bypass403.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/code_repository.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/credshed.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/ffuf.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/nuclei.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/vhost.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dehashed.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsbrute.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnscommonsrv.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsdumpster.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/docker_pull.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dockerhub.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dotnetnuke.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/emailformat.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ffuf_shortnames.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/filedownload.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/fingerprintx.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/generic_ssrf.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/git.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/git_clone.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_codesearch.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_org.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_workflows.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/gitlab.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/google_playstore.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/gowitness.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/host_header.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/httpx.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hunt.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hunterio.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/iis_shortnames.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/aggregate.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/base.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/cloudcheck.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internetdb.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ip2location.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ipneighbor.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ipstack.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/newsletters.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ntlm.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/oauth.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/asset_inventory.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/base.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/csv.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/discord.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/emails.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/http.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/json.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/neo4j.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/python.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/slack.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/splunk.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/stdout.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/subdomains.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/teams.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/txt.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/web_report.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/websocket.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_cookies.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_getparams.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_headers.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/pgp.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/portscan.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/postman.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/postman_download.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/affiliates.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/asn.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/base.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/robots.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/secretsdb.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/securitytxt.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/sitedossier.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/skymem.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/smuggler.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/social.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/sslcert.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/subdomainradar.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/telerik.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/bucket.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/github.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/postman.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/shodan.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/webhook.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/url_manipulation.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/urlscan.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/viewdns.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wafw00f.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wappalyzer.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wayback.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wpscan.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/baddns-thorough.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/cloud-enum.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/code-enum.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/email-enum.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/kitchen-sink.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/subdomain-enum.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dirbust-light.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/paramminer.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-basic.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-screenshots.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-thorough.yml +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/dispatcher.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/conditions.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/environ.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/stats.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scripts/docs.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/coverage.cfg +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/owasp_mastg.apk +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/run_tests.sh +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test.conf +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_output.ndjson +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_command.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_config.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_docs.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_engine.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_files.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_scope.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/testsslcert.pem +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/testsslkey.pem +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/devops_mutations.txt +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/nameservers.txt +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
- {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
- {bbot-2.1.2.5156rc0 → 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)
|
|
@@ -30,11 +30,12 @@ Requires-Dist: lxml (>=4.9.2,<6.0.0)
|
|
|
30
30
|
Requires-Dist: mmh3 (>=4.1,<6.0)
|
|
31
31
|
Requires-Dist: omegaconf (>=2.3.0,<3.0.0)
|
|
32
32
|
Requires-Dist: psutil (>=5.9.4,<7.0.0)
|
|
33
|
+
Requires-Dist: puremagic (>=1.28,<2.0)
|
|
33
34
|
Requires-Dist: pycryptodome (>=3.17,<4.0)
|
|
34
35
|
Requires-Dist: pydantic (>=2.4.2,<3.0.0)
|
|
35
36
|
Requires-Dist: pyjwt (>=2.7.0,<3.0.0)
|
|
36
37
|
Requires-Dist: pyzmq (>=26.0.3,<27.0.0)
|
|
37
|
-
Requires-Dist: radixtarget (>=
|
|
38
|
+
Requires-Dist: radixtarget (>=2.0.0.50,<3.0.0.0)
|
|
38
39
|
Requires-Dist: regex (>=2024.4.16,<2025.0.0)
|
|
39
40
|
Requires-Dist: setproctitle (>=1.3.3,<2.0.0)
|
|
40
41
|
Requires-Dist: socksio (>=1.0.0,<2.0.0)
|
|
@@ -144,6 +145,10 @@ description: Recursive web spider
|
|
|
144
145
|
modules:
|
|
145
146
|
- httpx
|
|
146
147
|
|
|
148
|
+
blacklist:
|
|
149
|
+
# Prevent spider from invalidating sessions by logging out
|
|
150
|
+
- "RE:/.*(sign|log)[_-]?out"
|
|
151
|
+
|
|
147
152
|
config:
|
|
148
153
|
web:
|
|
149
154
|
# how many links to follow in a row
|
|
@@ -410,6 +415,7 @@ For details, see [Configuration](https://www.blacklanternsecurity.com/bbot/Stabl
|
|
|
410
415
|
- **Modules**
|
|
411
416
|
- [List of Modules](https://www.blacklanternsecurity.com/bbot/Stable/modules/list_of_modules)
|
|
412
417
|
- [Nuclei](https://www.blacklanternsecurity.com/bbot/Stable/modules/nuclei)
|
|
418
|
+
- [Custom YARA Rules](https://www.blacklanternsecurity.com/bbot/Stable/modules/custom_yara_rules)
|
|
413
419
|
- **Misc**
|
|
414
420
|
- [Contribution](https://www.blacklanternsecurity.com/bbot/Stable/contribution)
|
|
415
421
|
- [Release History](https://www.blacklanternsecurity.com/bbot/Stable/release_history)
|
|
@@ -91,6 +91,10 @@ description: Recursive web spider
|
|
|
91
91
|
modules:
|
|
92
92
|
- httpx
|
|
93
93
|
|
|
94
|
+
blacklist:
|
|
95
|
+
# Prevent spider from invalidating sessions by logging out
|
|
96
|
+
- "RE:/.*(sign|log)[_-]?out"
|
|
97
|
+
|
|
94
98
|
config:
|
|
95
99
|
web:
|
|
96
100
|
# how many links to follow in a row
|
|
@@ -357,6 +361,7 @@ For details, see [Configuration](https://www.blacklanternsecurity.com/bbot/Stabl
|
|
|
357
361
|
- **Modules**
|
|
358
362
|
- [List of Modules](https://www.blacklanternsecurity.com/bbot/Stable/modules/list_of_modules)
|
|
359
363
|
- [Nuclei](https://www.blacklanternsecurity.com/bbot/Stable/modules/nuclei)
|
|
364
|
+
- [Custom YARA Rules](https://www.blacklanternsecurity.com/bbot/Stable/modules/custom_yara_rules)
|
|
360
365
|
- **Misc**
|
|
361
366
|
- [Contribution](https://www.blacklanternsecurity.com/bbot/Stable/contribution)
|
|
362
367
|
- [Release History](https://www.blacklanternsecurity.com/bbot/Stable/release_history)
|
|
@@ -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:
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import sys
|
|
2
3
|
import atexit
|
|
3
4
|
import logging
|
|
@@ -9,6 +10,7 @@ from contextlib import suppress
|
|
|
9
10
|
|
|
10
11
|
from ..helpers.misc import mkdir, error_and_exit
|
|
11
12
|
from ...logger import colorize, loglevel_mapping
|
|
13
|
+
from ..multiprocess import SHARED_INTERPRETER_STATE
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
debug_format = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s %(filename)s:%(lineno)s %(message)s")
|
|
@@ -65,8 +67,9 @@ class BBOTLogger:
|
|
|
65
67
|
|
|
66
68
|
self.listener = None
|
|
67
69
|
|
|
68
|
-
|
|
69
|
-
if
|
|
70
|
+
# if we haven't set up logging yet, do it now
|
|
71
|
+
if not "_BBOT_LOGGING_SETUP" in os.environ:
|
|
72
|
+
os.environ["_BBOT_LOGGING_SETUP"] = "1"
|
|
70
73
|
self.queue = multiprocessing.Queue()
|
|
71
74
|
self.setup_queue_handler()
|
|
72
75
|
# Start the QueueListener
|
|
@@ -113,7 +116,7 @@ class BBOTLogger:
|
|
|
113
116
|
|
|
114
117
|
self.core_logger.setLevel(log_level)
|
|
115
118
|
# disable asyncio logging for child processes
|
|
116
|
-
if
|
|
119
|
+
if not SHARED_INTERPRETER_STATE.is_main_process:
|
|
117
120
|
logging.getLogger("asyncio").setLevel(logging.ERROR)
|
|
118
121
|
|
|
119
122
|
def addLoggingLevel(self, levelName, levelNum, methodName=None):
|
|
@@ -6,6 +6,7 @@ from contextlib import suppress
|
|
|
6
6
|
from omegaconf import OmegaConf
|
|
7
7
|
|
|
8
8
|
from bbot.errors import BBOTError
|
|
9
|
+
from .multiprocess import SHARED_INTERPRETER_STATE
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
DEFAULT_CONFIG = None
|
|
@@ -41,9 +42,23 @@ class BBOTCore:
|
|
|
41
42
|
self.logger
|
|
42
43
|
self.log = logging.getLogger("bbot.core")
|
|
43
44
|
|
|
45
|
+
self._prep_multiprocessing()
|
|
46
|
+
|
|
47
|
+
def _prep_multiprocessing(self):
|
|
44
48
|
import multiprocessing
|
|
49
|
+
from .helpers.process import BBOTProcess
|
|
50
|
+
|
|
51
|
+
if SHARED_INTERPRETER_STATE.is_main_process:
|
|
52
|
+
# if this is the main bbot process, set the logger and queue for the first time
|
|
53
|
+
from functools import partialmethod
|
|
45
54
|
|
|
46
|
-
|
|
55
|
+
BBOTProcess.__init__ = partialmethod(
|
|
56
|
+
BBOTProcess.__init__, log_level=self.logger.log_level, log_queue=self.logger.queue
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# this makes our process class the default for process pools, etc.
|
|
60
|
+
mp_context = multiprocessing.get_context("spawn")
|
|
61
|
+
mp_context.Process = BBOTProcess
|
|
47
62
|
|
|
48
63
|
@property
|
|
49
64
|
def home(self):
|
|
@@ -187,12 +202,14 @@ class BBOTCore:
|
|
|
187
202
|
if os.environ.get("BBOT_TESTING", "") == "True":
|
|
188
203
|
process = self.create_thread(*args, **kwargs)
|
|
189
204
|
else:
|
|
190
|
-
if
|
|
205
|
+
if SHARED_INTERPRETER_STATE.is_scan_process:
|
|
191
206
|
from .helpers.process import BBOTProcess
|
|
192
207
|
|
|
193
208
|
process = BBOTProcess(*args, **kwargs)
|
|
194
209
|
else:
|
|
195
|
-
|
|
210
|
+
import multiprocessing
|
|
211
|
+
|
|
212
|
+
raise BBOTError(f"Tried to start server from process {multiprocessing.current_process().name}")
|
|
196
213
|
process.daemon = True
|
|
197
214
|
return process
|
|
198
215
|
|
|
@@ -10,6 +10,7 @@ import traceback
|
|
|
10
10
|
import contextlib
|
|
11
11
|
import contextvars
|
|
12
12
|
import zmq.asyncio
|
|
13
|
+
import multiprocessing
|
|
13
14
|
from pathlib import Path
|
|
14
15
|
from concurrent.futures import CancelledError
|
|
15
16
|
from contextlib import asynccontextmanager, suppress
|
|
@@ -17,6 +18,7 @@ from contextlib import asynccontextmanager, suppress
|
|
|
17
18
|
from bbot.core import CORE
|
|
18
19
|
from bbot.errors import BBOTEngineError
|
|
19
20
|
from bbot.core.helpers.async_helpers import get_event_loop
|
|
21
|
+
from bbot.core.multiprocess import SHARED_INTERPRETER_STATE
|
|
20
22
|
from bbot.core.helpers.misc import rand_string, in_exception_chain
|
|
21
23
|
|
|
22
24
|
|
|
@@ -264,10 +266,8 @@ class EngineClient(EngineBase):
|
|
|
264
266
|
return [s for s in self.CMDS if isinstance(s, str)]
|
|
265
267
|
|
|
266
268
|
def start_server(self):
|
|
267
|
-
import multiprocessing
|
|
268
|
-
|
|
269
269
|
process_name = multiprocessing.current_process().name
|
|
270
|
-
if
|
|
270
|
+
if SHARED_INTERPRETER_STATE.is_scan_process:
|
|
271
271
|
kwargs = dict(self.server_kwargs)
|
|
272
272
|
# if we're in tests, we use a single event loop to avoid weird race conditions
|
|
273
273
|
# this allows us to more easily mock http, etc.
|
|
@@ -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
|
|
@@ -503,12 +518,13 @@ class BaseEvent:
|
|
|
503
518
|
for t in list(self.tags):
|
|
504
519
|
if t.startswith("distance-"):
|
|
505
520
|
self.remove_tag(t)
|
|
506
|
-
if
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
521
|
+
if self.host:
|
|
522
|
+
if scope_distance == 0:
|
|
523
|
+
self.add_tag("in-scope")
|
|
524
|
+
self.remove_tag("affiliate")
|
|
525
|
+
else:
|
|
526
|
+
self.remove_tag("in-scope")
|
|
527
|
+
self.add_tag(f"distance-{new_scope_distance}")
|
|
512
528
|
self._scope_distance = new_scope_distance
|
|
513
529
|
# apply recursively to parent events
|
|
514
530
|
parent_scope_distance = getattr(self.parent, "scope_distance", None)
|
|
@@ -1002,13 +1018,15 @@ class ClosestHostEvent(DictHostEvent):
|
|
|
1002
1018
|
if parent_url is not None:
|
|
1003
1019
|
self.data["url"] = parent_url.geturl()
|
|
1004
1020
|
# inherit closest path
|
|
1005
|
-
if not "path" in self.data and isinstance(parent.data, dict):
|
|
1021
|
+
if not "path" in self.data and isinstance(parent.data, dict) and not parent.type == "HTTP_RESPONSE":
|
|
1006
1022
|
parent_path = parent.data.get("path", None)
|
|
1007
1023
|
if parent_path is not None:
|
|
1008
1024
|
self.data["path"] = parent_path
|
|
1009
1025
|
# inherit closest host
|
|
1010
1026
|
if parent.host:
|
|
1011
1027
|
self.data["host"] = str(parent.host)
|
|
1028
|
+
# we do this to refresh the hash
|
|
1029
|
+
self.data = self.data
|
|
1012
1030
|
break
|
|
1013
1031
|
# die if we still haven't found a host
|
|
1014
1032
|
if not self.host:
|
|
@@ -1018,20 +1036,21 @@ class ClosestHostEvent(DictHostEvent):
|
|
|
1018
1036
|
class DictPathEvent(DictEvent):
|
|
1019
1037
|
def sanitize_data(self, data):
|
|
1020
1038
|
new_data = dict(data)
|
|
1039
|
+
new_data["path"] = str(new_data["path"])
|
|
1021
1040
|
file_blobs = getattr(self.scan, "_file_blobs", False)
|
|
1022
1041
|
folder_blobs = getattr(self.scan, "_folder_blobs", False)
|
|
1023
1042
|
blob = None
|
|
1024
1043
|
try:
|
|
1025
|
-
|
|
1026
|
-
if
|
|
1044
|
+
self._data_path = Path(data["path"])
|
|
1045
|
+
if self._data_path.is_file():
|
|
1027
1046
|
self.add_tag("file")
|
|
1028
1047
|
if file_blobs:
|
|
1029
|
-
with open(
|
|
1048
|
+
with open(self._data_path, "rb") as file:
|
|
1030
1049
|
blob = file.read()
|
|
1031
|
-
elif
|
|
1050
|
+
elif self._data_path.is_dir():
|
|
1032
1051
|
self.add_tag("folder")
|
|
1033
1052
|
if folder_blobs:
|
|
1034
|
-
blob = self._tar_directory(
|
|
1053
|
+
blob = self._tar_directory(self._data_path)
|
|
1035
1054
|
except KeyError:
|
|
1036
1055
|
pass
|
|
1037
1056
|
if blob:
|
|
@@ -1110,8 +1129,7 @@ class DnsEvent(BaseEvent):
|
|
|
1110
1129
|
class IP_RANGE(DnsEvent):
|
|
1111
1130
|
def __init__(self, *args, **kwargs):
|
|
1112
1131
|
super().__init__(*args, **kwargs)
|
|
1113
|
-
|
|
1114
|
-
self.add_tag(f"ipv{net.version}")
|
|
1132
|
+
self.add_tag(f"ipv{self.host.version}")
|
|
1115
1133
|
|
|
1116
1134
|
def sanitize_data(self, data):
|
|
1117
1135
|
return str(ipaddress.ip_network(str(data), strict=False))
|
|
@@ -1540,7 +1558,25 @@ class WAF(DictHostEvent):
|
|
|
1540
1558
|
|
|
1541
1559
|
|
|
1542
1560
|
class FILESYSTEM(DictPathEvent):
|
|
1543
|
-
|
|
1561
|
+
def __init__(self, *args, **kwargs):
|
|
1562
|
+
super().__init__(*args, **kwargs)
|
|
1563
|
+
if self._data_path.is_file():
|
|
1564
|
+
# detect type of file content using magic
|
|
1565
|
+
from bbot.core.helpers.libmagic import get_magic_info, get_compression
|
|
1566
|
+
|
|
1567
|
+
extension, mime_type, description, confidence = get_magic_info(self.data["path"])
|
|
1568
|
+
self.data["magic_extension"] = extension
|
|
1569
|
+
self.data["magic_mime_type"] = mime_type
|
|
1570
|
+
self.data["magic_description"] = description
|
|
1571
|
+
self.data["magic_confidence"] = confidence
|
|
1572
|
+
# detection compression
|
|
1573
|
+
compression = get_compression(mime_type)
|
|
1574
|
+
if compression:
|
|
1575
|
+
self.add_tag("compressed")
|
|
1576
|
+
self.add_tag(f"{compression}-archive")
|
|
1577
|
+
self.data["compression"] = compression
|
|
1578
|
+
# refresh hash
|
|
1579
|
+
self.data = self.data
|
|
1544
1580
|
|
|
1545
1581
|
|
|
1546
1582
|
class RAW_DNS_RECORD(DictHostEvent, DnsEvent):
|
|
@@ -1621,23 +1657,23 @@ def make_event(
|
|
|
1621
1657
|
tags = set(tags)
|
|
1622
1658
|
|
|
1623
1659
|
if is_event(data):
|
|
1624
|
-
|
|
1625
|
-
if scan is not None and not
|
|
1626
|
-
|
|
1627
|
-
if scans is not None and not
|
|
1628
|
-
|
|
1660
|
+
event = copy(data)
|
|
1661
|
+
if scan is not None and not event.scan:
|
|
1662
|
+
event.scan = scan
|
|
1663
|
+
if scans is not None and not event.scans:
|
|
1664
|
+
event.scans = scans
|
|
1629
1665
|
if module is not None:
|
|
1630
|
-
|
|
1666
|
+
event.module = module
|
|
1631
1667
|
if parent is not None:
|
|
1632
|
-
|
|
1668
|
+
event.parent = parent
|
|
1633
1669
|
if context is not None:
|
|
1634
|
-
|
|
1670
|
+
event.discovery_context = context
|
|
1635
1671
|
if internal == True:
|
|
1636
|
-
|
|
1672
|
+
event.internal = True
|
|
1637
1673
|
if tags:
|
|
1638
|
-
|
|
1674
|
+
event.tags = tags.union(event.tags)
|
|
1639
1675
|
event_type = data.type
|
|
1640
|
-
return
|
|
1676
|
+
return event
|
|
1641
1677
|
else:
|
|
1642
1678
|
if event_type is None:
|
|
1643
1679
|
event_type, data = get_event_type(data)
|
|
@@ -1667,6 +1703,13 @@ def make_event(
|
|
|
1667
1703
|
if event_type == "USERNAME" and validators.soft_validate(data, "email"):
|
|
1668
1704
|
event_type = "EMAIL_ADDRESS"
|
|
1669
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
|
|
1670
1713
|
|
|
1671
1714
|
event_class = globals().get(event_type, DefaultEvent)
|
|
1672
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)
|
|
@@ -210,9 +210,10 @@ async def _write_proc_line(proc, chunk):
|
|
|
210
210
|
return True
|
|
211
211
|
except Exception as e:
|
|
212
212
|
proc_args = [str(s) for s in getattr(proc, "args", [])]
|
|
213
|
-
command = " ".join(proc_args)
|
|
214
|
-
|
|
215
|
-
|
|
213
|
+
command = " ".join(proc_args).strip()
|
|
214
|
+
if command:
|
|
215
|
+
log.warning(f"Error writing line to stdin for command: {command}: {e}")
|
|
216
|
+
log.trace(traceback.format_exc())
|
|
216
217
|
return False
|
|
217
218
|
|
|
218
219
|
|
|
@@ -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
|
|
|
@@ -44,6 +44,11 @@ class DepsInstaller:
|
|
|
44
44
|
self.parent_helper.mkdir(self.command_status)
|
|
45
45
|
self.setup_status = self.read_setup_status()
|
|
46
46
|
|
|
47
|
+
# make sure we're using a minimal git config
|
|
48
|
+
self.minimal_git_config = self.data_dir / "minimal_git.config"
|
|
49
|
+
self.minimal_git_config.touch()
|
|
50
|
+
os.environ["GIT_CONFIG_GLOBAL"] = str(self.minimal_git_config)
|
|
51
|
+
|
|
47
52
|
self.deps_behavior = self.parent_helper.config.get("deps_behavior", "abort_on_failure").lower()
|
|
48
53
|
self.ansible_debug = self.core.logger.log_level <= logging.DEBUG
|
|
49
54
|
self.venv = ""
|
|
@@ -171,10 +176,13 @@ class DepsInstaller:
|
|
|
171
176
|
|
|
172
177
|
command = [sys.executable, "-m", "pip", "install", "--upgrade"] + packages
|
|
173
178
|
|
|
174
|
-
if constraints
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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)
|
|
178
186
|
|
|
179
187
|
process = None
|
|
180
188
|
try:
|
|
@@ -350,6 +358,7 @@ class DepsInstaller:
|
|
|
350
358
|
"make": "make",
|
|
351
359
|
"gcc": "gcc",
|
|
352
360
|
"bash": "bash",
|
|
361
|
+
"which": "which",
|
|
353
362
|
}
|
|
354
363
|
for command, package_name in core_deps.items():
|
|
355
364
|
if not self.parent_helper.which(command):
|
|
@@ -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):
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import puremagic
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def get_magic_info(file):
|
|
5
|
+
|
|
6
|
+
magic_detections = puremagic.magic_file(file)
|
|
7
|
+
if magic_detections:
|
|
8
|
+
magic_detections.sort(key=lambda x: x.confidence, reverse=True)
|
|
9
|
+
detection = magic_detections[0]
|
|
10
|
+
return detection.extension, detection.mime_type, detection.name, detection.confidence
|
|
11
|
+
return "", "", "", 0
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_compression(mime_type):
|
|
15
|
+
mime_type = mime_type.lower()
|
|
16
|
+
# from https://github.com/cdgriffith/puremagic/blob/master/puremagic/magic_data.json
|
|
17
|
+
compression_map = {
|
|
18
|
+
"application/gzip": "gzip", # Gzip compressed file
|
|
19
|
+
"application/zip": "zip", # Zip archive
|
|
20
|
+
"application/x-bzip2": "bzip2", # Bzip2 compressed file
|
|
21
|
+
"application/x-xz": "xz", # XZ compressed file
|
|
22
|
+
"application/x-7z-compressed": "7z", # 7-Zip archive
|
|
23
|
+
"application/vnd.rar": "rar", # RAR archive
|
|
24
|
+
"application/x-lzma": "lzma", # LZMA compressed file
|
|
25
|
+
"application/x-compress": "compress", # Unix compress file
|
|
26
|
+
"application/zstd": "zstd", # Zstandard compressed file
|
|
27
|
+
"application/x-lz4": "lz4", # LZ4 compressed file
|
|
28
|
+
"application/x-tar": "tar", # Tar archive
|
|
29
|
+
"application/x-zip-compressed-fb2": "zip", # Zip archive (FB2)
|
|
30
|
+
"application/epub+zip": "zip", # EPUB book (Zip archive)
|
|
31
|
+
"application/pak": "pak", # PAK archive
|
|
32
|
+
"application/x-lha": "lha", # LHA archive
|
|
33
|
+
"application/arj": "arj", # ARJ archive
|
|
34
|
+
"application/vnd.ms-cab-compressed": "cab", # Microsoft Cabinet archive
|
|
35
|
+
"application/x-sit": "sit", # StuffIt archive
|
|
36
|
+
"application/binhex": "binhex", # BinHex encoded file
|
|
37
|
+
"application/x-lrzip": "lrzip", # Long Range ZIP
|
|
38
|
+
"application/x-alz": "alz", # ALZip archive
|
|
39
|
+
"application/x-tgz": "tgz", # Gzip compressed Tar archive
|
|
40
|
+
"application/x-gzip": "gzip", # Gzip compressed file
|
|
41
|
+
"application/x-lzip": "lzip", # Lzip compressed file
|
|
42
|
+
"application/x-zstd-compressed-tar": "zstd", # Zstandard compressed Tar archive
|
|
43
|
+
"application/x-lz4-compressed-tar": "lz4", # LZ4 compressed Tar archive
|
|
44
|
+
"application/vnd.comicbook+zip": "zip", # Comic book archive (Zip)
|
|
45
|
+
"application/vnd.palm": "palm", # Palm OS data
|
|
46
|
+
"application/fictionbook2+zip": "zip", # FictionBook 2.0 (Zip)
|
|
47
|
+
"application/fictionbook3+zip": "zip", # FictionBook 3.0 (Zip)
|
|
48
|
+
"application/x-cpio": "cpio", # CPIO archive
|
|
49
|
+
"application/x-java-pack200": "pack200", # Java Pack200 archive
|
|
50
|
+
"application/x-par2": "par2", # PAR2 recovery file
|
|
51
|
+
"application/x-rar-compressed": "rar", # RAR archive
|
|
52
|
+
"application/java-archive": "zip", # Java Archive (JAR)
|
|
53
|
+
"application/x-webarchive": "zip", # Web archive (Zip)
|
|
54
|
+
"application/vnd.android.package-archive": "zip", # Android package (APK)
|
|
55
|
+
"application/x-itunes-ipa": "zip", # iOS application archive (IPA)
|
|
56
|
+
"application/x-stuffit": "sit", # StuffIt archive
|
|
57
|
+
"application/x-archive": "ar", # Unix archive
|
|
58
|
+
"application/x-qpress": "qpress", # Qpress archive
|
|
59
|
+
"application/x-xar": "xar", # XAR archive
|
|
60
|
+
"application/x-ace": "ace", # ACE archive
|
|
61
|
+
"application/x-zoo": "zoo", # Zoo archive
|
|
62
|
+
"application/x-arc": "arc", # ARC archive
|
|
63
|
+
"application/x-zstd-compressed-tar": "zstd", # Zstandard compressed Tar archive
|
|
64
|
+
"application/x-lz4-compressed-tar": "lz4", # LZ4 compressed Tar archive
|
|
65
|
+
"application/vnd.comicbook-rar": "rar", # Comic book archive (RAR)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return compression_map.get(mime_type, "")
|
|
@@ -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]
|