bbot 2.2.0.5263rc0__tar.gz → 2.2.0.5279rc0__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.

Files changed (414) hide show
  1. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/PKG-INFO +1 -1
  2. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/__init__.py +1 -1
  3. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/depsinstaller/installer.py +8 -5
  4. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/misc.py +18 -0
  5. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/defaults.yml +3 -0
  6. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/speculate.py +33 -23
  7. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/leakix.py +2 -3
  8. bbot-2.2.0.5279rc0/bbot/presets/fast.yml +16 -0
  9. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/args.py +17 -1
  10. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/preset.py +8 -8
  11. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/bbot_fixtures.py +5 -2
  12. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/conftest.py +95 -83
  13. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_cli.py +29 -0
  14. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_events.py +0 -1
  15. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -3
  16. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_presets.py +1 -2
  17. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_web.py +3 -0
  18. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -6
  19. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +5 -1
  20. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/pyproject.toml +2 -2
  21. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/LICENSE +0 -0
  22. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/README.md +0 -0
  23. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/cli.py +0 -0
  24. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/__init__.py +0 -0
  25. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/config/__init__.py +0 -0
  26. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/config/files.py +0 -0
  27. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/config/logger.py +0 -0
  28. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/core.py +0 -0
  29. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/engine.py +0 -0
  30. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/event/__init__.py +0 -0
  31. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/event/base.py +0 -0
  32. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/event/helpers.py +0 -0
  33. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/flags.py +0 -0
  34. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/__init__.py +0 -0
  35. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/async_helpers.py +0 -0
  36. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/bloom.py +0 -0
  37. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/cache.py +0 -0
  38. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/command.py +0 -0
  39. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
  40. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
  41. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/diff.py +0 -0
  42. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/__init__.py +0 -0
  43. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/brute.py +0 -0
  44. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/dns.py +0 -0
  45. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/engine.py +0 -0
  46. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/helpers.py +0 -0
  47. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/mock.py +0 -0
  48. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/files.py +0 -0
  49. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/helper.py +0 -0
  50. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/interactsh.py +0 -0
  51. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/libmagic.py +0 -0
  52. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/names_generator.py +0 -0
  53. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/ntlm.py +0 -0
  54. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/process.py +0 -0
  55. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/ratelimiter.py +0 -0
  56. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/regex.py +0 -0
  57. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/regexes.py +0 -0
  58. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/url.py +0 -0
  59. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/validators.py +0 -0
  60. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/web/__init__.py +0 -0
  61. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/web/client.py +0 -0
  62. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/web/engine.py +0 -0
  63. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
  64. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/web/web.py +0 -0
  65. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/wordcloud.py +0 -0
  66. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/modules.py +0 -0
  67. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/multiprocess.py +0 -0
  68. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/core/shared_deps.py +0 -0
  69. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/db/sql/models.py +0 -0
  70. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/errors.py +0 -0
  71. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/logger.py +0 -0
  72. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/__init__.py +0 -0
  73. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ajaxpro.py +0 -0
  74. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/anubisdb.py +0 -0
  75. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/apkpure.py +0 -0
  76. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/azure_realm.py +0 -0
  77. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/azure_tenant.py +0 -0
  78. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/baddns.py +0 -0
  79. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/baddns_direct.py +0 -0
  80. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/baddns_zone.py +0 -0
  81. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/badsecrets.py +0 -0
  82. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/base.py +0 -0
  83. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bevigil.py +0 -0
  84. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/binaryedge.py +0 -0
  85. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_amazon.py +0 -0
  86. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_azure.py +0 -0
  87. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_digitalocean.py +0 -0
  88. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_file_enum.py +0 -0
  89. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_firebase.py +0 -0
  90. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_google.py +0 -0
  91. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bufferoverrun.py +0 -0
  92. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/builtwith.py +0 -0
  93. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bypass403.py +0 -0
  94. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/c99.py +0 -0
  95. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/censys.py +0 -0
  96. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/certspotter.py +0 -0
  97. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/chaos.py +0 -0
  98. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/code_repository.py +0 -0
  99. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/columbus.py +0 -0
  100. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/credshed.py +0 -0
  101. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/crt.py +0 -0
  102. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/deadly/dastardly.py +0 -0
  103. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/deadly/ffuf.py +0 -0
  104. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/deadly/nuclei.py +0 -0
  105. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/deadly/vhost.py +0 -0
  106. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dehashed.py +0 -0
  107. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/digitorus.py +0 -0
  108. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnsbimi.py +0 -0
  109. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnsbrute.py +0 -0
  110. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
  111. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnscaa.py +0 -0
  112. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnscommonsrv.py +0 -0
  113. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnsdumpster.py +0 -0
  114. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/docker_pull.py +0 -0
  115. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dockerhub.py +0 -0
  116. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dotnetnuke.py +0 -0
  117. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/emailformat.py +0 -0
  118. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/extractous.py +0 -0
  119. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ffuf_shortnames.py +0 -0
  120. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/filedownload.py +0 -0
  121. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/fingerprintx.py +0 -0
  122. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/fullhunt.py +0 -0
  123. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/generic_ssrf.py +0 -0
  124. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/git.py +0 -0
  125. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/git_clone.py +0 -0
  126. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/github_codesearch.py +0 -0
  127. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/github_org.py +0 -0
  128. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/github_workflows.py +0 -0
  129. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/gitlab.py +0 -0
  130. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/google_playstore.py +0 -0
  131. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/gowitness.py +0 -0
  132. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/hackertarget.py +0 -0
  133. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/host_header.py +0 -0
  134. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/httpx.py +0 -0
  135. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/hunt.py +0 -0
  136. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/hunterio.py +0 -0
  137. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/iis_shortnames.py +0 -0
  138. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/__init__.py +0 -0
  139. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/aggregate.py +0 -0
  140. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/base.py +0 -0
  141. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/cloudcheck.py +0 -0
  142. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/dnsresolve.py +0 -0
  143. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/excavate.py +0 -0
  144. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internetdb.py +0 -0
  145. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ip2location.py +0 -0
  146. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ipneighbor.py +0 -0
  147. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ipstack.py +0 -0
  148. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/jadx.py +0 -0
  149. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/myssl.py +0 -0
  150. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/newsletters.py +0 -0
  151. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ntlm.py +0 -0
  152. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/oauth.py +0 -0
  153. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/otx.py +0 -0
  154. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/__init__.py +0 -0
  155. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/asset_inventory.py +0 -0
  156. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/base.py +0 -0
  157. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/csv.py +0 -0
  158. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/discord.py +0 -0
  159. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/emails.py +0 -0
  160. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/http.py +0 -0
  161. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/json.py +0 -0
  162. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/neo4j.py +0 -0
  163. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/python.py +0 -0
  164. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/slack.py +0 -0
  165. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/splunk.py +0 -0
  166. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/sqlite.py +0 -0
  167. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/stdout.py +0 -0
  168. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/subdomains.py +0 -0
  169. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/teams.py +0 -0
  170. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/txt.py +0 -0
  171. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/web_report.py +0 -0
  172. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/websocket.py +0 -0
  173. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/paramminer_cookies.py +0 -0
  174. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/paramminer_getparams.py +0 -0
  175. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/paramminer_headers.py +0 -0
  176. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/passivetotal.py +0 -0
  177. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/pgp.py +0 -0
  178. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/portscan.py +0 -0
  179. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/postman.py +0 -0
  180. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/postman_download.py +0 -0
  181. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/rapiddns.py +0 -0
  182. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/report/affiliates.py +0 -0
  183. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/report/asn.py +0 -0
  184. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/report/base.py +0 -0
  185. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/robots.py +0 -0
  186. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/secretsdb.py +0 -0
  187. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/securitytrails.py +0 -0
  188. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/securitytxt.py +0 -0
  189. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/shodan_dns.py +0 -0
  190. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/sitedossier.py +0 -0
  191. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/skymem.py +0 -0
  192. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/smuggler.py +0 -0
  193. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/social.py +0 -0
  194. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/sslcert.py +0 -0
  195. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/subdomaincenter.py +0 -0
  196. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/subdomainradar.py +0 -0
  197. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/telerik.py +0 -0
  198. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/bucket.py +0 -0
  199. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/github.py +0 -0
  200. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/postman.py +0 -0
  201. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/shodan.py +0 -0
  202. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/sql.py +0 -0
  203. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
  204. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/webhook.py +0 -0
  205. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/trickest.py +0 -0
  206. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/trufflehog.py +0 -0
  207. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/url_manipulation.py +0 -0
  208. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/urlscan.py +0 -0
  209. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/viewdns.py +0 -0
  210. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/virustotal.py +0 -0
  211. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/wafw00f.py +0 -0
  212. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/wappalyzer.py +0 -0
  213. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/wayback.py +0 -0
  214. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/wpscan.py +0 -0
  215. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/modules/zoomeye.py +0 -0
  216. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/baddns-thorough.yml +0 -0
  217. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/cloud-enum.yml +0 -0
  218. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/code-enum.yml +0 -0
  219. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/email-enum.yml +0 -0
  220. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/kitchen-sink.yml +0 -0
  221. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/spider.yml +0 -0
  222. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/subdomain-enum.yml +0 -0
  223. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
  224. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web/dirbust-light.yml +0 -0
  225. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
  226. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
  227. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web/paramminer.yml +0 -0
  228. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web-basic.yml +0 -0
  229. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web-screenshots.yml +0 -0
  230. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web-thorough.yml +0 -0
  231. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/__init__.py +0 -0
  232. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/dispatcher.py +0 -0
  233. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/manager.py +0 -0
  234. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/__init__.py +0 -0
  235. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/conditions.py +0 -0
  236. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/environ.py +0 -0
  237. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/path.py +0 -0
  238. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/scanner.py +0 -0
  239. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/stats.py +0 -0
  240. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/target.py +0 -0
  241. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/scripts/docs.py +0 -0
  242. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/__init__.py +0 -0
  243. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/coverage.cfg +0 -0
  244. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/fastapi_test.py +0 -0
  245. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/owasp_mastg.apk +0 -0
  246. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/run_tests.sh +0 -0
  247. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test.conf +0 -0
  248. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_output.ndjson +0 -0
  249. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/__init__.py +0 -0
  250. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
  251. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_bbot_fastapi.py +0 -0
  252. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
  253. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_command.py +0 -0
  254. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_config.py +0 -0
  255. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
  256. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_dns.py +0 -0
  257. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_docs.py +0 -0
  258. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_engine.py +0 -0
  259. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_files.py +0 -0
  260. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
  261. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
  262. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
  263. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
  264. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
  265. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_scan.py +0 -0
  266. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_scope.py +0 -0
  267. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_target.py +0 -0
  268. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/__init__.py +0 -0
  269. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
  270. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/base.py +0 -0
  271. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
  272. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
  273. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
  274. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
  275. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
  276. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
  277. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
  278. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
  279. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
  280. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
  281. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
  282. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
  283. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
  284. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
  285. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
  286. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
  287. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
  288. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
  289. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
  290. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
  291. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
  292. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
  293. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
  294. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
  295. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
  296. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
  297. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
  298. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
  299. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
  300. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
  301. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
  302. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
  303. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
  304. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
  305. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +0 -0
  306. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
  307. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
  308. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
  309. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +0 -0
  310. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
  311. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
  312. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
  313. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
  314. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
  315. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
  316. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
  317. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
  318. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
  319. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
  320. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +0 -0
  321. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_extractous.py +0 -0
  322. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
  323. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
  324. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
  325. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
  326. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
  327. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
  328. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
  329. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
  330. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
  331. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
  332. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
  333. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
  334. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
  335. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
  336. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
  337. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
  338. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
  339. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
  340. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
  341. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
  342. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
  343. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
  344. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
  345. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
  346. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
  347. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_jadx.py +0 -0
  348. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
  349. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
  350. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
  351. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
  352. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
  353. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
  354. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
  355. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
  356. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
  357. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
  358. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
  359. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
  360. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
  361. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
  362. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
  363. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
  364. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
  365. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
  366. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
  367. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
  368. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
  369. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
  370. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
  371. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
  372. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
  373. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
  374. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
  375. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
  376. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
  377. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
  378. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_sqlite.py +0 -0
  379. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
  380. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
  381. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
  382. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
  383. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
  384. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
  385. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
  386. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
  387. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
  388. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
  389. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
  390. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
  391. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
  392. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
  393. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
  394. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
  395. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
  396. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
  397. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
  398. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
  399. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
  400. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
  401. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
  402. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
  403. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/testsslcert.pem +0 -0
  404. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/test/testsslkey.pem +0 -0
  405. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/devops_mutations.txt +0 -0
  406. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
  407. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
  408. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/nameservers.txt +0 -0
  409. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
  410. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
  411. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
  412. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
  413. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
  414. {bbot-2.2.0.5263rc0 → bbot-2.2.0.5279rc0}/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.2.0.5263rc0
