bbot 2.3.0.5491rc0__tar.gz → 2.3.0.5515rc0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of bbot might be problematic. Click here for more details.

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