bbot 2.1.0.5028rc0__tar.gz → 2.1.2.5156rc0__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 (401) hide show
  1. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/PKG-INFO +10 -9
  2. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/README.md +8 -7
  3. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/__init__.py +1 -1
  4. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/config/logger.py +28 -1
  5. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/depsinstaller/installer.py +10 -2
  6. bbot-2.1.2.5156rc0/bbot/modules/bufferoverrun.py +48 -0
  7. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/deadly/nuclei.py +1 -1
  8. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/gowitness.py +42 -44
  9. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/internal/speculate.py +2 -23
  10. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/trufflehog.py +1 -1
  11. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/wpscan.py +8 -2
  12. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/conftest.py +38 -17
  13. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/run_tests.sh +1 -1
  14. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/base.py +4 -0
  15. bbot-2.1.2.5156rc0/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +35 -0
  16. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +1 -1
  17. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/pyproject.toml +5 -5
  18. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/LICENSE +0 -0
  19. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/cli.py +0 -0
  20. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/__init__.py +0 -0
  21. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/config/__init__.py +0 -0
  22. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/config/files.py +0 -0
  23. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/core.py +0 -0
  24. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/engine.py +0 -0
  25. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/event/__init__.py +0 -0
  26. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/event/base.py +0 -0
  27. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/event/helpers.py +0 -0
  28. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/flags.py +0 -0
  29. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/__init__.py +0 -0
  30. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/async_helpers.py +0 -0
  31. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/bloom.py +0 -0
  32. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/cache.py +0 -0
  33. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/command.py +0 -0
  34. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
  35. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
  36. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/diff.py +0 -0
  37. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/dns/__init__.py +0 -0
  38. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/dns/brute.py +0 -0
  39. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/dns/dns.py +0 -0
  40. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/dns/engine.py +0 -0
  41. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/dns/helpers.py +0 -0
  42. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/dns/mock.py +0 -0
  43. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/files.py +0 -0
  44. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/helper.py +0 -0
  45. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/interactsh.py +0 -0
  46. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/misc.py +0 -0
  47. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/names_generator.py +0 -0
  48. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/ntlm.py +0 -0
  49. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/process.py +0 -0
  50. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/ratelimiter.py +0 -0
  51. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/regex.py +0 -0
  52. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/regexes.py +0 -0
  53. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/url.py +0 -0
  54. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/validators.py +0 -0
  55. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/web/__init__.py +0 -0
  56. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/web/client.py +0 -0
  57. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/web/engine.py +0 -0
  58. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
  59. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/web/web.py +0 -0
  60. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/helpers/wordcloud.py +0 -0
  61. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/modules.py +0 -0
  62. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/core/shared_deps.py +0 -0
  63. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/defaults.yml +0 -0
  64. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/errors.py +0 -0
  65. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/logger.py +0 -0
  66. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/__init__.py +0 -0
  67. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/ajaxpro.py +0 -0
  68. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/anubisdb.py +0 -0
  69. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/apkpure.py +0 -0
  70. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/azure_realm.py +0 -0
  71. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/azure_tenant.py +0 -0
  72. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/baddns.py +0 -0
  73. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/baddns_direct.py +0 -0
  74. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/baddns_zone.py +0 -0
  75. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/badsecrets.py +0 -0
  76. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/base.py +0 -0
  77. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/bevigil.py +0 -0
  78. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/binaryedge.py +0 -0
  79. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/bucket_amazon.py +0 -0
  80. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/bucket_azure.py +0 -0
  81. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/bucket_digitalocean.py +0 -0
  82. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/bucket_file_enum.py +0 -0
  83. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/bucket_firebase.py +0 -0
  84. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/bucket_google.py +0 -0
  85. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/builtwith.py +0 -0
  86. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/bypass403.py +0 -0
  87. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/c99.py +0 -0
  88. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/censys.py +0 -0
  89. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/certspotter.py +0 -0
  90. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/chaos.py +0 -0
  91. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/code_repository.py +0 -0
  92. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/columbus.py +0 -0
  93. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/credshed.py +0 -0
  94. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/crt.py +0 -0
  95. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/deadly/dastardly.py +0 -0
  96. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/deadly/ffuf.py +0 -0
  97. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/deadly/vhost.py +0 -0
  98. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/dehashed.py +0 -0
  99. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/digitorus.py +0 -0
  100. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/dnsbrute.py +0 -0
  101. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
  102. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/dnscaa.py +0 -0
  103. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/dnscommonsrv.py +0 -0
  104. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/dnsdumpster.py +0 -0
  105. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/docker_pull.py +0 -0
  106. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/dockerhub.py +0 -0
  107. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/dotnetnuke.py +0 -0
  108. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/emailformat.py +0 -0
  109. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/ffuf_shortnames.py +0 -0
  110. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/filedownload.py +0 -0
  111. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/fingerprintx.py +0 -0
  112. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/fullhunt.py +0 -0
  113. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/generic_ssrf.py +0 -0
  114. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/git.py +0 -0
  115. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/git_clone.py +0 -0
  116. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/github_codesearch.py +0 -0
  117. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/github_org.py +0 -0
  118. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/github_workflows.py +0 -0
  119. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/gitlab.py +0 -0
  120. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/google_playstore.py +0 -0
  121. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/hackertarget.py +0 -0
  122. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/host_header.py +0 -0
  123. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/httpx.py +0 -0
  124. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/hunt.py +0 -0
  125. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/hunterio.py +0 -0
  126. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/iis_shortnames.py +0 -0
  127. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/internal/__init__.py +0 -0
  128. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/internal/aggregate.py +0 -0
  129. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/internal/base.py +0 -0
  130. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/internal/cloudcheck.py +0 -0
  131. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/internal/dnsresolve.py +0 -0
  132. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/internal/excavate.py +0 -0
  133. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/internetdb.py +0 -0
  134. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/ip2location.py +0 -0
  135. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/ipneighbor.py +0 -0
  136. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/ipstack.py +0 -0
  137. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/leakix.py +0 -0
  138. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/myssl.py +0 -0
  139. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/newsletters.py +0 -0
  140. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/ntlm.py +0 -0
  141. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/oauth.py +0 -0
  142. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/otx.py +0 -0
  143. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/__init__.py +0 -0
  144. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/asset_inventory.py +0 -0
  145. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/base.py +0 -0
  146. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/csv.py +0 -0
  147. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/discord.py +0 -0
  148. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/emails.py +0 -0
  149. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/http.py +0 -0
  150. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/json.py +0 -0
  151. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/neo4j.py +0 -0
  152. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/python.py +0 -0
  153. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/slack.py +0 -0
  154. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/splunk.py +0 -0
  155. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/stdout.py +0 -0
  156. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/subdomains.py +0 -0
  157. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/teams.py +0 -0
  158. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/txt.py +0 -0
  159. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/web_report.py +0 -0
  160. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/output/websocket.py +0 -0
  161. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/paramminer_cookies.py +0 -0
  162. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/paramminer_getparams.py +0 -0
  163. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/paramminer_headers.py +0 -0
  164. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/passivetotal.py +0 -0
  165. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/pgp.py +0 -0
  166. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/portscan.py +0 -0
  167. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/postman.py +0 -0
  168. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/postman_download.py +0 -0
  169. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/rapiddns.py +0 -0
  170. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/report/affiliates.py +0 -0
  171. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/report/asn.py +0 -0
  172. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/report/base.py +0 -0
  173. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/robots.py +0 -0
  174. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/secretsdb.py +0 -0
  175. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/securitytrails.py +0 -0
  176. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/securitytxt.py +0 -0
  177. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/shodan_dns.py +0 -0
  178. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/sitedossier.py +0 -0
  179. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/skymem.py +0 -0
  180. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/smuggler.py +0 -0
  181. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/social.py +0 -0
  182. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/sslcert.py +0 -0
  183. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/subdomaincenter.py +0 -0
  184. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/subdomainradar.py +0 -0
  185. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/telerik.py +0 -0
  186. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/templates/bucket.py +0 -0
  187. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/templates/github.py +0 -0
  188. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/templates/postman.py +0 -0
  189. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/templates/shodan.py +0 -0
  190. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
  191. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/templates/webhook.py +0 -0
  192. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/trickest.py +0 -0
  193. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/unstructured.py +0 -0
  194. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/url_manipulation.py +0 -0
  195. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/urlscan.py +0 -0
  196. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/viewdns.py +0 -0
  197. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/virustotal.py +0 -0
  198. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/wafw00f.py +0 -0
  199. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/wappalyzer.py +0 -0
  200. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/wayback.py +0 -0
  201. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/modules/zoomeye.py +0 -0
  202. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/baddns-thorough.yml +0 -0
  203. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/cloud-enum.yml +0 -0
  204. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/code-enum.yml +0 -0
  205. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/email-enum.yml +0 -0
  206. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/kitchen-sink.yml +0 -0
  207. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/spider.yml +0 -0
  208. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/subdomain-enum.yml +0 -0
  209. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
  210. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/web/dirbust-light.yml +0 -0
  211. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
  212. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
  213. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/web/paramminer.yml +0 -0
  214. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/web-basic.yml +0 -0
  215. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/web-screenshots.yml +0 -0
  216. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/presets/web-thorough.yml +0 -0
  217. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/__init__.py +0 -0
  218. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/dispatcher.py +0 -0
  219. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/manager.py +0 -0
  220. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/preset/__init__.py +0 -0
  221. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/preset/args.py +0 -0
  222. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/preset/conditions.py +0 -0
  223. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/preset/environ.py +0 -0
  224. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/preset/path.py +0 -0
  225. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/preset/preset.py +0 -0
  226. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/scanner.py +0 -0
  227. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/stats.py +0 -0
  228. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scanner/target.py +0 -0
  229. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/scripts/docs.py +0 -0
  230. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/__init__.py +0 -0
  231. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/bbot_fixtures.py +0 -0
  232. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/coverage.cfg +0 -0
  233. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/owasp_mastg.apk +0 -0
  234. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test.conf +0 -0
  235. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_output.ndjson +0 -0
  236. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/__init__.py +0 -0
  237. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
  238. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
  239. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_cli.py +0 -0
  240. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_command.py +0 -0
  241. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_config.py +0 -0
  242. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
  243. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_dns.py +0 -0
  244. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_docs.py +0 -0
  245. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_engine.py +0 -0
  246. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_events.py +0 -0
  247. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_files.py +0 -0
  248. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
  249. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
  250. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
  251. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -0
  252. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_presets.py +0 -0
  253. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
  254. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
  255. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_scan.py +0 -0
  256. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_scope.py +0 -0
  257. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_target.py +0 -0
  258. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_1/test_web.py +0 -0
  259. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/__init__.py +0 -0
  260. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
  261. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
  262. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
  263. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
  264. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
  265. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
  266. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
  267. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
  268. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
  269. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
  270. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
  271. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
  272. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
  273. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
  274. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
  275. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
  276. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
  277. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
  278. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
  279. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
  280. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
  281. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
  282. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
  283. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
  284. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
  285. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
  286. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
  287. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
  288. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
  289. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
  290. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
  291. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
  292. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
  293. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
  294. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +0 -0
  295. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
  296. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
  297. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
  298. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
  299. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
  300. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
  301. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
  302. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
  303. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
  304. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
  305. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
  306. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
  307. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
  308. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
  309. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +0 -0
  310. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
  311. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
  312. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
  313. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
  314. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
  315. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
  316. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
  317. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
  318. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
  319. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
  320. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
  321. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
  322. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
  323. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
  324. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
  325. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
  326. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
  327. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
  328. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
  329. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
  330. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
  331. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
  332. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
  333. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
  334. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
  335. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
  336. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
  337. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
  338. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
  339. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
  340. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
  341. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
  342. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
  343. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
  344. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
  345. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
  346. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
  347. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
  348. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
  349. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
  350. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
  351. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
  352. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
  353. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
  354. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
  355. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
  356. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
  357. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
  358. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
  359. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
  360. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
  361. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
  362. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
  363. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
  364. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
  365. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
  366. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
  367. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
  368. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
  369. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
  370. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
  371. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
  372. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
  373. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
  374. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
  375. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -0
  376. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
  377. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
  378. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
  379. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
  380. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
  381. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
  382. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
  383. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
  384. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
  385. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
  386. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
  387. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
  388. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
  389. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
  390. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/testsslcert.pem +0 -0
  391. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/test/testsslkey.pem +0 -0
  392. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/wordlists/devops_mutations.txt +0 -0
  393. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
  394. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
  395. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/wordlists/nameservers.txt +0 -0
  396. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
  397. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
  398. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
  399. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
  400. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
  401. {bbot-2.1.0.5028rc0 → bbot-2.1.2.5156rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bbot
3
- Version: 2.1.0.5028rc0
3
+ Version: 2.1.2.5156rc0
4
4
  Summary: OSINT automation for hackers.
5
5
  Home-page: https://github.com/blacklanternsecurity/bbot
6
6
  License: GPL-3.0
@@ -29,7 +29,7 @@ Requires-Dist: jinja2 (>=3.1.3,<4.0.0)
29
29
  Requires-Dist: lxml (>=4.9.2,<6.0.0)
30
30
  Requires-Dist: mmh3 (>=4.1,<6.0)
31
31
  Requires-Dist: omegaconf (>=2.3.0,<3.0.0)
32
- Requires-Dist: psutil (>=5.9.4,<6.0.0)
32
+ Requires-Dist: psutil (>=5.9.4,<7.0.0)
33
33
  Requires-Dist: pycryptodome (>=3.17,<4.0)
34
34
  Requires-Dist: pydantic (>=2.4.2,<3.0.0)
35
35
  Requires-Dist: pyjwt (>=2.7.0,<3.0.0)
@@ -108,13 +108,13 @@ config:
108
108
  threads: 25
109
109
  brute_threads: 1000
110
110
  # put your API keys here
111
- modules:
112
- github:
113
- api_key: ""
114
- chaos:
115
- api_key: ""
116
- securitytrails:
117
- api_key: ""
111
+ # modules:
112
+ # github:
113
+ # api_key: ""
114
+ # chaos:
115
+ # api_key: ""
116
+ # securitytrails:
117
+ # api_key: ""
118
118
 
119
119
  ```
120
120
 
@@ -268,6 +268,7 @@ include:
268
268
  - paramminer
269
269
  - dirbust-light
270
270
  - web-screenshots
271
+ - baddns-thorough
271
272
 
272
273
  config:
273
274
  modules:
@@ -55,13 +55,13 @@ config:
55
55
  threads: 25
56
56
  brute_threads: 1000
57
57
  # put your API keys here
58
- modules:
59
- github:
60
- api_key: ""
61
- chaos:
62
- api_key: ""
63
- securitytrails:
64
- api_key: ""
58
+ # modules:
59
+ # github:
60
+ # api_key: ""
61
+ # chaos:
62
+ # api_key: ""
63
+ # securitytrails:
64
+ # api_key: ""
65
65
 
66
66
  ```
67
67
 
@@ -215,6 +215,7 @@ include:
215
215
  - paramminer
216
216
  - dirbust-light
217
217
  - web-screenshots
218
+ - baddns-thorough
218
219
 
219
220
  config:
220
221
  modules:
@@ -1,4 +1,4 @@
1
1
  # version placeholder (replaced by poetry-dynamic-versioning)
2
- __version__ = "v2.1.0.5028rc"
2
+ __version__ = "v2.1.2.5156rc"
3
3
 
4
4
  from .scanner import Scanner, Preset
@@ -5,6 +5,7 @@ from copy import copy
5
5
  import multiprocessing
6
6
  import logging.handlers
7
7
  from pathlib import Path
8
+ from contextlib import suppress
8
9
 
9
10
  from ..helpers.misc import mkdir, error_and_exit
10
11
  from ...logger import colorize, loglevel_mapping
@@ -71,10 +72,36 @@ class BBOTLogger:
71
72
  # Start the QueueListener
72
73
  self.listener = logging.handlers.QueueListener(self.queue, *self.log_handlers.values())
73
74
  self.listener.start()
74
- atexit.register(self.listener.stop)
75
+ atexit.register(self.cleanup_logging)
75
76
 
76
77
  self.log_level = logging.INFO
77
78
 
79
+ def cleanup_logging(self):
80
+ # Close the queue handler
81
+ with suppress(Exception):
82
+ self.queue_handler.close()
83
+
84
+ # Clean root logger
85
+ root_logger = logging.getLogger()
86
+ for handler in list(root_logger.handlers):
87
+ with suppress(Exception):
88
+ root_logger.removeHandler(handler)
89
+ with suppress(Exception):
90
+ handler.close()
91
+
92
+ # Clean all other loggers
93
+ for logger in logging.Logger.manager.loggerDict.values():
94
+ if hasattr(logger, "handlers"): # Logger, not PlaceHolder
95
+ for handler in list(logger.handlers):
96
+ with suppress(Exception):
97
+ logger.removeHandler(handler)
98
+ with suppress(Exception):
99
+ handler.close()
100
+
101
+ # Stop queue listener
102
+ with suppress(Exception):
103
+ self.listener.stop()
104
+
78
105
  def setup_queue_handler(self, logging_queue=None, log_level=logging.DEBUG):
79
106
  if logging_queue is None:
80
107
  logging_queue = self.queue
@@ -248,7 +248,7 @@ class DepsInstaller:
248
248
  return success
249
249
 
250
250
  def ansible_run(self, tasks=None, module=None, args=None, ansible_args=None):
251
- _ansible_args = {"ansible_connection": "local"}
251
+ _ansible_args = {"ansible_connection": "local", "ansible_python_interpreter": sys.executable}
252
252
  if ansible_args is not None:
253
253
  _ansible_args.update(ansible_args)
254
254
  module_args = None
@@ -342,7 +342,15 @@ class DepsInstaller:
342
342
  # ensure tldextract data is cached
343
343
  self.parent_helper.tldextract("evilcorp.co.uk")
344
344
  # command: package_name
345
- core_deps = {"unzip": "unzip", "curl": "curl"}
345
+ core_deps = {
346
+ "unzip": "unzip",
347
+ "zipinfo": "unzip",
348
+ "curl": "curl",
349
+ "git": "git",
350
+ "make": "make",
351
+ "gcc": "gcc",
352
+ "bash": "bash",
353
+ }
346
354
  for command, package_name in core_deps.items():
347
355
  if not self.parent_helper.which(command):
348
356
  to_install.add(package_name)
@@ -0,0 +1,48 @@
1
+ from bbot.modules.templates.subdomain_enum import subdomain_enum_apikey
2
+
3
+
4
+ class BufferOverrun(subdomain_enum_apikey):
5
+ watched_events = ["DNS_NAME"]
6
+ produced_events = ["DNS_NAME"]
7
+ flags = ["subdomain-enum", "passive", "safe"]
8
+ meta = {
9
+ "description": "Query BufferOverrun's TLS API for subdomains",
10
+ "created_date": "2024-10-23",
11
+ "author": "@TheTechromancer",
12
+ "auth_required": True,
13
+ }
14
+ options = {"api_key": "", "commercial": False}
15
+ options_desc = {"api_key": "BufferOverrun API key", "commercial": "Use commercial API"}
16
+
17
+ base_url = "https://tls.bufferover.run/dns"
18
+ commercial_base_url = "https://bufferover-run-tls.p.rapidapi.com/ipv4/dns"
19
+
20
+ async def setup(self):
21
+ self.commercial = self.config.get("commercial", False)
22
+ return await super().setup()
23
+
24
+ def prepare_api_request(self, url, kwargs):
25
+ if self.commercial:
26
+ kwargs["headers"]["x-rapidapi-host"] = "bufferover-run-tls.p.rapidapi.com"
27
+ kwargs["headers"]["x-rapidapi-key"] = self.api_key
28
+ else:
29
+ kwargs["headers"]["x-api-key"] = self.api_key
30
+ return url, kwargs
31
+
32
+ async def request_url(self, query):
33
+ url = f"{self.commercial_base_url if self.commercial else self.base_url}?q=.{query}"
34
+ return await self.api_request(url)
35
+
36
+ def parse_results(self, r, query):
37
+ j = r.json()
38
+ subdomains_set = set()
39
+ if isinstance(j, dict):
40
+ results = j.get("Results", [])
41
+ for result in results:
42
+ parts = result.split(",")
43
+ if len(parts) > 4:
44
+ subdomain = parts[4].strip()
45
+ if subdomain and subdomain.endswith(f".{query}"):
46
+ subdomains_set.add(subdomain)
47
+ for subdomain in subdomains_set:
48
+ yield subdomain
@@ -15,7 +15,7 @@ class nuclei(BaseModule):
15
15
  }
