bbot 2.4.2.6677rc0__tar.gz → 2.4.2.6706rc0__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.4.2.6677rc0 → bbot-2.4.2.6706rc0}/PKG-INFO +1 -1
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/__init__.py +1 -1
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/async_helpers.py +29 -8
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/defaults.yml +6 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/apkpure.py +5 -3
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/base.py +86 -32
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/docker_pull.py +3 -3
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/filedownload.py +8 -4
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/git_clone.py +5 -2
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/gitdumper.py +14 -5
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/github_workflows.py +12 -5
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/nuclei.py +4 -2
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/portscan.py +2 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/postman_download.py +6 -3
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/trufflehog.py +1 -2
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/args.py +10 -1
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/preset.py +0 -2
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/scanner.py +1 -4
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scripts/docs.py +8 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_scan.py +57 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +2 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +8 -3
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +2 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +5 -1
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +4 -1
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_gitdumper.py +2 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +3 -3
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +6 -1
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +38 -12
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/pyproject.toml +1 -1
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/LICENSE +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/README.md +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/cli.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/config/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/config/files.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/config/logger.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/core.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/engine.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/event/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/event/base.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/event/helpers.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/flags.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/bloom.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/cache.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/command.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/depsinstaller/installer.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/diff.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/brute.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/dns.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/engine.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/helpers.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/mock.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/files.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/helper.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/interactsh.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/libmagic.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/misc.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/names_generator.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/ntlm.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/process.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/ratelimiter.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/regex.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/regexes.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/url.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/validators.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/client.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/engine.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/envelopes.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/web.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/wordcloud.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/yara_helper.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/modules.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/multiprocess.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/core/shared_deps.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/db/sql/models.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/errors.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/logger.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ajaxpro.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/anubisdb.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/azure_realm.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/azure_tenant.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/baddns.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/baddns_direct.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/baddns_zone.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/badsecrets.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bevigil.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/binaryedge.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_amazon.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_azure.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_digitalocean.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_file_enum.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_firebase.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_google.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bufferoverrun.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/builtwith.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bypass403.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/c99.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/censys.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/certspotter.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/chaos.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/code_repository.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/credshed.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/crt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/crt_db.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/deadly/medusa.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dehashed.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/digitorus.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnsbimi.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnsbrute.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnscaa.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnscommonsrv.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnsdumpster.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnstlsrpt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dockerhub.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dotnetnuke.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/emailformat.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/extractous.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ffuf.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ffuf_shortnames.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/fingerprintx.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/fullhunt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/generic_ssrf.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/git.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/github_codesearch.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/github_org.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/github_usersearch.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/gitlab.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/google_playstore.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/gowitness.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/hackertarget.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/host_header.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/httpx.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/hunt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/hunterio.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/iis_shortnames.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/aggregate.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/base.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/cloudcheck.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/dnsresolve.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/excavate.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/speculate.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/unarchive.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ip2location.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ipneighbor.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ipstack.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/jadx.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/leakix.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/lightfuzz.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/base.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/cmdi.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/crypto.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/nosqli.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/path.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/serial.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/sqli.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/ssti.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/xss.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/myssl.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/newsletters.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ntlm.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/oauth.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/otx.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/asset_inventory.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/base.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/csv.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/discord.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/emails.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/http.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/json.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/mysql.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/neo4j.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/nmap_xml.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/postgres.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/python.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/slack.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/splunk.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/sqlite.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/stdout.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/subdomains.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/teams.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/txt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/web_parameters.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/web_report.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/websocket.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/paramminer_cookies.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/paramminer_getparams.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/paramminer_headers.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/passivetotal.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/pgp.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/portfilter.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/postman.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/rapiddns.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/reflected_parameters.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/report/affiliates.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/report/asn.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/report/base.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/robots.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/securitytrails.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/securitytxt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/shodan_dns.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/shodan_idb.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/sitedossier.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/skymem.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/smuggler.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/social.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/sslcert.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/subdomaincenter.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/subdomainradar.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/telerik.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/bucket.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/github.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/postman.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/shodan.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/sql.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/webhook.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/trickest.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/url_manipulation.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/urlscan.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/vhost.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/viewdns.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/virustotal.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/wafw00f.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/wappalyzer.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/wayback.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/wpscan.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/modules/zoomeye.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/baddns-intense.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/cloud-enum.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/code-enum.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/email-enum.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/fast.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/kitchen-sink.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/nuclei/nuclei-budget.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/nuclei/nuclei-intense.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/nuclei/nuclei-technology.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/nuclei/nuclei.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/spider-intense.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/spider.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/subdomain-enum.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/tech-detect.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/dirbust-light.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/lightfuzz-heavy.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/lightfuzz-light.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/lightfuzz-medium.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/lightfuzz-superheavy.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/lightfuzz-xss.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/paramminer.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web-basic.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web-screenshots.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web-thorough.yml +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/dispatcher.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/manager.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/conditions.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/environ.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/path.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/stats.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/target.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/bbot_fixtures.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/conftest.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/coverage.cfg +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/fastapi_test.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/owasp_mastg.apk +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/run_tests.sh +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test.conf +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_output.ndjson +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_bbot_fastapi.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_cli.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_command.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_config.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_dns.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_docs.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_engine.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_event_seeds.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_events.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_files.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_presets.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_scope.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_target.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_web.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_web_envelopes.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/base.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_crt_db.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnstlsrpt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_extractous.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_github_usersearch.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_jadx.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_lightfuzz.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_medusa.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_mysql.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_nmap_xml.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_portfilter.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_postgres.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_reflected_parameters.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_idb.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_sqlite.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_unarchive.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_web_parameters.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/testsslcert.pem +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/test/testsslkey.pem +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/devops_mutations.txt +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/nameservers.txt +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
- {bbot-2.4.2.6677rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: bbot
|
|
3
|
-
Version: 2.4.2.
|
|
3
|
+
Version: 2.4.2.6706rc0
|
|
4
4
|
Summary: OSINT automation for hackers.
|
|
5
5
|
License: GPL-3.0
|
|
6
6
|
Keywords: python,cli,automation,osint,threat-intel,intelligence,neo4j,scanner,python-library,hacking,recursion,pentesting,recon,command-line-tool,bugbounty,subdomains,security-tools,subdomain-scanner,osint-framework,attack-surface,subdomain-enumeration,osint-tool
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import time
|
|
1
2
|
import uuid
|
|
2
3
|
import random
|
|
3
4
|
import asyncio
|
|
4
5
|
import logging
|
|
5
6
|
import functools
|
|
6
|
-
from
|
|
7
|
-
from .misc import human_timedelta
|
|
7
|
+
from contextlib import suppress
|
|
8
8
|
from cachetools import keys, LRUCache
|
|
9
9
|
from contextlib import asynccontextmanager
|
|
10
10
|
|
|
@@ -63,26 +63,27 @@ class TaskCounter:
|
|
|
63
63
|
self._lock = asyncio.Lock()
|
|
64
64
|
return self._lock
|
|
65
65
|
|
|
66
|
-
def count(self, task_name, n=1, _log=True):
|
|
66
|
+
def count(self, task_name, n=1, asyncio_task=None, _log=True):
|
|
67
67
|
if callable(task_name):
|
|
68
68
|
task_name = f"{task_name.__qualname__}()"
|
|
69
|
-
return self.Task(self, task_name, n=n, _log=_log)
|
|
69
|
+
return self.Task(self, task_name, n=n, _log=_log, asyncio_task=asyncio_task)
|
|
70
70
|
|
|
71
71
|
class Task:
|
|
72
|
-
def __init__(self, manager, task_name, n=1, _log=True):
|
|
72
|
+
def __init__(self, manager, task_name, n=1, _log=True, asyncio_task=None):
|
|
73
73
|
self.manager = manager
|
|
74
74
|
self.task_name = task_name
|
|
75
75
|
self.task_id = None
|
|
76
76
|
self.start_time = None
|
|
77
77
|
self.log = _log
|
|
78
78
|
self.n = n
|
|
79
|
+
self._asyncio_task = asyncio_task
|
|
79
80
|
|
|
80
81
|
async def __aenter__(self):
|
|
81
82
|
self.task_id = uuid.uuid4()
|
|
82
83
|
# if self.log:
|
|
83
84
|
# log.trace(f"Starting task {self.task_name} ({self.task_id})")
|
|
84
85
|
async with self.manager.lock:
|
|
85
|
-
self.start_time =
|
|
86
|
+
self.start_time = time.time()
|
|
86
87
|
self.manager.tasks[self.task_id] = self
|
|
87
88
|
return self
|
|
88
89
|
|
|
@@ -92,9 +93,29 @@ class TaskCounter:
|
|
|
92
93
|
# if self.log:
|
|
93
94
|
# log.trace(f"Finished task {self.task_name} ({self.task_id})")
|
|
94
95
|
|
|
96
|
+
@property
|
|
97
|
+
def asyncio_task(self):
|
|
98
|
+
if self._asyncio_task is None:
|
|
99
|
+
raise AttributeError("No asyncio task associated with this task")
|
|
100
|
+
return self._asyncio_task
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def function_name(self):
|
|
104
|
+
with suppress(AttributeError):
|
|
105
|
+
return self.asyncio_task.get_coro().__name__
|
|
106
|
+
return ""
|
|
107
|
+
|
|
108
|
+
async def cancel(self):
|
|
109
|
+
self.asyncio_task.cancel()
|
|
110
|
+
with suppress(asyncio.CancelledError):
|
|
111
|
+
await self.asyncio_task
|
|
112
|
+
|
|
113
|
+
@property
|
|
114
|
+
def running_for(self):
|
|
115
|
+
return time.time() - self.start_time
|
|
116
|
+
|
|
95
117
|
def __str__(self):
|
|
96
|
-
|
|
97
|
-
return f"{self.task_name} running for {running_for}"
|
|
118
|
+
return f"{self.task_name} running for {self.running_for:.1f}s"
|
|
98
119
|
|
|
99
120
|
|
|
100
121
|
def get_event_loop():
|
|
@@ -133,6 +133,12 @@ deps:
|
|
|
133
133
|
# Load BBOT modules from these custom paths
|
|
134
134
|
module_dirs: []
|
|
135
135
|
|
|
136
|
+
# maximum runtime in seconds for each module's handle_event() is 60 minutes
|
|
137
|
+
# when the timeout is reached, the offending handle_event() will be cancelled and the module will move on to the next event
|
|
138
|
+
module_handle_event_timeout: 3600
|
|
139
|
+
# handle_batch() default timeout is 2 hours
|
|
140
|
+
module_handle_batch_timeout: 7200
|
|
141
|
+
|
|
136
142
|
# Infer certain events from others, e.g. IPs from IP ranges, DNS_NAMEs from URLs, etc.
|
|
137
143
|
speculate: True
|
|
138
144
|
# Passively search event data for URLs, hostnames, emails, etc.
|
|
@@ -13,14 +13,16 @@ class apkpure(BaseModule):
|
|
|
13
13
|
"author": "@domwhewell-sage",
|
|
14
14
|
}
|
|
15
15
|
options = {"output_folder": ""}
|
|
16
|
-
options_desc = {
|
|
16
|
+
options_desc = {
|
|
17
|
+
"output_folder": "Folder to download APKs to. If not specified, downloaded APKs will be deleted when the scan completes, to minimize disk usage."
|
|
18
|
+
}
|
|
17
19
|
|
|
18
20
|
async def setup(self):
|
|
19
|
-
output_folder = self.config.get("output_folder")
|
|
21
|
+
output_folder = self.config.get("output_folder", "")
|
|
20
22
|
if output_folder:
|
|
21
23
|
self.output_dir = Path(output_folder) / "apk_files"
|
|
22
24
|
else:
|
|
23
|
-
self.output_dir = self.
|
|
25
|
+
self.output_dir = self.helpers.temp_dir / "apk_files"
|
|
24
26
|
self.helpers.mkdir(self.output_dir)
|
|
25
27
|
return await super().setup()
|
|
26
28
|
|
|
@@ -61,8 +61,6 @@ class BaseModule:
|
|
|
61
61
|
|
|
62
62
|
batch_size (int): Size of batches processed by handle_batch(). Default is 1.
|
|
63
63
|
|
|
64
|
-
batch_wait (int): Seconds to wait before force-submitting a batch. Default is 10.
|
|
65
|
-
|
|
66
64
|
api_failure_abort_threshold (int): Threshold for setting error state after failed HTTP requests (only takes effect when `api_request()` is used. Default is 5.
|
|
67
65
|
|
|
68
66
|
_preserve_graph (bool): When set to True, accept events that may be duplicates but are necessary for construction of complete graph. Typically only enabled for output modules that need to maintain full chains of events, e.g. `neo4j` and `json`. Default is False.
|
|
@@ -102,7 +100,6 @@ class BaseModule:
|
|
|
102
100
|
|
|
103
101
|
_module_threads = 1
|
|
104
102
|
_batch_size = 1
|
|
105
|
-
batch_wait = 10
|
|
106
103
|
|
|
107
104
|
# disable the module after this many failed attempts in a row
|
|
108
105
|
_api_failure_abort_threshold = 3
|
|
@@ -159,6 +156,13 @@ class BaseModule:
|
|
|
159
156
|
|
|
160
157
|
self._tasks = []
|
|
161
158
|
self._event_received = None
|
|
159
|
+
# maximum runtime for each module's handle_event()
|
|
160
|
+
self._default_handle_event_timeout = self.scan.config.get("module_handle_event_timeout", 60 * 60) # 1 hour
|
|
161
|
+
self._default_handle_batch_timeout = self.scan.config.get(
|
|
162
|
+
"module_handle_batch_timeout", 60 * 60 * 2
|
|
163
|
+
) # 2 hours
|
|
164
|
+
self._event_handler_watchdog_task = None
|
|
165
|
+
self._event_handler_watchdog_interval = self.event_handler_timeout / 10
|
|
162
166
|
|
|
163
167
|
# used for optional "per host" tracking
|
|
164
168
|
self._per_host_tracker = set()
|
|
@@ -399,6 +403,13 @@ class BaseModule:
|
|
|
399
403
|
module_threads = self._module_threads
|
|
400
404
|
return module_threads
|
|
401
405
|
|
|
406
|
+
@property
|
|
407
|
+
def event_handler_timeout(self):
|
|
408
|
+
module_timeout = self.config.get("module_timeout", None)
|
|
409
|
+
if module_timeout is not None:
|
|
410
|
+
return float(module_timeout)
|
|
411
|
+
return self._default_handle_event_timeout if self.batch_size <= 1 else self._default_handle_batch_timeout
|
|
412
|
+
|
|
402
413
|
@property
|
|
403
414
|
def auth_secret(self):
|
|
404
415
|
"""Indicates if the module is properly configured for authentication.
|
|
@@ -446,23 +457,28 @@ class BaseModule:
|
|
|
446
457
|
- If a "FINISHED" event is found, invokes 'finish()' method of the module.
|
|
447
458
|
"""
|
|
448
459
|
finish = False
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
460
|
+
submitted = False
|
|
461
|
+
if self.batch_size <= 1:
|
|
462
|
+
return
|
|
463
|
+
if self.num_incoming_events > 0:
|
|
464
|
+
events, finish = await self._events_waiting()
|
|
465
|
+
if events and not self.errored:
|
|
466
|
+
self.verbose(f"Handling batch of {len(events):,} events")
|
|
467
|
+
event_types = {}
|
|
468
|
+
for e in events:
|
|
469
|
+
event_types[e.type] = event_types.get(e.type, 0) + 1
|
|
470
|
+
event_types_sorted = sorted(event_types.items(), key=lambda x: x[1], reverse=True)
|
|
471
|
+
event_types_str = ", ".join(f"{k}: {v}" for k, v in event_types_sorted)
|
|
472
|
+
submitted = True
|
|
473
|
+
context = f"{self.name}.handle_batch({event_types_str})"
|
|
474
|
+
try:
|
|
475
|
+
await self.run_task(self.handle_batch(*events), context, n=len(events))
|
|
476
|
+
except asyncio.CancelledError:
|
|
477
|
+
self.debug(f"{context} was cancelled")
|
|
478
|
+
self.verbose(f"Finished handling batch of {len(events):,} events")
|
|
462
479
|
if finish:
|
|
463
480
|
context = f"{self.name}.finish()"
|
|
464
|
-
|
|
465
|
-
await self.finish()
|
|
481
|
+
await self.run_task(self.finish(), context)
|
|
466
482
|
return submitted
|
|
467
483
|
|
|
468
484
|
def make_event(self, *args, **kwargs):
|
|
@@ -594,6 +610,10 @@ class BaseModule:
|
|
|
594
610
|
asyncio.create_task(self._worker(), name=f"{self.scan.name}.{self.name}._worker()")
|
|
595
611
|
for _ in range(self.module_threads)
|
|
596
612
|
]
|
|
613
|
+
self._event_handler_watchdog_task = asyncio.create_task(
|
|
614
|
+
self._event_handler_watchdog(),
|
|
615
|
+
name=f"{self.scan.name}.{self.name}._event_handler_watchdog()",
|
|
616
|
+
)
|
|
597
617
|
|
|
598
618
|
async def _setup(self):
|
|
599
619
|
"""
|
|
@@ -662,11 +682,6 @@ class BaseModule:
|
|
|
662
682
|
async with self.scan._acatch(context=self._worker, unhandled_is_critical=True):
|
|
663
683
|
try:
|
|
664
684
|
while not self.scan.stopping and not self.errored:
|
|
665
|
-
# hold the reigns if our outgoing queue is full
|
|
666
|
-
if self._qsize > 0 and self.outgoing_event_queue.qsize() >= self._qsize:
|
|
667
|
-
await asyncio.sleep(0.1)
|
|
668
|
-
continue
|
|
669
|
-
|
|
670
685
|
# if batch wasn't big enough, we wait for the next event before continuing
|
|
671
686
|
if self.batch_size > 1:
|
|
672
687
|
submitted = await self._handle_batch()
|
|
@@ -689,14 +704,20 @@ class BaseModule:
|
|
|
689
704
|
if acceptable:
|
|
690
705
|
if event.type == "FINISHED":
|
|
691
706
|
context = f"{self.name}.finish()"
|
|
692
|
-
|
|
693
|
-
await self.finish()
|
|
707
|
+
try:
|
|
708
|
+
await self.run_task(self.finish(), context)
|
|
709
|
+
except asyncio.CancelledError:
|
|
710
|
+
self.debug(f"{context} was cancelled")
|
|
711
|
+
continue
|
|
694
712
|
else:
|
|
695
713
|
context = f"{self.name}.handle_event({event})"
|
|
696
714
|
self.scan.stats.event_consumed(event, self)
|
|
697
715
|
self.debug(f"Handling {event}")
|
|
698
|
-
|
|
699
|
-
await self.handle_event(event)
|
|
716
|
+
try:
|
|
717
|
+
await self.run_task(self.handle_event(event), context)
|
|
718
|
+
except asyncio.CancelledError:
|
|
719
|
+
self.debug(f"{context} was cancelled")
|
|
720
|
+
continue
|
|
700
721
|
self.debug(f"Finished handling {event}")
|
|
701
722
|
else:
|
|
702
723
|
self.debug(f"Not accepting {event} because {reason}")
|
|
@@ -852,6 +873,36 @@ class BaseModule:
|
|
|
852
873
|
async with self.scan._acatch(context), self._task_counter.count(context):
|
|
853
874
|
await self.helpers.execute_sync_or_async(callback)
|
|
854
875
|
|
|
876
|
+
async def run_task(self, coro, name, n=1):
|
|
877
|
+
"""
|
|
878
|
+
Start a task while tracking it in the module's task counter.
|
|
879
|
+
|
|
880
|
+
This lets us keep a detailed module status and selectively cancel tasks when needed, like when handle_event exceeds its max runtime.
|
|
881
|
+
"""
|
|
882
|
+
task = asyncio.create_task(coro)
|
|
883
|
+
async with self.scan._acatch(context=name), self._task_counter.count(task_name=name, asyncio_task=task, n=n):
|
|
884
|
+
return await task
|
|
885
|
+
|
|
886
|
+
async def _event_handler_watchdog(self):
|
|
887
|
+
"""
|
|
888
|
+
Watches handle_event and handle_batch tasks and cancels them if they exceed their max runtime.
|
|
889
|
+
"""
|
|
890
|
+
while not self.scan.stopping and not self.errored:
|
|
891
|
+
# if there are events in the outgoing queue, we leave the tasks alone
|
|
892
|
+
if self.outgoing_event_queue.qsize() > 0:
|
|
893
|
+
await self.helpers.sleep(self._event_handler_watchdog_interval)
|
|
894
|
+
continue
|
|
895
|
+
event_handler_tasks = [
|
|
896
|
+
t for t in self._task_counter.tasks.values() if t.function_name in ("handle_event", "handle_batch")
|
|
897
|
+
]
|
|
898
|
+
for task in event_handler_tasks:
|
|
899
|
+
if task.running_for > self.event_handler_timeout:
|
|
900
|
+
self.warning(
|
|
901
|
+
f"{self.name} Cancelling event handler task {task.task_name} because it's been running for {task.running_for:.1f}s (max timeout is {self.event_handler_timeout})"
|
|
902
|
+
)
|
|
903
|
+
await task.cancel()
|
|
904
|
+
await asyncio.sleep(self._event_handler_watchdog_interval)
|
|
905
|
+
|
|
855
906
|
async def queue_event(self, event):
|
|
856
907
|
"""
|
|
857
908
|
Asynchronously queues an incoming event to the module's event queue for further processing.
|
|
@@ -1266,7 +1317,7 @@ class BaseModule:
|
|
|
1266
1317
|
new_url, new_kwargs = iter_key(url, page, page_size, offset, **requests_kwargs)
|
|
1267
1318
|
result = await self.api_request(new_url, **new_kwargs)
|
|
1268
1319
|
if result is None:
|
|
1269
|
-
self.verbose(f"api_page_iter() got no response for {
|
|
1320
|
+
self.verbose(f"api_page_iter() got no response for {new_url}")
|
|
1270
1321
|
break
|
|
1271
1322
|
try:
|
|
1272
1323
|
if _json:
|
|
@@ -1708,10 +1759,13 @@ class BaseInterceptModule(BaseModule):
|
|
|
1708
1759
|
context = f"{self.name}.handle_event({event, kwargs})"
|
|
1709
1760
|
self.scan.stats.event_consumed(event, self)
|
|
1710
1761
|
self.debug(f"Intercepting {event}")
|
|
1711
|
-
|
|
1712
|
-
forward_event = await self.handle_event(event, **kwargs)
|
|
1713
|
-
|
|
1714
|
-
|
|
1762
|
+
try:
|
|
1763
|
+
forward_event = await self.run_task(self.handle_event(event, **kwargs), context)
|
|
1764
|
+
except asyncio.CancelledError:
|
|
1765
|
+
self.debug(f"{context} was cancelled")
|
|
1766
|
+
continue
|
|
1767
|
+
with suppress(ValueError, TypeError):
|
|
1768
|
+
forward_event, forward_event_reason = forward_event
|
|
1715
1769
|
|
|
1716
1770
|
if forward_event is False:
|
|
1717
1771
|
self.debug(f"Not forwarding {event} because {forward_event_reason}")
|
|
@@ -17,7 +17,7 @@ class docker_pull(BaseModule):
|
|
|
17
17
|
options = {"all_tags": False, "output_folder": ""}
|
|
18
18
|
options_desc = {
|
|
19
19
|
"all_tags": "Download all tags from each registry (Default False)",
|
|
20
|
-
"output_folder": "Folder to download docker repositories to",
|
|
20
|
+
"output_folder": "Folder to download docker repositories to. If not specified, downloaded docker images will be deleted when the scan completes, to minimize disk usage.",
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
scope_distance_modifier = 2
|
|
@@ -34,11 +34,11 @@ class docker_pull(BaseModule):
|
|
|
34
34
|
)
|
|
35
35
|
}
|
|
36
36
|
self.all_tags = self.config.get("all_tags", True)
|
|
37
|
-
output_folder = self.config.get("output_folder")
|
|
37
|
+
output_folder = self.config.get("output_folder", "")
|
|
38
38
|
if output_folder:
|
|
39
39
|
self.output_dir = Path(output_folder) / "docker_images"
|
|
40
40
|
else:
|
|
41
|
-
self.output_dir = self.
|
|
41
|
+
self.output_dir = self.helpers.temp_dir / "docker_images"
|
|
42
42
|
self.helpers.mkdir(self.output_dir)
|
|
43
43
|
return await super().setup()
|
|
44
44
|
|
|
@@ -84,12 +84,12 @@ class filedownload(BaseModule):
|
|
|
84
84
|
"bz2", # Bzip2 Compressed File
|
|
85
85
|
],
|
|
86
86
|
"max_filesize": "10MB",
|
|
87
|
-
"
|
|
87
|
+
"output_folder": "",
|
|
88
88
|
}
|
|
89
89
|
options_desc = {
|
|
90
90
|
"extensions": "File extensions to download",
|
|
91
91
|
"max_filesize": "Cancel download if filesize is greater than this size",
|
|
92
|
-
"
|
|
92
|
+
"output_folder": "Folder to download files to. If not specified, downloaded files will be deleted when the scan completes, to minimize disk usage.",
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
scope_distance_modifier = 3
|
|
@@ -97,10 +97,14 @@ class filedownload(BaseModule):
|
|
|
97
97
|
async def setup(self):
|
|
98
98
|
self.extensions = list({e.lower().strip(".") for e in self.config.get("extensions", [])})
|
|
99
99
|
self.max_filesize = self.config.get("max_filesize", "10MB")
|
|
100
|
-
self.download_dir = self.scan.home / "filedownload"
|
|
101
|
-
self.helpers.mkdir(self.download_dir)
|
|
102
100
|
self.urls_downloaded = set()
|
|
103
101
|
self.files_downloaded = 0
|
|
102
|
+
output_dir = self.config.get("output_folder", "")
|
|
103
|
+
if output_dir:
|
|
104
|
+
self.download_dir = Path(output_dir) / "filedownload"
|
|
105
|
+
else:
|
|
106
|
+
self.download_dir = self.helpers.temp_dir / "filedownload"
|
|
107
|
+
self.helpers.mkdir(self.download_dir)
|
|
104
108
|
self.mime_db_file = await self.helpers.wordlist(
|
|
105
109
|
"https://raw.githubusercontent.com/jshttp/mime-db/master/db.json"
|
|
106
110
|
)
|
|
@@ -13,7 +13,10 @@ class git_clone(github):
|
|
|
13
13
|
"author": "@domwhewell-sage",
|
|
14
14
|
}
|
|
15
15
|
options = {"api_key": "", "output_folder": ""}
|
|
16
|
-
options_desc = {
|
|
16
|
+
options_desc = {
|
|
17
|
+
"api_key": "Github token",
|
|
18
|
+
"output_folder": "Folder to clone repositories to. If not specified, cloned repositories will be deleted when the scan completes, to minimize disk usage.",
|
|
19
|
+
}
|
|
17
20
|
|
|
18
21
|
deps_apt = ["git"]
|
|
19
22
|
|
|
@@ -24,7 +27,7 @@ class git_clone(github):
|
|
|
24
27
|
if output_folder:
|
|
25
28
|
self.output_dir = Path(output_folder) / "git_repos"
|
|
26
29
|
else:
|
|
27
|
-
self.output_dir = self.
|
|
30
|
+
self.output_dir = self.helpers.temp_dir / "git_repos"
|
|
28
31
|
self.helpers.mkdir(self.output_dir)
|
|
29
32
|
return await super().setup()
|
|
30
33
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import asyncio
|
|
1
2
|
import regex as re
|
|
2
3
|
from pathlib import Path
|
|
3
4
|
from subprocess import CalledProcessError
|
|
@@ -19,7 +20,7 @@ class gitdumper(BaseModule):
|
|
|
19
20
|
"max_semanic_version": 10,
|
|
20
21
|
}
|
|
21
22
|
options_desc = {
|
|
22
|
-
"output_folder": "Folder to download repositories to",
|
|
23
|
+
"output_folder": "Folder to download repositories to. If not specified, downloaded repositories will be deleted when the scan completes, to minimize disk usage.",
|
|
23
24
|
"fuzz_tags": "Fuzz for common git tag names (v0.0.1, 0.0.2, etc.) up to the max_semanic_version",
|
|
24
25
|
"max_semanic_version": "Maximum version number to fuzz for (default < v10.10.10)",
|
|
25
26
|
}
|
|
@@ -28,11 +29,11 @@ class gitdumper(BaseModule):
|
|
|
28
29
|
|
|
29
30
|
async def setup(self):
|
|
30
31
|
self.urls_downloaded = set()
|
|
31
|
-
output_folder = self.config.get("output_folder")
|
|
32
|
+
output_folder = self.config.get("output_folder", "")
|
|
32
33
|
if output_folder:
|
|
33
34
|
self.output_dir = Path(output_folder) / "git_repos"
|
|
34
35
|
else:
|
|
35
|
-
self.output_dir = self.
|
|
36
|
+
self.output_dir = self.helpers.temp_dir / "git_repos"
|
|
36
37
|
self.helpers.mkdir(self.output_dir)
|
|
37
38
|
self.unsafe_regex = self.helpers.re.compile(r"^\s*fsmonitor|sshcommand|askpass|editor|pager", re.IGNORECASE)
|
|
38
39
|
self.ref_regex = self.helpers.re.compile(r"ref: refs/heads/([a-zA-Z\d_-]+)")
|
|
@@ -79,6 +80,7 @@ class gitdumper(BaseModule):
|
|
|
79
80
|
"staging",
|
|
80
81
|
"test",
|
|
81
82
|
"testing",
|
|
83
|
+
"trunk",
|
|
82
84
|
"wip",
|
|
83
85
|
]
|
|
84
86
|
url_patterns = [
|
|
@@ -121,7 +123,11 @@ class gitdumper(BaseModule):
|
|
|
121
123
|
dir_listing = await self.directory_listing_enabled(repo_url)
|
|
122
124
|
if dir_listing:
|
|
123
125
|
urls = await self.recursive_dir_list(dir_listing)
|
|
124
|
-
|
|
126
|
+
try:
|
|
127
|
+
result = await self.download_files(urls, repo_folder)
|
|
128
|
+
except asyncio.CancelledError:
|
|
129
|
+
self.verbose(f"Cancellation requested while downloading files from {repo_url}")
|
|
130
|
+
result = True
|
|
125
131
|
else:
|
|
126
132
|
result = await self.git_fuzz(repo_url, repo_folder)
|
|
127
133
|
if result:
|
|
@@ -171,7 +177,10 @@ class gitdumper(BaseModule):
|
|
|
171
177
|
result = await self.download_files(url_list, repo_folder)
|
|
172
178
|
if result:
|
|
173
179
|
await self.download_current_branch(repo_url, repo_folder)
|
|
174
|
-
|
|
180
|
+
try:
|
|
181
|
+
await self.download_git_objects(repo_url, repo_folder)
|
|
182
|
+
except asyncio.CancelledError:
|
|
183
|
+
self.verbose(f"Cancellation requested while downloading git objects from {repo_url}")
|
|
175
184
|
await self.download_git_packs(repo_url, repo_folder)
|
|
176
185
|
return True
|
|
177
186
|
else:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import zipfile
|
|
2
2
|
import fnmatch
|
|
3
|
+
from pathlib import Path
|
|
3
4
|
|
|
4
5
|
from bbot.modules.templates.github import github
|
|
5
6
|
|
|
@@ -13,10 +14,11 @@ class github_workflows(github):
|
|
|
13
14
|
"created_date": "2024-04-29",
|
|
14
15
|
"author": "@domwhewell-sage",
|
|
15
16
|
}
|
|
16
|
-
options = {"api_key": "", "num_logs": 1}
|
|
17
|
+
options = {"api_key": "", "num_logs": 1, "output_folder": ""}
|
|
17
18
|
options_desc = {
|
|
18
19
|
"api_key": "Github token",
|
|
19
20
|
"num_logs": "For each workflow fetch the last N successful runs logs (max 100)",
|
|
21
|
+
"output_folder": "Folder to download workflow logs and artifacts to",
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
scope_distance_modifier = 2
|
|
@@ -26,7 +28,11 @@ class github_workflows(github):
|
|
|
26
28
|
if self.num_logs > 100:
|
|
27
29
|
self.log.error("num_logs option is capped at 100")
|
|
28
30
|
return False
|
|
29
|
-
|
|
31
|
+
output_folder = self.config.get("output_folder", "")
|
|
32
|
+
if output_folder:
|
|
33
|
+
self.output_dir = Path(output_folder) / "workflow_logs"
|
|
34
|
+
else:
|
|
35
|
+
self.output_dir = self.scan.home / "workflow_logs"
|
|
30
36
|
self.helpers.mkdir(self.output_dir)
|
|
31
37
|
return await super().setup()
|
|
32
38
|
|
|
@@ -35,9 +41,10 @@ class github_workflows(github):
|
|
|
35
41
|
return r.is_success or getattr(r, "status_code", 0) == 404
|
|
36
42
|
|
|
37
43
|
async def filter_event(self, event):
|
|
38
|
-
if event.
|
|
39
|
-
|
|
40
|
-
|
|
44
|
+
if "git" not in event.tags:
|
|
45
|
+
return False, "event is not a git repository"
|
|
46
|
+
elif "github.com" not in event.data.get("url", ""):
|
|
47
|
+
return False, "event is not a github repository"
|
|
41
48
|
return True
|
|
42
49
|
|
|
43
50
|
async def handle_event(self, event):
|
|
@@ -28,6 +28,7 @@ class nuclei(BaseModule):
|
|
|
28
28
|
"directory_only": True,
|
|
29
29
|
"retries": 0,
|
|
30
30
|
"batch_size": 200,
|
|
31
|
+
"module_timeout": 21600, # 6 hours
|
|
31
32
|
}
|
|
32
33
|
options_desc = {
|
|
33
34
|
"version": "nuclei version",
|
|
@@ -38,11 +39,12 @@ class nuclei(BaseModule):
|
|
|
38
39
|
"concurrency": "maximum number of templates to be executed in parallel (default 25)",
|
|
39
40
|
"mode": "manual | technology | severe | budget. Technology: Only activate based on technology events that match nuclei tags (nuclei -as mode). Manual (DEFAULT): Fully manual settings. Severe: Only critical and high severity templates without intrusive. Budget: Limit Nuclei to a specified number of HTTP requests",
|
|
40
41
|
"etags": "tags to exclude from the scan",
|
|
41
|
-
"budget": "Used in budget mode to set the number of requests
|
|
42
|
+
"budget": "Used in budget mode to set the number of allowed requests per host",
|
|
42
43
|
"silent": "Don't display nuclei's banner or status messages",
|
|
43
44
|
"directory_only": "Filter out 'file' URL event (default True)",
|
|
44
45
|
"retries": "number of times to retry a failed request (default 0)",
|
|
45
46
|
"batch_size": "Number of targets to send to Nuclei per batch (default 200)",
|
|
47
|
+
"module_timeout": "Max time in seconds to spend handling each batch of events",
|
|
46
48
|
}
|
|
47
49
|
deps_ansible = [
|
|
48
50
|
{
|
|
@@ -57,7 +59,7 @@ class nuclei(BaseModule):
|
|
|
57
59
|
]
|
|
58
60
|
deps_pip = ["pyyaml~=6.0"]
|
|
59
61
|
in_scope_only = True
|
|
60
|
-
_batch_size =
|
|
62
|
+
_batch_size = 200
|
|
61
63
|
|
|
62
64
|
async def setup(self):
|
|
63
65
|
# attempt to update nuclei templates
|
|
@@ -30,6 +30,7 @@ class portscan(BaseModule):
|
|
|
30
30
|
"adapter_ip": "",
|
|
31
31
|
"adapter_mac": "",
|
|
32
32
|
"router_mac": "",
|
|
33
|
+
"module_timeout": 259200, # 3 days
|
|
33
34
|
}
|
|
34
35
|
options_desc = {
|
|
35
36
|
"top_ports": "Top ports to scan (default 100) (to override, specify 'ports')",
|
|
@@ -42,6 +43,7 @@ class portscan(BaseModule):
|
|
|
42
43
|
"adapter_ip": "Send packets using this IP address. Not needed unless masscan's autodetection fails",
|
|
43
44
|
"adapter_mac": "Send packets using this as the source MAC address. Not needed unless masscan's autodetection fails",
|
|
44
45
|
"router_mac": "Send packets to this MAC address as the destination. Not needed unless masscan's autodetection fails",
|
|
46
|
+
"module_timeout": "Max time in seconds to spend handling each batch of events",
|
|
45
47
|
}
|
|
46
48
|
deps_common = ["masscan"]
|
|
47
49
|
batch_size = 1000000
|
|
@@ -14,15 +14,18 @@ class postman_download(postman):
|
|
|
14
14
|
"author": "@domwhewell-sage",
|
|
15
15
|
}
|
|
16
16
|
options = {"output_folder": "", "api_key": ""}
|
|
17
|
-
options_desc = {
|
|
17
|
+
options_desc = {
|
|
18
|
+
"output_folder": "Folder to download postman workspaces to. If not specified, downloaded workspaces will be deleted when the scan completes, to minimize disk usage.",
|
|
19
|
+
"api_key": "Postman API Key",
|
|
20
|
+
}
|
|
18
21
|
scope_distance_modifier = 2
|
|
19
22
|
|
|
20
23
|
async def setup(self):
|
|
21
|
-
output_folder = self.config.get("output_folder")
|
|
24
|
+
output_folder = self.config.get("output_folder", "")
|
|
22
25
|
if output_folder:
|
|
23
26
|
self.output_dir = Path(output_folder) / "postman_workspaces"
|
|
24
27
|
else:
|
|
25
|
-
self.output_dir = self.
|
|
28
|
+
self.output_dir = self.helpers.temp_dir / "postman_workspaces"
|
|
26
29
|
self.helpers.mkdir(self.output_dir)
|
|
27
30
|
return await super().setup()
|
|
28
31
|
|
|
@@ -88,8 +88,7 @@ class trufflehog(BaseModule):
|
|
|
88
88
|
|
|
89
89
|
if event.type == "CODE_REPOSITORY":
|
|
90
90
|
path = event.data["url"]
|
|
91
|
-
|
|
92
|
-
module = "github-experimental"
|
|
91
|
+
module = "github-experimental"
|
|
93
92
|
elif event.type == "FILESYSTEM":
|
|
94
93
|
path = event.data["path"]
|
|
95
94
|
if "git" in event.tags:
|
|
@@ -9,9 +9,18 @@ from bbot.core.helpers.misc import chain_lists, get_closest_match, get_keys_in_d
|
|
|
9
9
|
log = logging.getLogger("bbot.presets.args")
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
universal_module_options = {
|
|
13
|
+
"batch_size": "The number of events to process in a single batch (only applies to batch modules)",
|
|
14
|
+
"module_threads": "How many event handlers to run in parallel",
|
|
15
|
+
"module_timeout": "Max time in seconds to spend handling each event or batch of events",
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
12
19
|
class BBOTArgs:
|
|
13
20
|
# module config options to exclude from validation
|
|
14
|
-
exclude_from_validation = re.compile(
|
|
21
|
+
exclude_from_validation = re.compile(
|
|
22
|
+
r".*modules\.[a-z0-9_]+\.(?:" + "|".join(universal_module_options.keys()) + ")$"
|
|
23
|
+
)
|
|
15
24
|
|
|
16
25
|
scan_examples = [
|
|
17
26
|
(
|
|
@@ -276,8 +276,6 @@ class Preset(metaclass=BasePreset):
|
|
|
276
276
|
self.exclude_flags.update(set(exclude_flags))
|
|
277
277
|
self.require_flags.update(set(require_flags))
|
|
278
278
|
|
|
279
|
-
# log.critical(f"{self.name}: verbose: {self.verbose}, debug: {self.debug}, silent: {self.silent}")
|
|
280
|
-
|
|
281
279
|
@property
|
|
282
280
|
def bbot_home(self):
|
|
283
281
|
return Path(self.config.get("home", "~/.bbot")).expanduser().resolve()
|
|
@@ -245,8 +245,6 @@ class Scanner:
|
|
|
245
245
|
self._cleanedup = False
|
|
246
246
|
self._omitted_event_types = None
|
|
247
247
|
|
|
248
|
-
self.__loop = None
|
|
249
|
-
self._manager_worker_loop_tasks = []
|
|
250
248
|
self.init_events_task = None
|
|
251
249
|
self.ticker_task = None
|
|
252
250
|
self.dispatcher_tasks = []
|
|
@@ -726,6 +724,7 @@ class Scanner:
|
|
|
726
724
|
scan_active_status.append(f" - {task}:")
|
|
727
725
|
# scan_active_status.append(f" incoming_queue_size: {m.num_incoming_events}")
|
|
728
726
|
# scan_active_status.append(f" outgoing_queue_size: {m.outgoing_event_queue.qsize()}")
|
|
727
|
+
|
|
729
728
|
for line in scan_active_status:
|
|
730
729
|
self.debug(line)
|
|
731
730
|
|
|
@@ -834,8 +833,6 @@ class Scanner:
|
|
|
834
833
|
tasks.append(self.ticker_task)
|
|
835
834
|
# dispatcher
|
|
836
835
|
tasks += self.dispatcher_tasks
|
|
837
|
-
# manager worker loops
|
|
838
|
-
tasks += self._manager_worker_loop_tasks
|
|
839
836
|
self.helpers.cancel_tasks_sync(tasks)
|
|
840
837
|
# process pool
|
|
841
838
|
self.helpers.process_pool.shutdown(cancel_futures=True)
|