3
+ Version: 2.2.0.5279rc0
4
4
  Summary: OSINT automation for hackers.
5
5
  Home-page: https://github.com/blacklanternsecurity/bbot
6
6
  License: GPL-3.0
@@ -1,4 +1,4 @@
1
1
  # version placeholder (replaced by poetry-dynamic-versioning)
2
- __version__ = "v2.2.0.5263rc"
2
+ __version__ = "v2.2.0.5279rc"
3
3
 
4
4
  from .scanner import Scanner, Preset
@@ -14,7 +14,7 @@ from secrets import token_bytes
14
14
  from ansible_runner.interface import run
15
15
  from subprocess import CalledProcessError
16
16
 
17
- from ..misc import can_sudo_without_password, os_platform, rm_at_exit
17
+ from ..misc import can_sudo_without_password, os_platform, rm_at_exit, get_python_constraints
18
18
 
19
19
  log = logging.getLogger("bbot.core.helpers.depsinstaller")
20
20
 
@@ -176,10 +176,13 @@ class DepsInstaller:
176
176
 
177
177
  command = [sys.executable, "-m", "pip", "install", "--upgrade"] + packages
178
178
 
179
- if constraints:
180
- constraints_tempfile = self.parent_helper.tempfile(constraints, pipe=False)
181
- command.append("--constraint")
182
- command.append(constraints_tempfile)
179
+ # if no custom constraints are provided, use the constraints of the currently installed version of bbot
180
+ if constraints is not None:
181
+ constraints = get_python_constraints()
182
+
183
+ constraints_tempfile = self.parent_helper.tempfile(constraints, pipe=False)
184
+ command.append("--constraint")
185
+ command.append(constraints_tempfile)
183
186
 
