bbot 2.7.0.6948rc0__tar.gz → 2.7.0.6989rc0__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 (462) hide show
  1. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/PKG-INFO +2 -2
  2. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/__init__.py +1 -1
  3. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/files.py +2 -2
  4. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/defaults.yml +4 -2
  5. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/base.py +11 -5
  6. bbot-2.7.0.6989rc0/bbot/modules/git_clone.py +85 -0
  7. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/graphql_introspection.py +1 -1
  8. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/httpx.py +2 -0
  9. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/base.py +0 -5
  10. bbot-2.7.0.6989rc0/bbot/modules/retirejs.py +238 -0
  11. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/manager.py +7 -4
  12. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/scanner.py +1 -1
  13. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_bbot_fastapi.py +2 -2
  14. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_events.py +0 -1
  15. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_scan.py +1 -7
  16. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/base.py +1 -0
  17. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +6 -6
  18. bbot-2.7.0.6989rc0/bbot/test/test_step_2/module_tests/test_module_retirejs.py +159 -0
  19. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/pyproject.toml +2 -2
  20. bbot-2.7.0.6948rc0/bbot/modules/git_clone.py +0 -67
  21. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/LICENSE +0 -0
  22. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/README.md +0 -0
  23. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/cli.py +0 -0
  24. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/__init__.py +0 -0
  25. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/config/__init__.py +0 -0
  26. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/config/files.py +0 -0
  27. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/config/logger.py +0 -0
  28. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/core.py +0 -0
  29. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/engine.py +0 -0
  30. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/event/__init__.py +0 -0
  31. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/event/base.py +0 -0
  32. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/event/helpers.py +0 -0
  33. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/flags.py +0 -0
  34. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/__init__.py +0 -0
  35. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/async_helpers.py +0 -0
  36. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/bloom.py +0 -0
  37. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/cache.py +0 -0
  38. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/command.py +0 -0
  39. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
  40. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/depsinstaller/installer.py +0 -0
  41. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
  42. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/diff.py +0 -0
  43. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/dns/__init__.py +0 -0
  44. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/dns/brute.py +0 -0
  45. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/dns/dns.py +0 -0
  46. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/dns/engine.py +0 -0
  47. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/dns/helpers.py +0 -0
  48. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/dns/mock.py +0 -0
  49. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/helper.py +0 -0
  50. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/interactsh.py +0 -0
  51. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/libmagic.py +0 -0
  52. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/misc.py +0 -0
  53. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/names_generator.py +0 -0
  54. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/ntlm.py +0 -0
  55. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/process.py +0 -0
  56. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/ratelimiter.py +0 -0
  57. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/regex.py +0 -0
  58. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/regexes.py +0 -0
  59. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/url.py +0 -0
  60. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/validators.py +0 -0
  61. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/web/__init__.py +0 -0
  62. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/web/client.py +0 -0
  63. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/web/engine.py +0 -0
  64. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/web/envelopes.py +0 -0
  65. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
  66. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/web/web.py +0 -0
  67. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/wordcloud.py +0 -0
  68. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/helpers/yara_helper.py +0 -0
  69. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/modules.py +0 -0
  70. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/multiprocess.py +0 -0
  71. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/core/shared_deps.py +0 -0
  72. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/db/sql/models.py +0 -0
  73. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/errors.py +0 -0
  74. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/logger.py +0 -0
  75. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/__init__.py +0 -0
  76. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/ajaxpro.py +0 -0
  77. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/anubisdb.py +0 -0
  78. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/apkpure.py +0 -0
  79. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/aspnet_bin_exposure.py +0 -0
  80. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/azure_realm.py +0 -0
  81. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/azure_tenant.py +0 -0
  82. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/baddns.py +0 -0
  83. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/baddns_direct.py +0 -0
  84. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/baddns_zone.py +0 -0
  85. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/badsecrets.py +0 -0
  86. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/bevigil.py +0 -0
  87. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/bucket_amazon.py +0 -0
  88. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/bucket_azure.py +0 -0
  89. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/bucket_digitalocean.py +0 -0
  90. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/bucket_file_enum.py +0 -0
  91. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/bucket_firebase.py +0 -0
  92. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/bucket_google.py +0 -0
  93. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/bufferoverrun.py +0 -0
  94. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/builtwith.py +0 -0
  95. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/bypass403.py +0 -0
  96. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/c99.py +0 -0
  97. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/censys.py +0 -0
  98. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/certspotter.py +0 -0
  99. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/chaos.py +0 -0
  100. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/code_repository.py +0 -0
  101. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/credshed.py +0 -0
  102. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/crt.py +0 -0
  103. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/crt_db.py +0 -0
  104. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/dehashed.py +0 -0
  105. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/digitorus.py +0 -0
  106. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/dnsbimi.py +0 -0
  107. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/dnsbrute.py +0 -0
  108. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
  109. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/dnscaa.py +0 -0
  110. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/dnscommonsrv.py +0 -0
  111. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/dnsdumpster.py +0 -0
  112. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/dnstlsrpt.py +0 -0
  113. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/docker_pull.py +0 -0
  114. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/dockerhub.py +0 -0
  115. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/dotnetnuke.py +0 -0
  116. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/emailformat.py +0 -0
  117. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/extractous.py +0 -0
  118. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/ffuf.py +0 -0
  119. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/ffuf_shortnames.py +0 -0
  120. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/filedownload.py +0 -0
  121. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/fingerprintx.py +0 -0
  122. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/fullhunt.py +0 -0
  123. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/generic_ssrf.py +0 -0
  124. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/git.py +0 -0
  125. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/gitdumper.py +0 -0
  126. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/github_codesearch.py +0 -0
  127. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/github_org.py +0 -0
  128. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/github_usersearch.py +0 -0
  129. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/github_workflows.py +0 -0
  130. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/gitlab.py +0 -0
  131. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/google_playstore.py +0 -0
  132. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/gowitness.py +0 -0
  133. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/hackertarget.py +0 -0
  134. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/host_header.py +0 -0
  135. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/hunt.py +0 -0
  136. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/hunterio.py +0 -0
  137. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/iis_shortnames.py +0 -0
  138. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/internal/__init__.py +0 -0
  139. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/internal/aggregate.py +0 -0
  140. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/internal/base.py +0 -0
  141. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/internal/cloudcheck.py +0 -0
  142. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/internal/dnsresolve.py +0 -0
  143. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/internal/excavate.py +0 -0
  144. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/internal/speculate.py +0 -0
  145. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/internal/unarchive.py +0 -0
  146. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/ip2location.py +0 -0
  147. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/ipneighbor.py +0 -0
  148. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/ipstack.py +0 -0
  149. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/jadx.py +0 -0
  150. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/leakix.py +0 -0
  151. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/lightfuzz/lightfuzz.py +0 -0
  152. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/lightfuzz/submodules/__init__.py +0 -0
  153. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/lightfuzz/submodules/base.py +0 -0
  154. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/lightfuzz/submodules/cmdi.py +0 -0
  155. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/lightfuzz/submodules/crypto.py +0 -0
  156. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/lightfuzz/submodules/path.py +0 -0
  157. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/lightfuzz/submodules/serial.py +0 -0
  158. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/lightfuzz/submodules/sqli.py +0 -0
  159. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/lightfuzz/submodules/ssti.py +0 -0
  160. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/lightfuzz/submodules/xss.py +0 -0
  161. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/medusa.py +0 -0
  162. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/myssl.py +0 -0
  163. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/newsletters.py +0 -0
  164. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/ntlm.py +0 -0
  165. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/nuclei.py +0 -0
  166. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/oauth.py +0 -0
  167. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/otx.py +0 -0
  168. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/__init__.py +0 -0
  169. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/asset_inventory.py +0 -0
  170. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/csv.py +0 -0
  171. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/discord.py +0 -0
  172. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/emails.py +0 -0
  173. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/http.py +0 -0
  174. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/json.py +0 -0
  175. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/mysql.py +0 -0
  176. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/neo4j.py +0 -0
  177. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/nmap_xml.py +0 -0
  178. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/postgres.py +0 -0
  179. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/python.py +0 -0
  180. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/slack.py +0 -0
  181. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/splunk.py +0 -0
  182. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/sqlite.py +0 -0
  183. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/stdout.py +0 -0
  184. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/subdomains.py +0 -0
  185. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/teams.py +0 -0
  186. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/txt.py +0 -0
  187. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/web_parameters.py +0 -0
  188. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/web_report.py +0 -0
  189. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/output/websocket.py +0 -0
  190. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/paramminer_cookies.py +0 -0
  191. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/paramminer_getparams.py +0 -0
  192. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/paramminer_headers.py +0 -0
  193. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/passivetotal.py +0 -0
  194. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/pgp.py +0 -0
  195. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/portfilter.py +0 -0
  196. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/portscan.py +0 -0
  197. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/postman.py +0 -0
  198. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/postman_download.py +0 -0
  199. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/rapiddns.py +0 -0
  200. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/reflected_parameters.py +0 -0
  201. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/report/affiliates.py +0 -0
  202. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/report/asn.py +0 -0
  203. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/report/base.py +0 -0
  204. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/robots.py +0 -0
  205. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/securitytrails.py +0 -0
  206. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/securitytxt.py +0 -0
  207. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/shodan_dns.py +0 -0
  208. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/shodan_idb.py +0 -0
  209. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/sitedossier.py +0 -0
  210. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/skymem.py +0 -0
  211. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/smuggler.py +0 -0
  212. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/social.py +0 -0
  213. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/sslcert.py +0 -0
  214. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/subdomaincenter.py +0 -0
  215. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/subdomainradar.py +0 -0
  216. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/telerik.py +0 -0
  217. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/templates/bucket.py +0 -0
  218. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/templates/github.py +0 -0
  219. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/templates/postman.py +0 -0
  220. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/templates/shodan.py +0 -0
  221. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/templates/sql.py +0 -0
  222. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
  223. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/templates/webhook.py +0 -0
  224. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/trickest.py +0 -0
  225. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/trufflehog.py +0 -0
  226. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/url_manipulation.py +0 -0
  227. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/urlscan.py +0 -0
  228. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/vhost.py +0 -0
  229. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/viewdns.py +0 -0
  230. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/virustotal.py +0 -0
  231. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/wafw00f.py +0 -0
  232. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/wappalyzer.py +0 -0
  233. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/wayback.py +0 -0
  234. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/wpscan.py +0 -0
  235. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/modules/zoomeye.py +0 -0
  236. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/baddns-intense.yml +0 -0
  237. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/cloud-enum.yml +0 -0
  238. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/code-enum.yml +0 -0
  239. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/email-enum.yml +0 -0
  240. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/fast.yml +0 -0
  241. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/kitchen-sink.yml +0 -0
  242. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/nuclei/nuclei-budget.yml +0 -0
  243. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/nuclei/nuclei-intense.yml +0 -0
  244. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/nuclei/nuclei-technology.yml +0 -0
  245. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/nuclei/nuclei.yml +0 -0
  246. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/spider-intense.yml +0 -0
  247. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/spider.yml +0 -0
  248. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/subdomain-enum.yml +0 -0
  249. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/tech-detect.yml +0 -0
  250. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
  251. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web/dirbust-light.yml +0 -0
  252. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
  253. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
  254. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web/lightfuzz-heavy.yml +0 -0
  255. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web/lightfuzz-light.yml +0 -0
  256. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web/lightfuzz-medium.yml +0 -0
  257. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web/lightfuzz-superheavy.yml +0 -0
  258. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web/lightfuzz-xss.yml +0 -0
  259. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web/paramminer.yml +0 -0
  260. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web-basic.yml +0 -0
  261. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web-screenshots.yml +0 -0
  262. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/presets/web-thorough.yml +0 -0
  263. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/__init__.py +0 -0
  264. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/dispatcher.py +0 -0
  265. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/preset/__init__.py +0 -0
  266. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/preset/args.py +0 -0
  267. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/preset/conditions.py +0 -0
  268. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/preset/environ.py +0 -0
  269. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/preset/path.py +0 -0
  270. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/preset/preset.py +0 -0
  271. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/stats.py +0 -0
  272. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scanner/target.py +0 -0
  273. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/scripts/docs.py +0 -0
  274. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/__init__.py +0 -0
  275. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/bbot_fixtures.py +0 -0
  276. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/conftest.py +0 -0
  277. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/coverage.cfg +0 -0
  278. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/fastapi_test.py +0 -0
  279. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/owasp_mastg.apk +0 -0
  280. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/run_tests.sh +0 -0
  281. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test.conf +0 -0
  282. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_output.ndjson +0 -0
  283. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/__init__.py +0 -0
  284. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
  285. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
  286. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_cli.py +0 -0
  287. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_command.py +0 -0
  288. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_config.py +0 -0
  289. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
  290. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_dns.py +0 -0
  291. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_docs.py +0 -0
  292. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_engine.py +0 -0
  293. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_event_seeds.py +0 -0
  294. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_files.py +0 -0
  295. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
  296. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
  297. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
  298. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -0
  299. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_presets.py +0 -0
  300. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
  301. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
  302. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_scope.py +0 -0
  303. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_target.py +0 -0
  304. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_web.py +0 -0
  305. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_1/test_web_envelopes.py +0 -0
  306. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/__init__.py +0 -0
  307. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
  308. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
  309. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
  310. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
  311. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
  312. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
  313. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
  314. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_aspnet_bin_exposure.py +0 -0
  315. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
  316. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
  317. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
  318. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
  319. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
  320. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
  321. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
  322. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
  323. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
  324. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
  325. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
  326. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
  327. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
  328. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
  329. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
  330. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
  331. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
  332. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
  333. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
  334. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
  335. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
  336. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
  337. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
  338. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
  339. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
  340. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_crt_db.py +0 -0
  341. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
  342. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
  343. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
  344. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
  345. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +0 -0
  346. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
  347. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
  348. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
  349. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
  350. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
  351. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
  352. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dnstlsrpt.py +0 -0
  353. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
  354. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
  355. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
  356. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
  357. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
  358. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_extractous.py +0 -0
  359. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
  360. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
  361. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
  362. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
  363. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
  364. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
  365. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
  366. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
  367. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_gitdumper.py +0 -0
  368. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
  369. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
  370. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_github_usersearch.py +0 -0
  371. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
  372. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
  373. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
  374. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
  375. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_graphql_introspection.py +0 -0
  376. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
  377. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
  378. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
  379. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
  380. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
  381. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
  382. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
  383. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
  384. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
  385. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
  386. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_jadx.py +0 -0
  387. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
  388. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
  389. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_lightfuzz.py +0 -0
  390. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_medusa.py +0 -0
  391. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_mysql.py +0 -0
  392. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
  393. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
  394. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
  395. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_nmap_xml.py +0 -0
  396. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
  397. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
  398. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
  399. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
  400. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
  401. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
  402. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
  403. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
  404. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
  405. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_portfilter.py +0 -0
  406. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
  407. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_postgres.py +0 -0
  408. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
  409. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
  410. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
  411. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
  412. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_reflected_parameters.py +0 -0
  413. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
  414. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
  415. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
  416. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
  417. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_idb.py +0 -0
  418. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
  419. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
  420. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
  421. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
  422. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
  423. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
  424. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
  425. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_sqlite.py +0 -0
  426. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
  427. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
  428. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
  429. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
  430. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
  431. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
  432. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
  433. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
  434. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
  435. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
  436. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_unarchive.py +0 -0
  437. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
  438. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
  439. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
  440. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
  441. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
  442. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
  443. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
  444. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
  445. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_web_parameters.py +0 -0
  446. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
  447. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
  448. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
  449. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
  450. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
  451. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
  452. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/testsslcert.pem +0 -0
  453. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/test/testsslkey.pem +0 -0
  454. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/wordlists/devops_mutations.txt +0 -0
  455. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
  456. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/wordlists/nameservers.txt +0 -0
  457. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
  458. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
  459. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
  460. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
  461. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
  462. {bbot-2.7.0.6948rc0 → bbot-2.7.0.6989rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bbot
3
- Version: 2.7.0.6948rc0
3
+ Version: 2.7.0.6989rc0
4
4
  Summary: OSINT automation for hackers.
5
5
  License: GPL-3.0
6
6
  Keywords: python,cli,automation,osint,threat-intel,intelligence,neo4j,scanner,python-library,hacking,recursion,pentesting,recon,command-line-tool,bugbounty,subdomains,security-tools,subdomain-scanner,osint-framework,attack-surface,subdomain-enumeration,osint-tool
@@ -34,7 +34,7 @@ Requires-Dist: puremagic (>=1.28,<2.0)
34
34
  Requires-Dist: pycryptodome (>=3.17,<4.0)
35
35
  Requires-Dist: pydantic (>=2.9.2,<3.0.0)
36
36
  Requires-Dist: pyjwt (>=2.7.0,<3.0.0)
37
- Requires-Dist: pyzmq (>=26.0.3,<27.0.0)
37
+ Requires-Dist: pyzmq (>=26.0.3,<28.0.0)
38
38
  Requires-Dist: radixtarget (>=3.0.13,<4.0.0)
39
39
  Requires-Dist: regex (>=2024.4.16,<2025.0.0)
40
40
  Requires-Dist: setproctitle (>=1.3.3,<2.0.0)
@@ -1,5 +1,5 @@
1
1
  # version placeholder (replaced by poetry-dynamic-versioning)
2
- __version__ = "v2.7.0.6948rc"
2
+ __version__ = "v2.7.0.6989rc"
3
3
 
4
4
  from .scanner import Scanner, Preset
5
5
 
@@ -9,7 +9,7 @@ from .misc import rm_at_exit
9
9
  log = logging.getLogger("bbot.core.helpers.files")
10
10
 
11
11
 
12
- def tempfile(self, content, pipe=True):
12
+ def tempfile(self, content, pipe=True, extension=None):
13
13
  """
14
14
  Creates a temporary file or named pipe and populates it with content.
15
15
 
@@ -29,7 +29,7 @@ def tempfile(self, content, pipe=True):
29
29
  >>> tempfile(["Another", "temp", "file"], pipe=False)
30
30
  '/home/user/.bbot/temp/someotherfile'
31
31
  """
32
- filename = self.temp_filename()
32
+ filename = self.temp_filename(extension)
33
33
  rm_at_exit(filename)
34
34
  try:
35
35
  if type(content) not in (set, list, tuple):
@@ -187,8 +187,10 @@ url_extension_blacklist:
187
187
  - mov
188
188
  - flv
189
189
  - webm
190
- # Distribute URLs with these extensions only to httpx (these are omitted from output)
191
- url_extension_httpx_only:
190
+
191
+ # URLs with these extensions are not distributed to modules unless the module opts in via `accept_url_special = True`
192
+ # They are also excluded from output. If you want to see them in output, remove them from this list.
193
+ url_extension_special:
192
194
  - js
193
195
 
194
196
  # These url extensions are almost always static, so we exclude them from modules that fuzz things
@@ -53,6 +53,8 @@ class BaseModule:
53
53
 
54
54
  in_scope_only (bool): Accept only explicitly in-scope events, regardless of the scan's search distance. Default is False.
55
55
 
56
+ accept_url_special (bool): Accept "special" URLs not typically distributed to web modules, e.g. JS URLs. Default is False.
57
+
56
58
  options (Dict): Customizable options for the module, e.g., {"api_key": ""}. Empty dict by default.
57
59
 
58
60
  options_desc (Dict): Descriptions for options, e.g., {"api_key": "API Key"}. Empty dict by default.
@@ -97,7 +99,7 @@ class BaseModule:
97
99
  scope_distance_modifier = 0
98
100
  target_only = False
99
101
  in_scope_only = False
100
-
102
+ accept_url_special = False
101
103
  _module_threads = 1
102
104
  _batch_size = 1
103
105
 
@@ -785,10 +787,14 @@ class BaseModule:
785
787
  if "target" not in event.tags:
786
788
  return False, "it did not meet target_only filter criteria"
787
789
 
788
- # exclude certain URLs (e.g. javascript):
789
- # TODO: revisit this after httpx rework
790
- if event.type.startswith("URL") and self.name != "httpx" and "httpx-only" in event.tags:
791
- return False, "its extension was listed in url_extension_httpx_only"
790
+ # limit js URLs to modules that opt in to receive them
791
+ if (not self.accept_url_special) and event.type.startswith("URL"):
792
+ extension = getattr(event, "url_extension", "")
793
+ if extension in self.scan.url_extension_special:
794
+ return (
795
+ False,
796
+ f"it is a special URL (extension {extension}) but the module does not opt in to receive special URLs",
797
+ )
792
798
 
793
799
  return True, "precheck succeeded"
794
800
 
@@ -0,0 +1,85 @@
1
+ from pathlib import Path
2
+ from subprocess import CalledProcessError
3
+ from bbot.modules.templates.github import github
4
+
5
+
6
+ class git_clone(github):
7
+ watched_events = ["CODE_REPOSITORY"]
8
+ produced_events = ["FILESYSTEM"]
9
+ flags = ["passive", "safe", "slow", "code-enum"]
10
+ meta = {
11
+ "description": "Clone code github repositories",
12
+ "created_date": "2024-03-08",
13
+ "author": "@domwhewell-sage",
14
+ }
15
+ options = {"api_key": "", "output_folder": ""}
16
+ options_desc = {
17
+ "api_key": "Github token",
18
+ "output_folder": "Folder to clone repositories to. If not specified, cloned repositories will be deleted when the scan completes, to minimize disk usage.",
19
+ }
20
+
21
+ deps_apt = ["git"]
22
+
23
+ scope_distance_modifier = 2
24
+
25
+ async def setup(self):
26
+ output_folder = self.config.get("output_folder")
27
+ self.output_dir = Path(output_folder) / "git_repos" if output_folder else self.scan.temp_dir / "git_repos"
28
+ self.helpers.mkdir(self.output_dir)
29
+ return await super().setup()
30
+
31
+ async def filter_event(self, event):
32
+ if event.type == "CODE_REPOSITORY" and "git" not in event.tags:
33
+ return False, "event is not a git repository"
34
+ return True
35
+
36
+ async def handle_event(self, event):
37
+ repository_url = event.data.get("url")
38
+ repository_path = await self.clone_git_repository(repository_url)
39
+ if repository_path:
40
+ self.verbose(f"Cloned {repository_url} to {repository_path}")
41
+ codebase_event = self.make_event({"path": str(repository_path)}, "FILESYSTEM", tags=["git"], parent=event)
42
+ await self.emit_event(
43
+ codebase_event,
44
+ context=f"{{module}} cloned git repository at {repository_url} to {{event.type}}: {repository_path}",
45
+ )
46
+
47
+ async def clone_git_repository(self, repository_url):
48
+ owner = repository_url.split("/")[-2]
49
+ folder = self.output_dir / owner
50
+ self.helpers.mkdir(folder)
51
+
52
+ command = ["git", "-C", folder, "clone", repository_url]
53
+ env = {"GIT_TERMINAL_PROMPT": "0"}
54
+
55
+ try:
56
+ hostname = self.helpers.urlparse(repository_url).hostname
57
+ if hostname and self.api_key:
58
+ _, domain = self.helpers.split_domain(hostname)
59
+ # only use the api key if the domain is github.com
60
+ if domain == "github.com":
61
+ env["GIT_HELPER"] = (
62
+ f'!f() {{ case "$1" in get) '
63
+ f"echo username=x-access-token; "
64
+ f"echo password={self.api_key};; "
65
+ f'esac; }}; f "$@"'
66
+ )
67
+ command = (
68
+ command[:1]
69
+ + [
70
+ "-c",
71
+ "credential.helper=",
72
+ "-c",
73
+ "credential.useHttpPath=true",
74
+ "--config-env=credential.helper=GIT_HELPER",
75
+ ]
76
+ + command[1:]
77
+ )
78
+
79
+ output = await self.run_process(command, env=env, check=True)
80
+ except CalledProcessError as e:
81
+ self.debug(f"Error cloning {repository_url}. STDERR: {repr(e.stderr)}")
82
+ return
83
+
84
+ folder_name = output.stderr.split("Cloning into '")[1].split("'")[0]
85
+ return folder / folder_name
@@ -27,7 +27,6 @@ class graphql_introspection(BaseModule):
27
27
  self.output_dir = Path(output_folder) / "graphql-schemas"
28
28
  else:
29
29
  self.output_dir = self.scan.home / "graphql-schemas"
30
- self.helpers.mkdir(self.output_dir)
31
30
  return True
32
31
 
33
32
  async def filter_event(self, event):
@@ -128,6 +127,7 @@ fragment TypeRef on __Type {
128
127
  self.debug(f"Failed to parse JSON for {url}")
129
128
  continue
130
129
  if response_json.get("data", {}).get("__schema", {}).get("types", []):
130
+ self.helpers.mkdir(self.output_dir)
131
131
  filename = f"schema-{self.helpers.tagify(url)}.json"
132
132
  filename = self.output_dir / filename
133
133
  with open(filename, "w") as f:
@@ -50,6 +50,8 @@ class httpx(BaseModule):
50
50
  _shuffle_incoming_queue = False
51
51
  _batch_size = 500
52
52
  _priority = 2
53
+ # accept Javascript URLs
54
+ accept_url_special = True
53
55
 
54
56
  async def setup(self):
55
57
  self.threads = self.config.get("threads", 50)
@@ -38,11 +38,6 @@ class BaseOutputModule(BaseModule):
38
38
  if self._is_graph_important(event):
39
39
  return True, "event is critical to the graph"
40
40
 
41
- # exclude certain URLs (e.g. javascript):
42
- # TODO: revisit this after httpx rework
43
- if event.type.startswith("URL") and self.name != "httpx" and "httpx-only" in event.tags:
44
- return False, (f"Omitting {event} from output because it's marked as httpx-only")
45
-
46
41
  # omit certain event types
47
42
  if event._omit:
48
43
  if "target" in event.tags:
@@ -0,0 +1,238 @@
1
+ import json
2
+ from enum import IntEnum
3
+ from bbot.modules.base import BaseModule
4
+
5
+
6
+ class RetireJSSeverity(IntEnum):
7
+ NONE = 0
8
+ LOW = 1
9
+ MEDIUM = 2
10
+ HIGH = 3
11
+ CRITICAL = 4
12
+
13
+ @classmethod
14
+ def from_string(cls, severity_str):
15
+ try:
16
+ return cls[severity_str.upper()]
17
+ except (KeyError, AttributeError):
18
+ return cls.NONE
19
+
20
+
21
+ class retirejs(BaseModule):
22
+ watched_events = ["URL_UNVERIFIED"]
23
+ produced_events = ["FINDING"]
24
+ flags = ["active", "safe", "web-thorough"]
25
+ meta = {
26
+ "description": "Detect vulnerable/out-of-date JavaScript libraries",
27
+ "created_date": "2025-08-19",
28
+ "author": "@liquidsec",
29
+ }
30
+ options = {
31
+ "version": "5.3.0",
32
+ "node_version": "18.19.1",
33
+ "severity": "medium",
34
+ }
35
+ options_desc = {
36
+ "version": "retire.js version",
37
+ "node_version": "Node.js version to install locally",
38
+ "severity": "Minimum severity level to report (none, low, medium, high, critical)",
39
+ }
40
+
41
+ deps_ansible = [
42
+ # Download Node.js binary (Linux x64)
43
+ {
44
+ "name": "Download Node.js binary (Linux x64)",
45
+ "get_url": {
46
+ "url": "https://nodejs.org/dist/v#{BBOT_MODULES_RETIREJS_NODE_VERSION}/node-v#{BBOT_MODULES_RETIREJS_NODE_VERSION}-linux-x64.tar.xz",
47
+ "dest": "#{BBOT_TEMP}/node-v#{BBOT_MODULES_RETIREJS_NODE_VERSION}-linux-x64.tar.xz",
48
+ "mode": "0644",
49
+ },
50
+ },
51
+ # Extract Node.js binary (x64)
52
+ {
53
+ "name": "Extract Node.js binary (x64)",
54
+ "unarchive": {
55
+ "src": "#{BBOT_TEMP}/node-v#{BBOT_MODULES_RETIREJS_NODE_VERSION}-linux-x64.tar.xz",
56
+ "dest": "#{BBOT_TOOLS}",
57
+ "remote_src": True,
58
+ },
59
+ },
60
+ # Remove existing node directory if it exists
61
+ {
62
+ "name": "Remove existing node directory",
63
+ "file": {"path": "#{BBOT_TOOLS}/node", "state": "absent"},
64
+ },
65
+ # Rename extracted directory to 'node' (x64)
66
+ {
67
+ "name": "Rename Node.js directory (x64)",
68
+ "command": "mv #{BBOT_TOOLS}/node-v#{BBOT_MODULES_RETIREJS_NODE_VERSION}-linux-x64 #{BBOT_TOOLS}/node",
69
+ },
70
+ # Make Node.js binary executable
71
+ {
72
+ "name": "Make Node.js binary executable",
73
+ "file": {"path": "#{BBOT_TOOLS}/node/bin/node", "mode": "0755"},
74
+ },
75
+ # Make npm executable
76
+ {
77
+ "name": "Make npm executable",
78
+ "file": {"path": "#{BBOT_TOOLS}/node/bin/npm", "mode": "0755"},
79
+ },
80
+ # Remove existing retirejs directory if it exists
81
+ {
82
+ "name": "Remove existing retirejs directory",
83
+ "file": {"path": "#{BBOT_TOOLS}/retirejs", "state": "absent"},
84
+ },
85
+ # Create retire.js local directory
86
+ {
87
+ "name": "Create retire.js directory in BBOT_TOOLS",
88
+ "file": {"path": "#{BBOT_TOOLS}/retirejs", "state": "directory", "mode": "0755"},
89
+ },
90
+ # Install retire.js locally using local Node.js
91
+ {
92
+ "name": "Install retire.js locally",
93
+ "shell": "cd #{BBOT_TOOLS}/retirejs && #{BBOT_TOOLS}/node/bin/node #{BBOT_TOOLS}/node/lib/node_modules/npm/bin/npm-cli.js install retire@#{BBOT_MODULES_RETIREJS_VERSION} --no-fund --no-audit --silent --no-optional",
94
+ "args": {"creates": "#{BBOT_TOOLS}/retirejs/node_modules/.bin/retire"},
95
+ "timeout": 600,
96
+ "ignore_errors": False,
97
+ },
98
+ # Fix retire script shebang to use our local node binary
99
+ {
100
+ "name": "Fix retire script shebang",
101
+ "shell": "sed -i '1s|#!/usr/bin/env node|#!#{BBOT_TOOLS}/node/bin/node|' #{BBOT_TOOLS}/retirejs/node_modules/.bin/retire",
102
+ },
103
+ # Make retire script executable
104
+ {
105
+ "name": "Make retire script executable",
106
+ "file": {"path": "#{BBOT_TOOLS}/retirejs/node_modules/.bin/retire", "mode": "0755"},
107
+ },
108
+ # Create retire cache directory
109
+ {
110
+ "name": "Create retire cache directory",
111
+ "file": {"path": "#{BBOT_CACHE}/retire_cache", "state": "directory", "mode": "0755"},
112
+ },
113
+ ]
114
+
115
+ accept_url_special = True
116
+ scope_distance_modifier = 1
117
+ _module_threads = 4
118
+
119
+ async def setup(self):
120
+ excavate_enabled = self.scan.config.get("excavate")
121
+ if not excavate_enabled:
122
+ return None, "retirejs will not function without excavate enabled"
123
+
124
+ # Validate severity level
125
+ valid_severities = ["none", "low", "medium", "high", "critical"]
126
+ configured_severity = self.config.get("severity", "medium").lower()
127
+ if configured_severity not in valid_severities:
128
+ return (
129
+ False,
130
+ f"Invalid severity level '{configured_severity}'. Valid options are: {', '.join(valid_severities)}",
131
+ )
132
+
133
+ self.repofile = await self.helpers.download(
134
+ "https://raw.githubusercontent.com/RetireJS/retire.js/master/repository/jsrepository-v4.json", cache_hrs=24
135
+ )
136
+ if not self.repofile:
137
+ return False, "failed to download retire.js repository file"
138
+ return True
139
+
140
+ async def handle_event(self, event):
141
+ js_file = await self.helpers.request(event.data)
142
+ if js_file:
143
+ js_file_body = js_file.text
144
+ if js_file_body:
145
+ js_file_body_saved = self.helpers.tempfile(js_file_body, pipe=False, extension="js")
146
+ results = await self.execute_retirejs(js_file_body_saved)
147
+ if not results:
148
+ self.warning("no output from retire.js")
149
+ return
150
+ results_json = json.loads(results)
151
+ if results_json.get("data"):
152
+ for file_result in results_json["data"]:
153
+ for component_result in file_result.get("results", []):
154
+ component = component_result.get("component", "unknown")
155
+ version = component_result.get("version", "unknown")
156
+ vulnerabilities = component_result.get("vulnerabilities", [])
157
+ for vuln in vulnerabilities:
158
+ severity = vuln.get("severity", "unknown")
159
+
160
+ # Filter by minimum severity level
161
+ min_severity = RetireJSSeverity.from_string(self.config.get("severity", "medium"))
162
+ vuln_severity = RetireJSSeverity.from_string(severity)
163
+ if vuln_severity < min_severity:
164
+ self.debug(
165
+ f"Skipping vulnerability with severity '{severity}' (below minimum '{min_severity.name.lower()}')"
166
+ )
167
+ continue
168
+
169
+ identifiers = vuln.get("identifiers", {})
170
+ summary = identifiers.get("summary", "Unknown vulnerability")
171
+ cves = identifiers.get("CVE", [])
172
+ description_parts = [
173
+ f"Vulnerable JavaScript library detected: {component} v{version}",
174
+ f"Severity: {severity.upper()}",
175
+ f"Summary: {summary}",
176
+ f"JavaScript URL: {event.data}",
177
+ ]
178
+ if cves:
179
+ description_parts.append(f"CVE(s): {', '.join(cves)}")
180
+
181
+ below_version = vuln.get("below", "")
182
+ at_or_above = vuln.get("atOrAbove", "")
183
+ if at_or_above and below_version:
184
+ description_parts.append(f"Affected versions: [{at_or_above} to {below_version})")
185
+ elif below_version:
186
+ description_parts.append(f"Affected versions: [< {below_version}]")
187
+ elif at_or_above:
188
+ description_parts.append(f"Affected versions: [>= {at_or_above}]")
189
+ description = " ".join(description_parts)
190
+ data = {
191
+ "description": description,
192
+ "severity": severity,
193
+ "component": component,
194
+ "url": event.parent.data["url"],
195
+ }
196
+ await self.emit_event(
197
+ data,
198
+ "FINDING",
199
+ parent=event,
200
+ context=f"{{module}} identified vulnerable JavaScript library {component} v{version} ({severity} severity)",
201
+ )
202
+
203
+ async def filter_event(self, event):
204
+ url_extension = getattr(event, "url_extension", "")
205
+ if url_extension != "js":
206
+ return False, f"it is a {url_extension} URL but retirejs only accepts js URLs"
207
+ return True
208
+
209
+ async def execute_retirejs(self, js_file):
210
+ cache_dir = self.helpers.cache_dir / "retire_cache"
211
+ retire_dir = self.scan.helpers.tools_dir / "retirejs"
212
+
213
+ # Use the retire CLI script directly with our local node binary
214
+ local_node_dir = self.scan.helpers.tools_dir / "node"
215
+ retire_cli_script = retire_dir / "node_modules" / "retire" / "lib" / "cli.js"
216
+
217
+ command = [
218
+ str(local_node_dir / "bin" / "node"),
219
+ str(retire_cli_script),
220
+ "--outputformat",
221
+ "json",
222
+ "--cachedir",
223
+ str(cache_dir),
224
+ "--path",
225
+ js_file,
226
+ "--jsrepo",
227
+ str(self.repofile),
228
+ ]
229
+
230
+ proxy = self.scan.web_config.get("http_proxy")
231
+ if proxy:
232
+ command.extend(["--proxy", proxy])
233
+
234
+ self.verbose(f"Running retire.js on {js_file}")
235
+ self.verbose(f"retire.js command: {command}")
236
+
237
+ result = await self.run_process(command)
238
+ return result.stdout
@@ -94,10 +94,6 @@ class ScanIngress(BaseInterceptModule):
94
94
  # special handling of URL extensions
95
95
  url_extension = getattr(event, "url_extension", None)
96
96
  if url_extension is not None:
97
- if url_extension in self.scan.url_extension_httpx_only:
98
- event.add_tag("httpx-only")
99
- event._omit = True
100
-
101
97
  # blacklist by extension
102
98
  if url_extension in self.scan.url_extension_blacklist:
103
99
  self.debug(
@@ -209,6 +205,13 @@ class ScanEgress(BaseInterceptModule):
209
205
  )
210
206
  event.internal = True
211
207
 
208
+ # mark special URLs (e.g. Javascript) as internal so they don't get output except when they're critical to the graph
209
+ if event.type.startswith("URL"):
210
+ extension = getattr(event, "url_extension", "")
211
+ if extension in self.scan.url_extension_special:
212
+ event.internal = True
213
+ self.debug(f"Making {event} internal because it is a special URL (extension {extension})")
214
+
212
215
  if event.type in self.scan.omitted_event_types:
213
216
  self.debug(f"Omitting {event} because its type is omitted in the config")
214
217
  event._omit = True
@@ -230,8 +230,8 @@ class Scanner:
230
230
  )
231
231
 
232
232
  # url file extensions
233
+ self.url_extension_special = {e.lower() for e in self.config.get("url_extension_special", [])}
233
234
  self.url_extension_blacklist = {e.lower() for e in self.config.get("url_extension_blacklist", [])}
234
- self.url_extension_httpx_only = {e.lower() for e in self.config.get("url_extension_httpx_only", [])}
235
235
 
236
236
  # url querystring behavior
237
237
  self.url_querystring_remove = self.config.get("url_querystring_remove", True)
@@ -22,8 +22,8 @@ def test_bbot_multiprocess(bbot_httpserver):
22
22
  queue = multiprocessing.Queue()
23
23
  events_process = multiprocessing.Process(target=run_bbot_multiprocess, args=(queue,))
24
24
  events_process.start()
25
- events_process.join()
26
- events = queue.get()
25
+ events_process.join(timeout=300)
26
+ events = queue.get(timeout=10)
27
27
  assert len(events) >= 3
28
28
  scan_events = [e for e in events if e["type"] == "SCAN"]
29
29
  assert len(scan_events) == 2
@@ -209,7 +209,6 @@ async def test_events(events, helpers):
209
209
  javascript_event = scan.make_event("http://evilcorp.com/asdf/a.js?b=c#d", "URL_UNVERIFIED", parent=scan.root_event)
210
210
  assert "extension-js" in javascript_event.tags
211
211
  await scan.ingress_module.handle_event(javascript_event)
212
- assert "httpx-only" in javascript_event.tags
213
212
 
214
213
  # scope distance
215
214
  event1 = scan.make_event("1.2.3.4", dummy=True)
@@ -147,24 +147,18 @@ async def test_task_scan_handle_event_timeout(bbot_scanner):
147
147
 
148
148
  @pytest.mark.asyncio
149
149
  async def test_url_extension_handling(bbot_scanner):
150
- scan = bbot_scanner(config={"url_extension_blacklist": ["css"], "url_extension_httpx_only": ["js"]})
150
+ scan = bbot_scanner(config={"url_extension_blacklist": ["css"]})
151
151
  await scan._prep()
152
152
  assert scan.url_extension_blacklist == {"css"}
153
- assert scan.url_extension_httpx_only == {"js"}
154
153
  good_event = scan.make_event("https://evilcorp.com/a.txt", "URL", tags=["status-200"], parent=scan.root_event)
155
154
  bad_event = scan.make_event("https://evilcorp.com/a.css", "URL", tags=["status-200"], parent=scan.root_event)
156
- httpx_event = scan.make_event("https://evilcorp.com/a.js", "URL", tags=["status-200"], parent=scan.root_event)
157
155
  assert "blacklisted" not in bad_event.tags
158
- assert "httpx-only" not in httpx_event.tags
159
156
  result = await scan.ingress_module.handle_event(good_event)
160
157
  assert result is None
161
158
  result, reason = await scan.ingress_module.handle_event(bad_event)
162
159
  assert result is False
163
160
  assert reason == "event is blacklisted"
164
161
  assert "blacklisted" in bad_event.tags
165
- result = await scan.ingress_module.handle_event(httpx_event)
166
- assert result is None
167
- assert "httpx-only" in httpx_event.tags
168
162
 
169
163
  await scan._cleanup()
170
164
 
@@ -61,6 +61,7 @@ class ModuleTestBase:
61
61
  config=self.config,
62
62
  whitelist=module_test_base.whitelist,
63
63
  blacklist=module_test_base.blacklist,
64
+ force_start=getattr(module_test_base, "force_start", False),
64
65
  )
