bbot 2.3.0.5418rc0__tar.gz → 2.3.0.5438rc0__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.5418rc0 → bbot-2.3.0.5438rc0}/PKG-INFO +1 -1
  2. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/__init__.py +1 -1
  3. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/cli.py +12 -2
  4. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/names_generator.py +1 -0
  5. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/base.py +1 -1
  6. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/internal/cloudcheck.py +5 -1
  7. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/internal/dnsresolve.py +9 -2
  8. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/internal/excavate.py +2 -0
  9. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/internal/speculate.py +1 -1
  10. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/mysql.py +1 -1
  11. bbot-2.3.0.5438rc0/bbot/modules/output/nmap_xml.py +171 -0
  12. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/postgres.py +5 -1
  13. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/sqlite.py +5 -1
  14. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/stdout.py +1 -1
  15. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/txt.py +1 -1
  16. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/preset/args.py +12 -6
  17. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/target.py +6 -1
  18. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_cli.py +14 -2
  19. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_modules_basic.py +9 -11
  20. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_target.py +1 -0
  21. bbot-2.3.0.5438rc0/bbot/test/test_step_2/module_tests/test_module_nmap_xml.py +85 -0
  22. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/pyproject.toml +2 -2
  23. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/LICENSE +0 -0
  24. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/README.md +0 -0
  25. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/__init__.py +0 -0
  26. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/config/__init__.py +0 -0
  27. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/config/files.py +0 -0
  28. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/config/logger.py +0 -0
  29. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/core.py +0 -0
  30. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/engine.py +0 -0
  31. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/event/__init__.py +0 -0
  32. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/event/base.py +0 -0
  33. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/event/helpers.py +0 -0
  34. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/flags.py +0 -0
  35. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/__init__.py +0 -0
  36. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/async_helpers.py +0 -0
  37. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/bloom.py +0 -0
  38. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/cache.py +0 -0
  39. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/command.py +0 -0
  40. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
  41. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/depsinstaller/installer.py +0 -0
  42. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
  43. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/diff.py +0 -0
  44. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/dns/__init__.py +0 -0
  45. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/dns/brute.py +0 -0
  46. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/dns/dns.py +0 -0
  47. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/dns/engine.py +0 -0
  48. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/dns/helpers.py +0 -0
  49. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/dns/mock.py +0 -0
  50. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/files.py +0 -0
  51. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/helper.py +0 -0
  52. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/interactsh.py +0 -0
  53. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/libmagic.py +0 -0
  54. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/misc.py +0 -0
  55. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/ntlm.py +0 -0
  56. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/process.py +0 -0
  57. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/ratelimiter.py +0 -0
  58. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/regex.py +0 -0
  59. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/regexes.py +0 -0
  60. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/url.py +0 -0
  61. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/validators.py +0 -0
  62. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/web/__init__.py +0 -0
  63. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/web/client.py +0 -0
  64. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/web/engine.py +0 -0
  65. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
  66. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/web/web.py +0 -0
  67. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/helpers/wordcloud.py +0 -0
  68. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/modules.py +0 -0
  69. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/multiprocess.py +0 -0
  70. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/core/shared_deps.py +0 -0
  71. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/db/sql/models.py +0 -0
  72. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/defaults.yml +0 -0
  73. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/errors.py +0 -0
  74. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/logger.py +0 -0
  75. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/__init__.py +0 -0
  76. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/ajaxpro.py +0 -0
  77. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/anubisdb.py +0 -0
  78. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/apkpure.py +0 -0
  79. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/azure_realm.py +0 -0
  80. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/azure_tenant.py +0 -0
  81. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/baddns.py +0 -0
  82. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/baddns_direct.py +0 -0
  83. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/baddns_zone.py +0 -0
  84. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/badsecrets.py +0 -0
  85. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/bevigil.py +0 -0
  86. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/binaryedge.py +0 -0
  87. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/bucket_amazon.py +0 -0
  88. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/bucket_azure.py +0 -0
  89. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/bucket_digitalocean.py +0 -0
  90. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/bucket_file_enum.py +0 -0
  91. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/bucket_firebase.py +0 -0
  92. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/bucket_google.py +0 -0
  93. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/bufferoverrun.py +0 -0
  94. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/builtwith.py +0 -0
  95. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/bypass403.py +0 -0
  96. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/c99.py +0 -0
  97. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/censys.py +0 -0
  98. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/certspotter.py +0 -0
  99. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/chaos.py +0 -0
  100. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/code_repository.py +0 -0
  101. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/columbus.py +0 -0
  102. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/credshed.py +0 -0
  103. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/crt.py +0 -0
  104. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/deadly/dastardly.py +0 -0
  105. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/deadly/ffuf.py +0 -0
  106. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/deadly/nuclei.py +0 -0
  107. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/deadly/vhost.py +0 -0
  108. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/dehashed.py +0 -0
  109. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/digitorus.py +0 -0
  110. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/dnsbimi.py +0 -0
  111. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/dnsbrute.py +0 -0
  112. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
  113. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/dnscaa.py +0 -0
  114. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/dnscommonsrv.py +0 -0
  115. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/dnsdumpster.py +0 -0
  116. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/dnstlsrpt.py +0 -0
  117. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/docker_pull.py +0 -0
  118. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/dockerhub.py +0 -0
  119. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/dotnetnuke.py +0 -0
  120. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/emailformat.py +0 -0
  121. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/extractous.py +0 -0
  122. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/ffuf_shortnames.py +0 -0
  123. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/filedownload.py +0 -0
  124. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/fingerprintx.py +0 -0
  125. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/fullhunt.py +0 -0
  126. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/generic_ssrf.py +0 -0
  127. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/git.py +0 -0
  128. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/git_clone.py +0 -0
  129. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/github_codesearch.py +0 -0
  130. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/github_org.py +0 -0
  131. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/github_workflows.py +0 -0
  132. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/gitlab.py +0 -0
  133. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/google_playstore.py +0 -0
  134. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/gowitness.py +0 -0
  135. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/hackertarget.py +0 -0
  136. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/host_header.py +0 -0
  137. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/httpx.py +0 -0
  138. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/hunt.py +0 -0
  139. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/hunterio.py +0 -0
  140. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/iis_shortnames.py +0 -0
  141. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/internal/__init__.py +0 -0
  142. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/internal/aggregate.py +0 -0
  143. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/internal/base.py +0 -0
  144. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/internetdb.py +0 -0
  145. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/ip2location.py +0 -0
  146. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/ipneighbor.py +0 -0
  147. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/ipstack.py +0 -0
  148. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/jadx.py +0 -0
  149. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/leakix.py +0 -0
  150. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/myssl.py +0 -0
  151. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/newsletters.py +0 -0
  152. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/ntlm.py +0 -0
  153. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/oauth.py +0 -0
  154. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/otx.py +0 -0
  155. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/__init__.py +0 -0
  156. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/asset_inventory.py +0 -0
  157. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/base.py +0 -0
  158. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/csv.py +0 -0
  159. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/discord.py +0 -0
  160. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/emails.py +0 -0
  161. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/http.py +0 -0
  162. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/json.py +0 -0
  163. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/neo4j.py +0 -0
  164. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/python.py +0 -0
  165. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/slack.py +0 -0
  166. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/splunk.py +0 -0
  167. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/subdomains.py +0 -0
  168. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/teams.py +0 -0
  169. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/web_report.py +0 -0
  170. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/output/websocket.py +0 -0
  171. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/paramminer_cookies.py +0 -0
  172. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/paramminer_getparams.py +0 -0
  173. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/paramminer_headers.py +0 -0
  174. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/passivetotal.py +0 -0
  175. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/pgp.py +0 -0
  176. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/portscan.py +0 -0
  177. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/postman.py +0 -0
  178. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/postman_download.py +0 -0
  179. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/rapiddns.py +0 -0
  180. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/report/affiliates.py +0 -0
  181. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/report/asn.py +0 -0
  182. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/report/base.py +0 -0
  183. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/robots.py +0 -0
  184. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/secretsdb.py +0 -0
  185. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/securitytrails.py +0 -0
  186. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/securitytxt.py +0 -0
  187. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/shodan_dns.py +0 -0
  188. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/sitedossier.py +0 -0
  189. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/skymem.py +0 -0
  190. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/smuggler.py +0 -0
  191. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/social.py +0 -0
  192. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/sslcert.py +0 -0
  193. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/subdomaincenter.py +0 -0
  194. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/subdomainradar.py +0 -0
  195. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/telerik.py +0 -0
  196. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/templates/bucket.py +0 -0
  197. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/templates/github.py +0 -0
  198. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/templates/postman.py +0 -0
  199. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/templates/shodan.py +0 -0
  200. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/templates/sql.py +0 -0
  201. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
  202. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/templates/webhook.py +0 -0
  203. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/trickest.py +0 -0
  204. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/trufflehog.py +0 -0
  205. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/url_manipulation.py +0 -0
  206. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/urlscan.py +0 -0
  207. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/viewdns.py +0 -0
  208. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/virustotal.py +0 -0
  209. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/wafw00f.py +0 -0
  210. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/wappalyzer.py +0 -0
  211. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/wayback.py +0 -0
  212. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/wpscan.py +0 -0
  213. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/modules/zoomeye.py +0 -0
  214. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/baddns-thorough.yml +0 -0
  215. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/cloud-enum.yml +0 -0
  216. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/code-enum.yml +0 -0
  217. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/email-enum.yml +0 -0
  218. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/fast.yml +0 -0
  219. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/kitchen-sink.yml +0 -0
  220. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/spider.yml +0 -0
  221. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/subdomain-enum.yml +0 -0
  222. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
  223. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/web/dirbust-light.yml +0 -0
  224. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
  225. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
  226. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/web/paramminer.yml +0 -0
  227. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/web-basic.yml +0 -0
  228. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/web-screenshots.yml +0 -0
  229. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/presets/web-thorough.yml +0 -0
  230. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/__init__.py +0 -0
  231. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/dispatcher.py +0 -0
  232. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/manager.py +0 -0
  233. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/preset/__init__.py +0 -0
  234. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/preset/conditions.py +0 -0
  235. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/preset/environ.py +0 -0
  236. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/preset/path.py +0 -0
  237. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/preset/preset.py +0 -0
  238. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/scanner.py +0 -0
  239. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scanner/stats.py +0 -0
  240. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/scripts/docs.py +0 -0
  241. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/__init__.py +0 -0
  242. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/bbot_fixtures.py +0 -0
  243. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/conftest.py +0 -0
  244. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/coverage.cfg +0 -0
  245. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/fastapi_test.py +0 -0
  246. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/owasp_mastg.apk +0 -0
  247. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/run_tests.sh +0 -0
  248. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test.conf +0 -0
  249. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_output.ndjson +0 -0
  250. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/__init__.py +0 -0
  251. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
  252. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_bbot_fastapi.py +0 -0
  253. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
  254. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_command.py +0 -0
  255. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_config.py +0 -0
  256. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
  257. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_dns.py +0 -0
  258. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_docs.py +0 -0
  259. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_engine.py +0 -0
  260. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_events.py +0 -0
  261. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_files.py +0 -0
  262. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
  263. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
  264. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
  265. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_presets.py +0 -0
  266. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
  267. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
  268. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_scan.py +0 -0
  269. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_scope.py +0 -0
  270. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_1/test_web.py +0 -0
  271. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/__init__.py +0 -0
  272. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
  273. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/base.py +0 -0
  274. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
  275. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
  276. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
  277. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
  278. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
  279. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
  280. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
  281. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
  282. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
  283. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
  284. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
  285. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
  286. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
  287. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
  288. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
  289. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
  290. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
  291. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
  292. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
  293. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
  294. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
  295. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
  296. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
  297. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
  298. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
  299. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
  300. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
  301. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
  302. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
  303. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
  304. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
  305. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
  306. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
  307. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
  308. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +0 -0
  309. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
  310. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
  311. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
  312. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +0 -0
  313. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
  314. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
  315. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
  316. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
  317. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
  318. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
  319. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dnstlsrpt.py +0 -0
  320. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
  321. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
  322. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
  323. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
  324. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
  325. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +0 -0
  326. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_extractous.py +0 -0
  327. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
  328. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
  329. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
  330. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
  331. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
  332. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
  333. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
  334. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
  335. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
  336. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
  337. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
  338. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
  339. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
  340. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
  341. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
  342. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
  343. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
  344. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
  345. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
  346. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
  347. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
  348. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
  349. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
  350. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
  351. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
  352. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_jadx.py +0 -0
  353. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
  354. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
  355. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_mysql.py +0 -0
  356. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
  357. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
  358. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
  359. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
  360. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
  361. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
  362. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
  363. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
  364. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
  365. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
  366. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
  367. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
  368. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
  369. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_postgres.py +0 -0
  370. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
  371. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
  372. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
  373. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
  374. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
  375. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
  376. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
  377. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
  378. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
  379. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
  380. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
  381. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
  382. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
  383. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
  384. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
  385. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
  386. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_sqlite.py +0 -0
  387. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
  388. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
  389. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
  390. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
  391. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
  392. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
  393. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
  394. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
  395. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
  396. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
  397. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
  398. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
  399. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
  400. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
  401. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
  402. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
  403. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
  404. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
  405. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
  406. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
  407. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
  408. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
  409. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
  410. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
  411. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/testsslcert.pem +0 -0
  412. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/test/testsslkey.pem +0 -0
  413. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/wordlists/devops_mutations.txt +0 -0
  414. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
  415. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
  416. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/wordlists/nameservers.txt +0 -0
  417. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
  418. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
  419. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
  420. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
  421. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
  422. {bbot-2.3.0.5418rc0 → bbot-2.3.0.5438rc0}/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.5418rc0