16
16
 
17
17
  options = {
18
- "version": "3.3.4",
18
+ "version": "3.3.5",
19
19
  "tags": "",
20
20
  "templates": "",
21
21
  "severity": "",
@@ -1,5 +1,5 @@
1
1
  import asyncio
2
- import sqlite3
2
+ import aiosqlite
3
3
  import multiprocessing
4
4
  from pathlib import Path
5
5
  from contextlib import suppress
@@ -34,6 +34,7 @@ class gowitness(BaseModule):
34
34
  "idle_timeout": "Skip the current gowitness batch if it stalls for longer than this many seconds",
35
35
  }
36
36
  deps_common = ["chromium"]
37
+ deps_pip = ["aiosqlite"]
37
38
  deps_ansible = [
38
39
  {
39
40
  "name": "Download gowitness",
@@ -72,7 +73,7 @@ class gowitness(BaseModule):
72
73
 
73
74
  # make sure we have a working chrome install
74
75
  chrome_test_pass = False
75
- for binary in ("chrome", "chromium", custom_chrome_path):
76
+ for binary in ("chrome", "chromium", "chromium-browser", custom_chrome_path):
76
77
  binary_path = self.helpers.which(binary)
77
78
  if binary_path and Path(binary_path).is_file():
78
79
  chrome_test_proc = await self.run_process([binary_path, "--version"])
@@ -136,7 +137,8 @@ class gowitness(BaseModule):
136
137
  return
137
138
 
138
139
  # emit web screenshots
139
- for filename, screenshot in self.new_screenshots.items():
140
+ new_screenshots = await self.get_new_screenshots()
141
+ for filename, screenshot in new_screenshots.items():
140
142
  url = screenshot["url"]
141
143
  final_url = screenshot["final_url"]
142
144
  filename = self.screenshot_path / screenshot["filename"]
@@ -150,7 +152,8 @@ class gowitness(BaseModule):
150
152
  )
151
153
 
152
154
  # emit URLs
153
- for url, row in self.new_network_logs.items():
155
+ new_network_logs = await self.get_new_network_logs()
156
+ for url, row in new_network_logs.items():
154
157
  ip = row["ip"]
155
158
  status_code = row["status_code"]
156
159
  tags = [f"status-{status_code}", f"ip-{ip}", "spider-danger"]
@@ -168,7 +171,8 @@ class gowitness(BaseModule):
168
171
  )