65
66
  self.events = []
66
67
  self.log = logging.getLogger(f"bbot.test.{module_test_base.name}")
@@ -24,14 +24,13 @@ class TestExcavate(ModuleTestBase):
24
24
  \\x3dwww6.test.notreal
25
25
  %0awww7.test.notreal
26
26
  \\u000awww8.test.notreal
27
- # these ones shouldn't get emitted because they're .js (url_extension_httpx_only)
28
- <a href="/a_relative.js">
29
- <link href="/link_relative.js">
30
- # these ones should
31
27
  <a href="/a_relative.txt">
32
28
  <link href="/link_relative.txt">
33
29
  <a href="mailto:bob@evilcorp.org?subject=help">Help</a>
34
30
  <li class="toctree-l3"><a class="reference internal" href="miscellaneous.html#x50-uart-driver">16x50 UART Driver</a></li>
31
+ # these ones should get emitted as URL_UNVERIFIED events (processed by httpx which has accept_js_url=True)
32
+ <a href="/a_relative.js">
33
+ <link href="/link_relative.js">
35
34
  """
36
35
  expect_args = {"method": "GET", "uri": "/"}
37
36
  respond_args = {"response_data": response_data}
@@ -63,8 +62,9 @@ class TestExcavate(ModuleTestBase):
63
62
  assert "www6.test.notreal" in event_data
64
63
  assert "www7.test.notreal" in event_data
65
64
  assert "www8.test.notreal" in event_data
66
- assert "http://127.0.0.1:8888/a_relative.js" not in event_data
67
- assert "http://127.0.0.1:8888/link_relative.js" not in event_data
65
+ # .js files should be emitted as URL_UNVERIFIED events (they are processed by httpx which has accept_js_url=True)
66
+ assert "http://127.0.0.1:8888/a_relative.js" in event_data
67
+ assert "http://127.0.0.1:8888/link_relative.js" in event_data
68
68
  assert "http://127.0.0.1:8888/a_relative.txt" in event_data
69
69
  assert "http://127.0.0.1:8888/link_relative.txt" in event_data
70
70