bbot 2.1.2.5161rc0__tar.gz → 2.1.2.5171rc0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of bbot might be problematic. Click here for more details.
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/PKG-INFO +2 -1
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/__init__.py +1 -1
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/event/base.py +30 -12
- bbot-2.1.2.5171rc0/bbot/core/helpers/libmagic.py +68 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/shared_deps.py +1 -1
- bbot-2.1.2.5161rc0/bbot/modules/unstructured.py → bbot-2.1.2.5171rc0/bbot/modules/extractous.py +19 -20
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_events.py +41 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +6 -6
- bbot-2.1.2.5171rc0/bbot/test/test_step_2/module_tests/test_module_extractous.py +54 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/pyproject.toml +2 -1
- bbot-2.1.2.5161rc0/bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -102
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/LICENSE +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/README.md +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/cli.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/config/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/config/files.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/config/logger.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/core.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/engine.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/event/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/event/helpers.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/flags.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/async_helpers.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/bloom.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/cache.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/command.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/depsinstaller/installer.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/diff.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/brute.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/dns.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/engine.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/helpers.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/mock.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/files.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/helper.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/interactsh.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/misc.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/names_generator.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/ntlm.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/process.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/ratelimiter.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/regex.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/regexes.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/url.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/validators.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/web/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/web/client.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/web/engine.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/web/web.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/wordcloud.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/core/modules.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/defaults.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/errors.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/logger.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ajaxpro.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/anubisdb.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/apkpure.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/azure_realm.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/azure_tenant.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/baddns.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/baddns_direct.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/baddns_zone.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/badsecrets.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/base.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bevigil.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/binaryedge.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_amazon.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_azure.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_digitalocean.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_file_enum.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_firebase.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_google.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bufferoverrun.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/builtwith.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bypass403.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/c99.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/censys.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/certspotter.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/chaos.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/code_repository.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/columbus.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/credshed.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/crt.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/deadly/dastardly.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/deadly/ffuf.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/deadly/nuclei.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/deadly/vhost.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dehashed.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/digitorus.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dnsbrute.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dnscaa.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dnscommonsrv.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dnsdumpster.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/docker_pull.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dockerhub.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dotnetnuke.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/emailformat.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ffuf_shortnames.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/filedownload.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/fingerprintx.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/fullhunt.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/generic_ssrf.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/git.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/git_clone.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/github_codesearch.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/github_org.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/github_workflows.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/gitlab.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/google_playstore.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/gowitness.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/hackertarget.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/host_header.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/httpx.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/hunt.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/hunterio.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/iis_shortnames.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/aggregate.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/base.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/cloudcheck.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/dnsresolve.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/excavate.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/speculate.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internetdb.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ip2location.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ipneighbor.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ipstack.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/leakix.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/myssl.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/newsletters.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ntlm.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/oauth.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/otx.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/asset_inventory.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/base.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/csv.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/discord.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/emails.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/http.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/json.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/neo4j.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/python.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/slack.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/splunk.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/stdout.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/subdomains.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/teams.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/txt.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/web_report.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/websocket.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/paramminer_cookies.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/paramminer_getparams.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/paramminer_headers.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/passivetotal.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/pgp.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/portscan.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/postman.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/postman_download.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/rapiddns.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/report/affiliates.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/report/asn.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/report/base.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/robots.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/secretsdb.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/securitytrails.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/securitytxt.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/shodan_dns.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/sitedossier.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/skymem.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/smuggler.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/social.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/sslcert.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/subdomaincenter.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/subdomainradar.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/telerik.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/bucket.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/github.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/postman.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/shodan.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/webhook.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/trickest.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/trufflehog.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/url_manipulation.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/urlscan.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/viewdns.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/virustotal.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/wafw00f.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/wappalyzer.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/wayback.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/wpscan.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/modules/zoomeye.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/baddns-thorough.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/cloud-enum.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/code-enum.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/email-enum.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/kitchen-sink.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/spider.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/subdomain-enum.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web/dirbust-light.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web/paramminer.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web-basic.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web-screenshots.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web-thorough.yml +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/dispatcher.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/manager.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/args.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/conditions.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/environ.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/path.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/preset.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/scanner.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/stats.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/target.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/scripts/docs.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/bbot_fixtures.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/conftest.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/coverage.cfg +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/owasp_mastg.apk +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/run_tests.sh +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test.conf +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_output.ndjson +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_cli.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_command.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_config.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_dns.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_docs.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_engine.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_files.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_presets.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_scan.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_scope.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_target.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_web.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/base.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/testsslcert.pem +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/testsslkey.pem +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/devops_mutations.txt +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/nameservers.txt +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
- {bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: bbot
|
|
3
|
-
Version: 2.1.2.
|
|
3
|
+
Version: 2.1.2.5171rc0
|
|
4
4
|
Summary: OSINT automation for hackers.
|
|
5
5
|
Home-page: https://github.com/blacklanternsecurity/bbot
|
|
6
6
|
License: GPL-3.0
|
|
@@ -30,6 +30,7 @@ Requires-Dist: lxml (>=4.9.2,<6.0.0)
|
|
|
30
30
|
Requires-Dist: mmh3 (>=4.1,<6.0)
|
|
31
31
|
Requires-Dist: omegaconf (>=2.3.0,<3.0.0)
|
|
32
32
|
Requires-Dist: psutil (>=5.9.4,<7.0.0)
|
|
33
|
+
Requires-Dist: puremagic (>=1.28,<2.0)
|
|
33
34
|
Requires-Dist: pycryptodome (>=3.17,<4.0)
|
|
34
35
|
Requires-Dist: pydantic (>=2.4.2,<3.0.0)
|
|
35
36
|
Requires-Dist: pyjwt (>=2.7.0,<3.0.0)
|
|
@@ -503,12 +503,13 @@ class BaseEvent:
|
|
|
503
503
|
for t in list(self.tags):
|
|
504
504
|
if t.startswith("distance-"):
|
|
505
505
|
self.remove_tag(t)
|
|
506
|
-
if
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
506
|
+
if self.host:
|
|
507
|
+
if scope_distance == 0:
|
|
508
|
+
self.add_tag("in-scope")
|
|
509
|
+
self.remove_tag("affiliate")
|
|
510
|
+
else:
|
|
511
|
+
self.remove_tag("in-scope")
|
|
512
|
+
self.add_tag(f"distance-{new_scope_distance}")
|
|
512
513
|
self._scope_distance = new_scope_distance
|
|
513
514
|
# apply recursively to parent events
|
|
514
515
|
parent_scope_distance = getattr(self.parent, "scope_distance", None)
|
|
@@ -1018,20 +1019,21 @@ class ClosestHostEvent(DictHostEvent):
|
|
|
1018
1019
|
class DictPathEvent(DictEvent):
|
|
1019
1020
|
def sanitize_data(self, data):
|
|
1020
1021
|
new_data = dict(data)
|
|
1022
|
+
new_data["path"] = str(new_data["path"])
|
|
1021
1023
|
file_blobs = getattr(self.scan, "_file_blobs", False)
|
|
1022
1024
|
folder_blobs = getattr(self.scan, "_folder_blobs", False)
|
|
1023
1025
|
blob = None
|
|
1024
1026
|
try:
|
|
1025
|
-
|
|
1026
|
-
if
|
|
1027
|
+
self._data_path = Path(data["path"])
|
|
1028
|
+
if self._data_path.is_file():
|
|
1027
1029
|
self.add_tag("file")
|
|
1028
1030
|
if file_blobs:
|
|
1029
|
-
with open(
|
|
1031
|
+
with open(self._data_path, "rb") as file:
|
|
1030
1032
|
blob = file.read()
|
|
1031
|
-
elif
|
|
1033
|
+
elif self._data_path.is_dir():
|
|
1032
1034
|
self.add_tag("folder")
|
|
1033
1035
|
if folder_blobs:
|
|
1034
|
-
blob = self._tar_directory(
|
|
1036
|
+
blob = self._tar_directory(self._data_path)
|
|
1035
1037
|
except KeyError:
|
|
1036
1038
|
pass
|
|
1037
1039
|
if blob:
|
|
@@ -1540,7 +1542,23 @@ class WAF(DictHostEvent):
|
|
|
1540
1542
|
|
|
1541
1543
|
|
|
1542
1544
|
class FILESYSTEM(DictPathEvent):
|
|
1543
|
-
|
|
1545
|
+
def __init__(self, *args, **kwargs):
|
|
1546
|
+
super().__init__(*args, **kwargs)
|
|
1547
|
+
if self._data_path.is_file():
|
|
1548
|
+
# detect type of file content using magic
|
|
1549
|
+
from bbot.core.helpers.libmagic import get_magic_info, get_compression
|
|
1550
|
+
|
|
1551
|
+
extension, mime_type, description, confidence = get_magic_info(self.data["path"])
|
|
1552
|
+
self.data["magic_extension"] = extension
|
|
1553
|
+
self.data["magic_mime_type"] = mime_type
|
|
1554
|
+
self.data["magic_description"] = description
|
|
1555
|
+
self.data["magic_confidence"] = confidence
|
|
1556
|
+
# detection compression
|
|
1557
|
+
compression = get_compression(mime_type)
|
|
1558
|
+
if compression:
|
|
1559
|
+
self.add_tag("compressed")
|
|
1560
|
+
self.add_tag(f"{compression}-archive")
|
|
1561
|
+
self.data["compression"] = compression
|
|
1544
1562
|
|
|
1545
1563
|
|
|
1546
1564
|
class RAW_DNS_RECORD(DictHostEvent, DnsEvent):
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import puremagic
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def get_magic_info(file):
|
|
5
|
+
|
|
6
|
+
magic_detections = puremagic.magic_file(file)
|
|
7
|
+
if magic_detections:
|
|
8
|
+
magic_detections.sort(key=lambda x: x.confidence, reverse=True)
|
|
9
|
+
detection = magic_detections[0]
|
|
10
|
+
return detection.extension, detection.mime_type, detection.name, detection.confidence
|
|
11
|
+
return "", "", "", 0
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_compression(mime_type):
|
|
15
|
+
mime_type = mime_type.lower()
|
|
16
|
+
# from https://github.com/cdgriffith/puremagic/blob/master/puremagic/magic_data.json
|
|
17
|
+
compression_map = {
|
|
18
|
+
"application/gzip": "gzip", # Gzip compressed file
|
|
19
|
+
"application/zip": "zip", # Zip archive
|
|
20
|
+
"application/x-bzip2": "bzip2", # Bzip2 compressed file
|
|
21
|
+
"application/x-xz": "xz", # XZ compressed file
|
|
22
|
+
"application/x-7z-compressed": "7z", # 7-Zip archive
|
|
23
|
+
"application/vnd.rar": "rar", # RAR archive
|
|
24
|
+
"application/x-lzma": "lzma", # LZMA compressed file
|
|
25
|
+
"application/x-compress": "compress", # Unix compress file
|
|
26
|
+
"application/zstd": "zstd", # Zstandard compressed file
|
|
27
|
+
"application/x-lz4": "lz4", # LZ4 compressed file
|
|
28
|
+
"application/x-tar": "tar", # Tar archive
|
|
29
|
+
"application/x-zip-compressed-fb2": "zip", # Zip archive (FB2)
|
|
30
|
+
"application/epub+zip": "zip", # EPUB book (Zip archive)
|
|
31
|
+
"application/pak": "pak", # PAK archive
|
|
32
|
+
"application/x-lha": "lha", # LHA archive
|
|
33
|
+
"application/arj": "arj", # ARJ archive
|
|
34
|
+
"application/vnd.ms-cab-compressed": "cab", # Microsoft Cabinet archive
|
|
35
|
+
"application/x-sit": "sit", # StuffIt archive
|
|
36
|
+
"application/binhex": "binhex", # BinHex encoded file
|
|
37
|
+
"application/x-lrzip": "lrzip", # Long Range ZIP
|
|
38
|
+
"application/x-alz": "alz", # ALZip archive
|
|
39
|
+
"application/x-tgz": "tgz", # Gzip compressed Tar archive
|
|
40
|
+
"application/x-gzip": "gzip", # Gzip compressed file
|
|
41
|
+
"application/x-lzip": "lzip", # Lzip compressed file
|
|
42
|
+
"application/x-zstd-compressed-tar": "zstd", # Zstandard compressed Tar archive
|
|
43
|
+
"application/x-lz4-compressed-tar": "lz4", # LZ4 compressed Tar archive
|
|
44
|
+
"application/vnd.comicbook+zip": "zip", # Comic book archive (Zip)
|
|
45
|
+
"application/vnd.palm": "palm", # Palm OS data
|
|
46
|
+
"application/fictionbook2+zip": "zip", # FictionBook 2.0 (Zip)
|
|
47
|
+
"application/fictionbook3+zip": "zip", # FictionBook 3.0 (Zip)
|
|
48
|
+
"application/x-cpio": "cpio", # CPIO archive
|
|
49
|
+
"application/x-java-pack200": "pack200", # Java Pack200 archive
|
|
50
|
+
"application/x-par2": "par2", # PAR2 recovery file
|
|
51
|
+
"application/x-rar-compressed": "rar", # RAR archive
|
|
52
|
+
"application/java-archive": "zip", # Java Archive (JAR)
|
|
53
|
+
"application/x-webarchive": "zip", # Web archive (Zip)
|
|
54
|
+
"application/vnd.android.package-archive": "zip", # Android package (APK)
|
|
55
|
+
"application/x-itunes-ipa": "zip", # iOS application archive (IPA)
|
|
56
|
+
"application/x-stuffit": "sit", # StuffIt archive
|
|
57
|
+
"application/x-archive": "ar", # Unix archive
|
|
58
|
+
"application/x-qpress": "qpress", # Qpress archive
|
|
59
|
+
"application/x-xar": "xar", # XAR archive
|
|
60
|
+
"application/x-ace": "ace", # ACE archive
|
|
61
|
+
"application/x-zoo": "zoo", # Zoo archive
|
|
62
|
+
"application/x-arc": "arc", # ARC archive
|
|
63
|
+
"application/x-zstd-compressed-tar": "zstd", # Zstandard compressed Tar archive
|
|
64
|
+
"application/x-lz4-compressed-tar": "lz4", # LZ4 compressed Tar archive
|
|
65
|
+
"application/vnd.comicbook-rar": "rar", # Comic book archive (RAR)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return compression_map.get(mime_type, "")
|
|
@@ -81,7 +81,7 @@ DEP_CHROMIUM = [
|
|
|
81
81
|
{
|
|
82
82
|
"name": "Install Chromium dependencies (Debian)",
|
|
83
83
|
"package": {
|
|
84
|
-
"name": "libasound2,libatk-bridge2.0-0,libatk1.0-0,libcairo2,libcups2,libdrm2,libgbm1,libnss3,libpango-1.0-0,libxcomposite1,libxdamage1,libxfixes3,libxkbcommon0,libxrandr2",
|
|
84
|
+
"name": "libasound2,libatk-bridge2.0-0,libatk1.0-0,libcairo2,libcups2,libdrm2,libgbm1,libnss3,libpango-1.0-0,libglib2.0-0,libxcomposite1,libxdamage1,libxfixes3,libxkbcommon0,libxrandr2",
|
|
85
85
|
"state": "present",
|
|
86
86
|
},
|
|
87
87
|
"become": True,
|
bbot-2.1.2.5161rc0/bbot/modules/unstructured.py → bbot-2.1.2.5171rc0/bbot/modules/extractous.py
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
from extractous import Extractor
|
|
2
2
|
|
|
3
3
|
from bbot.modules.base import BaseModule
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class
|
|
6
|
+
class extractous(BaseModule):
|
|
7
7
|
watched_events = ["FILESYSTEM"]
|
|
8
8
|
produced_events = ["RAW_TEXT"]
|
|
9
9
|
flags = ["passive", "safe"]
|
|
@@ -63,15 +63,11 @@ class unstructured(BaseModule):
|
|
|
63
63
|
"extensions": "File extensions to parse",
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
deps_pip = ["unstructured[all-docs]>=0.15.7,<1.0", "nltk>=3.9.0,<4.0"]
|
|
68
|
-
|
|
66
|
+
deps_pip = ["extractous"]
|
|
69
67
|
scope_distance_modifier = 1
|
|
70
68
|
|
|
71
69
|
async def setup(self):
|
|
72
70
|
self.extensions = list(set([e.lower().strip(".") for e in self.config.get("extensions", [])]))
|
|
73
|
-
# Do not send user statistics to the unstructured library
|
|
74
|
-
os.environ["SCARF_NO_ANALYTICS"] = "true"
|
|
75
71
|
return True
|
|
76
72
|
|
|
77
73
|
async def filter_event(self, event):
|
|
@@ -94,22 +90,16 @@ class unstructured(BaseModule):
|
|
|
94
90
|
)
|
|
95
91
|
await self.emit_event(raw_text_event)
|
|
96
92
|
|
|
97
|
-
async def finish(self):
|
|
98
|
-
del os.environ["SCARF_NO_ANALYTICS"]
|
|
99
|
-
return
|
|
100
|
-
|
|
101
93
|
|
|
102
94
|
def extract_text(file_path):
|
|
103
95
|
"""
|
|
104
|
-
extract_text Extracts plaintext from a document path using
|
|
96
|
+
extract_text Extracts plaintext from a document path using extractous.
|
|
105
97
|
|
|
106
98
|
:param file_path: The path of the file to extract text from.
|
|
107
99
|
:return: ASCII-encoded plaintext extracted from the document.
|
|
108
100
|
"""
|
|
109
101
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
unstructured_file_types = [
|
|
102
|
+
extractable_file_types = [
|
|
113
103
|
".csv",
|
|
114
104
|
".eml",
|
|
115
105
|
".msg",
|
|
@@ -135,12 +125,21 @@ def extract_text(file_path):
|
|
|
135
125
|
".xml",
|
|
136
126
|
]
|
|
137
127
|
|
|
138
|
-
# If the file can be extracted with
|
|
139
|
-
if any(file_path.lower().endswith(file_type) for file_type in
|
|
128
|
+
# If the file can be extracted with extractous use its partition function or try and read it
|
|
129
|
+
if any(file_path.lower().endswith(file_type) for file_type in extractable_file_types):
|
|
140
130
|
try:
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
131
|
+
extractor = Extractor()
|
|
132
|
+
reader = extractor.extract_file(str(file_path))
|
|
133
|
+
|
|
134
|
+
result = ""
|
|
135
|
+
buffer = reader.read(4096)
|
|
136
|
+
while len(buffer) > 0:
|
|
137
|
+
result += buffer.decode("utf-8")
|
|
138
|
+
buffer = reader.read(4096)
|
|
139
|
+
|
|
140
|
+
return result.strip()
|
|
141
|
+
|
|
142
|
+
except Exception:
|
|
144
143
|
with open(file_path, "rb") as file:
|
|
145
144
|
return file.read().decode("utf-8", errors="ignore")
|
|
146
145
|
else:
|
|
@@ -925,3 +925,44 @@ def test_event_closest_host():
|
|
|
925
925
|
vuln = scan.make_event(
|
|
926
926
|
{"path": "/tmp/asdf.txt", "description": "test", "severity": "HIGH"}, "VULNERABILITY", parent=event3
|
|
927
927
|
)
|
|
928
|
+
|
|
929
|
+
|
|
930
|
+
def test_event_magic():
|
|
931
|
+
from bbot.core.helpers.libmagic import get_magic_info, get_compression
|
|
932
|
+
|
|
933
|
+
import base64
|
|
934
|
+
|
|
935
|
+
zip_base64 = "UEsDBAoDAAAAAOMmZ1lR4FaHBQAAAAUAAAAIAAAAYXNkZi50eHRhc2RmClBLAQI/AwoDAAAAAOMmZ1lR4FaHBQAAAAUAAAAIACQAAAAAAAAAIICkgQAAAABhc2RmLnR4dAoAIAAAAAAAAQAYAICi2B77MNsBgKLYHvsw2wGAotge+zDbAVBLBQYAAAAAAQABAFoAAAArAAAAAAA="
|
|
936
|
+
zip_bytes = base64.b64decode(zip_base64)
|
|
937
|
+
zip_file = Path("/tmp/.bbottestzipasdkfjalsdf.zip")
|
|
938
|
+
with open(zip_file, "wb") as f:
|
|
939
|
+
f.write(zip_bytes)
|
|
940
|
+
|
|
941
|
+
# test magic helpers
|
|
942
|
+
extension, mime_type, description, confidence = get_magic_info(zip_file)
|
|
943
|
+
assert extension == ".zip"
|
|
944
|
+
assert mime_type == "application/zip"
|
|
945
|
+
assert description == "PKZIP Archive file"
|
|
946
|
+
assert confidence > 0
|
|
947
|
+
assert get_compression(mime_type) == "zip"
|
|
948
|
+
|
|
949
|
+
# test filesystem event - file
|
|
950
|
+
scan = Scanner()
|
|
951
|
+
event = scan.make_event({"path": zip_file}, "FILESYSTEM", parent=scan.root_event)
|
|
952
|
+
assert event.data == {
|
|
953
|
+
"path": "/tmp/.bbottestzipasdkfjalsdf.zip",
|
|
954
|
+
"magic_extension": ".zip",
|
|
955
|
+
"magic_mime_type": "application/zip",
|
|
956
|
+
"magic_description": "PKZIP Archive file",
|
|
957
|
+
"magic_confidence": 0.9,
|
|
958
|
+
"compression": "zip",
|
|
959
|
+
}
|
|
960
|
+
assert event.tags == {"file", "zip-archive", "compressed"}
|
|
961
|
+
|
|
962
|
+
# test filesystem event - folder
|
|
963
|
+
scan = Scanner()
|
|
964
|
+
event = scan.make_event({"path": "/tmp"}, "FILESYSTEM", parent=scan.root_event)
|
|
965
|
+
assert event.data == {"path": "/tmp"}
|
|
966
|
+
assert event.tags == {"folder"}
|
|
967
|
+
|
|
968
|
+
zip_file.unlink()
|
{bbot-2.1.2.5161rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py
RENAMED
|
@@ -894,7 +894,7 @@ class TestExcavateHeaders(ModuleTestBase):
|
|
|
894
894
|
|
|
895
895
|
class TestExcavateRAWTEXT(ModuleTestBase):
|
|
896
896
|
targets = ["http://127.0.0.1:8888/", "test.notreal"]
|
|
897
|
-
modules_overrides = ["excavate", "httpx", "filedownload", "
|
|
897
|
+
modules_overrides = ["excavate", "httpx", "filedownload", "extractous"]
|
|
898
898
|
config_overrides = {"scope": {"report_distance": 1}, "web": {"spider_distance": 2, "spider_depth": 2}}
|
|
899
899
|
|
|
900
900
|
pdf_data = r"""%PDF-1.3
|
|
@@ -965,7 +965,7 @@ trailer
|
|
|
965
965
|
startxref
|
|
966
966
|
1669
|
|
967
967
|
%%EOF"""
|
|
968
|
-
|
|
968
|
+
extractous_response = """This is an email example@blacklanternsecurity.notreal
|
|
969
969
|
|
|
970
970
|
An example JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
|
|
971
971
|
|
|
@@ -995,13 +995,13 @@ A href <a href='/donot_detect.js'>Click me</a>"""
|
|
|
995
995
|
raw_text_events = [e for e in events if e.type == "RAW_TEXT"]
|
|
996
996
|
assert 1 == len(raw_text_events), "Failed to emit RAW_TEXT event"
|
|
997
997
|
assert (
|
|
998
|
-
raw_text_events[0].data == self.
|
|
998
|
+
raw_text_events[0].data == self.extractous_response
|
|
999
999
|
), f"Text extracted from PDF is incorrect, got {raw_text_events[0].data}"
|
|
1000
1000
|
email_events = [e for e in events if e.type == "EMAIL_ADDRESS"]
|
|
1001
1001
|
assert 1 == len(email_events), "Failed to emit EMAIL_ADDRESS event"
|
|
1002
1002
|
assert (
|
|
1003
1003
|
email_events[0].data == "example@blacklanternsecurity.notreal"
|
|
1004
|
-
), f"Email extracted from
|
|
1004
|
+
), f"Email extracted from extractous text is incorrect, got {email_events[0].data}"
|
|
1005
1005
|
finding_events = [e for e in events if e.type == "FINDING"]
|
|
1006
1006
|
assert 2 == len(finding_events), "Failed to emit FINDING events"
|
|
1007
1007
|
assert any(
|
|
@@ -1026,7 +1026,7 @@ A href <a href='/donot_detect.js'>Click me</a>"""
|
|
|
1026
1026
|
url_events = [e.data for e in events if e.type == "URL_UNVERIFIED"]
|
|
1027
1027
|
assert (
|
|
1028
1028
|
"https://www.test.notreal/about" in url_events
|
|
1029
|
-
), f"URL extracted from
|
|
1029
|
+
), f"URL extracted from extractous text is incorrect, got {url_events}"
|
|
1030
1030
|
assert (
|
|
1031
1031
|
"/donot_detect.js" not in url_events
|
|
1032
|
-
), f"URL extracted from
|
|
1032
|
+
), f"URL extracted from extractous text is incorrect, got {url_events}"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from .base import ModuleTestBase
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestExtractous(ModuleTestBase):
|
|
7
|
+
targets = ["http://127.0.0.1:8888"]
|
|
8
|
+
modules_overrides = ["extractous", "filedownload", "httpx", "excavate", "speculate"]
|
|
9
|
+
config_overrides = {"web": {"spider_distance": 2, "spider_depth": 2}}
|
|
10
|
+
|
|
11
|
+
pdf_data = base64.b64decode(
|
|
12
|
+
"JVBERi0xLjMKJe+/ve+/ve+/ve+/vSBSZXBvcnRMYWIgR2VuZXJhdGVkIFBERiBkb2N1bWVudCBodHRwOi8vd3d3LnJlcG9ydGxhYi5jb20KMSAwIG9iago8PAovRjEgMiAwIFIKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL0Jhc2VGb250IC9IZWx2ZXRpY2EgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcgL05hbWUgL0YxIC9TdWJ0eXBlIC9UeXBlMSAvVHlwZSAvRm9udAo+PgplbmRvYmoKMyAwIG9iago8PAovQ29udGVudHMgNyAwIFIgL01lZGlhQm94IFsgMCAwIDU5NS4yNzU2IDg0MS44ODk4IF0gL1BhcmVudCA2IDAgUiAvUmVzb3VyY2VzIDw8Ci9Gb250IDEgMCBSIC9Qcm9jU2V0IFsgL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdCj4+IC9Sb3RhdGUgMCAvVHJhbnMgPDwKCj4+IAogIC9UeXBlIC9QYWdlCj4+CmVuZG9iago0IDAgb2JqCjw8Ci9QYWdlTW9kZSAvVXNlTm9uZSAvUGFnZXMgNiAwIFIgL1R5cGUgL0NhdGFsb2cKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0F1dGhvciAoYW5vbnltb3VzKSAvQ3JlYXRpb25EYXRlIChEOjIwMjQwNjAzMTg1ODE2KzAwJzAwJykgL0NyZWF0b3IgKFJlcG9ydExhYiBQREYgTGlicmFyeSAtIHd3dy5yZXBvcnRsYWIuY29tKSAvS2V5d29yZHMgKCkgL01vZERhdGUgKEQ6MjAyNDA2MDMxODU4MTYrMDAnMDAnKSAvUHJvZHVjZXIgKFJlcG9ydExhYiBQREYgTGlicmFyeSAtIHd3dy5yZXBvcnRsYWIuY29tKSAKICAvU3ViamVjdCAodW5zcGVjaWZpZWQpIC9UaXRsZSAodW50aXRsZWQpIC9UcmFwcGVkIC9GYWxzZQo+PgplbmRvYmoKNiAwIG9iago8PAovQ291bnQgMSAvS2lkcyBbIDMgMCBSIF0gL1R5cGUgL1BhZ2VzCj4+CmVuZG9iago3IDAgb2JqCjw8Ci9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZSAvRmxhdGVEZWNvZGUgXSAvTGVuZ3RoIDEwNwo+PgpzdHJlYW0KR2FwUWgwRT1GLDBVXEgzVFxwTllUXlFLaz90Yz5JUCw7VyNVMV4yM2loUEVNXz9DVzRLSVNpOTBNakdeMixGUyM8UkM1K2MsbilaOyRiSyRiIjVJWzwhXlREI2dpXSY9NVgsWzVAWUBWfj5lbmRzdHJlYW0KZW5kb2JqCnhyZWYKMCA4CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDA3MyAwMDAwMCBuIAowMDAwMDAwMTA0IDAwMDAwIG4gCjAwMDAwMDAyMTEgMDAwMDAgbiAKMDAwMDAwMDQxNCAwMDAwMCBuIAowMDAwMDAwNDgyIDAwMDAwIG4gCjAwMDAwMDA3NzggMDAwMDAgbiAKMDAwMDAwMDgzNyAwMDAwMCBuIAp0cmFpbGVyCjw8Ci9JRCAKWzw4MGQ5ZjViOTY0ZmM5OTI4NDUwMWRlYjdhNmE2MzdmNz48ODBkOWY1Yjk2NGZjOTkyODQ1MDFkZWI3YTZhNjM3Zjc+XQolIFJlcG9ydExhYiBnZW5lcmF0ZWQgUERGIGRvY3VtZW50IC0tIGRpZ2VzdCAoaHR0cDovL3d3dy5yZXBvcnRsYWIuY29tKQoKL0luZm8gNSAwIFIKL1Jvb3QgNCAwIFIKL1NpemUgOAo+PgpzdGFydHhyZWYKMTAzNAolJUVPRg=="
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
docx_data = base64.b64decode(
|
|
16
|
+
"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"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
expected_result_pdf = "Hello, World!"
|
|
20
|
+
expected_result_docx = "Hello, World!!"
|
|
21
|
+
|
|
22
|
+
async def setup_after_prep(self, module_test):
|
|
23
|
+
module_test.set_expect_requests(
|
|
24
|
+
dict(uri="/"),
|
|
25
|
+
dict(response_data='<a href="/Test_PDF"/><a href="/Test_DOCX"/>'),
|
|
26
|
+
)
|
|
27
|
+
module_test.set_expect_requests(
|
|
28
|
+
dict(uri="/Test_PDF"),
|
|
29
|
+
dict(response_data=self.pdf_data, headers={"Content-Type": "application/pdf"}),
|
|
30
|
+
)
|
|
31
|
+
module_test.set_expect_requests(
|
|
32
|
+
dict(uri="/Test_DOCX"),
|
|
33
|
+
dict(
|
|
34
|
+
response_data=self.docx_data,
|
|
35
|
+
headers={"Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
|
|
36
|
+
),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
def check(self, module_test, events):
|
|
40
|
+
filesystem_events = [e for e in events if e.type == "FILESYSTEM"]
|
|
41
|
+
assert 2 == len(filesystem_events), filesystem_events
|
|
42
|
+
for filesystem_event in filesystem_events:
|
|
43
|
+
file = Path(filesystem_event.data["path"])
|
|
44
|
+
assert file.is_file(), "Destination file doesn't exist"
|
|
45
|
+
assert (
|
|
46
|
+
open(file, "rb").read() == self.pdf_data or open(file, "rb").read() == self.docx_data
|
|
47
|
+
), f"File at {file} does not contain the correct content"
|
|
48
|
+
raw_text_events = [e for e in events if e.type == "RAW_TEXT"]
|
|
49
|
+
assert 2 == len(raw_text_events), "Failed to emit RAW_TEXT event"
|
|
50
|
+
for raw_text_event in raw_text_events:
|
|
51
|
+
assert raw_text_event.data in [
|
|
52
|
+
self.expected_result_pdf,
|
|
53
|
+
self.expected_result_docx,
|
|
54
|
+
], f"Text extracted from {raw_text_event.data['path']} is incorrect, got {raw_text_event.data}"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "bbot"
|
|
3
|
-
version = "v2.1.2.
|
|
3
|
+
version = "v2.1.2.5171rc"
|
|
4
4
|
description = "OSINT automation for hackers."
|
|
5
5
|
authors = [
|
|
6
6
|
"TheTechromancer",
|
|
@@ -55,6 +55,7 @@ setproctitle = "^1.3.3"
|
|
|
55
55
|
yara-python = "^4.5.1"
|
|
56
56
|
pyzmq = "^26.0.3"
|
|
57
57
|
httpx = "^0.27.0"
|
|
58
|
+
puremagic = "^1.28"
|
|
58
59
|
|
|
59
60
|
[tool.poetry.group.dev.dependencies]
|
|
60
61
|
flake8 = ">=6,<8"
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from .base import ModuleTestBase
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class TestUnstructured(ModuleTestBase):
|
|
6
|
-
targets = ["http://127.0.0.1:8888"]
|
|
7
|
-
modules_overrides = ["unstructured", "filedownload", "httpx", "excavate", "speculate"]
|
|
8
|
-
config_overrides = {"web": {"spider_distance": 2, "spider_depth": 2}}
|
|
9
|
-
|
|
10
|
-
pdf_data = r"""%PDF-1.3
|
|
11
|
-
%���� ReportLab Generated PDF document http://www.reportlab.com
|
|
12
|
-
1 0 obj
|
|
13
|
-
<<
|
|
14
|
-
/F1 2 0 R
|
|
15
|
-
>>
|
|
16
|
-
endobj
|
|
17
|
-
2 0 obj
|
|
18
|
-
<<
|
|
19
|
-
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
|
20
|
-
>>
|
|
21
|
-
endobj
|
|
22
|
-
3 0 obj
|
|
23
|
-
<<
|
|
24
|
-
/Contents 7 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 6 0 R /Resources <<
|
|
25
|
-
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
26
|
-
>> /Rotate 0 /Trans <<
|
|
27
|
-
|
|
28
|
-
>>
|
|
29
|
-
/Type /Page
|
|
30
|
-
>>
|
|
31
|
-
endobj
|
|
32
|
-
4 0 obj
|
|
33
|
-
<<
|
|
34
|
-
/PageMode /UseNone /Pages 6 0 R /Type /Catalog
|
|
35
|
-
>>
|
|
36
|
-
endobj
|
|
37
|
-
5 0 obj
|
|
38
|
-
<<
|
|
39
|
-
/Author (anonymous) /CreationDate (D:20240603185816+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240603185816+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
|
40
|
-
/Subject (unspecified) /Title (untitled) /Trapped /False
|
|
41
|
-
>>
|
|
42
|
-
endobj
|
|
43
|
-
6 0 obj
|
|
44
|
-
<<
|
|
45
|
-
/Count 1 /Kids [ 3 0 R ] /Type /Pages
|
|
46
|
-
>>
|
|
47
|
-
endobj
|
|
48
|
-
7 0 obj
|
|
49
|
-
<<
|
|
50
|
-
/Filter [ /ASCII85Decode /FlateDecode ] /Length 107
|
|
51
|
-
>>
|
|
52
|
-
stream
|
|
53
|
-
GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_?CW4KISi90MjG^2,FS#<RC5+c,n)Z;$bK$b"5I[<!^TD#gi]&=5X,[5@Y@V~>endstream
|
|
54
|
-
endobj
|
|
55
|
-
xref
|
|
56
|
-
0 8
|
|
57
|
-
0000000000 65535 f
|
|
58
|
-
0000000073 00000 n
|
|
59
|
-
0000000104 00000 n
|
|
60
|
-
0000000211 00000 n
|
|
61
|
-
0000000414 00000 n
|
|
62
|
-
0000000482 00000 n
|
|
63
|
-
0000000778 00000 n
|
|
64
|
-
0000000837 00000 n
|
|
65
|
-
trailer
|
|
66
|
-
<<
|
|
67
|
-
/ID
|
|
68
|
-
[<80d9f5b964fc99284501deb7a6a637f7><80d9f5b964fc99284501deb7a6a637f7>]
|
|
69
|
-
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
|
70
|
-
|
|
71
|
-
/Info 5 0 R
|
|
72
|
-
/Root 4 0 R
|
|
73
|
-
/Size 8
|
|
74
|
-
>>
|
|
75
|
-
startxref
|
|
76
|
-
1034
|
|
77
|
-
%%EOF"""
|
|
78
|
-
|
|
79
|
-
unstructured_response = "Hello, World!"
|
|
80
|
-
|
|
81
|
-
async def setup_after_prep(self, module_test):
|
|
82
|
-
module_test.set_expect_requests(
|
|
83
|
-
dict(uri="/"),
|
|
84
|
-
dict(response_data='<a href="/Test_PDF"/>'),
|
|
85
|
-
)
|
|
86
|
-
module_test.set_expect_requests(
|
|
87
|
-
dict(uri="/Test_PDF"),
|
|
88
|
-
dict(response_data=self.pdf_data, headers={"Content-Type": "application/pdf"}),
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
def check(self, module_test, events):
|
|
92
|
-
filesystem_events = [e for e in events if e.type == "FILESYSTEM"]
|
|
93
|
-
assert 1 == len(filesystem_events), filesystem_events
|
|
94
|
-
filesystem_event = filesystem_events[0]
|
|
95
|
-
file = Path(filesystem_event.data["path"])
|
|
96
|
-
assert file.is_file(), "Destination file doesn't exist"
|
|
97
|
-
assert open(file).read() == self.pdf_data, f"File at {file} does not contain the correct content"
|
|
98
|
-
raw_text_events = [e for e in events if e.type == "RAW_TEXT"]
|
|
99
|
-
assert 1 == len(raw_text_events), "Failed to emit RAW_TEXT event"
|
|
100
|
-
assert (
|
|
101
|
-
raw_text_events[0].data == self.unstructured_response
|
|
102
|
-
), f"Text extracted from PDF is incorrect, got {raw_text_events[0].data}"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|