184
187
  process = None
185
188
  try:
@@ -2807,3 +2807,21 @@ def safe_format(s, **kwargs):
2807
2807
  Format string while ignoring unused keys (prevents KeyError)
2808
2808
  """
2809
2809
  return s.format_map(SafeDict(kwargs))
2810
+
2811
+
2812
+ def get_python_constraints():
2813
+ req_regex = re.compile(r"([^(]+)\s*\((.*)\)", re.IGNORECASE)
2814
+
2815
+ def clean_requirement(req_string):
2816
+ # Extract package name and version constraints from format like "package (>=1.0,<2.0)"
2817
+ match = req_regex.match(req_string)
2818
+ if match:
2819
+ name, constraints = match.groups()
2820
+ return f"{name.strip()}{constraints}"
2821
+
2822
+ return req_string
2823
+
2824
+ from importlib.metadata import distribution
2825
+
2826
+ dist = distribution("bbot")
2827
+ return [clean_requirement(r) for r in dist.requires]
@@ -14,6 +14,9 @@ folder_blobs: false
14
14
  ### SCOPE ###
15
15
 
16
16
  scope:
17
+ # strict scope means only exact DNS names are considered in-scope
18
+ # subdomains are not included unless they are explicitly provided in the target list
19
+ strict: false
17
20
  # Filter by scope distance which events are displayed in the output
18
21
  # 0 == show only in-scope events (affiliates are always shown)
19
22
  # 1 == show all events up to distance-1 (1 hop from target)
@@ -32,10 +32,11 @@ class speculate(BaseInternalModule):
32
32
  "author": "@liquidsec",
33
33
  }
34
34
 
35
- options = {"max_hosts": 65536, "ports": "80,443"}
35
+ options = {"max_hosts": 65536, "ports": "80,443", "essential_only": False}
36
36
  options_desc = {
37
37
  "max_hosts": "Max number of IP_RANGE hosts to convert into IP_ADDRESS events",
38
38
  "ports": "The set of ports to speculate on",
39
+ "essential_only": "Only enable essential speculate features (no extra discovery)",
39
40
  }
40
41
  scope_distance_modifier = 1
41
42
  _priority = 4
@@ -52,6 +53,7 @@ class speculate(BaseInternalModule):
52
53
  self.emit_open_ports = self.open_port_consumers and not self.portscanner_enabled
53
54
  self.range_to_ip = True
54
55
  self.dns_disable = self.scan.config.get("dns", {}).get("disable", False)
56
+ self.essential_only = self.config.get("essential_only", False)
55
57
  self.org_stubs_seen = set()
56
58
 
57
59
  port_string = self.config.get("ports", "80,443")
@@ -75,6 +77,14 @@ class speculate(BaseInternalModule):
75
77
  return True
76
78
 
77
79
  async def handle_event(self, event):
80
+ ### BEGIN ESSENTIAL SPECULATION ###
81
+ # These features are required for smooth operation of bbot
82
+ # I.e. they are not "osinty" or intended to discover anything, they only compliment other modules
83
+
84
+ # we speculate on distance-1 stuff too, because distance-1 open ports are needed by certain modules like sslcert
85
+ event_in_scope_distance = event.scope_distance <= (self.scan.scope_search_distance + 1)
86
+ speculate_open_ports = self.emit_open_ports and event_in_scope_distance
87
+
78
88
  # generate individual IP addresses from IP range
79
89
  if event.type == "IP_RANGE" and self.range_to_ip:
80
90
  net = ipaddress.ip_network(event.data)
@@ -89,6 +99,28 @@ class speculate(BaseInternalModule):
89
99
  context=f"speculate converted range into individual IP_ADDRESS: {ip}",
90
100
  )
91
101
 
102
+ # IP_ADDRESS / DNS_NAME --> OPEN_TCP_PORT
103
+ if speculate_open_ports:
104
+ # don't act on unresolved DNS_NAMEs
105
+ usable_dns = False
106
+ if event.type == "DNS_NAME":
107
+ if self.dns_disable or ("a-record" in event.tags or "aaaa-record" in event.tags):
108
+ usable_dns = True
109
+
110
+ if event.type == "IP_ADDRESS" or usable_dns:
111
+ for port in self.ports:
112
+ await self.emit_event(
113
+ self.helpers.make_netloc(event.data, port),
114
+ "OPEN_TCP_PORT",
115
+ parent=event,
116
+ internal=True,
117
+ context="speculated {event.type}: {event.data}",
118
+ )
119
+
120
+ ### END ESSENTIAL SPECULATION ###
121
+ if self.essential_only:
122
+ return
123
+
92
124
  # parent domains
93
125
  if event.type.startswith("DNS_NAME"):
94
126
  parent = self.helpers.parent_domain(event.host_original)
@@ -97,10 +129,6 @@ class speculate(BaseInternalModule):
97
129
  parent, "DNS_NAME", parent=event, context=f"speculated parent {{event.type}}: {{event.data}}"
98
130
  )
99
131
 
100
- # we speculate on distance-1 stuff too, because distance-1 open ports are needed by certain modules like sslcert
101
- event_in_scope_distance = event.scope_distance <= (self.scan.scope_search_distance + 1)
102
- speculate_open_ports = self.emit_open_ports and event_in_scope_distance
103
-
104
132
  # URL --> OPEN_TCP_PORT
105
133
  event_is_url = event.type == "URL"
106
134
  if event_is_url or (event.type == "URL_UNVERIFIED" and self.open_port_consumers):
@@ -144,24 +172,6 @@ class speculate(BaseInternalModule):
144
172
  context="speculated {event.type}: {event.data}",
145
173
  )
146
174
 
147
- # IP_ADDRESS / DNS_NAME --> OPEN_TCP_PORT
148
- if speculate_open_ports:
149
- # don't act on unresolved DNS_NAMEs
150
- usable_dns = False
151
- if event.type == "DNS_NAME":
152
- if self.dns_disable or ("a-record" in event.tags or "aaaa-record" in event.tags):
153
- usable_dns = True
154
-
155
- if event.type == "IP_ADDRESS" or usable_dns:
156
- for port in self.ports:
157
- await self.emit_event(
158
- self.helpers.make_netloc(event.data, port),
159
- "OPEN_TCP_PORT",
160
- parent=event,
161
- internal=True,
162
- context="speculated {event.type}: {event.data}",
163
- )
164
-
165
175
  # ORG_STUB from TLD, SOCIAL, AZURE_TENANT
166
176
  org_stubs = set()
167
177
  if event.type == "DNS_NAME" and event.scope_distance == 0:
@@ -15,20 +15,19 @@ class leakix(subdomain_enum_apikey):
15
15
  }
16
16
 
17
17
  base_url = "https://leakix.net"
18
- ping_url = f"{base_url}/host/1.2.3.4.5"
18
+ ping_url = f"{base_url}/host/1.1.1.1"
19
19
 
20
20
  async def setup(self):
21
21
  ret = await super(subdomain_enum_apikey, self).setup()
22
- self.headers = {"Accept": "application/json"}
23
22
  self.api_key = self.config.get("api_key", "")
24
23
  if self.api_key:
25
- self.headers["api-key"] = self.api_key
26
24
  return await self.require_api_key()
27
25
  return ret
28
26
 
29
27
  def prepare_api_request(self, url, kwargs):
30
28
  if self.api_key:
31
29
  kwargs["headers"]["api-key"] = self.api_key
30
+ kwargs["headers"]["Accept"] = "application/json"
32
31
  return url, kwargs
33
32
 
34
33
  async def request_url(self, query):
@@ -0,0 +1,16 @@
1
+ description: Scan only the provided targets as fast as possible - no extra discovery
2
+
3
+ exclude_modules:
4
+ - excavate
5
+
6
+ config:
7
+ # only scan the exact targets specified
8
+ scope:
9
+ strict: true
10
+ # speed up dns resolution by doing A/AAAA only - not MX/NS/SRV/etc
11
+ dns:
12
+ minimal: true
13
+ # essential speculation only
14
+ modules:
15
+ speculate:
16
+ essential_only: true
@@ -91,7 +91,6 @@ class BBOTArgs:
91
91
  *self.parsed.targets,
92
92
  whitelist=self.parsed.whitelist,
93
93
  blacklist=self.parsed.blacklist,
94
- strict_scope=self.parsed.strict_scope,
95
94
  name="args_preset",
96
95
  )
97
96
 
@@ -149,6 +148,9 @@ class BBOTArgs:
149
148
  if self.parsed.force:
150
149
  args_preset.force_start = self.parsed.force
151
150
 
151
+ if self.parsed.proxy:
152
+ args_preset.core.merge_custom({"web": {"http_proxy": self.parsed.proxy}})
153
+
152
154
  if self.parsed.custom_headers:
153
155
  args_preset.core.merge_custom({"web": {"http_headers": self.parsed.custom_headers}})
154
156
 
@@ -165,6 +167,10 @@ class BBOTArgs:
165
167
  except Exception as e:
166
168
  raise BBOTArgumentError(f'Error parsing command-line config option: "{config_arg}": {e}')
167
169
 
170
+ # strict scope
171
+ if self.parsed.strict_scope:
172
+ args_preset.core.merge_custom({"scope": {"strict": True}})
173
+
168
174
  return args_preset
169
175
 
170
176
  def create_parser(self, *args, **kwargs):
@@ -265,6 +271,11 @@ class BBOTArgs:
265
271
  help="Run scan even in the case of condition violations or failed module setups",
266
272
  )
267
273
  scan.add_argument("-y", "--yes", action="store_true", help="Skip scan confirmation prompt")
274
+ scan.add_argument(
275
+ "--fast-mode",
276
+ action="store_true",
277
+ help="Scan only the provided targets as fast as possible, with no extra discovery",
278
+ )
268
279
  scan.add_argument("--dry-run", action="store_true", help=f"Abort before executing scan")
269
280
  scan.add_argument(
270
281
  "--current-preset",
@@ -310,6 +321,7 @@ class BBOTArgs:
310
321
 
311
322
  misc = p.add_argument_group(title="Misc")
312
323
  misc.add_argument("--version", action="store_true", help="show BBOT version and exit")
324
+ misc.add_argument("--proxy", help="Use this proxy for all HTTP requests", metavar="HTTP_PROXY")
313
325
  misc.add_argument(
314
326
  "-H",
315
327
  "--custom-headers",
@@ -359,6 +371,10 @@ class BBOTArgs:
359
371
  custom_headers_dict[k] = v
360
372
  self.parsed.custom_headers = custom_headers_dict
361
373
 
374
+ # --fast-mode
375
+ if self.parsed.fast_mode:
376
+ self.parsed.preset += ["fast"]
377
+
362
378
  def validate(self):
363
379
  # validate config options
364
380
  sentinel = object()
@@ -47,7 +47,6 @@ class Preset:
47
47
  target (Target): Target(s) of scan.
48
48
  whitelist (Target): Scan whitelist (by default this is the same as `target`).
49
49
  blacklist (Target): Scan blacklist (this takes ultimate precedence).
50
- strict_scope (bool): If True, subdomains of targets are not considered to be in-scope.
51
50
  helpers (ConfigAwareHelper): Helper containing various reusable functions, regexes, etc.
52
51
  output_dir (pathlib.Path): Output directory for scan.
53
52
  scan_name (str): Name of scan. Defaults to random value, e.g. "demonic_jimmy".
@@ -87,7 +86,6 @@ class Preset:
87
86
  *targets,
88
87
  whitelist=None,
89
88
  blacklist=None,
90
- strict_scope=False,
91
89
  modules=None,
92
90
  output_modules=None,
93
91
  exclude_modules=None,
@@ -117,7 +115,6 @@ class Preset:
117
115
  *targets (str): Target(s) to scan. Types supported: hostnames, IPs, CIDRs, emails, open ports.
118
116
  whitelist (list, optional): Whitelisted target(s) to scan. Defaults to the same as `targets`.
119
117
  blacklist (list, optional): Blacklisted target(s). Takes ultimate precedence. Defaults to empty.
120
- strict_scope (bool, optional): If True, subdomains of targets are not in-scope.
121
118
  modules (list[str], optional): List of scan modules to enable for the scan. Defaults to empty list.
122
119
  output_modules (list[str], optional): List of output modules to use. Defaults to csv, human, and json.
123
120
  exclude_modules (list[str], optional): List of modules to exclude from the scan.
@@ -234,7 +231,6 @@ class Preset:
234
231
  self.module_dirs = module_dirs
235
232
 
236
233
  # target / whitelist / blacklist
237
- self.strict_scope = strict_scope
238
234
  # these are temporary receptacles until they all get .baked() together
239
235
  self._seeds = set(targets if targets else [])
240
236
  self._whitelist = set(whitelist) if whitelist else whitelist
@@ -353,7 +349,6 @@ class Preset:
353
349
  else:
354
350
  self._whitelist.update(other._whitelist)
355
351
  self._blacklist.update(other._blacklist)
356
- self.strict_scope = self.strict_scope or other.strict_scope
357
352
 
358
353
  # module dirs
359
354
  self.module_dirs = self.module_dirs.union(other.module_dirs)
@@ -537,6 +532,14 @@ class Preset:
537
532
  def web_config(self):
538
533
  return self.core.config.get("web", {})
539
534
 
535
+ @property
536
+ def scope_config(self):
537
+ return self.config.get("scope", {})
538
+
539
+ @property
540
+ def strict_scope(self):
541
+ return self.scope_config.get("strict", False)
542
+
540
543
  def apply_log_level(self, apply_core=False):
541
544
  # silent takes precedence
542
545
  if self.silent:
@@ -635,7 +638,6 @@ class Preset:
635
638
  debug=preset_dict.get("debug", False),
636
639
  silent=preset_dict.get("silent", False),
637
640
  config=preset_dict.get("config"),
638
- strict_scope=preset_dict.get("strict_scope", False),
639
641
  module_dirs=preset_dict.get("module_dirs", []),
640
642
  include=list(preset_dict.get("include", [])),
641
643
  scan_name=preset_dict.get("scan_name"),
@@ -764,8 +766,6 @@ class Preset:
764
766
  preset_dict["whitelist"] = whitelist
765
767
  if blacklist:
766
768
  preset_dict["blacklist"] = blacklist
767
- if self.strict_scope:
768
- preset_dict["strict_scope"] = True
769
769
 
770
770
  # flags + modules
771
771
  if self.require_flags:
@@ -15,8 +15,8 @@ from werkzeug.wrappers import Request
15
15
  from bbot.errors import * # noqa: F401
16
16
  from bbot.core import CORE
17
17
  from bbot.scanner import Preset
18
- from bbot.core.helpers.misc import mkdir, rand_string
19
18
  from bbot.core.helpers.async_helpers import get_event_loop
19
+ from bbot.core.helpers.misc import mkdir, rand_string, get_python_constraints
20
20
 
21
21
 
22
22
  log = logging.getLogger(f"bbot.test.fixtures")
@@ -229,4 +229,7 @@ def install_all_python_deps():
229
229
  deps_pip = set()
230
230
  for module in DEFAULT_PRESET.module_loader.preloaded().values():
231
231
  deps_pip.update(set(module.get("deps", {}).get("pip", [])))
232
- subprocess.run([sys.executable, "-m", "pip", "install"] + list(deps_pip))
232
+
233
+ constraint_file = tempwordlist(get_python_constraints())
234
+
235
+ subprocess.run([sys.executable, "-m", "pip", "install", "--constraint", constraint_file] + list(deps_pip))
@@ -94,9 +94,21 @@ def bbot_httpserver_ssl():
94
94
  server.clear()
95
95
 
96
96
 
97
- @pytest.fixture
98
- def non_mocked_hosts() -> list:
99
- return ["127.0.0.1", "localhost", "raw.githubusercontent.com"] + interactsh_servers
97
+ def should_mock(request):
98
+ return not request.url.host in ["127.0.0.1", "localhost", "raw.githubusercontent.com"] + interactsh_servers
99
+
100
+
101
+ def pytest_collection_modifyitems(config, items):
102
+ # make sure all tests have the httpx_mock marker
103
+ for item in items:
104
+ item.add_marker(
105
+ pytest.mark.httpx_mock(
106
+ should_mock=should_mock,
107
+ assert_all_requests_were_expected=False,
108
+ assert_all_responses_were_requested=False,
109
+ can_send_already_matched_responses=True,
110
+ )
111
+ )
100
112
 
101
113
 
102
114
  @pytest.fixture
@@ -239,80 +251,80 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config): # pragma: no
239
251
 
240
252
 
241
253
  # BELOW: debugging for frozen/hung tests
242
- # import psutil
243
- # import traceback
244
- # import inspect
245
-
246
-
247
- # def _print_detailed_info(): # pragma: no cover
248
- # """
249
- # Debugging pytests hanging
250
- # """
251
- # print("=== Detailed Thread and Process Information ===\n")
252
- # try:
253
- # print("=== Threads ===")
254
- # for thread in threading.enumerate():
255
- # print(f"Thread Name: {thread.name}")
256
- # print(f"Thread ID: {thread.ident}")
257
- # print(f"Is Alive: {thread.is_alive()}")
258
- # print(f"Daemon: {thread.daemon}")
259
-
260
- # if hasattr(thread, "_target"):
261
- # target = thread._target
262
- # if target:
263
- # qualname = (
264
- # f"{target.__module__}.{target.__qualname__}"
265
- # if hasattr(target, "__qualname__")
266
- # else str(target)
267
- # )
268
- # print(f"Target Function: {qualname}")
269
-
270
- # if hasattr(thread, "_args"):
271
- # args = thread._args
272
- # kwargs = thread._kwargs if hasattr(thread, "_kwargs") else {}
273
- # arg_spec = inspect.getfullargspec(target)
274
-
275
- # all_args = list(args) + [f"{k}={v}" for k, v in kwargs.items()]
276
-
277
- # if inspect.ismethod(target) and arg_spec.args[0] == "self":
278
- # arg_spec.args.pop(0)
279
-
280
- # named_args = list(zip(arg_spec.args, all_args))
281
- # if arg_spec.varargs:
282
- # named_args.extend((f"*{arg_spec.varargs}", arg) for arg in all_args[len(arg_spec.args) :])
283
-
284
- # print("Arguments:")
285
- # for name, value in named_args:
286
- # print(f" {name}: {value}")
287
- # else:
288
- # print("Target Function: None")
289
- # else:
290
- # print("Target Function: Unknown")
291
-
292
- # print()
293
-
294
- # print("=== Processes ===")
295
- # current_process = psutil.Process()
296
- # for child in current_process.children(recursive=True):
297
- # print(f"Process ID: {child.pid}")
298
- # print(f"Name: {child.name()}")
299
- # print(f"Status: {child.status()}")
300
- # print(f"CPU Times: {child.cpu_times()}")
301
- # print(f"Memory Info: {child.memory_info()}")
302
- # print()
303
-
304
- # print("=== Current Process ===")
305
- # print(f"Process ID: {current_process.pid}")
306
- # print(f"Name: {current_process.name()}")
307
- # print(f"Status: {current_process.status()}")
308
- # print(f"CPU Times: {current_process.cpu_times()}")
309
- # print(f"Memory Info: {current_process.memory_info()}")
310
- # print()
311
-
312
- # except Exception as e:
313
- # print(f"An error occurred: {str(e)}")
314
- # print("Traceback:")
315
- # traceback.print_exc()
254
+ import psutil
255
+ import traceback
256
+ import inspect
257
+
258
+
259
+ def _print_detailed_info(): # pragma: no cover
260
+ """
261
+ Debugging pytests hanging
262
+ """
263
+ print("=== Detailed Thread and Process Information ===\n")
264
+ try:
265
+ print("=== Threads ===")
266
+ for thread in threading.enumerate():
267
+ print(f"Thread Name: {thread.name}")
268
+ print(f"Thread ID: {thread.ident}")
269
+ print(f"Is Alive: {thread.is_alive()}")
270
+ print(f"Daemon: {thread.daemon}")
271
+
272
+ if hasattr(thread, "_target"):
273
+ target = thread._target
274
+ if target:
275
+ qualname = (
276
+ f"{target.__module__}.{target.__qualname__}"
277
+ if hasattr(target, "__qualname__")
278
+ else str(target)
279
+ )
280
+ print(f"Target Function: {qualname}")
281
+
282
+ if hasattr(thread, "_args"):
283
+ args = thread._args
284
+ kwargs = thread._kwargs if hasattr(thread, "_kwargs") else {}
285
+ arg_spec = inspect.getfullargspec(target)
286
+
287
+ all_args = list(args) + [f"{k}={v}" for k, v in kwargs.items()]
288
+
289
+ if inspect.ismethod(target) and arg_spec.args[0] == "self":
290
+ arg_spec.args.pop(0)
291
+
292
+ named_args = list(zip(arg_spec.args, all_args))
293
+ if arg_spec.varargs:
294
+ named_args.extend((f"*{arg_spec.varargs}", arg) for arg in all_args[len(arg_spec.args) :])
295
+
296
+ print("Arguments:")
297
+ for name, value in named_args:
298
+ print(f" {name}: {value}")
299
+ else:
300
+ print("Target Function: None")
301
+ else:
302
+ print("Target Function: Unknown")
303
+
304
+ print()
305
+
306
+ print("=== Processes ===")
307
+ current_process = psutil.Process()
308
+ for child in current_process.children(recursive=True):
309
+ print(f"Process ID: {child.pid}")
310
+ print(f"Name: {child.name()}")
311
+ print(f"Status: {child.status()}")
312
+ print(f"CPU Times: {child.cpu_times()}")
313
+ print(f"Memory Info: {child.memory_info()}")
314
+ print()
315
+
316
+ print("=== Current Process ===")
317
+ print(f"Process ID: {current_process.pid}")
318
+ print(f"Name: {current_process.name()}")
319
+ print(f"Status: {current_process.status()}")
320
+ print(f"CPU Times: {current_process.cpu_times()}")
321
+ print(f"Memory Info: {current_process.memory_info()}")
322
+ print()
323
+
324
+ except Exception as e:
325
+ print(f"An error occurred: {str(e)}")
326
+ print("Traceback:")
327
+ traceback.print_exc()
316
328
 
