bbot 2.1.0.5004rc0__tar.gz → 2.1.0.5021rc0__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.
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/PKG-INFO +1 -1
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/__init__.py +1 -1
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/event/base.py +10 -1
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/misc.py +10 -3
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/base.py +4 -1
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/generic_ssrf.py +2 -2
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/internal/dnsresolve.py +0 -6
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/internal/excavate.py +2 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/internal/speculate.py +3 -4
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/shodan_dns.py +7 -9
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/templates/subdomain_enum.py +43 -4
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/trickest.py +4 -28
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/virustotal.py +4 -14
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/scanner.py +13 -11
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_events.py +25 -2
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_helpers.py +15 -2
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +9 -7
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_modules_basic.py +7 -6
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_presets.py +5 -0
- bbot-2.1.0.5021rc0/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +40 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/pyproject.toml +2 -2
- bbot-2.1.0.5004rc0/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -21
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/LICENSE +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/README.md +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/cli.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/config/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/config/files.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/config/logger.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/core.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/engine.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/event/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/event/helpers.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/flags.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/async_helpers.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/bloom.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/cache.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/command.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/depsinstaller/installer.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/diff.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/dns/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/dns/brute.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/dns/dns.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/dns/engine.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/dns/helpers.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/dns/mock.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/files.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/helper.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/interactsh.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/names_generator.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/ntlm.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/process.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/ratelimiter.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/regex.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/regexes.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/url.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/validators.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/web/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/web/client.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/web/engine.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/web/web.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/helpers/wordcloud.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/modules.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/core/shared_deps.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/defaults.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/errors.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/logger.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/ajaxpro.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/anubisdb.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/apkpure.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/azure_realm.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/azure_tenant.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/baddns.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/baddns_direct.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/baddns_zone.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/badsecrets.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/bevigil.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/binaryedge.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/bucket_amazon.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/bucket_azure.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/bucket_digitalocean.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/bucket_file_enum.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/bucket_firebase.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/bucket_google.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/builtwith.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/bypass403.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/c99.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/censys.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/certspotter.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/chaos.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/code_repository.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/columbus.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/credshed.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/crt.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/deadly/dastardly.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/deadly/ffuf.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/deadly/nuclei.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/deadly/vhost.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/dehashed.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/digitorus.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/dnsbrute.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/dnscaa.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/dnscommonsrv.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/dnsdumpster.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/docker_pull.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/dockerhub.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/dotnetnuke.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/emailformat.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/ffuf_shortnames.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/filedownload.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/fingerprintx.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/fullhunt.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/git.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/git_clone.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/github_codesearch.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/github_org.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/github_workflows.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/gitlab.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/google_playstore.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/gowitness.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/hackertarget.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/host_header.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/httpx.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/hunt.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/hunterio.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/iis_shortnames.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/internal/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/internal/aggregate.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/internal/base.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/internal/cloudcheck.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/internetdb.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/ip2location.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/ipneighbor.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/ipstack.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/leakix.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/myssl.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/newsletters.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/ntlm.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/oauth.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/otx.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/asset_inventory.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/base.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/csv.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/discord.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/emails.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/http.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/json.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/neo4j.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/python.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/slack.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/splunk.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/stdout.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/subdomains.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/teams.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/txt.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/web_report.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/output/websocket.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/paramminer_cookies.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/paramminer_getparams.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/paramminer_headers.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/passivetotal.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/pgp.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/portscan.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/postman.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/postman_download.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/rapiddns.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/report/affiliates.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/report/asn.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/report/base.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/robots.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/secretsdb.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/securitytrails.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/securitytxt.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/sitedossier.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/skymem.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/smuggler.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/social.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/sslcert.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/subdomaincenter.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/subdomainradar.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/telerik.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/templates/bucket.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/templates/github.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/templates/postman.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/templates/shodan.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/templates/webhook.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/trufflehog.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/unstructured.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/url_manipulation.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/urlscan.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/viewdns.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/wafw00f.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/wappalyzer.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/wayback.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/wpscan.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/modules/zoomeye.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/baddns-thorough.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/cloud-enum.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/code-enum.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/email-enum.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/kitchen-sink.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/spider.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/subdomain-enum.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/web/dirbust-light.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/web/paramminer.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/web-basic.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/web-screenshots.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/presets/web-thorough.yml +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/dispatcher.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/manager.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/preset/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/preset/args.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/preset/conditions.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/preset/environ.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/preset/path.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/preset/preset.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/stats.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scanner/target.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/scripts/docs.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/bbot_fixtures.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/conftest.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/coverage.cfg +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/owasp_mastg.apk +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/run_tests.sh +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test.conf +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_output.ndjson +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_cli.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_command.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_config.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_dns.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_docs.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_engine.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_files.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_scan.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_scope.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_target.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_web.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/base.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/testsslcert.pem +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/testsslkey.pem +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/wordlists/devops_mutations.txt +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/wordlists/nameservers.txt +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
- {bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
|
@@ -25,6 +25,7 @@ from bbot.core.helpers import (
|
|
|
25
25
|
is_domain,
|
|
26
26
|
is_subdomain,
|
|
27
27
|
is_ip,
|
|
28
|
+
is_ip_type,
|
|
28
29
|
is_ptr,
|
|
29
30
|
is_uri,
|
|
30
31
|
url_depth,
|
|
@@ -352,6 +353,12 @@ class BaseEvent:
|
|
|
352
353
|
return 80
|
|
353
354
|
return self._port
|
|
354
355
|
|
|
356
|
+
@property
|
|
357
|
+
def netloc(self):
|
|
358
|
+
if self.host and is_ip_type(self.host, network=False):
|
|
359
|
+
return make_netloc(self.host, self.port)
|
|
360
|
+
return None
|
|
361
|
+
|
|
355
362
|
@property
|
|
356
363
|
def host_stem(self):
|
|
357
364
|
"""
|
|
@@ -741,7 +748,7 @@ class BaseEvent:
|
|
|
741
748
|
"""
|
|
742
749
|
j = dict()
|
|
743
750
|
# type, ID, scope description
|
|
744
|
-
for i in ("type", "id", "uuid", "scope_description"):
|
|
751
|
+
for i in ("type", "id", "uuid", "scope_description", "netloc"):
|
|
745
752
|
v = getattr(self, i, "")
|
|
746
753
|
if v:
|
|
747
754
|
j.update({i: str(v)})
|
|
@@ -760,6 +767,8 @@ class BaseEvent:
|
|
|
760
767
|
j["host"] = str(self.host)
|
|
761
768
|
j["resolved_hosts"] = sorted(str(h) for h in self.resolved_hosts)
|
|
762
769
|
j["dns_children"] = {k: list(v) for k, v in self.dns_children.items()}
|
|
770
|
+
if isinstance(self.port, int):
|
|
771
|
+
j["port"] = self.port
|
|
763
772
|
# web spider distance
|
|
764
773
|
web_spider_distance = getattr(self, "web_spider_distance", None)
|
|
765
774
|
if web_spider_distance is not None:
|
|
@@ -621,12 +621,13 @@ def is_ip(d, version=None):
|
|
|
621
621
|
return False
|
|
622
622
|
|
|
623
623
|
|
|
624
|
-
def is_ip_type(i):
|
|
624
|
+
def is_ip_type(i, network=None):
|
|
625
625
|
"""
|
|
626
626
|
Checks if the given object is an instance of an IPv4 or IPv6 type from the ipaddress module.
|
|
627
627
|
|
|
628
628
|
Args:
|
|
629
629
|
i (ipaddress._BaseV4 or ipaddress._BaseV6): The IP object to check.
|
|
630
|
+
network (bool, optional): Whether to restrict the check to network types (IPv4Network or IPv6Network). Defaults to False.
|
|
630
631
|
|
|
631
632
|
Returns:
|
|
632
633
|
bool: True if the object is an instance of ipaddress._BaseV4 or ipaddress._BaseV6, False otherwise.
|
|
@@ -639,6 +640,12 @@ def is_ip_type(i):
|
|
|
639
640
|
>>> is_ip_type("192.168.1.0/24")
|
|
640
641
|
False
|
|
641
642
|
"""
|
|
643
|
+
if network is not None:
|
|
644
|
+
is_network = ipaddress._BaseNetwork in i.__class__.__mro__
|
|
645
|
+
if network:
|
|
646
|
+
return is_network
|
|
647
|
+
else:
|
|
648
|
+
return not is_network
|
|
642
649
|
return ipaddress._IPAddressBase in i.__class__.__mro__
|
|
643
650
|
|
|
644
651
|
|
|
@@ -1260,7 +1267,7 @@ def gen_numbers(n, padding=2):
|
|
|
1260
1267
|
return results
|
|
1261
1268
|
|
|
1262
1269
|
|
|
1263
|
-
def make_netloc(host, port):
|
|
1270
|
+
def make_netloc(host, port=None):
|
|
1264
1271
|
"""Constructs a network location string from a given host and port.
|
|
1265
1272
|
|
|
1266
1273
|
Args:
|
|
@@ -1289,7 +1296,7 @@ def make_netloc(host, port):
|
|
|
1289
1296
|
if is_ip(host, version=6):
|
|
1290
1297
|
host = f"[{host}]"
|
|
1291
1298
|
if port is None:
|
|
1292
|
-
return host
|
|
1299
|
+
return str(host)
|
|
1293
1300
|
return f"{host}:{port}"
|
|
1294
1301
|
|
|
1295
1302
|
|
|
@@ -984,8 +984,11 @@ class BaseModule:
|
|
|
984
984
|
def _outgoing_dedup_hash(self, event):
|
|
985
985
|
"""
|
|
986
986
|
Determines the criteria for what is considered to be a duplicate event if `suppress_dupes` is True.
|
|
987
|
+
|
|
988
|
+
We take into account the `internal` attribute we don't want an internal event (which isn't distributed to output modules)
|
|
989
|
+
to inadvertently suppress a non-internal event.
|
|
987
990
|
"""
|
|
988
|
-
return hash((event, self.name))
|
|
991
|
+
return hash((event, self.name, event.internal, event.always_emit))
|
|
989
992
|
|
|
990
993
|
def get_per_host_hash(self, event):
|
|
991
994
|
"""
|
|
@@ -137,10 +137,10 @@ class Generic_XXE(BaseSubmodule):
|
|
|
137
137
|
post_body = f"""<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
138
138
|
<!DOCTYPE foo [
|
|
139
139
|
<!ELEMENT foo ANY >
|
|
140
|
-
<!ENTITY
|
|
140
|
+
<!ENTITY {rand_entity} SYSTEM "http://{subdomain_tag}.{self.parent_module.interactsh_domain}" >
|
|
141
141
|
]>
|
|
142
142
|
<foo>&{rand_entity};</foo>"""
|
|
143
|
-
test_url =
|
|
143
|
+
test_url = event.parsed_url.geturl()
|
|
144
144
|
r = await self.parent_module.helpers.curl(
|
|
145
145
|
url=test_url, method="POST", raw_body=post_body, headers={"Content-type": "application/xml"}
|
|
146
146
|
)
|
|
@@ -16,12 +16,6 @@ class DNSResolve(BaseInterceptModule):
|
|
|
16
16
|
_name = "host"
|
|
17
17
|
_type = "internal"
|
|
18
18
|
|
|
19
|
-
def _outgoing_dedup_hash(self, event):
|
|
20
|
-
# this exists to ensure a second, more interesting host isn't passed up
|
|
21
|
-
# because its ugly cousin spent its one dedup token before it arrived
|
|
22
|
-
# by removing those race conditions, this makes for more consistent results
|
|
23
|
-
return hash((event, self.name, event.always_emit))
|
|
24
|
-
|
|
25
19
|
@property
|
|
26
20
|
def module_threads(self):
|
|
27
21
|
return self.dns_config.get("threads", 25)
|
|
@@ -876,6 +876,8 @@ class excavate(BaseInternalModule, BaseInterceptModule):
|
|
|
876
876
|
yara_rules_combined = "\n".join(self.yara_rules_dict.values())
|
|
877
877
|
try:
|
|
878
878
|
self.info(f"Compiling {len(self.yara_rules_dict):,} YARA rules")
|
|
879
|
+
for rule_name, rule_content in self.yara_rules_dict.items():
|
|
880
|
+
self.debug(f" - {rule_name}")
|
|
879
881
|
self.yara_rules = yara.compile(source=yara_rules_combined)
|
|
880
882
|
except yara.SyntaxError as e:
|
|
881
883
|
self.debug(yara_rules_combined)
|
|
@@ -112,15 +112,15 @@ class speculate(BaseInternalModule):
|
|
|
112
112
|
speculate_open_ports = self.emit_open_ports and event_in_scope_distance
|
|
113
113
|
|
|
114
114
|
# URL --> OPEN_TCP_PORT
|
|
115
|
-
|
|
115
|
+
event_is_url = event.type == "URL"
|
|
116
|
+
if event_is_url or (event.type == "URL_UNVERIFIED" and self.open_port_consumers):
|
|
116
117
|
# only speculate port from a URL if it wouldn't be speculated naturally from the host
|
|
117
118
|
if event.host and (event.port not in self.ports or not speculate_open_ports):
|
|
118
119
|
await self.emit_event(
|
|
119
120
|
self.helpers.make_netloc(event.host, event.port),
|
|
120
121
|
"OPEN_TCP_PORT",
|
|
121
122
|
parent=event,
|
|
122
|
-
internal=
|
|
123
|
-
quick=(event.type == "URL"),
|
|
123
|
+
internal=not event_is_url, # if the URL is verified, the port is definitely open
|
|
124
124
|
context=f"speculated {{event.type}} from {event.type}: {{event.data}}",
|
|
125
125
|
)
|
|
126
126
|
|
|
@@ -169,7 +169,6 @@ class speculate(BaseInternalModule):
|
|
|
169
169
|
"OPEN_TCP_PORT",
|
|
170
170
|
parent=event,
|
|
171
171
|
internal=True,
|
|
172
|
-
quick=True,
|
|
173
172
|
context="speculated {event.type}: {event.data}",
|
|
174
173
|
)
|
|
175
174
|
|
|
@@ -16,13 +16,11 @@ class shodan_dns(shodan):
|
|
|
16
16
|
|
|
17
17
|
base_url = "https://api.shodan.io"
|
|
18
18
|
|
|
19
|
-
async def
|
|
20
|
-
|
|
21
|
-
response = await self.api_request(url)
|
|
22
|
-
return response
|
|
19
|
+
async def handle_event(self, event):
|
|
20
|
+
await self.handle_event_paginated(event)
|
|
23
21
|
|
|
24
|
-
def
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
def make_url(self, query):
|
|
23
|
+
return f"{self.base_url}/dns/domain/{self.helpers.quote(query)}?key={{api_key}}&page={{page}}"
|
|
24
|
+
|
|
25
|
+
def parse_results(self, json, query):
|
|
26
|
+
return [f"{sub}.{query}" for sub in json.get("subdomains", [])]
|
|
@@ -31,6 +31,11 @@ class subdomain_enum(BaseModule):
|
|
|
31
31
|
# "lowest_parent": dedupe by lowest parent (lowest parent of www.api.test.evilcorp.com is api.test.evilcorp.com)
|
|
32
32
|
dedup_strategy = "highest_parent"
|
|
33
33
|
|
|
34
|
+
# how many results to request per API call
|
|
35
|
+
page_size = 100
|
|
36
|
+
# arguments to pass to api_page_iter
|
|
37
|
+
api_page_iter_kwargs = {}
|
|
38
|
+
|
|
34
39
|
@property
|
|
35
40
|
def source_pretty_name(self):
|
|
36
41
|
return f"{self.__class__.__name__} API"
|
|
@@ -61,10 +66,31 @@ class subdomain_enum(BaseModule):
|
|
|
61
66
|
context=f'{{module}} searched {self.source_pretty_name} for "{query}" and found {{event.type}}: {{event.data}}',
|
|
62
67
|
)
|
|
63
68
|
|
|
69
|
+
async def handle_event_paginated(self, event):
|
|
70
|
+
query = self.make_query(event)
|
|
71
|
+
async for result_batch in self.query_paginated(query):
|
|
72
|
+
for hostname in set(result_batch):
|
|
73
|
+
try:
|
|
74
|
+
hostname = self.helpers.validators.validate_host(hostname)
|
|
75
|
+
except ValueError as e:
|
|
76
|
+
self.verbose(e)
|
|
77
|
+
continue
|
|
78
|
+
if hostname and hostname.endswith(f".{query}") and not hostname == event.data:
|
|
79
|
+
await self.emit_event(
|
|
80
|
+
hostname,
|
|
81
|
+
"DNS_NAME",
|
|
82
|
+
event,
|
|
83
|
+
abort_if=self.abort_if,
|
|
84
|
+
context=f'{{module}} searched {self.source_pretty_name} for "{query}" and found {{event.type}}: {{event.data}}',
|
|
85
|
+
)
|
|
86
|
+
|
|
64
87
|
async def request_url(self, query):
|
|
65
|
-
url =
|
|
88
|
+
url = self.make_url(query)
|
|
66
89
|
return await self.api_request(url)
|
|
67
90
|
|
|
91
|
+
def make_url(self, query):
|
|
92
|
+
return f"{self.base_url}/subdomains/{self.helpers.quote(query)}"
|
|
93
|
+
|
|
68
94
|
def make_query(self, event):
|
|
69
95
|
query = event.data
|
|
70
96
|
parents = list(self.helpers.domain_parents(event.data))
|
|
@@ -86,11 +112,11 @@ class subdomain_enum(BaseModule):
|
|
|
86
112
|
for hostname in json:
|
|
87
113
|
yield hostname
|
|
88
114
|
|
|
89
|
-
async def query(self, query,
|
|
90
|
-
if parse_fn is None:
|
|
91
|
-
parse_fn = self.parse_results
|
|
115
|
+
async def query(self, query, request_fn=None, parse_fn=None):
|
|
92
116
|
if request_fn is None:
|
|
93
117
|
request_fn = self.request_url
|
|
118
|
+
if parse_fn is None:
|
|
119
|
+
parse_fn = self.parse_results
|
|
94
120
|
try:
|
|
95
121
|
response = await request_fn(query)
|
|
96
122
|
if response is None:
|
|
@@ -113,6 +139,19 @@ class subdomain_enum(BaseModule):
|
|
|
113
139
|
except Exception as e:
|
|
114
140
|
self.info(f"Error retrieving results for {query}: {e}", trace=True)
|
|
115
141
|
|
|
142
|
+
async def query_paginated(self, query):
|
|
143
|
+
url = self.make_url(query)
|
|
144
|
+
agen = self.api_page_iter(url, page_size=self.page_size, **self.api_page_iter_kwargs)
|
|
145
|
+
try:
|
|
146
|
+
async for response in agen:
|
|
147
|
+
subdomains = self.parse_results(response, query)
|
|
148
|
+
self.verbose(f'Got {len(subdomains):,} subdomains for "{query}"')
|
|
149
|
+
if not subdomains:
|
|
150
|
+
break
|
|
151
|
+
yield subdomains
|
|
152
|
+
finally:
|
|
153
|
+
agen.aclose()
|
|
154
|
+
|
|
116
155
|
async def _is_wildcard(self, query):
|
|
117
156
|
rdtypes = ("A", "AAAA", "CNAME")
|
|
118
157
|
if self.helpers.is_dns_name(query):
|
|
@@ -28,39 +28,15 @@ class Trickest(subdomain_enum_apikey):
|
|
|
28
28
|
return url, kwargs
|
|
29
29
|
|
|
30
30
|
async def handle_event(self, event):
|
|
31
|
-
|
|
32
|
-
async for result_batch in self.query(query):
|
|
33
|
-
for hostname in set(result_batch):
|
|
34
|
-
try:
|
|
35
|
-
hostname = self.helpers.validators.validate_host(hostname)
|
|
36
|
-
except ValueError as e:
|
|
37
|
-
self.verbose(e)
|
|
38
|
-
continue
|
|
39
|
-
if hostname and hostname.endswith(f".{query}") and not hostname == event.data:
|
|
40
|
-
await self.emit_event(
|
|
41
|
-
hostname,
|
|
42
|
-
"DNS_NAME",
|
|
43
|
-
event,
|
|
44
|
-
abort_if=self.abort_if,
|
|
45
|
-
context=f'{{module}} searched {self.source_pretty_name} for "{query}" and found {{event.type}}: {{event.data}}',
|
|
46
|
-
)
|
|
31
|
+
await self.handle_event_paginated(event)
|
|
47
32
|
|
|
48
|
-
|
|
33
|
+
def make_url(self, query):
|
|
49
34
|
url = f"{self.base_url}/view?q=hostname%20~%20%22.{self.helpers.quote(query)}%22"
|
|
50
35
|
url += f"&dataset_id={self.dataset_id}"
|
|
51
36
|
url += "&limit={page_size}&offset={offset}&select=hostname&orderby=hostname"
|
|
52
|
-
|
|
53
|
-
try:
|
|
54
|
-
async for response in agen:
|
|
55
|
-
subdomains = self.parse_results(response)
|
|
56
|
-
self.verbose(f'Got {len(subdomains):,} subdomains for "{query}"')
|
|
57
|
-
if not subdomains:
|
|
58
|
-
break
|
|
59
|
-
yield subdomains
|
|
60
|
-
finally:
|
|
61
|
-
agen.aclose()
|
|
37
|
+
return url
|
|
62
38
|
|
|
63
|
-
def parse_results(self, j):
|
|
39
|
+
def parse_results(self, j, query):
|
|
64
40
|
results = j.get("results", [])
|
|
65
41
|
subdomains = set()
|
|
66
42
|
for item in results:
|
|
@@ -15,6 +15,10 @@ class virustotal(subdomain_enum_apikey):
|
|
|
15
15
|
options_desc = {"api_key": "VirusTotal API Key"}
|
|
16
16
|
|
|
17
17
|
base_url = "https://www.virustotal.com/api/v3"
|
|
18
|
+
api_page_iter_kwargs = {"json": False, "next_key": lambda r: r.json().get("links", {}).get("next", "")}
|
|
19
|
+
|
|
20
|
+
def make_url(self, query):
|
|
21
|
+
return f"{self.base_url}/domains/{self.helpers.quote(query)}/subdomains"
|
|
18
22
|
|
|
19
23
|
def prepare_api_request(self, url, kwargs):
|
|
20
24
|
kwargs["headers"]["x-apikey"] = self.api_key
|
|
@@ -28,17 +32,3 @@ class virustotal(subdomain_enum_apikey):
|
|
|
28
32
|
if match.endswith(query):
|
|
29
33
|
results.add(match)
|
|
30
34
|
return results
|
|
31
|
-
|
|
32
|
-
async def query(self, query):
|
|
33
|
-
results = set()
|
|
34
|
-
url = f"{self.base_url}/domains/{self.helpers.quote(query)}/subdomains"
|
|
35
|
-
agen = self.api_page_iter(url, json=False, next_key=lambda r: r.json().get("links", {}).get("next", ""))
|
|
36
|
-
try:
|
|
37
|
-
async for response in agen:
|
|
38
|
-
r = self.parse_results(response, query)
|
|
39
|
-
if not r:
|
|
40
|
-
break
|
|
41
|
-
results.update(r)
|
|
42
|
-
finally:
|
|
43
|
-
agen.aclose()
|
|
44
|
-
return results
|
|
@@ -130,20 +130,22 @@ class Scanner:
|
|
|
130
130
|
else:
|
|
131
131
|
self.id = f"SCAN:{sha1(rand_string(20)).hexdigest()}"
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
custom_preset = kwargs.pop("preset", None)
|
|
134
134
|
kwargs["_log"] = True
|
|
135
135
|
|
|
136
136
|
from .preset import Preset
|
|
137
137
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if not isinstance(
|
|
142
|
-
raise ValidationError(f'Preset must be of type Preset, not "{type(
|
|
143
|
-
|
|
138
|
+
base_preset = Preset(*targets, **kwargs)
|
|
139
|
+
|
|
140
|
+
if custom_preset is not None:
|
|
141
|
+
if not isinstance(custom_preset, Preset):
|
|
142
|
+
raise ValidationError(f'Preset must be of type Preset, not "{type(custom_preset).__name__}"')
|
|
143
|
+
base_preset.merge(custom_preset)
|
|
144
|
+
|
|
145
|
+
self.preset = base_preset.bake(self)
|
|
144
146
|
|
|
145
147
|
# scan name
|
|
146
|
-
if preset.scan_name is None:
|
|
148
|
+
if self.preset.scan_name is None:
|
|
147
149
|
tries = 0
|
|
148
150
|
while 1:
|
|
149
151
|
if tries > 5:
|
|
@@ -158,7 +160,7 @@ class Scanner:
|
|
|
158
160
|
break
|
|
159
161
|
tries += 1
|
|
160
162
|
else:
|
|
161
|
-
scan_name = str(preset.scan_name)
|
|
163
|
+
scan_name = str(self.preset.scan_name)
|
|
162
164
|
self.name = scan_name
|
|
163
165
|
|
|
164
166
|
# make sure the preset has a description
|
|
@@ -166,8 +168,8 @@ class Scanner:
|
|
|
166
168
|
self.preset.description = self.name
|
|
167
169
|
|
|
168
170
|
# scan output dir
|
|
169
|
-
if preset.output_dir is not None:
|
|
170
|
-
self.home = Path(preset.output_dir).resolve() / self.name
|
|
171
|
+
if self.preset.output_dir is not None:
|
|
172
|
+
self.home = Path(self.preset.output_dir).resolve() / self.name
|
|
171
173
|
else:
|
|
172
174
|
self.home = self.preset.bbot_home / "scans" / self.name
|
|
173
175
|
|
|
@@ -14,10 +14,19 @@ async def test_events(events, helpers):
|
|
|
14
14
|
await scan._prep()
|
|
15
15
|
|
|
16
16
|
assert events.ipv4.type == "IP_ADDRESS"
|
|
17
|
+
assert events.ipv4.netloc == "8.8.8.8"
|
|
18
|
+
assert events.ipv4.port is None
|
|
17
19
|
assert events.ipv6.type == "IP_ADDRESS"
|
|
20
|
+
assert events.ipv6.netloc == "[2001:4860:4860::8888]"
|
|
21
|
+
assert events.ipv6.port is None
|
|
22
|
+
assert events.ipv6_open_port.netloc == "[2001:4860:4860::8888]:443"
|
|
18
23
|
assert events.netv4.type == "IP_RANGE"
|
|
24
|
+
assert events.netv4.netloc is None
|
|
25
|
+
assert "netloc" not in events.netv4.json()
|
|
19
26
|
assert events.netv6.type == "IP_RANGE"
|
|
20
27
|
assert events.domain.type == "DNS_NAME"
|
|
28
|
+
assert events.domain.netloc == "publicapis.org"
|
|
29
|
+
assert events.domain.port is None
|
|
21
30
|
assert "domain" in events.domain.tags
|
|
22
31
|
assert events.subdomain.type == "DNS_NAME"
|
|
23
32
|
assert "subdomain" in events.subdomain.tags
|
|
@@ -67,8 +76,14 @@ async def test_events(events, helpers):
|
|
|
67
76
|
assert not events.netv6 in events.domain
|
|
68
77
|
assert events.emoji not in events.domain
|
|
69
78
|
assert events.domain not in events.emoji
|
|
70
|
-
|
|
71
|
-
|
|
79
|
+
open_port_event = scan.make_event(" eViLcorp.COM.:88", "DNS_NAME", dummy=True)
|
|
80
|
+
dns_event = scan.make_event("evilcorp.com.", "DNS_NAME", dummy=True)
|
|
81
|
+
for e in (open_port_event, dns_event):
|
|
82
|
+
assert "evilcorp.com" == e
|
|
83
|
+
assert e.netloc == "evilcorp.com"
|
|
84
|
+
assert e.json()["netloc"] == "evilcorp.com"
|
|
85
|
+
assert e.port is None
|
|
86
|
+
assert "port" not in e.json()
|
|
72
87
|
|
|
73
88
|
# url tests
|
|
74
89
|
assert scan.make_event("http://evilcorp.com", dummy=True) == scan.make_event("http://evilcorp.com/", dummy=True)
|
|
@@ -78,8 +93,14 @@ async def test_events(events, helpers):
|
|
|
78
93
|
assert "api.publicapis.org:443" in events.url_unverified
|
|
79
94
|
assert "publicapis.org" not in events.url_unverified
|
|
80
95
|
assert events.ipv4_url_unverified in events.ipv4
|
|
96
|
+
assert events.ipv4_url_unverified.netloc == "8.8.8.8:443"
|
|
97
|
+
assert events.ipv4_url_unverified.port == 443
|
|
98
|
+
assert events.ipv4_url_unverified.json()["port"] == 443
|
|
81
99
|
assert events.ipv4_url_unverified in events.netv4
|
|
82
100
|
assert events.ipv6_url_unverified in events.ipv6
|
|
101
|
+
assert events.ipv6_url_unverified.netloc == "[2001:4860:4860::8888]:443"
|
|
102
|
+
assert events.ipv6_url_unverified.port == 443
|
|
103
|
+
assert events.ipv6_url_unverified.json()["port"] == 443
|
|
83
104
|
assert events.ipv6_url_unverified in events.netv6
|
|
84
105
|
assert events.emoji not in events.url_unverified
|
|
85
106
|
assert events.emoji not in events.ipv6_url_unverified
|
|
@@ -193,6 +214,8 @@ async def test_events(events, helpers):
|
|
|
193
214
|
|
|
194
215
|
org_stub_1 = scan.make_event("STUB1", "ORG_STUB", parent=scan.root_event)
|
|
195
216
|
org_stub_1.scope_distance == 1
|
|
217
|
+
assert org_stub_1.netloc == None
|
|
218
|
+
assert "netloc" not in org_stub_1.json()
|
|
196
219
|
org_stub_2 = scan.make_event("STUB2", "ORG_STUB", parent=org_stub_1)
|
|
197
220
|
org_stub_2.scope_distance == 2
|
|
198
221
|
|
|
@@ -94,6 +94,15 @@ async def test_helpers_misc(helpers, scan, bbot_scanner, bbot_httpserver):
|
|
|
94
94
|
]
|
|
95
95
|
assert helpers.is_ip("127.0.0.1")
|
|
96
96
|
assert not helpers.is_ip("127.0.0.0.1")
|
|
97
|
+
|
|
98
|
+
assert not helpers.is_ip_type("127.0.0.1")
|
|
99
|
+
assert helpers.is_ip_type(ipaddress.ip_address("127.0.0.1"))
|
|
100
|
+
assert not helpers.is_ip_type(ipaddress.ip_address("127.0.0.1"), network=True)
|
|
101
|
+
assert helpers.is_ip_type(ipaddress.ip_address("127.0.0.1"), network=False)
|
|
102
|
+
assert helpers.is_ip_type(ipaddress.ip_network("127.0.0.0/8"))
|
|
103
|
+
assert helpers.is_ip_type(ipaddress.ip_network("127.0.0.0/8"), network=True)
|
|
104
|
+
assert not helpers.is_ip_type(ipaddress.ip_network("127.0.0.0/8"), network=False)
|
|
105
|
+
|
|
97
106
|
assert helpers.is_dns_name("evilcorp.com")
|
|
98
107
|
assert helpers.is_dns_name("evilcorp")
|
|
99
108
|
assert not helpers.is_dns_name("evilcorp", include_local=False)
|
|
@@ -212,8 +221,12 @@ async def test_helpers_misc(helpers, scan, bbot_scanner, bbot_httpserver):
|
|
|
212
221
|
|
|
213
222
|
ipv4_netloc = helpers.make_netloc("192.168.1.1", 80)
|
|
214
223
|
assert ipv4_netloc == "192.168.1.1:80"
|
|
215
|
-
|
|
216
|
-
assert
|
|
224
|
+
assert helpers.make_netloc("192.168.1.1") == "192.168.1.1"
|
|
225
|
+
assert helpers.make_netloc(ipaddress.ip_address("192.168.1.1"), None) == "192.168.1.1"
|
|
226
|
+
assert helpers.make_netloc("dead::beef", "443") == "[dead::beef]:443"
|
|
227
|
+
assert helpers.make_netloc(ipaddress.ip_address("dead::beef"), 443) == "[dead::beef]:443"
|
|
228
|
+
assert helpers.make_netloc("dead::beef", None) == "[dead::beef]"
|
|
229
|
+
assert helpers.make_netloc(ipaddress.ip_address("dead::beef"), None) == "[dead::beef]"
|
|
217
230
|
|
|
218
231
|
assert helpers.get_file_extension("https://evilcorp.com/evilcorp.com/test/asdf.TXT") == "txt"
|
|
219
232
|
assert helpers.get_file_extension("/etc/conf/test.tar.gz") == "gz"
|
{bbot-2.1.0.5004rc0 → bbot-2.1.0.5021rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py
RENAMED
|
@@ -575,7 +575,7 @@ async def test_manager_scope_accuracy(bbot_scanner, bbot_httpserver, bbot_other_
|
|
|
575
575
|
},
|
|
576
576
|
)
|
|
577
577
|
|
|
578
|
-
assert len(events) ==
|
|
578
|
+
assert len(events) == 12
|
|
579
579
|
assert 1 == len([e for e in events if e.type == "IP_RANGE" and e.data == "127.0.0.110/31" and e.internal == False and e.scope_distance == 0])
|
|
580
580
|
assert 0 == len([e for e in events if e.type == "IP_ADDRESS" and e.data == "127.0.0.110"])
|
|
581
581
|
assert 1 == len([e for e in events if e.type == "IP_ADDRESS" and e.data == "127.0.0.111" and e.internal == False and e.scope_distance == 0])
|
|
@@ -589,9 +589,9 @@ async def test_manager_scope_accuracy(bbot_scanner, bbot_httpserver, bbot_other_
|
|
|
589
589
|
assert 0 == len([e for e in events if e.type == "URL_UNVERIFIED" and e.data == "http://127.0.0.33:8889/"])
|
|
590
590
|
assert 1 == len([e for e in events if e.type == "IP_ADDRESS" and e.data == "127.0.0.33" and e.internal == False and e.scope_distance == 0])
|
|
591
591
|
assert 0 == len([e for e in events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.222:8888"])
|
|
592
|
-
assert
|
|
592
|
+
assert 1 == len([e for e in events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.222:8889"])
|
|
593
593
|
assert 0 == len([e for e in events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.33:8888"])
|
|
594
|
-
assert
|
|
594
|
+
assert 1 == len([e for e in events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.33:8889"])
|
|
595
595
|
assert 1 == len([e for e in events if e.type == "URL" and e.data == "http://127.0.0.222:8889/" and e.internal == False and e.scope_distance == 0])
|
|
596
596
|
assert 0 == len([e for e in events if e.type == "HTTP_RESPONSE" and e.data["input"] == "127.0.0.222:8889"])
|
|
597
597
|
assert 1 == len([e for e in events if e.type == "URL" and e.data == "http://127.0.0.33:8889/" and e.internal == False and e.scope_distance == 0])
|
|
@@ -603,7 +603,7 @@ async def test_manager_scope_accuracy(bbot_scanner, bbot_httpserver, bbot_other_
|
|
|
603
603
|
assert 0 == len([e for e in events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.44:8888"])
|
|
604
604
|
assert 0 == len([e for e in events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.55:8888"])
|
|
605
605
|
|
|
606
|
-
assert len(all_events) ==
|
|
606
|
+
assert len(all_events) == 31
|
|
607
607
|
assert 1 == len([e for e in all_events if e.type == "IP_RANGE" and e.data == "127.0.0.110/31" and e.internal == False and e.scope_distance == 0])
|
|
608
608
|
assert 1 == len([e for e in all_events if e.type == "IP_ADDRESS" and e.data == "127.0.0.110" and e.internal == True and e.scope_distance == 0])
|
|
609
609
|
assert 2 == len([e for e in all_events if e.type == "IP_ADDRESS" and e.data == "127.0.0.111" and e.internal == False and e.scope_distance == 0])
|
|
@@ -618,8 +618,10 @@ async def test_manager_scope_accuracy(bbot_scanner, bbot_httpserver, bbot_other_
|
|
|
618
618
|
assert 1 == len([e for e in all_events if e.type == "IP_ADDRESS" and e.data == "127.0.0.33" and e.internal == False and e.scope_distance == 0])
|
|
619
619
|
assert 1 == len([e for e in all_events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.222:8888" and e.internal == True and e.scope_distance == 0])
|
|
620
620
|
assert 1 == len([e for e in all_events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.222:8889" and e.internal == True and e.scope_distance == 0])
|
|
621
|
+
assert 1 == len([e for e in all_events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.222:8889" and e.internal == False and e.scope_distance == 0])
|
|
621
622
|
assert 1 == len([e for e in all_events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.33:8888" and e.internal == True and e.scope_distance == 0])
|
|
622
623
|
assert 1 == len([e for e in all_events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.33:8889" and e.internal == True and e.scope_distance == 0])
|
|
624
|
+
assert 1 == len([e for e in all_events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.33:8889" and e.internal == False and e.scope_distance == 0])
|
|
623
625
|
assert 1 == len([e for e in all_events if e.type == "URL" and e.data == "http://127.0.0.222:8889/" and e.internal == False and e.scope_distance == 0])
|
|
624
626
|
assert 1 == len([e for e in all_events if e.type == "HTTP_RESPONSE" and e.data["url"] == "http://127.0.0.222:8889/" and e.internal == False and e.scope_distance == 0])
|
|
625
627
|
assert 1 == len([e for e in all_events if e.type == "URL" and e.data == "http://127.0.0.33:8889/" and e.internal == False and e.scope_distance == 0])
|
|
@@ -660,7 +662,7 @@ async def test_manager_scope_accuracy(bbot_scanner, bbot_httpserver, bbot_other_
|
|
|
660
662
|
assert 1 == len([e for e in all_events_nodups if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.55:8888" and e.internal == True and e.scope_distance == 1])
|
|
661
663
|
|
|
662
664
|
for _graph_output_events in (graph_output_events, graph_output_batch_events):
|
|
663
|
-
assert len(_graph_output_events) ==
|
|
665
|
+
assert len(_graph_output_events) == 12
|
|
664
666
|
assert 1 == len([e for e in _graph_output_events if e.type == "IP_RANGE" and e.data == "127.0.0.110/31" and e.internal == False and e.scope_distance == 0])
|
|
665
667
|
assert 0 == len([e for e in _graph_output_events if e.type == "IP_ADDRESS" and e.data == "127.0.0.110"])
|
|
666
668
|
assert 1 == len([e for e in _graph_output_events if e.type == "IP_ADDRESS" and e.data == "127.0.0.111" and e.internal == False and e.scope_distance == 0])
|
|
@@ -674,9 +676,9 @@ async def test_manager_scope_accuracy(bbot_scanner, bbot_httpserver, bbot_other_
|
|
|
674
676
|
assert 0 == len([e for e in _graph_output_events if e.type == "URL_UNVERIFIED" and e.data == "http://127.0.0.33:8889/"])
|
|
675
677
|
assert 1 == len([e for e in _graph_output_events if e.type == "IP_ADDRESS" and e.data == "127.0.0.33"])
|
|
676
678
|
assert 0 == len([e for e in _graph_output_events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.222:8888"])
|
|
677
|
-
assert
|
|
679
|
+
assert 1 == len([e for e in _graph_output_events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.222:8889"])
|
|
678
680
|
assert 0 == len([e for e in _graph_output_events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.33:8888"])
|
|
679
|
-
assert
|
|
681
|
+
assert 1 == len([e for e in _graph_output_events if e.type == "OPEN_TCP_PORT" and e.data == "127.0.0.33:8889"])
|
|
680
682
|
assert 1 == len([e for e in _graph_output_events if e.type == "URL" and e.data == "http://127.0.0.222:8889/" and e.internal == False and e.scope_distance == 0])
|
|
681
683
|
assert 0 == len([e for e in _graph_output_events if e.type == "HTTP_RESPONSE" and e.data["input"] == "127.0.0.222:8889"])
|
|
682
684
|
assert 1 == len([e for e in _graph_output_events if e.type == "URL" and e.data == "http://127.0.0.33:8889/" and e.internal == False and e.scope_distance == 0])
|
|
@@ -380,15 +380,14 @@ async def test_modules_basic_stats(helpers, events, bbot_scanner, httpx_mock, mo
|
|
|
380
380
|
scan.modules["dummy"] = dummy(scan)
|
|
381
381
|
events = [e async for e in scan.async_start()]
|
|
382
382
|
|
|
383
|
-
assert len(events) ==
|
|
384
|
-
for e in events:
|
|
385
|
-
log.critical(e)
|
|
383
|
+
assert len(events) == 11
|
|
386
384
|
assert 2 == len([e for e in events if e.type == "SCAN"])
|
|
387
385
|
assert 4 == len([e for e in events if e.type == "DNS_NAME"])
|
|
388
386
|
# one from target and one from speculate
|
|
389
387
|
assert 2 == len([e for e in events if e.type == "DNS_NAME" and e.data == "evilcorp.com"])
|
|
390
388
|
assert 1 == len([e for e in events if e.type == "DNS_NAME" and e.data == "www.evilcorp.com"])
|
|
391
389
|
assert 1 == len([e for e in events if e.type == "DNS_NAME" and e.data == "asdf.evilcorp.com"])
|
|
390
|
+
assert 1 == len([e for e in events if e.type == "OPEN_TCP_PORT" and e.data == "asdf.evilcorp.com:443"])
|
|
392
391
|
assert 1 == len([e for e in events if e.type == "ORG_STUB" and e.data == "evilcorp"])
|
|
393
392
|
assert 1 == len([e for e in events if e.type == "FINDING"])
|
|
394
393
|
assert 1 == len([e for e in events if e.type == "URL_UNVERIFIED"])
|
|
@@ -397,6 +396,7 @@ async def test_modules_basic_stats(helpers, events, bbot_scanner, httpx_mock, mo
|
|
|
397
396
|
"SCAN": 1,
|
|
398
397
|
"DNS_NAME": 4,
|
|
399
398
|
"URL": 1,
|
|
399
|
+
"OPEN_TCP_PORT": 1,
|
|
400
400
|
"ORG_STUB": 1,
|
|
401
401
|
"URL_UNVERIFIED": 1,
|
|
402
402
|
"FINDING": 1,
|
|
@@ -431,16 +431,17 @@ async def test_modules_basic_stats(helpers, events, bbot_scanner, httpx_mock, mo
|
|
|
431
431
|
assert python_stats.consumed == {
|
|
432
432
|
"DNS_NAME": 4,
|
|
433
433
|
"FINDING": 1,
|
|
434
|
+
"OPEN_TCP_PORT": 1,
|
|
434
435
|
"ORG_STUB": 1,
|
|
435
436
|
"SCAN": 1,
|
|
436
437
|
"URL": 1,
|
|
437
438
|
"URL_UNVERIFIED": 1,
|
|
438
439
|
}
|
|
439
|
-
assert python_stats.consumed_total ==
|
|
440
|
+
assert python_stats.consumed_total == 10
|
|
440
441
|
|
|
441
442
|
speculate_stats = scan.stats.module_stats["speculate"]
|
|
442
|
-
assert speculate_stats.produced == {"DNS_NAME": 1, "URL_UNVERIFIED": 1, "ORG_STUB": 1}
|
|
443
|
-
assert speculate_stats.produced_total ==
|
|
443
|
+
assert speculate_stats.produced == {"DNS_NAME": 1, "URL_UNVERIFIED": 1, "ORG_STUB": 1, "OPEN_TCP_PORT": 1}
|
|
444
|
+
assert speculate_stats.produced_total == 4
|
|
444
445
|
assert speculate_stats.consumed == {"URL": 1, "DNS_NAME": 3, "URL_UNVERIFIED": 1, "IP_ADDRESS": 3}
|
|
445
446
|
assert speculate_stats.consumed_total == 8
|
|
446
447
|
|
|
@@ -169,6 +169,11 @@ exclude_flags:
|
|
|
169
169
|
|
|
170
170
|
def test_preset_scope():
|
|
171
171
|
|
|
172
|
+
# test target merging
|
|
173
|
+
scan = Scanner("1.2.3.4", preset=Preset.from_dict({"target": ["evilcorp.com"]}))
|
|
174
|
+
assert set([str(h) for h in scan.preset.target.seeds.hosts]) == {"1.2.3.4", "evilcorp.com"}
|
|
175
|
+
assert set([e.data for e in scan.target]) == {"1.2.3.4", "evilcorp.com"}
|
|
176
|
+
|
|
172
177
|
blank_preset = Preset()
|
|
173
178
|
blank_preset = blank_preset.bake()
|
|
174
179
|
assert not blank_preset.target
|