169
172
 
170
173
  # emit technologies
171
- for _, row in self.new_technologies.items():
174
+ new_technologies = await self.get_new_technologies()
175
+ for _, row in new_technologies.items():
172
176
  parent_id = row["url_id"]
173
177
  parent_url = self.screenshots_taken[parent_id]
174
178
  parent_event = event_dict[parent_url]
@@ -207,59 +211,53 @@ class gowitness(BaseModule):
207
211
  command += ["--timeout", str(self.timeout)]
208
212
  return command
209
213
 
210
- @property
211
- def new_screenshots(self):
214
+ async def get_new_screenshots(self):
212
215
  screenshots = {}
213
216
  if self.db_path.is_file():
214
- with sqlite3.connect(str(self.db_path)) as con:
215
- con.row_factory = sqlite3.Row
217
+ async with aiosqlite.connect(str(self.db_path)) as con:
218
+ con.row_factory = aiosqlite.Row
216
219
  con.text_factory = self.helpers.smart_decode
217
- cur = con.cursor()
218
- res = self.cur_execute(cur, "SELECT * FROM urls")
219
- for row in res:
220
- row = dict(row)
221
- _id = row["id"]
222
- if _id not in self.screenshots_taken:
223
- self.screenshots_taken[_id] = row["url"]
224
- screenshots[_id] = row
220
+ async with con.execute("SELECT * FROM urls") as cur:
221
+ async for row in cur:
222
+ row = dict(row)
223
+ _id = row["id"]
224
+ if _id not in self.screenshots_taken:
225
+ self.screenshots_taken[_id] = row["url"]
226
+ screenshots[_id] = row
225
227
  return screenshots