3
+ Version: 2.3.0.5438rc0
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.5418rc"
2
+ __version__ = "v2.3.0.5438rc"
3
3
 
4
4
  from .scanner import Scanner, Preset
@@ -78,7 +78,7 @@ async def _main():
78
78
  return
79
79
 
80
80
  # if we're listing modules or their options
81
- if options.list_modules or options.list_module_options:
81
+ if options.list_modules or options.list_output_modules or options.list_module_options:
82
82
  # if no modules or flags are specified, enable everything
83
83
  if not (options.modules or options.output_modules or options.flags):
84
84
  for module, preloaded in preset.module_loader.preloaded().items():
@@ -96,7 +96,17 @@ async def _main():
96
96
  print("")
97
97
  print("### MODULES ###")
98
98
  print("")
99
- for row in preset.module_loader.modules_table(preset.modules).splitlines():
99
+ modules = sorted(set(preset.scan_modules + preset.internal_modules))
100
+ for row in preset.module_loader.modules_table(modules).splitlines():
101
+ print(row)
102
+ return
103
+
104
+ # --list-output-modules
105
+ if options.list_output_modules:
106
+ print("")
107
+ print("### OUTPUT MODULES ###")
108
+ print("")
109
+ for row in preset.module_loader.modules_table(preset.output_modules).splitlines():
100
110
  print(row)