317
329
 
318
330
  @pytest.hookimpl(tryfirst=True, hookwrapper=True)
@@ -330,11 +342,11 @@ def pytest_sessionfinish(session, exitstatus):
330
342
  yield
331
343
 
332
344
  # temporarily suspend stdout capture and print detailed thread info
333
- # capmanager = session.config.pluginmanager.get_plugin("capturemanager")
334
- # if capmanager:
335
- # capmanager.suspend_global_capture(in_=True)
345
+ capmanager = session.config.pluginmanager.get_plugin("capturemanager")
346
+ if capmanager:
347
+ capmanager.suspend_global_capture(in_=True)
336
348
 
337
- # _print_detailed_info()
349
+ _print_detailed_info()
338
350
 
339
- # if capmanager:
340
- # capmanager.resume_global_capture()
351
+ if capmanager:
352
+ capmanager.resume_global_capture()
@@ -626,6 +626,35 @@ config:
626
626
  stdout_preset = yaml.safe_load(captured.out)
627
627
  assert stdout_preset["config"]["web"]["http_proxy"] == "http://proxy2"
628
628
 
629
+ # --fast-mode
630
+ monkeypatch.setattr("sys.argv", ["bbot", "--current-preset"])
631
+ cli.main()
632
+ captured = capsys.readouterr()
633
+ stdout_preset = yaml.safe_load(captured.out)
634
+ assert list(stdout_preset) == ["description"]
635
+
636
+ monkeypatch.setattr("sys.argv", ["bbot", "--fast", "--current-preset"])
637
+ cli.main()
638
+ captured = capsys.readouterr()
639
+ stdout_preset = yaml.safe_load(captured.out)
640
+ stdout_preset.pop("description")
641
+ assert stdout_preset == {
642
+ "config": {
643
+ "scope": {"strict": True},
644
+ "dns": {"minimal": True},
645
+ "modules": {"speculate": {"essential_only": True}},
646
+ },
647
+ "exclude_modules": ["excavate"],
648
+ }
649
+
650
+ # --proxy
651
+ monkeypatch.setattr("sys.argv", ["bbot", "--proxy", "http://127.0.0.1:8080", "--current-preset"])
652
+ cli.main()
653
+ captured = capsys.readouterr()
654
+ stdout_preset = yaml.safe_load(captured.out)
655
+ stdout_preset.pop("description")
656
+ assert stdout_preset == {"config": {"web": {"http_proxy": "http://127.0.0.1:8080"}}}
657
+
629
658
  # cli config overrides all presets