226
228
 
227
- @property
228
- def new_network_logs(self):
229
+ async def get_new_network_logs(self):
229
230
  network_logs = dict()
230
231
  if self.db_path.is_file():
231
- with sqlite3.connect(str(self.db_path)) as con:
232
- con.row_factory = sqlite3.Row
233
- cur = con.cursor()
234
- res = self.cur_execute(cur, "SELECT * FROM network_logs")
235
- for row in res:
236
- row = dict(row)
237
- url = row["final_url"]
238
- if url not in self.connections_logged:
239
- self.connections_logged.add(url)
240
- network_logs[url] = row
232
+ async with aiosqlite.connect(str(self.db_path)) as con:
233
+ con.row_factory = aiosqlite.Row
234
+ async with con.execute("SELECT * FROM network_logs") as cur:
235
+ async for row in cur:
236
+ row = dict(row)
237
+ url = row["final_url"]
238
+ if url not in self.connections_logged:
239
+ self.connections_logged.add(url)
240
+ network_logs[url] = row
241
241
  return network_logs
242
242
 
243
- @property
244
- def new_technologies(self):
243
+ async def get_new_technologies(self):
245
244
  technologies = dict()
246
245
  if self.db_path.is_file():
247
- with sqlite3.connect(str(self.db_path)) as con:
248
- con.row_factory = sqlite3.Row
249
- cur = con.cursor()
250
- res = self.cur_execute(cur, "SELECT * FROM technologies")
251
- for row in res:
252
- _id = row["id"]
253
- if _id not in self.technologies_found:
254
- self.technologies_found.add(_id)
255
- row = dict(row)
256
- technologies[_id] = row
246
+ async with aiosqlite.connect(str(self.db_path)) as con:
247
+ con.row_factory = aiosqlite.Row
248
+ async with con.execute("SELECT * FROM technologies") as cur:
249
+ async for row in cur:
250
+ _id = row["id"]
251
+ if _id not in self.technologies_found:
252
+ self.technologies_found.add(_id)
253
+ row = dict(row)
254
+ technologies[_id] = row
257
255
  return technologies
