bbot 2.1.0.5028rc0__tar.gz → 2.2.0.5263rc0__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.0.5028rc0 → bbot-2.2.0.5263rc0}/PKG-INFO +12 -9
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/README.md +9 -7
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/__init__.py +1 -1
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/config/logger.py +34 -4
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/core.py +20 -3
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/engine.py +3 -3
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/event/base.py +46 -24
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/command.py +4 -3
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/depsinstaller/installer.py +16 -2
- bbot-2.2.0.5263rc0/bbot/core/helpers/libmagic.py +68 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/process.py +0 -18
- bbot-2.2.0.5263rc0/bbot/core/multiprocess.py +58 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/shared_deps.py +46 -3
- bbot-2.2.0.5263rc0/bbot/db/sql/models.py +147 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/apkpure.py +15 -5
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/baddns.py +1 -1
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/baddns_direct.py +1 -1
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/baddns_zone.py +1 -1
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/badsecrets.py +1 -1
- bbot-2.2.0.5263rc0/bbot/modules/bufferoverrun.py +48 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/censys.py +9 -13
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/deadly/dastardly.py +1 -1
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/deadly/nuclei.py +1 -1
- bbot-2.2.0.5263rc0/bbot/modules/dnsbimi.py +145 -0
- bbot-2.1.0.5028rc0/bbot/modules/unstructured.py → bbot-2.2.0.5263rc0/bbot/modules/extractous.py +23 -49
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/gowitness.py +42 -44
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/dnsresolve.py +12 -1
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/speculate.py +2 -23
- bbot-2.2.0.5263rc0/bbot/modules/jadx.py +87 -0
- bbot-2.2.0.5263rc0/bbot/modules/output/sqlite.py +29 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/passivetotal.py +9 -11
- bbot-2.2.0.5263rc0/bbot/modules/templates/sql.py +89 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/trufflehog.py +1 -1
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/wpscan.py +8 -2
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/preset.py +3 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/scanner.py +5 -2
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/conftest.py +37 -17
- bbot-2.2.0.5263rc0/bbot/test/fastapi_test.py +17 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/run_tests.sh +1 -1
- bbot-2.2.0.5263rc0/bbot/test/test_step_1/test_bbot_fastapi.py +82 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_dns.py +36 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_events.py +73 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/base.py +4 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +6 -4
- bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +35 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +4 -1
- bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +103 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +6 -6
- bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_extractous.py +54 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +1 -1
- bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_jadx.py +55 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +3 -1
- bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_sqlite.py +18 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/pyproject.toml +9 -6
- bbot-2.1.0.5028rc0/bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -102
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/LICENSE +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/cli.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/config/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/config/files.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/event/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/event/helpers.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/flags.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/async_helpers.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/bloom.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/cache.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/diff.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/brute.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/dns.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/engine.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/helpers.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/mock.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/files.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/helper.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/interactsh.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/misc.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/names_generator.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/ntlm.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/ratelimiter.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/regex.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/regexes.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/url.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/validators.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/web/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/web/client.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/web/engine.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/web/web.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/wordcloud.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/modules.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/defaults.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/errors.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/logger.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ajaxpro.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/anubisdb.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/azure_realm.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/azure_tenant.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/base.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bevigil.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/binaryedge.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_amazon.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_azure.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_digitalocean.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_file_enum.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_firebase.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_google.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/builtwith.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bypass403.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/c99.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/certspotter.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/chaos.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/code_repository.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/columbus.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/credshed.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/crt.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/deadly/ffuf.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/deadly/vhost.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dehashed.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/digitorus.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dnsbrute.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dnscaa.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dnscommonsrv.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dnsdumpster.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/docker_pull.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dockerhub.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dotnetnuke.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/emailformat.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ffuf_shortnames.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/filedownload.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/fingerprintx.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/fullhunt.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/generic_ssrf.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/git.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/git_clone.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/github_codesearch.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/github_org.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/github_workflows.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/gitlab.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/google_playstore.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/hackertarget.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/host_header.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/httpx.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/hunt.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/hunterio.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/iis_shortnames.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/aggregate.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/base.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/cloudcheck.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/excavate.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internetdb.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ip2location.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ipneighbor.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ipstack.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/leakix.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/myssl.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/newsletters.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ntlm.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/oauth.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/otx.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/asset_inventory.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/base.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/csv.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/discord.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/emails.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/http.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/json.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/neo4j.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/python.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/slack.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/splunk.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/stdout.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/subdomains.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/teams.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/txt.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/web_report.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/websocket.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/paramminer_cookies.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/paramminer_getparams.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/paramminer_headers.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/pgp.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/portscan.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/postman.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/postman_download.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/rapiddns.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/report/affiliates.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/report/asn.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/report/base.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/robots.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/secretsdb.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/securitytrails.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/securitytxt.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/shodan_dns.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/sitedossier.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/skymem.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/smuggler.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/social.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/sslcert.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/subdomaincenter.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/subdomainradar.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/telerik.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/bucket.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/github.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/postman.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/shodan.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/webhook.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/trickest.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/url_manipulation.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/urlscan.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/viewdns.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/virustotal.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/wafw00f.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/wappalyzer.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/wayback.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/zoomeye.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/baddns-thorough.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/cloud-enum.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/code-enum.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/email-enum.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/kitchen-sink.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/spider.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/subdomain-enum.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web/dirbust-light.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web/paramminer.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web-basic.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web-screenshots.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web-thorough.yml +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/dispatcher.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/manager.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/args.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/conditions.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/environ.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/path.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/stats.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/target.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scripts/docs.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/bbot_fixtures.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/coverage.cfg +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/owasp_mastg.apk +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test.conf +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_output.ndjson +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_cli.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_command.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_config.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_docs.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_engine.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_files.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_presets.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_scan.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_scope.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_target.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_web.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/testsslcert.pem +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/testsslkey.pem +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/devops_mutations.txt +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/nameservers.txt +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
- {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: bbot
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0.5263rc0
|
|
4
4
|
Summary: OSINT automation for hackers.
|
|
5
5
|
Home-page: https://github.com/blacklanternsecurity/bbot
|
|
6
6
|
License: GPL-3.0
|
|
@@ -29,7 +29,8 @@ Requires-Dist: jinja2 (>=3.1.3,<4.0.0)
|
|
|
29
29
|
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
|
-
Requires-Dist: psutil (>=5.9.4,<
|
|
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)
|
|
@@ -108,13 +109,13 @@ config:
|
|
|
108
109
|
threads: 25
|
|
109
110
|
brute_threads: 1000
|
|
110
111
|
# put your API keys here
|
|
111
|
-
modules:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
112
|
+
# modules:
|
|
113
|
+
# github:
|
|
114
|
+
# api_key: ""
|
|
115
|
+
# chaos:
|
|
116
|
+
# api_key: ""
|
|
117
|
+
# securitytrails:
|
|
118
|
+
# api_key: ""
|
|
118
119
|
|
|
119
120
|
```
|
|
120
121
|
|
|
@@ -268,6 +269,7 @@ include:
|
|
|
268
269
|
- paramminer
|
|
269
270
|
- dirbust-light
|
|
270
271
|
- web-screenshots
|
|
272
|
+
- baddns-thorough
|
|
271
273
|
|
|
272
274
|
config:
|
|
273
275
|
modules:
|
|
@@ -409,6 +411,7 @@ For details, see [Configuration](https://www.blacklanternsecurity.com/bbot/Stabl
|
|
|
409
411
|
- **Modules**
|
|
410
412
|
- [List of Modules](https://www.blacklanternsecurity.com/bbot/Stable/modules/list_of_modules)
|
|
411
413
|
- [Nuclei](https://www.blacklanternsecurity.com/bbot/Stable/modules/nuclei)
|
|
414
|
+
- [Custom YARA Rules](https://www.blacklanternsecurity.com/bbot/Stable/modules/custom_yara_rules)
|
|
412
415
|
- **Misc**
|
|
413
416
|
- [Contribution](https://www.blacklanternsecurity.com/bbot/Stable/contribution)
|
|
414
417
|
- [Release History](https://www.blacklanternsecurity.com/bbot/Stable/release_history)
|
|
@@ -55,13 +55,13 @@ config:
|
|
|
55
55
|
threads: 25
|
|
56
56
|
brute_threads: 1000
|
|
57
57
|
# put your API keys here
|
|
58
|
-
modules:
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
58
|
+
# modules:
|
|
59
|
+
# github:
|
|
60
|
+
# api_key: ""
|
|
61
|
+
# chaos:
|
|
62
|
+
# api_key: ""
|
|
63
|
+
# securitytrails:
|
|
64
|
+
# api_key: ""
|
|
65
65
|
|
|
66
66
|
```
|
|
67
67
|
|
|
@@ -215,6 +215,7 @@ include:
|
|
|
215
215
|
- paramminer
|
|
216
216
|
- dirbust-light
|
|
217
217
|
- web-screenshots
|
|
218
|
+
- baddns-thorough
|
|
218
219
|
|
|
219
220
|
config:
|
|
220
221
|
modules:
|
|
@@ -356,6 +357,7 @@ For details, see [Configuration](https://www.blacklanternsecurity.com/bbot/Stabl
|
|
|
356
357
|
- **Modules**
|
|
357
358
|
- [List of Modules](https://www.blacklanternsecurity.com/bbot/Stable/modules/list_of_modules)
|
|
358
359
|
- [Nuclei](https://www.blacklanternsecurity.com/bbot/Stable/modules/nuclei)
|
|
360
|
+
- [Custom YARA Rules](https://www.blacklanternsecurity.com/bbot/Stable/modules/custom_yara_rules)
|
|
359
361
|
- **Misc**
|
|
360
362
|
- [Contribution](https://www.blacklanternsecurity.com/bbot/Stable/contribution)
|
|
361
363
|
- [Release History](https://www.blacklanternsecurity.com/bbot/Stable/release_history)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import sys
|
|
2
3
|
import atexit
|
|
3
4
|
import logging
|
|
@@ -5,9 +6,11 @@ from copy import copy
|
|
|
5
6
|
import multiprocessing
|
|
6
7
|
import logging.handlers
|
|
7
8
|
from pathlib import Path
|
|
9
|
+
from contextlib import suppress
|
|
8
10
|
|
|
9
11
|
from ..helpers.misc import mkdir, error_and_exit
|
|
10
12
|
from ...logger import colorize, loglevel_mapping
|
|
13
|
+
from ..multiprocess import SHARED_INTERPRETER_STATE
|
|
11
14
|
|
|
12
15
|
|
|
13
16
|
debug_format = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s %(filename)s:%(lineno)s %(message)s")
|
|
@@ -64,17 +67,44 @@ class BBOTLogger:
|
|
|
64
67
|
|
|
65
68
|
self.listener = None
|
|
66
69
|
|
|
67
|
-
|
|
68
|
-
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"
|
|
69
73
|
self.queue = multiprocessing.Queue()
|
|
70
74
|
self.setup_queue_handler()
|
|
71
75
|
# Start the QueueListener
|
|
72
76
|
self.listener = logging.handlers.QueueListener(self.queue, *self.log_handlers.values())
|
|
73
77
|
self.listener.start()
|
|
74
|
-
atexit.register(self.
|
|
78
|
+
atexit.register(self.cleanup_logging)
|
|
75
79
|
|
|
76
80
|
self.log_level = logging.INFO
|
|
77
81
|
|
|
82
|
+
def cleanup_logging(self):
|
|
83
|
+
# Close the queue handler
|
|
84
|
+
with suppress(Exception):
|
|
85
|
+
self.queue_handler.close()
|
|
86
|
+
|
|
87
|
+
# Clean root logger
|
|
88
|
+
root_logger = logging.getLogger()
|
|
89
|
+
for handler in list(root_logger.handlers):
|
|
90
|
+
with suppress(Exception):
|
|
91
|
+
root_logger.removeHandler(handler)
|
|
92
|
+
with suppress(Exception):
|
|
93
|
+
handler.close()
|
|
94
|
+
|
|
95
|
+
# Clean all other loggers
|
|
96
|
+
for logger in logging.Logger.manager.loggerDict.values():
|
|
97
|
+
if hasattr(logger, "handlers"): # Logger, not PlaceHolder
|
|
98
|
+
for handler in list(logger.handlers):
|
|
99
|
+
with suppress(Exception):
|
|
100
|
+
logger.removeHandler(handler)
|
|
101
|
+
with suppress(Exception):
|
|
102
|
+
handler.close()
|
|
103
|
+
|
|
104
|
+
# Stop queue listener
|
|
105
|
+
with suppress(Exception):
|
|
106
|
+
self.listener.stop()
|
|
107
|
+
|
|
78
108
|
def setup_queue_handler(self, logging_queue=None, log_level=logging.DEBUG):
|
|
79
109
|
if logging_queue is None:
|
|
80
110
|
logging_queue = self.queue
|
|
@@ -86,7 +116,7 @@ class BBOTLogger:
|
|
|
86
116
|
|
|
87
117
|
self.core_logger.setLevel(log_level)
|
|
88
118
|
# disable asyncio logging for child processes
|
|
89
|
-
if
|
|
119
|
+
if not SHARED_INTERPRETER_STATE.is_main_process:
|
|
90
120
|
logging.getLogger("asyncio").setLevel(logging.ERROR)
|
|
91
121
|
|
|
92
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.
|
|
@@ -503,12 +503,13 @@ class BaseEvent:
|
|
|
503
503
|
for t in list(self.tags):
|
|
504
504
|
if t.startswith("distance-"):
|
|
505
505
|
self.remove_tag(t)
|
|
506
|
-
if
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
506
|
+
if self.host:
|
|
507
|
+
if scope_distance == 0:
|
|
508
|
+
self.add_tag("in-scope")
|
|
509
|
+
self.remove_tag("affiliate")
|
|
510
|
+
else:
|
|
511
|
+
self.remove_tag("in-scope")
|
|
512
|
+
self.add_tag(f"distance-{new_scope_distance}")
|
|
512
513
|
self._scope_distance = new_scope_distance
|
|
513
514
|
# apply recursively to parent events
|
|
514
515
|
parent_scope_distance = getattr(self.parent, "scope_distance", None)
|
|
@@ -1002,13 +1003,15 @@ class ClosestHostEvent(DictHostEvent):
|
|
|
1002
1003
|
if parent_url is not None:
|
|
1003
1004
|
self.data["url"] = parent_url.geturl()
|
|
1004
1005
|
# inherit closest path
|
|
1005
|
-
if not "path" in self.data and isinstance(parent.data, dict):
|
|
1006
|
+
if not "path" in self.data and isinstance(parent.data, dict) and not parent.type == "HTTP_RESPONSE":
|
|
1006
1007
|
parent_path = parent.data.get("path", None)
|
|
1007
1008
|
if parent_path is not None:
|
|
1008
1009
|
self.data["path"] = parent_path
|
|
1009
1010
|
# inherit closest host
|
|
1010
1011
|
if parent.host:
|
|
1011
1012
|
self.data["host"] = str(parent.host)
|
|
1013
|
+
# we do this to refresh the hash
|
|
1014
|
+
self.data = self.data
|
|
1012
1015
|
break
|
|
1013
1016
|
# die if we still haven't found a host
|
|
1014
1017
|
if not self.host:
|
|
@@ -1018,20 +1021,21 @@ class ClosestHostEvent(DictHostEvent):
|
|
|
1018
1021
|
class DictPathEvent(DictEvent):
|
|
1019
1022
|
def sanitize_data(self, data):
|
|
1020
1023
|
new_data = dict(data)
|
|
1024
|
+
new_data["path"] = str(new_data["path"])
|
|
1021
1025
|
file_blobs = getattr(self.scan, "_file_blobs", False)
|
|
1022
1026
|
folder_blobs = getattr(self.scan, "_folder_blobs", False)
|
|
1023
1027
|
blob = None
|
|
1024
1028
|
try:
|
|
1025
|
-
|
|
1026
|
-
if
|
|
1029
|
+
self._data_path = Path(data["path"])
|
|
1030
|
+
if self._data_path.is_file():
|
|
1027
1031
|
self.add_tag("file")
|
|
1028
1032
|
if file_blobs:
|
|
1029
|
-
with open(
|
|
1033
|
+
with open(self._data_path, "rb") as file:
|
|
1030
1034
|
blob = file.read()
|
|
1031
|
-
elif
|
|
1035
|
+
elif self._data_path.is_dir():
|
|
1032
1036
|
self.add_tag("folder")
|
|
1033
1037
|
if folder_blobs:
|
|
1034
|
-
blob = self._tar_directory(
|
|
1038
|
+
blob = self._tar_directory(self._data_path)
|
|
1035
1039
|
except KeyError:
|
|
1036
1040
|
pass
|
|
1037
1041
|
if blob:
|
|
@@ -1540,7 +1544,25 @@ class WAF(DictHostEvent):
|
|
|
1540
1544
|
|
|
1541
1545
|
|
|
1542
1546
|
class FILESYSTEM(DictPathEvent):
|
|
1543
|
-
|
|
1547
|
+
def __init__(self, *args, **kwargs):
|
|
1548
|
+
super().__init__(*args, **kwargs)
|
|
1549
|
+
if self._data_path.is_file():
|
|
1550
|
+
# detect type of file content using magic
|
|
1551
|
+
from bbot.core.helpers.libmagic import get_magic_info, get_compression
|
|
1552
|
+
|
|
1553
|
+
extension, mime_type, description, confidence = get_magic_info(self.data["path"])
|
|
1554
|
+
self.data["magic_extension"] = extension
|
|
1555
|
+
self.data["magic_mime_type"] = mime_type
|
|
1556
|
+
self.data["magic_description"] = description
|
|
1557
|
+
self.data["magic_confidence"] = confidence
|
|
1558
|
+
# detection compression
|
|
1559
|
+
compression = get_compression(mime_type)
|
|
1560
|
+
if compression:
|
|
1561
|
+
self.add_tag("compressed")
|
|
1562
|
+
self.add_tag(f"{compression}-archive")
|
|
1563
|
+
self.data["compression"] = compression
|
|
1564
|
+
# refresh hash
|
|
1565
|
+
self.data = self.data
|
|
1544
1566
|
|
|
1545
1567
|
|
|
1546
1568
|
class RAW_DNS_RECORD(DictHostEvent, DnsEvent):
|
|
@@ -1621,23 +1643,23 @@ def make_event(
|
|
|
1621
1643
|
tags = set(tags)
|
|
1622
1644
|
|
|
1623
1645
|
if is_event(data):
|
|
1624
|
-
|
|
1625
|
-
if scan is not None and not
|
|
1626
|
-
|
|
1627
|
-
if scans is not None and not
|
|
1628
|
-
|
|
1646
|
+
event = copy(data)
|
|
1647
|
+
if scan is not None and not event.scan:
|
|
1648
|
+
event.scan = scan
|
|
1649
|
+
if scans is not None and not event.scans:
|
|
1650
|
+
event.scans = scans
|
|
1629
1651
|
if module is not None:
|
|
1630
|
-
|
|
1652
|
+
event.module = module
|
|
1631
1653
|
if parent is not None:
|
|
1632
|
-
|
|
1654
|
+
event.parent = parent
|
|
1633
1655
|
if context is not None:
|
|
1634
|
-
|
|
1656
|
+
event.discovery_context = context
|
|
1635
1657
|
if internal == True:
|
|
1636
|
-
|
|
1658
|
+
event.internal = True
|
|
1637
1659
|
if tags:
|
|
1638
|
-
|
|
1660
|
+
event.tags = tags.union(event.tags)
|
|
1639
1661
|
event_type = data.type
|
|
1640
|
-
return
|
|
1662
|
+
return event
|
|
1641
1663
|
else:
|
|
1642
1664
|
if event_type is None:
|
|
1643
1665
|
event_type, data = get_event_type(data)
|
|
@@ -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
|
|
|
@@ -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 = ""
|
|
@@ -248,7 +253,7 @@ class DepsInstaller:
|
|
|
248
253
|
return success
|
|
249
254
|
|
|
250
255
|
def ansible_run(self, tasks=None, module=None, args=None, ansible_args=None):
|
|
251
|
-
_ansible_args = {"ansible_connection": "local"}
|
|
256
|
+
_ansible_args = {"ansible_connection": "local", "ansible_python_interpreter": sys.executable}
|
|
252
257
|
if ansible_args is not None:
|
|
253
258
|
_ansible_args.update(ansible_args)
|
|
254
259
|
module_args = None
|
|
@@ -342,7 +347,16 @@ class DepsInstaller:
|
|
|
342
347
|
# ensure tldextract data is cached
|
|
343
348
|
self.parent_helper.tldextract("evilcorp.co.uk")
|
|
344
349
|
# command: package_name
|
|
345
|
-
core_deps = {
|
|
350
|
+
core_deps = {
|
|
351
|
+
"unzip": "unzip",
|
|
352
|
+
"zipinfo": "unzip",
|
|
353
|
+
"curl": "curl",
|
|
354
|
+
"git": "git",
|
|
355
|
+
"make": "make",
|
|
356
|
+
"gcc": "gcc",
|
|
357
|
+
"bash": "bash",
|
|
358
|
+
"which": "which",
|
|
359
|
+
}
|
|
346
360
|
for command, package_name in core_deps.items():
|
|
347
361
|
if not self.parent_helper.which(command):
|
|
348
362
|
to_install.add(package_name)
|
|
@@ -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, "")
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import traceback
|
|
3
3
|
import threading
|
|
4
|
-
import multiprocessing
|
|
5
4
|
from multiprocessing.context import SpawnProcess
|
|
6
5
|
|
|
7
6
|
from .misc import in_exception_chain
|
|
8
7
|
|
|
9
8
|
|
|
10
|
-
current_process = multiprocessing.current_process()
|
|
11
|
-
|
|
12
|
-
|
|
13
9
|
class BBOTThread(threading.Thread):
|
|
14
10
|
|
|
15
11
|
default_name = "default bbot thread"
|
|
@@ -57,17 +53,3 @@ class BBOTProcess(SpawnProcess):
|
|
|
57
53
|
if not in_exception_chain(e, (KeyboardInterrupt,)):
|
|
58
54
|
log.warning(f"Error in {self.name}: {e}")
|
|
59
55
|
log.trace(traceback.format_exc())
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if current_process.name == "MainProcess":
|
|
63
|
-
# if this is the main bbot process, set the logger and queue for the first time
|
|
64
|
-
from bbot.core import CORE
|
|
65
|
-
from functools import partialmethod
|
|
66
|
-
|
|
67
|
-
BBOTProcess.__init__ = partialmethod(
|
|
68
|
-
BBOTProcess.__init__, log_level=CORE.logger.log_level, log_queue=CORE.logger.queue
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
# this makes our process class the default for process pools, etc.
|
|
72
|
-
mp_context = multiprocessing.get_context("spawn")
|
|
73
|
-
mp_context.Process = BBOTProcess
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import atexit
|
|
3
|
+
from contextlib import suppress
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class SharedInterpreterState:
|
|
7
|
+
"""
|
|
8
|
+
A class to track the primary BBOT process.
|
|
9
|
+
|
|
10
|
+
Used to prevent spawning multiple unwanted processes with multiprocessing.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def __init__(self):
|
|
14
|
+
self.main_process_var_name = "_BBOT_MAIN_PID"
|
|
15
|
+
self.scan_process_var_name = "_BBOT_SCAN_PID"
|
|
16
|
+
atexit.register(self.cleanup)
|
|
17
|
+
|
|
18
|
+
@property
|
|
19
|
+
def is_main_process(self):
|
|
20
|
+
is_main_process = self.main_pid == os.getpid()
|
|
21
|
+
return is_main_process
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def is_scan_process(self):
|
|
25
|
+
is_scan_process = os.getpid() == self.scan_pid
|
|
26
|
+
return is_scan_process
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def main_pid(self):
|
|
30
|
+
main_pid = int(os.environ.get(self.main_process_var_name, 0))
|
|
31
|
+
if main_pid == 0:
|
|
32
|
+
main_pid = os.getpid()
|
|
33
|
+
# if main PID is not set, set it to the current PID
|
|
34
|
+
os.environ[self.main_process_var_name] = str(main_pid)
|
|
35
|
+
return main_pid
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def scan_pid(self):
|
|
39
|
+
scan_pid = int(os.environ.get(self.scan_process_var_name, 0))
|
|
40
|
+
if scan_pid == 0:
|
|
41
|
+
scan_pid = os.getpid()
|
|
42
|
+
# if scan PID is not set, set it to the current PID
|
|
43
|
+
os.environ[self.scan_process_var_name] = str(scan_pid)
|
|
44
|
+
return scan_pid
|
|
45
|
+
|
|
46
|
+
def update_scan_pid(self):
|
|
47
|
+
os.environ[self.scan_process_var_name] = str(os.getpid())
|
|
48
|
+
|
|
49
|
+
def cleanup(self):
|
|
50
|
+
with suppress(Exception):
|
|
51
|
+
if self.is_main_process:
|
|
52
|
+
with suppress(KeyError):
|
|
53
|
+
del os.environ[self.main_process_var_name]
|
|
54
|
+
with suppress(KeyError):
|
|
55
|
+
del os.environ[self.scan_process_var_name]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
SHARED_INTERPRETER_STATE = SharedInterpreterState()
|
|
@@ -79,13 +79,23 @@ DEP_CHROMIUM = [
|
|
|
79
79
|
"ignore_errors": True,
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
|
-
"name": "Install Chromium dependencies (
|
|
82
|
+
"name": "Install Chromium dependencies (Ubuntu 24.04)",
|
|
83
83
|
"package": {
|
|
84
|
-
"name": "
|
|
84
|
+
"name": "libasound2t64,libatk-bridge2.0-0,libatk1.0-0,libcairo2,libcups2,libdrm2,libgbm1,libnss3,libpango-1.0-0,libglib2.0-0,libxcomposite1,libxdamage1,libxfixes3,libxkbcommon0,libxrandr2",
|
|
85
85
|
"state": "present",
|
|
86
86
|
},
|
|
87
87
|
"become": True,
|
|
88
|
-
"when": "ansible_facts['
|
|
88
|
+
"when": "ansible_facts['distribution'] == 'Ubuntu' and ansible_facts['distribution_version'] == '24.04'",
|
|
89
|
+
"ignore_errors": True,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"name": "Install Chromium dependencies (Other Debian-based)",
|
|
93
|
+
"package": {
|
|
94
|
+
"name": "libasound2,libatk-bridge2.0-0,libatk1.0-0,libcairo2,libcups2,libdrm2,libgbm1,libnss3,libpango-1.0-0,libglib2.0-0,libxcomposite1,libxdamage1,libxfixes3,libxkbcommon0,libxrandr2",
|
|
95
|
+
"state": "present",
|
|
96
|
+
},
|
|
97
|
+
"become": True,
|
|
98
|
+
"when": "ansible_facts['os_family'] == 'Debian' and not (ansible_facts['distribution'] == 'Ubuntu' and ansible_facts['distribution_version'] == '24.04')",
|
|
89
99
|
"ignore_errors": True,
|
|
90
100
|
},
|
|
91
101
|
{
|
|
@@ -149,6 +159,39 @@ DEP_MASSCAN = [
|
|
|
149
159
|
},
|
|
150
160
|
]
|
|
151
161
|
|
|
162
|
+
DEP_JAVA = [
|
|
163
|
+
{
|
|
164
|
+
"name": "Check if Java is installed",
|
|
165
|
+
"command": "which java",
|
|
166
|
+
"register": "java_installed",
|
|
167
|
+
"ignore_errors": True,
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"name": "Install latest JRE (Debian)",
|
|
171
|
+
"package": {"name": ["default-jre"], "state": "present"},
|
|
172
|
+
"become": True,
|
|
173
|
+
"when": "ansible_facts['os_family'] == 'Debian' and java_installed.rc != 0",
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"name": "Install latest JRE (Arch)",
|
|
177
|
+
"package": {"name": ["jre-openjdk"], "state": "present"},
|
|
178
|
+
"become": True,
|
|
179
|
+
"when": "ansible_facts['os_family'] == 'Archlinux' and java_installed.rc != 0",
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"name": "Install latest JRE (Fedora)",
|
|
183
|
+
"package": {"name": ["which", "java-latest-openjdk-headless"], "state": "present"},
|
|
184
|
+
"become": True,
|
|
185
|
+
"when": "ansible_facts['os_family'] == 'RedHat' and java_installed.rc != 0",
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"name": "Install latest JRE (Alpine)",
|
|
189
|
+
"package": {"name": ["openjdk11"], "state": "present"},
|
|
190
|
+
"become": True,
|
|
191
|
+
"when": "ansible_facts['os_family'] == 'Alpine' and java_installed.rc != 0",
|
|
192
|
+
},
|
|
193
|
+
]
|
|
194
|
+
|
|
152
195
|
# shared module dependencies -- ffuf, massdns, chromium, etc.
|
|
153
196
|
SHARED_DEPS = {}
|
|
154
197
|
for var, val in list(locals().items()):
|