630
659
  monkeypatch.setattr(
631
660
  "sys.argv",
@@ -484,7 +484,6 @@ async def test_events(events, helpers):
484
484
  json_event = db_event.json()
485
485
  assert isinstance(json_event["uuid"], str)
486
486
  assert json_event["uuid"] == str(db_event.uuid)
487
- print(f"{json_event} / {db_event.uuid} / {db_event.parent_uuid} / {scan.root_event.uuid}")
488
487
  assert json_event["parent_uuid"] == str(scan.root_event.uuid)
489
488
  assert json_event["scope_distance"] == 1
490
489
  assert json_event["data"] == "evilcorp.com:80"
@@ -10,9 +10,6 @@ from bbot.modules.internal.base import BaseInternalModule
10
10
 
11
11
  @pytest.mark.asyncio
12
12
  async def test_modules_basic_checks(events, httpx_mock):
13
- for http_method in ("GET", "CONNECT", "HEAD", "POST", "PUT", "TRACE", "DEBUG", "PATCH", "DELETE", "OPTIONS"):
14
- httpx_mock.add_response(method=http_method, url=re.compile(r".*"), json={"test": "test"})
15
-
16
13
  from bbot.scanner import Scanner
17
14
 
18
15
  scan = Scanner(config={"omit_event_types": ["URL_UNVERIFIED"]})
@@ -86,7 +86,6 @@ def test_preset_yaml(clean_default_config):
86
86
  debug=False,
87
87
  silent=True,
88
88
  config={"preset_test_asdf": 1},
89
- strict_scope=False,
90
89
  )