258
256
 
259
- def cur_execute(self, cur, query):
257
+ async def cur_execute(self, cur, query):
260
258
  try:
261
- return cur.execute(query)
262
- except sqlite3.OperationalError as e:
259
+ return await cur.execute(query)
260
+ except aiosqlite.OperationalError as e:
263
261
  self.warning(f"Error executing query: {query}: {e}")
264
262
  return []
265
263
 
@@ -1,6 +1,5 @@
1
1
  import random
2
2
  import ipaddress
3
- from pathlib import Path
4
3
 
5
4
  from bbot.core.helpers import validators
6
5
  from bbot.modules.internal.base import BaseInternalModule
@@ -24,9 +23,8 @@ class speculate(BaseInternalModule):
24
23
  "SOCIAL",
25
24
  "AZURE_TENANT",
26
25
  "USERNAME",
27
- "FILESYSTEM",
28
26
  ]
29
- produced_events = ["DNS_NAME", "OPEN_TCP_PORT", "IP_ADDRESS", "FINDING", "ORG_STUB", "FILESYSTEM"]
27
+ produced_events = ["DNS_NAME", "OPEN_TCP_PORT", "IP_ADDRESS", "FINDING", "ORG_STUB"]
30
28
  flags = ["passive"]
31
29
  meta = {
32
30
  "description": "Derive certain event types from others by common sense",
@@ -34,11 +32,10 @@ class speculate(BaseInternalModule):
34
32
  "author": "@liquidsec",
35
33
  }