101
111
  return
102
112
 
@@ -293,6 +293,7 @@ names = [
293
293
  "alyssa",
294
294
  "amanda",
295
295
  "amber",
296
+ "amir",
296
297
  "amy",
297
298
  "andrea",
298
299
  "andrew",
@@ -51,7 +51,7 @@ class BaseModule:
51
51
 
52
52
  target_only (bool): Accept only the initial target event(s). Default is False.
53
53
 
54
- in_scope_only (bool): Accept only explicitly in-scope events. Default is False.
54
+ in_scope_only (bool): Accept only explicitly in-scope events, regardless of the scan's search distance. Default is False.
55
55
 
56
56
  options (Dict): Customizable options for the module, e.g., {"api_key": ""}. Empty dict by default.
57
57
 
@@ -5,7 +5,11 @@ from bbot.modules.base import BaseInterceptModule
5
5
 
6
6
  class CloudCheck(BaseInterceptModule):
7
7
  watched_events = ["*"]
8
- meta = {"description": "Tag events by cloud provider, identify cloud resources like storage buckets"}
8
+ meta = {
9
+ "description": "Tag events by cloud provider, identify cloud resources like storage buckets",
10
+ "created_date": "2024-07-07",
11
+ "author": "@TheTechromancer",
12
+ }
9
13
  scope_distance_modifier = 1
10
14
  _priority = 3
11
15
 
@@ -9,6 +9,8 @@ from bbot.modules.base import BaseInterceptModule, BaseModule
9
9
 
10
10
  class DNSResolve(BaseInterceptModule):
11
11
  watched_events = ["*"]
12
+ produced_events = ["DNS_NAME", "IP_ADDRESS", "RAW_DNS_RECORD"]
13
+ meta = {"description": "Perform DNS resolution", "created_date": "2022-04-08", "author": "@TheTechromancer"}
12
14
  _priority = 1
13
15
  scope_distance_modifier = None
14
16
 
@@ -83,9 +85,14 @@ class DNSResolve(BaseInterceptModule):
83
85
  event_data_changed = await self.handle_wildcard_event(main_host_event)
84
86
  if event_data_changed:
85
87
  # since data has changed, we check again whether it's a duplicate
86
- if event.type == "DNS_NAME" and self.scan.ingress_module.is_incoming_duplicate(event, add=True):
88
+ if event.type == "DNS_NAME" and self.scan.ingress_module.is_incoming_duplicate(
89
+ event, add=True
90
+ ):
87
91
  if not event._graph_important:
88
- return False, "it's a DNS wildcard, and its module already emitted a similar wildcard event"
92
+ return (
93
+ False,
94
+ "it's a DNS wildcard, and its module already emitted a similar wildcard event",
95
+ )
89
96
  else:
90
97
  self.debug(
91
98
  f"Event {event} was already emitted by its module, but it's graph-important so it gets a pass"
@@ -656,8 +656,10 @@ class excavate(BaseInternalModule, BaseInterceptModule):
656
656
  continue
657
657
  if parsed_url.scheme in ["http", "https"]:
658
658
  continue
659
+
659
660
  def abort_if(e):
660
661
  return e.scope_distance > 0
662
+
661
663
  finding_data = {"host": str(host), "description": f"Non-HTTP URI: {parsed_url.geturl()}"}
662
664
  await self.report(finding_data, event, yara_rule_settings, discovery_context, abort_if=abort_if)
663
665
  protocol_data = {"protocol": parsed_url.scheme, "host": str(host)}
@@ -104,7 +104,7 @@ class speculate(BaseInternalModule):
104
104
  # don't act on unresolved DNS_NAMEs
105
105
  usable_dns = False
106
106
  if event.type == "DNS_NAME":
107
- if self.dns_disable or ("a-record" in event.tags or "aaaa-record" in event.tags):
107
+ if self.dns_disable or event.resolved_hosts:
108
108
  usable_dns = True
109
109
 
110
110
  if event.type == "IP_ADDRESS" or usable_dns:
@@ -3,7 +3,7 @@ from bbot.modules.templates.sql import SQLTemplate
3
3
 
4
4
  class MySQL(SQLTemplate):
5
5
  watched_events = ["*"]
6
- meta = {"description": "Output scan data to a MySQL database"}
6
+ meta = {"description": "Output scan data to a MySQL database", "created_date": "2024-11-13", "author": "@TheTechromancer"}
7
7
  options = {
8
8
  "username": "root",
9
9
  "password": "bbotislife",
@@ -0,0 +1,171 @@
1
+ import sys
2
+ from xml.dom import minidom
3
+ from datetime import datetime
4
+ from xml.etree.ElementTree import Element, SubElement, tostring
5
+
6
+ from bbot import __version__
7
+ from bbot.modules.output.base import BaseOutputModule
8
+
9
+
10
+ class NmapHost:
11
+ __slots__ = ["hostnames", "open_ports"]
12
+
13
+ def __init__(self):
14
+ self.hostnames = set()
15
+ # a dict of {port: {protocol: banner}}
16
+ self.open_ports = dict()
17
+
18
+
19
+ class Nmap_XML(BaseOutputModule):
20
+ watched_events = ["OPEN_TCP_PORT", "DNS_NAME", "IP_ADDRESS", "PROTOCOL", "HTTP_RESPONSE"]
21
+ meta = {"description": "Output to Nmap XML", "created_date": "2024-11-16", "author": "@TheTechromancer"}
22
+ output_filename = "output.nmap.xml"
23
+ in_scope_only = True
24
+
25
+ async def setup(self):
26
+ self.hosts = {}
27
+ self._prep_output_dir(self.output_filename)
28
+ return True
29
+
30
+ async def handle_event(self, event):
31
+ event_host = event.host
32
+
33
+ # we always record by IP
34
+ ips = []
35
+ for ip in event.resolved_hosts:
36
+ try:
37
+ ips.append(self.helpers.make_ip_type(ip))
38
+ except ValueError:
39
+ continue
40
+ if not ips and self.helpers.is_ip(event_host):
41
+ ips = [event_host]
42
+
43
+ for ip in ips:
44
+ try:
45
+ nmap_host = self.hosts[ip]
46
+ except KeyError:
47
+ nmap_host = NmapHost()
48
+ self.hosts[ip] = nmap_host
49
+
50
+ event_port = getattr(event, "port", None)
51
+ if event.type == "OPEN_TCP_PORT":
52
+ if event_port not in nmap_host.open_ports:
53
+ nmap_host.open_ports[event.port] = {}
54
+ elif event.type in ("PROTOCOL", "HTTP_RESPONSE"):
55
+ if event_port is not None:
56
+ try:
57
+ existing_services = nmap_host.open_ports[event.port]
58
+ except KeyError:
59
+ existing_services = {}
60
+ nmap_host.open_ports[event.port] = existing_services
61
+ if event.type == "PROTOCOL":
62
+ protocol = event.data["protocol"].lower()
63
+ banner = event.data.get("banner", None)
64
+ elif event.type == "HTTP_RESPONSE":
65
+ protocol = event.parsed_url.scheme.lower()
66
+ banner = event.http_title
67
+ if protocol not in existing_services:
68
+ existing_services[protocol] = banner
69
+
70
+ if self.helpers.is_ip(event_host):
71
+ if str(event.module) == "PTR":
72
+ nmap_host.hostnames.add(event.parent.data)
73
+ else:
74
+ nmap_host.hostnames.add(event_host)
75
+
76
+ async def report(self):
77
+ scan_start_time = str(int(self.scan.start_time.timestamp()))
78
+ scan_start_time_str = self.scan.start_time.strftime("%a %b %d %H:%M:%S %Y")
79
+ scan_end_time = datetime.now()
80
+ scan_end_time_str = scan_end_time.strftime("%a %b %d %H:%M:%S %Y")
81
+ scan_end_time_timestamp = str(scan_end_time.timestamp())
82
+ scan_duration = scan_end_time - self.scan.start_time
83
+ num_hosts_up = len(self.hosts)
84
+
85
+ # Create the root element
86
+ nmaprun = Element(
87
+ "nmaprun",
88
+ {
89
+ "scanner": "bbot",
90
+ "args": " ".join(sys.argv),
91
+ "start": scan_start_time,
92
+ "startstr": scan_start_time_str,
93
+ "version": str(__version__),
94
+ "xmloutputversion": "1.05",
95
+ },
96
+ )
97
+
98
+ ports_scanned = []
99
+ speculate_module = self.scan.modules.get("speculate", None)
100
+ if speculate_module is not None:
101
+ ports_scanned = speculate_module.ports
102
+ portscan_module = self.scan.modules.get("portscan", None)
103
+ if portscan_module is not None:
104
+ ports_scanned = self.helpers.parse_port_string(str(portscan_module.ports))
105
+ num_ports_scanned = len(sorted(ports_scanned))
106
+ ports_scanned = ",".join(str(x) for x in sorted(ports_scanned))
107
+
108
+ # Add scaninfo
109
+ SubElement(
110
+ nmaprun,
111
+ "scaninfo",
112
+ {"type": "syn", "protocol": "tcp", "numservices": str(num_ports_scanned), "services": ports_scanned},
113
+ )
114
+
115
+ # Add host information
116
+ for ip, nmap_host in self.hosts.items():
117
+ hostnames = sorted(nmap_host.hostnames)
118
+ ports = sorted(nmap_host.open_ports)
119
+
120
+ host_elem = SubElement(nmaprun, "host")
121
+ SubElement(host_elem, "status", {"state": "up", "reason": "user-set", "reason_ttl": "0"})
122
+ SubElement(host_elem, "address", {"addr": str(ip), "addrtype": f"ipv{ip.version}"})
123
+
124
+ if hostnames:
125
+ hostnames_elem = SubElement(host_elem, "hostnames")
126
+ for hostname in hostnames:
127
+ SubElement(hostnames_elem, "hostname", {"name": hostname, "type": "user"})
128
+
129
+ ports = SubElement(host_elem, "ports")
130
+ for port, protocols in nmap_host.open_ports.items():
131
+ port_elem = SubElement(ports, "port", {"protocol": "tcp", "portid": str(port)})
132
+ SubElement(port_elem, "state", {"state": "open", "reason": "syn-ack", "reason_ttl": "0"})
133
+ # <port protocol="tcp" portid="443"><state state="open" reason="syn-ack" reason_ttl="53"/><service name="http" product="AkamaiGHost" extrainfo="Akamai&apos;s HTTP Acceleration/Mirror service" tunnel="ssl" method="probed" conf="10"/></port>
134
+ for protocol, banner in protocols.items():
135
+ attrs = {"name": protocol, "method": "probed", "conf": "10"}
136
+ if banner is not None:
137
+ attrs["product"] = banner
138
+ attrs["extrainfo"] = banner
139
+ SubElement(port_elem, "service", attrs)
140
+
141
+ # Add runstats
142
+ runstats = SubElement(nmaprun, "runstats")
143
+ SubElement(
144
+ runstats,
145
+ "finished",
146
+ {
147
+ "time": scan_end_time_timestamp,
148
+ "timestr": scan_end_time_str,
149
+ "summary": f"BBOT done at {scan_end_time_str}; {num_hosts_up} scanned in {scan_duration} seconds",
150
+ "elapsed": str(scan_duration.total_seconds()),
151
+ "exit": "success",
152
+ },
153
+ )
154
+ SubElement(runstats, "hosts", {"up": str(num_hosts_up), "down": "0", "total": str(num_hosts_up)})
155
+
156
+ # make backup of the file
157
+ self.helpers.backup_file(self.output_file)
158
+
159
+ # Pretty-format the XML
160
+ rough_string = tostring(nmaprun, encoding="utf-8")
161
+ reparsed = minidom.parseString(rough_string)
162
+
163
+ # Create a new document with the doctype
164
+ doctype = minidom.DocumentType("nmaprun")
165
+ reparsed.insertBefore(doctype, reparsed.documentElement)
166
+
167
+ pretty_xml = reparsed.toprettyxml(indent=" ")
168
+
169
+ with open(self.output_file, "w") as f:
170
+ f.write(pretty_xml)
171
+ self.info(f"Saved Nmap XML output to {self.output_file}")
@@ -3,7 +3,11 @@ from bbot.modules.templates.sql import SQLTemplate
3
3
 
4
4
  class Postgres(SQLTemplate):
5
5
  watched_events = ["*"]
6
- meta = {"description": "Output scan data to a SQLite database"}
6
+ meta = {
7
+ "description": "Output scan data to a SQLite database",
8
+ "created_date": "2024-11-08",
9
+ "author": "@TheTechromancer",
10
+ }
7
11
  options = {
8
12
  "username": "postgres",
9
13
  "password": "bbotislife",
@@ -5,7 +5,11 @@ from bbot.modules.templates.sql import SQLTemplate
5
5
 
6
6
  class SQLite(SQLTemplate):
7
7
  watched_events = ["*"]
8
- meta = {"description": "Output scan data to a SQLite database"}
8
+ meta = {
9
+ "description": "Output scan data to a SQLite database",
10
+ "created_date": "2024-11-07",
11
+ "author": "@TheTechromancer",
12
+ }
9
13
  options = {
10
14
  "database": "",
11
15
  }
@@ -6,7 +6,7 @@ from bbot.modules.output.base import BaseOutputModule
6
6
 
7
7
  class Stdout(BaseOutputModule):
8
8
  watched_events = ["*"]
9
- meta = {"description": "Output to text"}
9
+ meta = {"description": "Output to text", "created_date": "2024-04-03", "author": "@TheTechromancer"}
10
10
  options = {"format": "text", "event_types": [], "event_fields": [], "in_scope_only": False, "accept_dupes": True}
11
11
  options_desc = {
12
12
  "format": "Which text format to display, choices: text,json",
@@ -5,7 +5,7 @@ from bbot.modules.output.base import BaseOutputModule
5
5
 
6
6
  class TXT(BaseOutputModule):
7
7
  watched_events = ["*"]
8
- meta = {"description": "Output to text"}
8
+ meta = {"description": "Output to text", "created_date": "2024-04-03", "author": "@TheTechromancer"}
9
9
  options = {"output_file": ""}
10
10
  options_desc = {"output_file": "Output to file"}
11
11
 
@@ -52,6 +52,11 @@ class BBOTArgs:
52
52
  "",
53
53
  "bbot -l",
54
54
  ),
55
+ (
56
+ "List output modules",
57
+ "",
58
+ "bbot -lo",
59
+ ),
55
60
  (
56
61
  "List presets",
57
62
  "",
@@ -290,12 +295,6 @@ class BBOTArgs:
290
295
  )
291
296
 
292
297
  output = p.add_argument_group(title="Output")
293
- output.add_argument(
294
- "-o",
295
- "--output-dir",
296
- help="Directory to output scan results",
297
- metavar="DIR",
298
- )
299
298
  output.add_argument(
300
299
  "-om",
301
300
  "--output-modules",
@@ -304,6 +303,13 @@ class BBOTArgs:
304
303
  help=f'Output module(s). Choices: {",".join(sorted(self.preset.module_loader.output_module_choices))}',
305
304
  metavar="MODULE",
306
305
  )
306
+ output.add_argument("-lo", "--list-output-modules", action="store_true", help="List available output modules")
307
+ output.add_argument(
308
+ "-o",
309
+ "--output-dir",
310
+ help="Directory to output scan results",
311
+ metavar="DIR",
312
+ )
307
313
  output.add_argument("--json", "-j", action="store_true", help="Output scan data in JSON format")
308
314
  output.add_argument("--brief", "-br", action="store_true", help="Output only the data itself")
309
315
  output.add_argument("--event-types", nargs="+", default=[], help="Choose which event types to display")
@@ -192,7 +192,6 @@ class ScanBlacklist(ACLTarget):
192
192
  @special_target_type(r"^(?:RE|REGEX):(.*)")
193
193
  def handle_regex(self, match):
194
194
  pattern = match.group(1)
195
- log.info(f"Blacklisting by custom regex: {pattern}")
196
195
  blacklist_regex = re.compile(pattern, re.IGNORECASE)
197
196
  self.blacklist_regexes.add(blacklist_regex)
198
197
  return []
@@ -225,6 +224,12 @@ class ScanBlacklist(ACLTarget):
225
224
  hosts = [str(h).encode() for h in self.sorted_hosts]
226
225
  return hosts + regex_patterns
227
226
 
227
+ def __len__(self):
228
+ return super().__len__() + len(self.blacklist_regexes)
229
+
230
+ def __bool__(self):
231
+ return bool(len(self))
232
+
228
233
 
229
234
  class BBOTTarget:
230
235
  """
@@ -150,11 +150,23 @@ async def test_cli_args(monkeypatch, caplog, capsys, clean_default_config):
150
150
  out, err = capsys.readouterr()
151
151
  # internal modules
152
152
  assert "| excavate " in out
153
- # output modules
154
- assert "| csv " in out
153
+ # no output modules
154
+ assert not "| csv " in out
155
155
  # scan modules
156
156
  assert "| wayback " in out
157
157
 
158
+ # list output modules
159
+ monkeypatch.setattr("sys.argv", ["bbot", "--list-output-modules"])
160
+ result = await cli._main()
161
+ assert result == None
162
+ out, err = capsys.readouterr()
163
+ # no internal modules
164
+ assert not "| excavate " in out
165
+ # output modules
166
+ assert "| csv " in out
167
+ # no scan modules
168
+ assert not "| wayback " in out
169
+
158
170
  # output dir and scan name
159
171
  output_dir = bbot_test_dir / "bbot_cli_args_output"
160
172
  scan_name = "bbot_cli_args_scan_name"
@@ -156,17 +156,15 @@ async def test_modules_basic_checks(events, httpx_mock):
156
156
  assert not (
157
157
  "web-basic" in flags and "web-thorough" in flags
158
158
  ), f'module "{module_name}" should have either "web-basic" or "web-thorough" flags, not both'
159
- meta = preloaded.get("meta", {})
160
- # make sure every module has a description
161
- assert meta.get("description", ""), f"{module_name} must have a description"
162
- # make sure every module has an author
163
- assert meta.get("author", ""), f"{module_name} must have an author"
164
- # make sure every module has a created date
165
- created_date = meta.get("created_date", "")
166
- assert created_date, f"{module_name} must have a created date"
167
- assert created_date_regex.match(
168
- created_date
169
- ), f"{module_name}'s created_date must match the format YYYY-MM-DD"
159
+ meta = preloaded.get("meta", {})
160
+ # make sure every module has a description
161
+ assert meta.get("description", ""), f"{module_name} must have a description"
162
+ # make sure every module has an author
163
+ assert meta.get("author", ""), f"{module_name} must have an author"
164
+ # make sure every module has a created date
165
+ created_date = meta.get("created_date", "")
166
+ assert created_date, f"{module_name} must have a created date"
167
+ assert created_date_regex.match(created_date), f"{module_name}'s created_date must match the format YYYY-MM-DD"
170
168
 
171
169
  # attribute checks
172
170
  watched_events = preloaded.get("watched_events")
@@ -395,6 +395,7 @@ async def test_blacklist_regex(bbot_scanner, bbot_httpserver):
395
395
  config={"excavate": True},
396
396
  debug=True,
397
397
  )
398
+ assert len(scan.target.blacklist) == 2
398
399
  assert scan.target.blacklist.blacklist_regexes
399
400
  assert {r.pattern for r in scan.target.blacklist.blacklist_regexes} == {
400
401
  r"evil[0-9]{3}",
@@ -0,0 +1,85 @@
1
+ import xml.etree.ElementTree as ET
2
+
3
+ from bbot.modules.base import BaseModule
4
+ from .base import ModuleTestBase
5
+
6
+
7
+ class TestNmap_XML(ModuleTestBase):
8
+ modules_overrides = ["nmap_xml", "speculate"]
9
+ targets = ["blacklanternsecurity.com", "127.0.0.3"]
10
+ config_overrides = {"dns": {"minimal": False}}
11
+
12
+ class DummyModule(BaseModule):
13
+ watched_events = ["OPEN_TCP_PORT"]
14
+ _name = "dummy_module"
15
+
16
+ async def handle_event(self, event):
17
+ if event.port == 80:
18
+ await self.emit_event(
19
+ {"host": str(event.host), "port": event.port, "protocol": "http", "banner": "Apache"},
20
+ "PROTOCOL",
21
+ parent=event,
22
+ )
23
+ elif event.port == 443:
24
+ await self.emit_event(
25
+ {"host": str(event.host), "port": event.port, "protocol": "https"}, "PROTOCOL", parent=event
26
+ )
27
+
28
+ async def setup_before_prep(self, module_test):
29
+ self.dummy_module = self.DummyModule(module_test.scan)
30
+ module_test.scan.modules["dummy_module"] = self.dummy_module
31
+ await module_test.mock_dns(
32
+ {
33
+ "blacklanternsecurity.com": {"A": ["127.0.0.1", "127.0.0.2"]},
34
+ "3.0.0.127.in-addr.arpa": {"PTR": ["www.blacklanternsecurity.com"]},
35
+ "www.blacklanternsecurity.com": {"A": ["127.0.0.1"]},
36
+ }
37
+ )
38
+
39
+ def check(self, module_test, events):
40
+ nmap_xml_file = module_test.scan.modules["nmap_xml"].output_file
41
+ nmap_xml = open(nmap_xml_file).read()
42
+
43
+ # Parse the XML
44
+ root = ET.fromstring(nmap_xml)
45
+
46
+ # Expected IP addresses
47
+ expected_ips = {"127.0.0.1", "127.0.0.2", "127.0.0.3"}
48
+ found_ips = set()
49
+
50
+ # Iterate over each host in the XML
51
+ for host in root.findall("host"):
52
+ # Get the IP address
53
+ address = host.find("address").get("addr")
54
+ found_ips.add(address)
55
+
56
+ # Get hostnames if available
57
+ hostnames = sorted([hostname.get("name") for hostname in host.findall(".//hostname")])
58
+
59
+ # Get open ports and services
60
+ ports = []
61
+ for port in host.findall(".//port"):
62
+ port_id = port.get("portid")
63
+ state = port.find("state").get("state")
64
+ if state == "open":
65
+ service_name = port.find("service").get("name")
66
+ service_product = port.find("service").get("product", "")
67
+ service_extrainfo = port.find("service").get("extrainfo", "")
68
+ ports.append((port_id, service_name, service_product, service_extrainfo))
69
+
70
+ # Sort ports for consistency
71
+ ports.sort()
72
+
73
+ # Assertions
74
+ if address == "127.0.0.1":
75
+ assert hostnames == ["blacklanternsecurity.com", "www.blacklanternsecurity.com"]
76
+ assert ports == sorted([("80", "http", "Apache", "Apache"), ("443", "https", "", "")])
77
+ elif address == "127.0.0.2":
78
+ assert hostnames == sorted(["blacklanternsecurity.com"])
79
+ assert ports == sorted([("80", "http", "Apache", "Apache"), ("443", "https", "", "")])
80
+ elif address == "127.0.0.3":
81
+ assert hostnames == [] # No hostnames for this IP
82
+ assert ports == sorted([("80", "http", "Apache", "Apache"), ("443", "https", "", "")])
83
+
84
+ # Assert that all expected IPs were found
85
+ assert found_ips == expected_ips
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "bbot"
3
- version = "v2.3.0.5418rc"
3
+ version = "v2.3.0.5438rc"
4
4
  description = "OSINT automation for hackers."
5
5
  authors = [
6
6
  "TheTechromancer",
@@ -102,7 +102,7 @@ skip = "./docs/javascripts/vega*.js,./bbot/wordlists/*"
102
102
  [tool.ruff]
103
103
  line-length = 119
104
104
  format.exclude = ["bbot/test/test_step_1/test_manager_*"]
105
- lint.ignore = ["E402", "E721", "E741", "F401", "F403", "F405"]
105
+ lint.ignore = ["E402", "E711", "E713", "E721", "E741", "F401", "F403", "F405"]
106
106
 
107
107
  [tool.poetry-dynamic-versioning]
108
108
  enable = false
File without changes
File without changes