bbot 2.3.0.5491rc0__tar.gz → 2.3.0.5515rc0__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.3.0.5491rc0 → bbot-2.3.0.5515rc0}/PKG-INFO +1 -1
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/__init__.py +1 -1
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/event/base.py +39 -22
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/depsinstaller/installer.py +70 -30
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/misc.py +1 -7
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/regexes.py +3 -12
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/dnsbrute_mutations.py +8 -3
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/extractous.py +2 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/filedownload.py +5 -1
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/github_org.py +1 -5
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/gowitness.py +3 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/internal/excavate.py +6 -1
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/trufflehog.py +40 -38
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_events.py +18 -2
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_helpers.py +1 -1
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +27 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +25 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +22 -4
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +32 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +33 -1
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +20 -4
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/pyproject.toml +1 -1
- bbot-2.3.0.5491rc0/bbot/modules/secretsdb.py +0 -78
- bbot-2.3.0.5491rc0/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -14
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/LICENSE +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/README.md +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/cli.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/config/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/config/files.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/config/logger.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/core.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/engine.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/event/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/event/helpers.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/flags.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/async_helpers.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/bloom.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/cache.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/command.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/diff.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/dns/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/dns/brute.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/dns/dns.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/dns/engine.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/dns/helpers.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/dns/mock.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/files.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/helper.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/interactsh.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/libmagic.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/names_generator.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/ntlm.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/process.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/ratelimiter.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/regex.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/url.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/validators.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/web/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/web/client.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/web/engine.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/web/web.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/helpers/wordcloud.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/modules.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/multiprocess.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/core/shared_deps.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/db/sql/models.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/defaults.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/errors.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/logger.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/ajaxpro.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/anubisdb.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/apkpure.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/azure_realm.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/azure_tenant.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/baddns.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/baddns_direct.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/baddns_zone.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/badsecrets.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/base.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/bevigil.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/binaryedge.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/bucket_amazon.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/bucket_azure.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/bucket_digitalocean.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/bucket_file_enum.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/bucket_firebase.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/bucket_google.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/bufferoverrun.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/builtwith.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/bypass403.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/c99.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/censys.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/certspotter.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/chaos.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/code_repository.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/columbus.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/credshed.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/crt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/deadly/dastardly.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/deadly/ffuf.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/deadly/nuclei.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/deadly/vhost.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/dehashed.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/digitorus.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/dnsbimi.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/dnsbrute.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/dnscaa.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/dnscommonsrv.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/dnsdumpster.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/dnstlsrpt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/docker_pull.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/dockerhub.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/dotnetnuke.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/emailformat.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/ffuf_shortnames.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/fingerprintx.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/fullhunt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/generic_ssrf.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/git.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/git_clone.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/github_codesearch.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/github_workflows.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/gitlab.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/google_playstore.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/hackertarget.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/host_header.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/httpx.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/hunt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/hunterio.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/iis_shortnames.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/internal/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/internal/aggregate.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/internal/base.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/internal/cloudcheck.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/internal/dnsresolve.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/internal/speculate.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/internetdb.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/ip2location.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/ipneighbor.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/ipstack.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/jadx.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/leakix.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/myssl.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/newsletters.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/ntlm.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/oauth.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/otx.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/asset_inventory.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/base.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/csv.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/discord.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/emails.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/http.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/json.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/mysql.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/neo4j.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/nmap_xml.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/postgres.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/python.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/slack.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/splunk.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/sqlite.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/stdout.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/subdomains.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/teams.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/txt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/web_report.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/output/websocket.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/paramminer_cookies.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/paramminer_getparams.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/paramminer_headers.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/passivetotal.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/pgp.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/portscan.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/postman.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/postman_download.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/rapiddns.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/report/affiliates.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/report/asn.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/report/base.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/robots.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/securitytrails.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/securitytxt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/shodan_dns.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/sitedossier.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/skymem.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/smuggler.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/social.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/sslcert.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/subdomaincenter.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/subdomainradar.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/telerik.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/templates/bucket.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/templates/github.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/templates/postman.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/templates/shodan.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/templates/sql.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/templates/webhook.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/trickest.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/url_manipulation.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/urlscan.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/viewdns.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/virustotal.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/wafw00f.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/wappalyzer.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/wayback.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/wpscan.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/modules/zoomeye.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/baddns-thorough.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/cloud-enum.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/code-enum.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/email-enum.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/fast.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/kitchen-sink.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/spider.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/subdomain-enum.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/web/dirbust-light.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/web/paramminer.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/web-basic.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/web-screenshots.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/presets/web-thorough.yml +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/dispatcher.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/manager.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/preset/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/preset/args.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/preset/conditions.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/preset/environ.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/preset/path.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/preset/preset.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/scanner.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/stats.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scanner/target.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/scripts/docs.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/bbot_fixtures.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/conftest.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/coverage.cfg +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/fastapi_test.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/owasp_mastg.apk +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/run_tests.sh +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test.conf +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_output.ndjson +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_bbot_fastapi.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_cli.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_command.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_config.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_dns.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_docs.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_engine.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_files.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_presets.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_regexes.py +1 -1
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_scan.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_scope.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_target.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_1/test_web.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/base.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dnstlsrpt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_extractous.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_jadx.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_mysql.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_nmap_xml.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_postgres.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_sqlite.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/testsslcert.pem +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/test/testsslkey.pem +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/wordlists/devops_mutations.txt +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/wordlists/nameservers.txt +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
- {bbot-2.3.0.5491rc0 → bbot-2.3.0.5515rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
|
@@ -515,22 +515,25 @@ class BaseEvent:
|
|
|
515
515
|
new_scope_distance = min(self.scope_distance, scope_distance)
|
|
516
516
|
if self._scope_distance != new_scope_distance:
|
|
517
517
|
# remove old scope distance tags
|
|
518
|
-
for t in list(self.tags):
|
|
519
|
-
if t.startswith("distance-"):
|
|
520
|
-
self.remove_tag(t)
|
|
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}")
|
|
528
518
|
self._scope_distance = new_scope_distance
|
|
519
|
+
self.refresh_scope_tags()
|
|
529
520
|
# apply recursively to parent events
|
|
530
521
|
parent_scope_distance = getattr(self.parent, "scope_distance", None)
|
|
531
522
|
if parent_scope_distance is not None and self.parent is not self:
|
|
532
523
|
self.parent.scope_distance = new_scope_distance + 1
|
|
533
524
|
|
|
525
|
+
def refresh_scope_tags(self):
|
|
526
|
+
for t in list(self.tags):
|
|
527
|
+
if t.startswith("distance-"):
|
|
528
|
+
self.remove_tag(t)
|
|
529
|
+
if self.host:
|
|
530
|
+
if self.scope_distance == 0:
|
|
531
|
+
self.add_tag("in-scope")
|
|
532
|
+
self.remove_tag("affiliate")
|
|
533
|
+
else:
|
|
534
|
+
self.remove_tag("in-scope")
|
|
535
|
+
self.add_tag(f"distance-{self.scope_distance}")
|
|
536
|
+
|
|
534
537
|
@property
|
|
535
538
|
def scope_description(self):
|
|
536
539
|
"""
|
|
@@ -587,7 +590,7 @@ class BaseEvent:
|
|
|
587
590
|
if t in ("spider-danger", "spider-max"):
|
|
588
591
|
self.add_tag(t)
|
|
589
592
|
elif not self._dummy:
|
|
590
|
-
log.warning(f"Tried to set invalid parent on {self}: (got: {parent})")
|
|
593
|
+
log.warning(f"Tried to set invalid parent on {self}: (got: {repr(parent)} ({type(parent)}))")
|
|
591
594
|
|
|
592
595
|
@property
|
|
593
596
|
def parent_id(self):
|
|
@@ -1042,6 +1045,9 @@ class DictPathEvent(DictEvent):
|
|
|
1042
1045
|
blob = None
|
|
1043
1046
|
try:
|
|
1044
1047
|
self._data_path = Path(data["path"])
|
|
1048
|
+
# prepend the scan's home dir if the path is relative
|
|
1049
|
+
if not self._data_path.is_absolute():
|
|
1050
|
+
self._data_path = self.scan.home / self._data_path
|
|
1045
1051
|
if self._data_path.is_file():
|
|
1046
1052
|
self.add_tag("file")
|
|
1047
1053
|
if file_blobs:
|
|
@@ -1352,18 +1358,22 @@ class HTTP_RESPONSE(URL_UNVERIFIED, DictEvent):
|
|
|
1352
1358
|
self.parsed_url = self.validators.validate_url_parsed(url)
|
|
1353
1359
|
data["url"] = self.parsed_url.geturl()
|
|
1354
1360
|
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
if
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1361
|
+
if not "raw_header" in data:
|
|
1362
|
+
raise ValueError("raw_header is required for HTTP_RESPONSE events")
|
|
1363
|
+
|
|
1364
|
+
if "header-dict" not in data:
|
|
1365
|
+
header_dict = {}
|
|
1366
|
+
for i in data.get("raw_header", "").splitlines():
|
|
1367
|
+
if len(i) > 0 and ":" in i:
|
|
1368
|
+
k, v = i.split(":", 1)
|
|
1369
|
+
k = k.strip().lower()
|
|
1370
|
+
v = v.lstrip()
|
|
1371
|
+
if k in header_dict:
|
|
1372
|
+
header_dict[k].append(v)
|
|
1373
|
+
else:
|
|
1374
|
+
header_dict[k] = [v]
|
|
1375
|
+
data["header-dict"] = header_dict
|
|
1365
1376
|
|
|
1366
|
-
data["header-dict"] = header_dict
|
|
1367
1377
|
# move URL to the front of the dictionary for visibility
|
|
1368
1378
|
data = dict(data)
|
|
1369
1379
|
new_data = {"url": data.pop("url")}
|
|
@@ -1377,6 +1387,13 @@ class HTTP_RESPONSE(URL_UNVERIFIED, DictEvent):
|
|
|
1377
1387
|
def _pretty_string(self):
|
|
1378
1388
|
return f'{self.data["hash"]["header_mmh3"]}:{self.data["hash"]["body_mmh3"]}'
|
|
1379
1389
|
|
|
1390
|
+
@property
|
|
1391
|
+
def raw_response(self):
|
|
1392
|
+
"""
|
|
1393
|
+
Formats the status code, headers, and body into a single string formatted as an HTTP/1.1 response.
|
|
1394
|
+
"""
|
|
1395
|
+
return f'{self.data["raw_header"]}{self.data["body"]}'
|
|
1396
|
+
|
|
1380
1397
|
@property
|
|
1381
1398
|
def http_status(self):
|
|
1382
1399
|
try:
|
|
@@ -20,11 +20,43 @@ log = logging.getLogger("bbot.core.helpers.depsinstaller")
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class DepsInstaller:
|
|
23
|
+
CORE_DEPS = {
|
|
24
|
+
# core BBOT dependencies in the format of binary: package_name
|
|
25
|
+
# each one will only be installed if the binary is not found
|
|
26
|
+
"unzip": "unzip",
|
|
27
|
+
"zipinfo": "unzip",
|
|
28
|
+
"curl": "curl",
|
|
29
|
+
"git": "git",
|
|
30
|
+
"make": "make",
|
|
31
|
+
"gcc": "gcc",
|
|
32
|
+
"bash": "bash",
|
|
33
|
+
"which": "which",
|
|
34
|
+
"unrar": "unrar-free",
|
|
35
|
+
"tar": "tar",
|
|
36
|
+
# debian why are you like this
|
|
37
|
+
"7z": [
|
|
38
|
+
{
|
|
39
|
+
"name": "Install 7zip (Debian)",
|
|
40
|
+
"package": {"name": ["p7zip-full"], "state": "present"},
|
|
41
|
+
"become": True,
|
|
42
|
+
"when": "ansible_facts['os_family'] == 'Debian'",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "Install 7zip (Non-Debian)",
|
|
46
|
+
"package": {"name": ["p7zip"], "state": "present"},
|
|
47
|
+
"become": True,
|
|
48
|
+
"when": "ansible_facts['os_family'] != 'Debian'",
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
}
|
|
52
|
+
|
|
23
53
|
def __init__(self, parent_helper):
|
|
24
54
|
self.parent_helper = parent_helper
|
|
25
55
|
self.preset = self.parent_helper.preset
|
|
26
56
|
self.core = self.preset.core
|
|
27
57
|
|
|
58
|
+
self.os_platform = os_platform()
|
|
59
|
+
|
|
28
60
|
# respect BBOT's http timeout
|
|
29
61
|
self.web_config = self.parent_helper.config.get("web", {})
|
|
30
62
|
http_timeout = self.web_config.get("http_timeout", 30)
|
|
@@ -202,28 +234,32 @@ class DepsInstaller:
|
|
|
202
234
|
"""
|
|
203
235
|
Install packages with the OS's default package manager (apt, pacman, dnf, etc.)
|
|
204
236
|
"""
|
|
205
|
-
|
|
237
|
+
args, kwargs = self._make_apt_ansible_args(packages)
|
|
238
|
+
success, err = self.ansible_run(module="package", args=args, **kwargs)
|
|
239
|
+
if success:
|
|
240
|
+
log.info(f'Successfully installed OS packages "{",".join(sorted(packages))}"')
|
|
241
|
+
else:
|
|
242
|
+
log.warning(
|
|
243
|
+
f"Failed to install OS packages ({err}). Recommend installing the following packages manually:"
|
|
244
|
+
)
|
|
245
|
+
for p in packages:
|
|
246
|
+
log.warning(f" - {p}")
|
|
247
|
+
return success
|
|
248
|
+
|
|
249
|
+
def _make_apt_ansible_args(self, packages):
|
|
250
|
+
packages_str = ",".join(sorted(packages))
|
|
206
251
|
log.info(f"Installing the following OS packages: {packages_str}")
|
|
207
252
|
args = {"name": packages_str, "state": "present"} # , "update_cache": True, "cache_valid_time": 86400}
|
|
208
253
|
kwargs = {}
|
|
209
254
|
# don't sudo brew
|
|
210
|
-
if os_platform
|
|
255
|
+
if self.os_platform != "darwin":
|
|
211
256
|
kwargs = {
|
|
212
257
|
"ansible_args": {
|
|
213
258
|
"ansible_become": True,
|
|
214
259
|
"ansible_become_method": "sudo",
|
|
215
260
|
}
|
|
216
261
|
}
|
|
217
|
-
|
|
218
|
-
if success:
|
|
219
|
-
log.info(f'Successfully installed OS packages "{packages_str}"')
|
|
220
|
-
else:
|
|
221
|
-
log.warning(
|
|
222
|
-
f"Failed to install OS packages ({err}). Recommend installing the following packages manually:"
|
|
223
|
-
)
|
|
224
|
-
for p in packages:
|
|
225
|
-
log.warning(f" - {p}")
|
|
226
|
-
return success
|
|
262
|
+
return args, kwargs
|
|
227
263
|
|
|
228
264
|
def shell(self, module, commands):
|
|
229
265
|
tasks = []
|
|
@@ -269,7 +305,7 @@ class DepsInstaller:
|
|
|
269
305
|
for task in tasks:
|
|
270
306
|
if "package" in task:
|
|
271
307
|
# special case for macos
|
|
272
|
-
if os_platform
|
|
308
|
+
if self.os_platform == "darwin":
|
|
273
309
|
# don't sudo brew
|
|
274
310
|
task["become"] = False
|
|
275
311
|
# brew doesn't support update_cache
|
|
@@ -292,8 +328,8 @@ class DepsInstaller:
|
|
|
292
328
|
},
|
|
293
329
|
module=module,
|
|
294
330
|
module_args=module_args,
|
|
295
|
-
quiet=
|
|
296
|
-
verbosity=
|
|
331
|
+
quiet=True,
|
|
332
|
+
verbosity=0,
|
|
297
333
|
cancel_callback=lambda: None,
|
|
298
334
|
)
|
|
299
335
|
|
|
@@ -303,7 +339,7 @@ class DepsInstaller:
|
|
|
303
339
|
err = ""
|
|
304
340
|
for e in res.events:
|
|
305
341
|
if self.ansible_debug and not success:
|
|
306
|
-
log.debug(json.dumps(e, indent=
|
|
342
|
+
log.debug(json.dumps(e, indent=2))
|
|
307
343
|
if e["event"] == "runner_on_failed":
|
|
308
344
|
err = e["event_data"]["res"]["msg"]
|
|
309
345
|
break
|
|
@@ -347,26 +383,30 @@ class DepsInstaller:
|
|
|
347
383
|
|
|
348
384
|
def install_core_deps(self):
|
|
349
385
|
to_install = set()
|
|
386
|
+
to_install_friendly = set()
|
|
387
|
+
playbook = []
|
|
350
388
|
self._install_sudo_askpass()
|
|
351
389
|
# ensure tldextract data is cached
|
|
352
390
|
self.parent_helper.tldextract("evilcorp.co.uk")
|
|
353
|
-
|
|
354
|
-
core_deps = {
|
|
355
|
-
"unzip": "unzip",
|
|
356
|
-
"zipinfo": "unzip",
|
|
357
|
-
"curl": "curl",
|
|
358
|
-
"git": "git",
|
|
359
|
-
"make": "make",
|
|
360
|
-
"gcc": "gcc",
|
|
361
|
-
"bash": "bash",
|
|
362
|
-
"which": "which",
|
|
363
|
-
}
|
|
364
|
-
for command, package_name in core_deps.items():
|
|
391
|
+
for command, package_name_or_playbook in self.CORE_DEPS.items():
|
|
365
392
|
if not self.parent_helper.which(command):
|
|
366
|
-
|
|
393
|
+
to_install_friendly.add(command)
|
|
394
|
+
if isinstance(package_name_or_playbook, str):
|
|
395
|
+
to_install.add(package_name_or_playbook)
|
|
396
|
+
else:
|
|
397
|
+
playbook.extend(package_name_or_playbook)
|
|
367
398
|
if to_install:
|
|
399
|
+
playbook.append(
|
|
400
|
+
{
|
|
401
|
+
"name": "Install Core BBOT Dependencies",
|
|
402
|
+
"package": {"name": list(to_install), "state": "present"},
|
|
403
|
+
"become": True,
|
|
404
|
+
}
|
|
405
|
+
)
|
|
406
|
+
if playbook:
|
|
407
|
+
log.info(f"Installing core BBOT dependencies: {','.join(sorted(to_install_friendly))}")
|
|
368
408
|
self.ensure_root()
|
|
369
|
-
self.
|
|
409
|
+
self.ansible_run(tasks=playbook)
|
|
370
410
|
|
|
371
411
|
def _setup_sudo_cache(self):
|
|
372
412
|
if not self._sudo_cache_setup:
|
|
@@ -559,13 +559,12 @@ def is_port(p):
|
|
|
559
559
|
return p and p.isdigit() and 0 <= int(p) <= 65535
|
|
560
560
|
|
|
561
561
|
|
|
562
|
-
def is_dns_name(d
|
|
562
|
+
def is_dns_name(d):
|
|
563
563
|
"""
|
|
564
564
|
Determines if the given string is a valid DNS name.
|
|
565
565
|
|
|
566
566
|
Args:
|
|
567
567
|
d (str): The string to be checked.
|
|
568
|
-
include_local (bool): Consider local hostnames to be valid (hostnames without periods)
|
|
569
568
|
|
|
570
569
|
Returns:
|
|
571
570
|
bool: True if the string is a valid DNS name, False otherwise.
|
|
@@ -575,17 +574,12 @@ def is_dns_name(d, include_local=True):
|
|
|
575
574
|
True
|
|
576
575
|
>>> is_dns_name('localhost')
|
|
577
576
|
True
|
|
578
|
-
>>> is_dns_name('localhost', include_local=False)
|
|
579
|
-
False
|
|
580
577
|
>>> is_dns_name('192.168.1.1')
|
|
581
578
|
False
|
|
582
579
|
"""
|
|
583
580
|
if is_ip(d):
|
|
584
581
|
return False
|
|
585
582
|
d = smart_decode(d)
|
|
586
|
-
if include_local:
|
|
587
|
-
if bbot_regexes.hostname_regex.match(d):
|
|
588
|
-
return True
|
|
589
583
|
if bbot_regexes.dns_name_validation_regex.match(d):
|
|
590
584
|
return True
|
|
591
585
|
return False
|
|
@@ -39,14 +39,10 @@ _ip_range_regexes = (
|
|
|
39
39
|
ip_range_regexes = [re.compile(r, re.I) for r in _ip_range_regexes]
|
|
40
40
|
|
|
41
41
|
# dns names with periods
|
|
42
|
-
_dns_name_regex = r"(?:\w(?:[\w-]{0,100}\w)
|
|
42
|
+
_dns_name_regex = r"(?:\w(?:[\w-]{0,100}\w)?\.?)+(?:[xX][nN]--)?[^\W_]{1,63}\.?"
|
|
43
43
|
dns_name_extraction_regex = re.compile(_dns_name_regex, re.I)
|
|
44
44
|
dns_name_validation_regex = re.compile(r"^" + _dns_name_regex + r"$", re.I)
|
|
45
45
|
|
|
46
|
-
# dns names without periods
|
|
47
|
-
_hostname_regex = r"(?!\w*\.\w+)\w(?:[\w-]{0,100}\w)?"
|
|
48
|
-
hostname_regex = re.compile(r"^" + _hostname_regex + r"$", re.I)
|
|
49
|
-
|
|
50
46
|
_email_regex = r"(?:[^\W_][\w\-\.\+']{,100})@" + _dns_name_regex
|
|
51
47
|
email_regex = re.compile(_email_regex, re.I)
|
|
52
48
|
|
|
@@ -61,14 +57,12 @@ event_uuid_regex = re.compile(_event_uuid_regex, re.I)
|
|
|
61
57
|
|
|
62
58
|
_open_port_regexes = (
|
|
63
59
|
_dns_name_regex + r":[0-9]{1,5}",
|
|
64
|
-
_hostname_regex + r":[0-9]{1,5}",
|
|
65
60
|
r"\[" + _ipv6_regex + r"\]:[0-9]{1,5}",
|
|
66
61
|
)
|
|
67
62
|
open_port_regexes = [re.compile(r, re.I) for r in _open_port_regexes]
|
|
68
63
|
|
|
69
64
|
_url_regexes = (
|
|
70
65
|
r"https?://" + _dns_name_regex + r"(?::[0-9]{1,5})?(?:(?:/|\?).*)?",
|
|
71
|
-
r"https?://" + _hostname_regex + r"(?::[0-9]{1,5})?(?:(?:/|\?).*)?",
|
|
72
66
|
r"https?://\[" + _ipv6_regex + r"\](?::[0-9]{1,5})?(?:(?:/|\?).*)?",
|
|
73
67
|
)
|
|
74
68
|
url_regexes = [re.compile(r, re.I) for r in _url_regexes]
|
|
@@ -83,10 +77,7 @@ event_type_regexes = OrderedDict(
|
|
|
83
77
|
for k, regexes in (
|
|
84
78
|
(
|
|
85
79
|
"DNS_NAME",
|
|
86
|
-
(
|
|
87
|
-
r"^" + _dns_name_regex + r"$",
|
|
88
|
-
r"^" + _hostname_regex + r"$",
|
|
89
|
-
),
|
|
80
|
+
(r"^" + _dns_name_regex + r"$",),
|
|
90
81
|
),
|
|
91
82
|
(
|
|
92
83
|
"EMAIL_ADDRESS",
|
|
@@ -140,7 +131,7 @@ select_tag_regex = re.compile(
|
|
|
140
131
|
textarea_tag_regex = re.compile(
|
|
141
132
|
r'<textarea[^>]*\bname=["\']?(\w+)["\']?[^>]*>(.*?)</textarea>', re.IGNORECASE | re.DOTALL
|
|
142
133
|
)
|
|
143
|
-
tag_attribute_regex = re.compile(r"<[^>]*(?:href|src)\s*=\s*[\"\']([^\
|
|
134
|
+
tag_attribute_regex = re.compile(r"<[^>]*(?:href|action|src)\s*=\s*[\"\']?(?!mailto:)([^\s\'\"\>]+)[\"\']?[^>]*>")
|
|
144
135
|
|
|
145
136
|
valid_netloc = r"[^\s!@#$%^&()=/?\\'\";~`<>]+"
|
|
146
137
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import time
|
|
2
|
+
|
|
1
3
|
from bbot.modules.base import BaseModule
|
|
2
4
|
|
|
3
5
|
|
|
@@ -40,8 +42,11 @@ class dnsbrute_mutations(BaseModule):
|
|
|
40
42
|
except KeyError:
|
|
41
43
|
self.found[domain] = {subdomain}
|
|
42
44
|
|
|
43
|
-
def get_parent_event(self, subdomain):
|
|
44
|
-
|
|
45
|
+
async def get_parent_event(self, subdomain):
|
|
46
|
+
start = time.time()
|
|
47
|
+
parent_host = await self.helpers.run_in_executor(self.helpers.closest_match, subdomain, self.parent_events)
|
|
48
|
+
elapsed = time.time() - start
|
|
49
|
+
self.trace(f"{subdomain}: got closest match among {len(self.parent_events):,} parent events in {elapsed:.2f}s")
|
|
45
50
|
return self.parent_events[parent_host]
|
|
46
51
|
|
|
47
52
|
async def finish(self):
|
|
@@ -124,7 +129,7 @@ class dnsbrute_mutations(BaseModule):
|
|
|
124
129
|
self._mutation_run_counter[domain] = mutation_run = 1
|
|
125
130
|
self._mutation_run_counter[domain] += 1
|
|
126
131
|
for hostname in results:
|
|
127
|
-
parent_event = self.get_parent_event(hostname)
|
|
132
|
+
parent_event = await self.get_parent_event(hostname)
|
|
128
133
|
mutation_run_ordinal = self.helpers.integer_to_ordinal(mutation_run)
|
|
129
134
|
await self.emit_event(
|
|
130
135
|
hostname,
|
|
@@ -28,6 +28,7 @@ class extractous(BaseModule):
|
|
|
28
28
|
"ica", # Citrix Independent Computing Architecture File
|
|
29
29
|
"indd", # Adobe InDesign Document
|
|
30
30
|
"ini", # Initialization File
|
|
31
|
+
"json", # JSON File
|
|
31
32
|
"key", # Private Key File
|
|
32
33
|
"pub", # Public Key File
|
|
33
34
|
"log", # Log File
|
|
@@ -45,6 +46,7 @@ class extractous(BaseModule):
|
|
|
45
46
|
"pptx", # Microsoft PowerPoint Presentation
|
|
46
47
|
"ps1", # PowerShell Script
|
|
47
48
|
"rdp", # Remote Desktop Protocol File
|
|
49
|
+
"rsa", # RSA Private Key File
|
|
48
50
|
"sh", # Shell Script
|
|
49
51
|
"sql", # SQL Database Dump
|
|
50
52
|
"swp", # Swap File (temporary file, often Vim)
|
|
@@ -38,6 +38,7 @@ class filedownload(BaseModule):
|
|
|
38
38
|
"indd", # Adobe InDesign Document
|
|
39
39
|
"ini", # Initialization File
|
|
40
40
|
"jar", # Java Archive
|
|
41
|
+
"json", # JSON File
|
|
41
42
|
"key", # Private Key File
|
|
42
43
|
"log", # Log File
|
|
43
44
|
"markdown", # Markdown File
|
|
@@ -57,6 +58,7 @@ class filedownload(BaseModule):
|
|
|
57
58
|
"pub", # Public Key File
|
|
58
59
|
"raw", # Raw Image File Format
|
|
59
60
|
"rdp", # Remote Desktop Protocol File
|
|
61
|
+
"rsa", # RSA Private Key File
|
|
60
62
|
"sh", # Shell Script
|
|
61
63
|
"sql", # SQL Database Dump
|
|
62
64
|
"sqlite", # SQLite Database File
|
|
@@ -177,7 +179,9 @@ class filedownload(BaseModule):
|
|
|
177
179
|
if extension:
|
|
178
180
|
filename = f"{filename}.{extension}"
|
|
179
181
|
orig_filename = f"{orig_filename}.{extension}"
|
|
180
|
-
|
|
182
|
+
file_destination = self.download_dir / filename
|
|
183
|
+
file_destination = self.helpers.truncate_filename(file_destination)
|
|
184
|
+
return orig_filename, file_destination, base_url
|
|
181
185
|
|
|
182
186
|
async def report(self):
|
|
183
187
|
if self.files_downloaded > 0:
|
|
@@ -206,11 +206,7 @@ class github_org(github):
|
|
|
206
206
|
for k, v in json.items():
|
|
207
207
|
if (
|
|
208
208
|
isinstance(v, str)
|
|
209
|
-
and (
|
|
210
|
-
self.helpers.is_dns_name(v, include_local=False)
|
|
211
|
-
or self.helpers.is_url(v)
|
|
212
|
-
or self.helpers.is_email(v)
|
|
213
|
-
)
|
|
209
|
+
and (self.helpers.is_dns_name(v) and "." in v or self.helpers.is_url(v) or self.helpers.is_email(v))
|
|
214
210
|
and self.scan.in_scope(v)
|
|
215
211
|
):
|
|
216
212
|
self.verbose(f'Found in-scope key "{k}": "{v}" for {org}, it appears to be in-scope')
|
|
@@ -142,6 +142,9 @@ class gowitness(BaseModule):
|
|
|
142
142
|
url = screenshot["url"]
|
|
143
143
|
final_url = screenshot["final_url"]
|
|
144
144
|
filename = self.screenshot_path / screenshot["filename"]
|
|
145
|
+
filename = filename.relative_to(self.scan.home)
|
|
146
|
+
# NOTE: this prevents long filenames from causing problems in BBOT, but gowitness will still fail to save it.
|
|
147
|
+
filename = self.helpers.truncate_filename(filename)
|
|
145
148
|
webscreenshot_data = {"path": str(filename), "url": final_url}
|
|
146
149
|
parent_event = event_dict[url]
|
|
147
150
|
await self.emit_event(
|
|
@@ -505,6 +505,11 @@ class excavate(BaseInternalModule, BaseInterceptModule):
|
|
|
505
505
|
if self.excavate.helpers.validate_parameter(parameter_name, parameter_type):
|
|
506
506
|
if self.excavate.in_bl(parameter_name) is False:
|
|
507
507
|
parsed_url = urlparse(url)
|
|
508
|
+
if not parsed_url.hostname:
|
|
509
|
+
self.excavate.warning(
|
|
510
|
+
f"Error Parsing reconstructed URL [{url}] during parameter extraction, missing hostname"
|
|
511
|
+
)
|
|
512
|
+
continue
|
|
508
513
|
description = f"HTTP Extracted Parameter [{parameter_name}] ({parameterExtractorSubModule.name} Submodule)"
|
|
509
514
|
data = {
|
|
510
515
|
"host": parsed_url.hostname,
|
|
@@ -703,7 +708,7 @@ class excavate(BaseInternalModule, BaseInterceptModule):
|
|
|
703
708
|
"""
|
|
704
709
|
),
|
|
705
710
|
}
|
|
706
|
-
full_url_regex = re.compile(r"(https?)://(
|
|
711
|
+
full_url_regex = re.compile(r"(https?)://(\w(?:[\w-]+\.?)+(?::\d{1,5})?(?:/[-\w\.\(\)]*[-\w\.]+)*/?)")
|
|
707
712
|
full_url_regex_strict = re.compile(r"^(https?):\/\/([\w.-]+)(?::\d{1,5})?(\/[\w\/\.-]*)?(\?[^\s]+)?$")
|
|
708
713
|
tag_attribute_regex = bbot_regexes.tag_attribute_regex
|
|
709
714
|
|
|
@@ -3,7 +3,7 @@ from bbot.modules.base import BaseModule
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
class trufflehog(BaseModule):
|
|
6
|
-
watched_events = ["CODE_REPOSITORY", "FILESYSTEM"]
|
|
6
|
+
watched_events = ["CODE_REPOSITORY", "FILESYSTEM", "HTTP_RESPONSE", "RAW_TEXT"]
|
|
7
7
|
produced_events = ["FINDING", "VULNERABILITY"]
|
|
8
8
|
flags = ["passive", "safe", "code-enum"]
|
|
9
9
|
meta = {
|
|
@@ -81,12 +81,15 @@ class trufflehog(BaseModule):
|
|
|
81
81
|
return True
|
|
82
82
|
|
|
83
83
|
async def handle_event(self, event):
|
|
84
|
-
description =
|
|
84
|
+
description = ""
|
|
85
|
+
if isinstance(event.data, dict):
|
|
86
|
+
description = event.data.get("description", "")
|
|
87
|
+
|
|
85
88
|
if event.type == "CODE_REPOSITORY":
|
|
86
89
|
path = event.data["url"]
|
|
87
90
|
if "git" in event.tags:
|
|
88
91
|
module = "github-experimental"
|
|
89
|
-
|
|
92
|
+
elif event.type == "FILESYSTEM":
|
|
90
93
|
path = event.data["path"]
|
|
91
94
|
if "git" in event.tags:
|
|
92
95
|
module = "git"
|
|
@@ -96,6 +99,14 @@ class trufflehog(BaseModule):
|
|
|
96
99
|
module = "postman"
|
|
97
100
|
else:
|
|
98
101
|
module = "filesystem"
|
|
102
|
+
elif event.type in ("HTTP_RESPONSE", "RAW_TEXT"):
|
|
103
|
+
module = "filesystem"
|
|
104
|
+
file_data = event.raw_response if event.type == "HTTP_RESPONSE" else event.data
|
|
105
|
+
# write the response to a tempfile
|
|
106
|
+
# this is necessary because trufflehog doesn't yet support reading from stdin
|
|
107
|
+
# https://github.com/trufflesecurity/trufflehog/issues/162
|
|
108
|
+
path = self.helpers.tempfile(file_data, pipe=False)
|
|
109
|
+
|
|
99
110
|
if event.type == "CODE_REPOSITORY":
|
|
100
111
|
host = event.host
|
|
101
112
|
else:
|
|
@@ -108,41 +119,32 @@ class trufflehog(BaseModule):
|
|
|
108
119
|
verified,
|
|
109
120
|
source_metadata,
|
|
110
121
|
) in self.execute_trufflehog(module, path):
|
|
111
|
-
if verified
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
data["
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
data["description"] += f" RawV2 result: [{rawv2_result}]"
|
|
138
|
-
await self.emit_event(
|
|
139
|
-
data,
|
|
140
|
-
"FINDING",
|
|
141
|
-
event,
|
|
142
|
-
context=f'{{module}} searched {event.type} using "{module}" method and found possible secret ({{event.type}}): {raw_result}',
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
async def execute_trufflehog(self, module, path):
|
|
122
|
+
verified_str = "Verified" if verified else "Possible"
|
|
123
|
+
finding_type = "VULNERABILITY" if verified else "FINDING"
|
|
124
|
+
data = {
|
|
125
|
+
"description": f"{verified_str} Secret Found. Detector Type: [{detector_name}] Decoder Type: [{decoder_name}] Details: [{source_metadata}]",
|
|
126
|
+
}
|
|
127
|
+
if host:
|
|
128
|
+
data["host"] = host
|
|
129
|
+
if finding_type == "VULNERABILITY":
|
|
130
|
+
data["severity"] = "High"
|
|
131
|
+
if description:
|
|
132
|
+
data["description"] += f" Description: [{description}]"
|
|
133
|
+
data["description"] += f" Raw result: [{raw_result}]"
|
|
134
|
+
if rawv2_result:
|
|
135
|
+
data["description"] += f" RawV2 result: [{rawv2_result}]"
|
|
136
|
+
await self.emit_event(
|
|
137
|
+
data,
|
|
138
|
+
finding_type,
|
|
139
|
+
event,
|
|
140
|
+
context=f'{{module}} searched {event.type} using "{module}" method and found {verified_str.lower()} secret ({{event.type}}): {raw_result}',
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
# clean up the tempfile when we're done with it
|
|
144
|
+
if event.type in ("HTTP_RESPONSE", "RAW_TEXT"):
|
|
145
|
+
path.unlink(missing_ok=True)
|
|
146
|
+
|
|
147
|
+
async def execute_trufflehog(self, module, path=None, string=None):
|
|
146
148
|
command = [
|
|
147
149
|
"trufflehog",
|
|
148
150
|
"--json",
|
|
@@ -149,6 +149,7 @@ async def test_events(events, helpers):
|
|
|
149
149
|
"title": "HTTP%20RESPONSE",
|
|
150
150
|
"url": "http://www.evilcorp.com:80",
|
|
151
151
|
"input": "http://www.evilcorp.com:80",
|
|
152
|
+
"raw_header": "HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.evilcorp.com/asdf\r\n\r\n",
|
|
152
153
|
"location": "/asdf",
|
|
153
154
|
"status_code": 301,
|
|
154
155
|
},
|
|
@@ -161,7 +162,13 @@ async def test_events(events, helpers):
|
|
|
161
162
|
|
|
162
163
|
# http response url validation
|
|
163
164
|
http_response_2 = scan.make_event(
|
|
164
|
-
{
|
|
165
|
+
{
|
|
166
|
+
"port": "80",
|
|
167
|
+
"url": "http://evilcorp.com:80/asdf",
|
|
168
|
+
"raw_header": "HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.evilcorp.com/asdf\r\n\r\n",
|
|
169
|
+
},
|
|
170
|
+
"HTTP_RESPONSE",
|
|
171
|
+
dummy=True,
|
|
165
172
|
)
|
|
166
173
|
assert http_response_2.data["url"] == "http://evilcorp.com/asdf"
|
|
167
174
|
|
|
@@ -546,6 +553,10 @@ async def test_events(events, helpers):
|
|
|
546
553
|
http_response = scan.make_event(httpx_response, "HTTP_RESPONSE", parent=scan.root_event)
|
|
547
554
|
assert http_response.parent_id == scan.root_event.id
|
|
548
555
|
assert http_response.data["input"] == "http://example.com:80"
|
|
556
|
+
assert (
|
|
557
|
+
http_response.raw_response
|
|
558
|
+
== 'HTTP/1.1 200 OK\r\nConnection: close\r\nAge: 526111\r\nCache-Control: max-age=604800\r\nContent-Type: text/html; charset=UTF-8\r\nDate: Mon, 14 Nov 2022 17:14:27 GMT\r\nEtag: "3147526947+ident+gzip"\r\nExpires: Mon, 21 Nov 2022 17:14:27 GMT\r\nLast-Modified: Thu, 17 Oct 2019 07:18:26 GMT\r\nServer: ECS (agb/A445)\r\nVary: Accept-Encoding\r\nX-Cache: HIT\r\n\r\n<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\n <meta charset="utf-8" />\n <meta http-equiv="Content-type" content="text/html; charset=utf-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1" />\n <style type="text/css">\n body {\n background-color: #f0f0f2;\n margin: 0;\n padding: 0;\n font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;\n \n }\n div {\n width: 600px;\n margin: 5em auto;\n padding: 2em;\n background-color: #fdfdff;\n border-radius: 0.5em;\n box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n }\n a:link, a:visited {\n color: #38488f;\n text-decoration: none;\n }\n @media (max-width: 700px) {\n div {\n margin: 0 auto;\n width: auto;\n }\n }\n </style> \n</head>\n\n<body>\n<div>\n <h1>Example Domain</h1>\n <p>This domain is for use in illustrative examples in documents. You may use this\n domain in literature without prior coordination or asking for permission.</p>\n <p><a href="https://www.iana.org/domains/example">More information...</a></p>\n</div>\n</body>\n</html>\n'
|
|
559
|
+
)
|
|
549
560
|
json_event = http_response.json(mode="graph")
|
|
550
561
|
assert isinstance(json_event["data"], str)
|
|
551
562
|
json_event = http_response.json()
|
|
@@ -906,7 +917,12 @@ def test_event_closest_host():
|
|
|
906
917
|
assert event1.host == "evilcorp.com"
|
|
907
918
|
# second event has a host + url
|
|
908
919
|
event2 = scan.make_event(
|
|
909
|
-
{
|
|
920
|
+
{
|
|
921
|
+
"method": "GET",
|
|
922
|
+
"url": "http://www.evilcorp.com/asdf",
|
|
923
|
+
"hash": {"header_mmh3": "1", "body_mmh3": "2"},
|
|
924
|
+
"raw_header": "HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.evilcorp.com/asdf\r\n\r\n",
|
|
925
|
+
},
|
|
910
926
|
"HTTP_RESPONSE",
|
|
911
927
|
parent=event1,
|
|
912
928
|
)
|
|
@@ -122,7 +122,7 @@ async def test_helpers_misc(helpers, scan, bbot_scanner, bbot_httpserver):
|
|
|
122
122
|
assert not helpers.is_dns_name("evilcorp.com:80")
|
|
123
123
|
assert not helpers.is_dns_name("http://evilcorp.com:80")
|
|
124
124
|
assert helpers.is_dns_name("evilcorp")
|
|
125
|
-
assert
|
|
125
|
+
assert helpers.is_dns_name("evilcorp.")
|
|
126
126
|
assert helpers.is_dns_name("ドメイン.テスト")
|
|
127
127
|
assert not helpers.is_dns_name("127.0.0.1")
|
|
128
128
|
assert not helpers.is_dns_name("dead::beef")
|