36
34
 
37
- options = {"max_hosts": 65536, "ports": "80,443", "ignore_folders": [".git"]}
35
+ options = {"max_hosts": 65536, "ports": "80,443"}
38
36
  options_desc = {
39
37
  "max_hosts": "Max number of IP_RANGE hosts to convert into IP_ADDRESS events",
40
38
  "ports": "The set of ports to speculate on",
41
- "ignore_folders": "Subfolders to ignore when crawling downloaded folders",
42
39
  }
43
40
  scope_distance_modifier = 1
44
41
  _priority = 4
@@ -75,13 +72,6 @@ class speculate(BaseInternalModule):
75
72
  self.hugewarning(f'Enabling the "portscan" module is highly recommended')
76
73
  self.range_to_ip = False
77
74
 
78
- self.ignored_folders = self.config.get("ignore_folders", [])
79
-
80
- return True
81
-
82
- async def filter_event(self, event):
83
- if event.type == "FILESYSTEM" and "folder" not in event.tags:
84
- return False, "Event is not a folder"
85
75
  return True
86
76
 
87
77
  async def handle_event(self, event):
@@ -205,14 +195,3 @@ class speculate(BaseInternalModule):
205
195
  email_event = self.make_event(email, "EMAIL_ADDRESS", parent=event, tags=["affiliate"])
206
196
  if email_event:
207
197
  await self.emit_event(email_event, context="detected {event.type}: {event.data}")
208
-
209
- # FILESYSTEM (folder) --> FILESYSTEM (files)
210
- if event.type == "FILESYSTEM":
211
- folder_path = Path(event.data["path"])
212
- for file_path in folder_path.rglob("*"):
213
- # If the file is not in an ignored folder and if it has an allowed extension raise it as a FILESYSTEM event
214
- if not any(ignored_folder in str(file_path) for ignored_folder in self.ignored_folders):
215
- file_event = self.make_event(
216
- {"path": str(file_path)}, "FILESYSTEM", tags=["parsed_folder", "file"], parent=event
217
- )
218
- await self.emit_event(file_event)
@@ -13,7 +13,7 @@ class trufflehog(BaseModule):
13
13
  }
14
14
 