91
90
  preset1 = preset1.bake()
92
91
  assert "evilcorp.com" in preset1.target
@@ -210,7 +209,7 @@ def test_preset_scope():
210
209
  "evilcorp.org",
211
210
  whitelist=["evilcorp.de"],
212
211
  blacklist=["test.www.evilcorp.de"],
213
- strict_scope=True,
212
+ config={"scope": {"strict": True}},
214
213
  )
215
214
 
216
215
  preset1.merge(preset3)
@@ -471,6 +471,9 @@ async def test_web_cookies(bbot_scanner, httpx_mock):
471
471
  # but that they're not sent in the response
472
472
  with pytest.raises(httpx.TimeoutException):
473
473
  r = await client2.get(url="http://www2.evilcorp.com/cookies/test")
474
+ # make sure cookies are sent
475
+ r = await client2.get(url="http://www2.evilcorp.com/cookies/test", cookies={"wats": "fdsa"})
476
+ assert r.status_code == 200
474
477
  # make sure we can manually send cookies
475
478
  httpx_mock.add_response(url="http://www2.evilcorp.com/cookies/test2", match_headers={"Cookie": "fdsa=wats"})
476
479
  r = await client2.get(url="http://www2.evilcorp.com/cookies/test2", cookies={"fdsa": "wats"})