15
15
  options = {
16
- "version": "3.82.11",
16
+ "version": "3.83.2",
17
17
  "config": "",
18
18
  "only_verified": True,
19
19
  "concurrency": 8,
@@ -33,7 +33,7 @@ class wpscan(BaseModule):
33
33
  deps_apt = ["curl", "make", "gcc"]
34
34
  deps_ansible = [
35
35
  {
36
- "name": "Install Ruby Deps (Debian/Ubuntu)",
36
+ "name": "Install Ruby Deps (Debian)",
37
37
  "package": {"name": ["ruby-rubygems", "ruby-dev"], "state": "present"},
38
38
  "become": True,
39
39
  "when": "ansible_facts['os_family'] == 'Debian'",
@@ -48,7 +48,13 @@ class wpscan(BaseModule):
48
48
  "name": "Install Ruby Deps (Fedora)",
49
49
  "package": {"name": ["rubygems", "ruby-devel"], "state": "present"},
50
50
  "become": True,
51
- "when": "ansible_facts['os_family'] == 'Fedora'",
51
+ "when": "ansible_facts['os_family'] == 'RedHat'",
52
+ },
53
+ {
54
+ "name": "Install Ruby Deps (Alpine)",
55
+ "package": {"name": ["ruby-dev", "ruby-bundler"], "state": "present"},
56
+ "become": True,
57
+ "when": "ansible_facts['os_family'] == 'Alpine'",
52
58
  },
53
59
  {
54
60
  "name": "Install wpscan gem",
@@ -13,17 +13,31 @@ from bbot.core import CORE
13
13
  from bbot.core.helpers.misc import execute_sync_or_async
14
14
  from bbot.core.helpers.interactsh import server_list as interactsh_servers
15
15
 
16
+ # silence stdout + trace
17
+ root_logger = logging.getLogger()
18
+ pytest_debug_file = Path(__file__).parent.parent.parent / "pytest_debug.log"
19
+ print(f"pytest_debug_file: {pytest_debug_file}")
20
+ debug_handler = logging.FileHandler(pytest_debug_file)
21
+ debug_handler.setLevel(logging.DEBUG)
22
+ debug_format = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s %(filename)s:%(lineno)s %(message)s")
23
+ debug_handler.setFormatter(debug_format)
24
+ root_logger.addHandler(debug_handler)
16
25
 
17
26
  test_config = OmegaConf.load(Path(__file__).parent / "test.conf")
18
- if test_config.get("debug", False):
19
- os.environ["BBOT_DEBUG"] = "True"
20
- logging.getLogger("bbot").setLevel(logging.DEBUG)
21
- CORE.logger.log_level = logging.DEBUG
22
- else:
23
- # silence stdout + trace
24
- root_logger = logging.getLogger()
25
- for h in root_logger.handlers:
26
- h.addFilter(lambda x: x.levelname not in ("STDOUT", "TRACE"))
27
+
28
+ os.environ["BBOT_DEBUG"] = "True"
29
+ CORE.logger.log_level = logging.DEBUG
30
+
31
+ # silence all stderr output:
32
+ stderr_handler = CORE.logger.log_handlers["stderr"]
33
+ stderr_handler.setLevel(logging.CRITICAL)
34
+ handlers = list(CORE.logger.listener.handlers)
35
+ handlers.remove(stderr_handler)
36
+ CORE.logger.listener.handlers = tuple(handlers)
37
+
38
+ for h in root_logger.handlers:
39
+ h.addFilter(lambda x: x.levelname not in ("STDOUT", "TRACE"))
40
+
27
41
 
28
42
  CORE.merge_default(test_config)
29
43
 
@@ -33,6 +47,13 @@ def assert_all_responses_were_requested() -> bool:
33
47
  return False
34
48
 
35
49
 
50
+ @pytest.fixture(autouse=True)
51
+ def silence_live_logging():
52
+ for handler in logging.getLogger().handlers:
53
+ if type(handler).__name__ == "_LiveLoggingStreamHandler":
54
+ handler.setLevel(logging.CRITICAL)
55
+
56
+
36
57
  @pytest.fixture
37
58
  def bbot_httpserver():
38
59
  server = HTTPServer(host="127.0.0.1", port=8888, threaded=True)
@@ -202,20 +223,20 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config): # pragma: no
202
223
  errors = len(stats.get("error", []))
203
224
  failed = stats.get("failed", [])
204
225
 
205
- print("\nTest Session Summary:")
206
- print(f"Total tests run: {total_tests}")
207
- print(
208
- f"{GREEN}Passed: {passed}{RESET}, {RED}Failed: {len(failed)}{RESET}, {YELLOW}Skipped: {skipped}{RESET}, Errors: {errors}"
226
+ terminalreporter.write("\nTest Session Summary:")
227
+ terminalreporter.write(f"\nTotal tests run: {total_tests}")
228
+ terminalreporter.write(
229
+ f"\n{GREEN}Passed: {passed}{RESET}, {RED}Failed: {len(failed)}{RESET}, {YELLOW}Skipped: {skipped}{RESET}, Errors: {errors}"
209
230
  )
210
231
 
211
232
  if failed:
212
- print(f"\n{RED}Detailed failed test report:{RESET}")
233
+ terminalreporter.write(f"\n{RED}Detailed failed test report:{RESET}")
213
234
  for item in failed:
214
235
  test_name = item.nodeid.split("::")[-1] if "::" in item.nodeid else item.nodeid
215
236
  file_and_line = f"{item.location[0]}:{item.location[1]}" # File path and line number
216
- print(f"{BLUE}Test Name: {test_name}{RESET} {CYAN}({file_and_line}){RESET}")
217
- print(f"{RED}Location: {item.nodeid} at {item.location[0]}:{item.location[1]}{RESET}")
218
- print(f"{RED}Failure details:\n{item.longreprtext}{RESET}")
237
+ terminalreporter.write(f"\n{BLUE}Test Name: {test_name}{RESET} {CYAN}({file_and_line}){RESET}")
238
+ terminalreporter.write(f"\n{RED}Location: {item.nodeid} at {item.location[0]}:{item.location[1]}{RESET}")
239
+ terminalreporter.write(f"\n{RED}Failure details:\n{item.longreprtext}{RESET}")
219
240
 
220
241
 
221
242
  # BELOW: debugging for frozen/hung tests
@@ -10,7 +10,7 @@ echo
10
10
 
11
11
  echo "[+] Linting with flake8"
12
12
  echo "======================="
13
- flake8 --select F,E722 --ignore F403,F405,F541 --per-file-ignores="*/__init__.py:F401,F403" "$bbot_dir" || exit 1
13
+ flake8 "$bbot_dir" || exit 1
14
14
  echo
15
15
 
16
16
  if [ "${1}x" != "x" ] ; then
@@ -89,6 +89,10 @@ class ModuleTestBase:
89
89
  async def module_test(
90
90
  self, httpx_mock, bbot_httpserver, bbot_httpserver_ssl, monkeypatch, request, caplog, capsys
91
91
  ):
92
+ # Skip dastardly test if we're in the distro tests (because dastardly uses docker)
93
+ if os.getenv("BBOT_DISTRO_TESTS") and self.name == "dastardly":
94
+ pytest.skip("Skipping module_test for dastardly module due to BBOT_DISTRO_TESTS environment variable")
95
+
92
96
  self.log.info(f"Starting {self.name} module test")
93
97
  module_test = self.ModuleTest(
94
98
  self, httpx_mock, bbot_httpserver, bbot_httpserver_ssl, monkeypatch, request, caplog, capsys
@@ -0,0 +1,35 @@
1
+ from .base import ModuleTestBase
2
+
3
+
4
+ class TestBufferOverrun(ModuleTestBase):
5
+ config_overrides = {"modules": {"bufferoverrun": {"api_key": "asdf", "commercial": False}}}
6
+
7
+ async def setup_before_prep(self, module_test):
8
+ # Mock response for non-commercial API
9
+ module_test.httpx_mock.add_response(
10
+ url="https://tls.bufferover.run/dns?q=.blacklanternsecurity.com",
11
+ match_headers={"x-api-key": "asdf"},
12
+ json={"Results": ["1.2.3.4,example.com,*,*,sub.blacklanternsecurity.com"]},
13
+ )
14
+
15
+ def check(self, module_test, events):
16
+ assert any(e.data == "sub.blacklanternsecurity.com" for e in events), "Failed to detect subdomain for free API"
17
+
18
+
19
+ class TestBufferOverrunCommercial(ModuleTestBase):
20
+ modules_overrides = ["bufferoverrun"]
21
+ module_name = "bufferoverrun"
22
+ config_overrides = {"modules": {"bufferoverrun": {"api_key": "asdf", "commercial": True}}}
23
+
24
+ async def setup_before_prep(self, module_test):
25
+ # Mock response for commercial API
26
+ module_test.httpx_mock.add_response(
27
+ url="https://bufferover-run-tls.p.rapidapi.com/ipv4/dns?q=.blacklanternsecurity.com",
28
+ match_headers={"x-rapidapi-host": "bufferover-run-tls.p.rapidapi.com", "x-rapidapi-key": "asdf"},
29
+ json={"Results": ["5.6.7.8,blacklanternsecurity.com,*,*,sub.blacklanternsecurity.com"]},
30
+ )
31
+
32
+ def check(self, module_test, events):
33
+ assert any(
34
+ e.data == "sub.blacklanternsecurity.com" for e in events
35
+ ), "Failed to detect subdomain for commercial API"
@@ -215,7 +215,7 @@ class TestGit_CloneWithBlob(TestGit_Clone):
215
215
  config_overrides = {"folder_blobs": True}
216
216
 
217
217
  def check(self, module_test, events):
218
- filesystem_events = [e for e in events if e.type == "FILESYSTEM" and "folder" in e.tags]
218
+ filesystem_events = [e for e in events if e.type == "FILESYSTEM"]
219
219
  assert len(filesystem_events) == 1
220
220
  assert all(["blob" in e.data for e in filesystem_events])
221
221
  filesystem_event = filesystem_events[0]
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "bbot"
3
- version = "v2.1.0.5028rc"
3
+ version = "v2.1.2.5156rc"
4
4
  description = "OSINT automation for hackers."
5
5
  authors = [
6
6
  "TheTechromancer",
@@ -27,7 +27,7 @@ bbot = 'bbot.cli:main'
27
27
  [tool.poetry.dependencies]
28
28
  python = "^3.9"
29
29
  omegaconf = "^2.3.0"
30
- psutil = "^5.9.4"
30
+ psutil = ">=5.9.4,<7.0.0"
31
31
  wordninja = "^2.0.0"
32
32
  ansible-runner = "^2.3.2"
33
33
  deepdiff = ">=6.2.3,<8.0.0"
@@ -64,13 +64,13 @@ werkzeug = ">=2.3.4,<4.0.0"
64
64
  pytest-env = ">=0.8.2,<1.2.0"
65
65
  pre-commit = ">=3.4,<5.0"
66
66
  black = "^24.1.1"
67
- pytest-cov = "^5.0.0"
67
+ pytest-cov = ">=5,<7"
68
68
  pytest-rerunfailures = "^14.0"
69
69
  pytest-timeout = "^2.3.1"
70
70
  pytest-httpx = "^0.30.0"
71
71
  pytest-httpserver = "^1.0.11"
72
72
  pytest = "^8.3.1"
73
- pytest-asyncio = "0.23.8"
73
+ pytest-asyncio = "0.24.0"
74
74
 
75
75
  [tool.poetry.group.docs.dependencies]
76
76
  mkdocs = "^1.5.2"
@@ -100,7 +100,7 @@ extend-exclude = "(test_step_1/test_manager_*)"
100
100
  [tool.poetry-dynamic-versioning]
101
101
  enable = false
102
102
  metadata = false
103
- format-jinja = 'v2.1.0{% if branch == "dev" %}.{{ distance }}rc{% endif %}'
103
+ format-jinja = 'v2.1.2{% if branch == "dev" %}.{{ distance }}rc{% endif %}'
104
104
 
105
105
  [tool.poetry-dynamic-versioning.substitution]
106
106
  files = ["*/__init__.py"]
File without changes
File without changes