bbot 2.2.0.5263rc0__tar.gz → 2.3.0.5328rc0__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 (419) hide show
  1. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/PKG-INFO +8 -4
  2. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/README.md +4 -0
  3. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/__init__.py +1 -1
  4. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/cli.py +1 -1
  5. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/engine.py +2 -2
  6. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/base.py +23 -2
  7. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/bloom.py +8 -1
  8. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/installer.py +8 -5
  9. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/helpers.py +2 -2
  10. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/helper.py +4 -3
  11. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/misc.py +29 -5
  12. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/regexes.py +2 -1
  13. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/web.py +1 -1
  14. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/db/sql/models.py +2 -1
  15. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/defaults.yml +3 -0
  16. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/anubisdb.py +1 -1
  17. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns.py +1 -1
  18. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bevigil.py +2 -2
  19. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/binaryedge.py +1 -1
  20. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bufferoverrun.py +2 -3
  21. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/builtwith.py +2 -2
  22. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/c99.py +4 -2
  23. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/certspotter.py +4 -2
  24. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/chaos.py +4 -2
  25. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/columbus.py +1 -1
  26. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/crt.py +4 -2
  27. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/digitorus.py +1 -1
  28. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnscaa.py +3 -3
  29. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/fullhunt.py +1 -1
  30. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hackertarget.py +4 -2
  31. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/excavate.py +2 -3
  32. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/speculate.py +34 -24
  33. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/leakix.py +6 -5
  34. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/myssl.py +1 -1
  35. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/otx.py +4 -2
  36. bbot-2.3.0.5328rc0/bbot/modules/output/postgres.py +49 -0
  37. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/sqlite.py +1 -1
  38. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/passivetotal.py +4 -2
  39. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/rapiddns.py +2 -7
  40. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/securitytrails.py +4 -2
  41. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/shodan_dns.py +1 -1
  42. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/subdomaincenter.py +1 -1
  43. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/sql.py +13 -12
  44. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/subdomain_enum.py +3 -3
  45. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/trickest.py +1 -1
  46. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/trufflehog.py +1 -1
  47. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/virustotal.py +2 -7
  48. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/zoomeye.py +5 -3
  49. bbot-2.3.0.5328rc0/bbot/presets/fast.yml +16 -0
  50. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/spider.yml +4 -0
  51. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/manager.py +1 -2
  52. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/args.py +20 -4
  53. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/path.py +3 -1
  54. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/preset.py +18 -12
  55. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/scanner.py +7 -2
  56. bbot-2.3.0.5328rc0/bbot/scanner/target.py +345 -0
  57. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/bbot_fixtures.py +5 -2
  58. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/conftest.py +95 -83
  59. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_bloom_filter.py +2 -0
  60. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_cli.py +36 -0
  61. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_dns.py +2 -1
  62. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_events.py +16 -3
  63. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_helpers.py +17 -0
  64. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -3
  65. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_presets.py +51 -38
  66. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_python_api.py +4 -0
  67. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_scan.py +8 -2
  68. bbot-2.3.0.5328rc0/bbot/test/test_step_1/test_target.py +407 -0
  69. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_web.py +3 -0
  70. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/base.py +6 -2
  71. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +2 -1
  72. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -6
  73. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +1 -1
  74. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +5 -1
  75. bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_postgres.py +74 -0
  76. bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_sqlite.py +18 -0
  77. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/pyproject.toml +6 -6
  78. bbot-2.2.0.5263rc0/bbot/scanner/target.py +0 -543
  79. bbot-2.2.0.5263rc0/bbot/test/test_step_1/test_target.py +0 -309
  80. bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_sqlite.py +0 -18
  81. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/LICENSE +0 -0
  82. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/__init__.py +0 -0
  83. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/__init__.py +0 -0
  84. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/files.py +0 -0
  85. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/logger.py +0 -0
  86. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/core.py +0 -0
  87. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/__init__.py +0 -0
  88. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/helpers.py +0 -0
  89. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/flags.py +0 -0
  90. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/__init__.py +0 -0
  91. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/async_helpers.py +0 -0
  92. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/cache.py +0 -0
  93. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/command.py +0 -0
  94. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
  95. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
  96. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/diff.py +0 -0
  97. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/__init__.py +0 -0
  98. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/brute.py +0 -0
  99. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/dns.py +0 -0
  100. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/engine.py +0 -0
  101. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/mock.py +0 -0
  102. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/files.py +0 -0
  103. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/interactsh.py +0 -0
  104. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/libmagic.py +0 -0
  105. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/names_generator.py +0 -0
  106. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/ntlm.py +0 -0
  107. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/process.py +0 -0
  108. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/ratelimiter.py +0 -0
  109. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/regex.py +0 -0
  110. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/url.py +0 -0
  111. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/validators.py +0 -0
  112. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/__init__.py +0 -0
  113. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/client.py +0 -0
  114. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/engine.py +0 -0
  115. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
  116. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/wordcloud.py +0 -0
  117. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/modules.py +0 -0
  118. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/multiprocess.py +0 -0
  119. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/core/shared_deps.py +0 -0
  120. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/errors.py +0 -0
  121. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/logger.py +0 -0
  122. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/__init__.py +0 -0
  123. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ajaxpro.py +0 -0
  124. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/apkpure.py +0 -0
  125. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/azure_realm.py +0 -0
  126. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/azure_tenant.py +0 -0
  127. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns_direct.py +0 -0
  128. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns_zone.py +0 -0
  129. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/badsecrets.py +0 -0
  130. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/base.py +0 -0
  131. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_amazon.py +0 -0
  132. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_azure.py +0 -0
  133. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_digitalocean.py +0 -0
  134. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_file_enum.py +0 -0
  135. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_firebase.py +0 -0
  136. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_google.py +0 -0
  137. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bypass403.py +0 -0
  138. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/censys.py +0 -0
  139. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/code_repository.py +0 -0
  140. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/credshed.py +0 -0
  141. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/dastardly.py +0 -0
  142. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/ffuf.py +0 -0
  143. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/nuclei.py +0 -0
  144. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/vhost.py +0 -0
  145. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dehashed.py +0 -0
  146. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsbimi.py +0 -0
  147. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsbrute.py +0 -0
  148. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
  149. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnscommonsrv.py +0 -0
  150. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsdumpster.py +0 -0
  151. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/docker_pull.py +0 -0
  152. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dockerhub.py +0 -0
  153. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dotnetnuke.py +0 -0
  154. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/emailformat.py +0 -0
  155. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/extractous.py +0 -0
  156. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ffuf_shortnames.py +0 -0
  157. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/filedownload.py +0 -0
  158. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/fingerprintx.py +0 -0
  159. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/generic_ssrf.py +0 -0
  160. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/git.py +0 -0
  161. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/git_clone.py +0 -0
  162. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_codesearch.py +0 -0
  163. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_org.py +0 -0
  164. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_workflows.py +0 -0
  165. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/gitlab.py +0 -0
  166. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/google_playstore.py +0 -0
  167. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/gowitness.py +0 -0
  168. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/host_header.py +0 -0
  169. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/httpx.py +0 -0
  170. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hunt.py +0 -0
  171. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hunterio.py +0 -0
  172. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/iis_shortnames.py +0 -0
  173. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/__init__.py +0 -0
  174. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/aggregate.py +0 -0
  175. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/base.py +0 -0
  176. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/cloudcheck.py +0 -0
  177. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/dnsresolve.py +0 -0
  178. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internetdb.py +0 -0
  179. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ip2location.py +0 -0
  180. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ipneighbor.py +0 -0
  181. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ipstack.py +0 -0
  182. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/jadx.py +0 -0
  183. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/newsletters.py +0 -0
  184. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ntlm.py +0 -0
  185. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/oauth.py +0 -0
  186. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/__init__.py +0 -0
  187. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/asset_inventory.py +0 -0
  188. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/base.py +0 -0
  189. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/csv.py +0 -0
  190. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/discord.py +0 -0
  191. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/emails.py +0 -0
  192. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/http.py +0 -0
  193. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/json.py +0 -0
  194. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/neo4j.py +0 -0
  195. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/python.py +0 -0
  196. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/slack.py +0 -0
  197. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/splunk.py +0 -0
  198. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/stdout.py +0 -0
  199. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/subdomains.py +0 -0
  200. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/teams.py +0 -0
  201. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/txt.py +0 -0
  202. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/web_report.py +0 -0
  203. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/websocket.py +0 -0
  204. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_cookies.py +0 -0
  205. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_getparams.py +0 -0
  206. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_headers.py +0 -0
  207. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/pgp.py +0 -0
  208. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/portscan.py +0 -0
  209. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/postman.py +0 -0
  210. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/postman_download.py +0 -0
  211. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/affiliates.py +0 -0
  212. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/asn.py +0 -0
  213. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/base.py +0 -0
  214. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/robots.py +0 -0
  215. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/secretsdb.py +0 -0
  216. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/securitytxt.py +0 -0
  217. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/sitedossier.py +0 -0
  218. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/skymem.py +0 -0
  219. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/smuggler.py +0 -0
  220. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/social.py +0 -0
  221. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/sslcert.py +0 -0
  222. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/subdomainradar.py +0 -0
  223. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/telerik.py +0 -0
  224. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/bucket.py +0 -0
  225. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/github.py +0 -0
  226. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/postman.py +0 -0
  227. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/shodan.py +0 -0
  228. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/webhook.py +0 -0
  229. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/url_manipulation.py +0 -0
  230. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/urlscan.py +0 -0
  231. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/viewdns.py +0 -0
  232. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wafw00f.py +0 -0
  233. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wappalyzer.py +0 -0
  234. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wayback.py +0 -0
  235. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wpscan.py +0 -0
  236. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/baddns-thorough.yml +0 -0
  237. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/cloud-enum.yml +0 -0
  238. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/code-enum.yml +0 -0
  239. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/email-enum.yml +0 -0
  240. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/kitchen-sink.yml +0 -0
  241. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/subdomain-enum.yml +0 -0
  242. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
  243. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dirbust-light.yml +0 -0
  244. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
  245. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
  246. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/paramminer.yml +0 -0
  247. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-basic.yml +0 -0
  248. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-screenshots.yml +0 -0
  249. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-thorough.yml +0 -0
  250. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/__init__.py +0 -0
  251. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/dispatcher.py +0 -0
  252. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/__init__.py +0 -0
  253. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/conditions.py +0 -0
  254. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/environ.py +0 -0
  255. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/stats.py +0 -0
  256. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/scripts/docs.py +0 -0
  257. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/__init__.py +0 -0
  258. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/coverage.cfg +0 -0
  259. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/fastapi_test.py +0 -0
  260. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/owasp_mastg.apk +0 -0
  261. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/run_tests.sh +0 -0
  262. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test.conf +0 -0
  263. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_output.ndjson +0 -0
  264. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/__init__.py +0 -0
  265. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
  266. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_bbot_fastapi.py +0 -0
  267. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_command.py +0 -0
  268. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_config.py +0 -0
  269. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
  270. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_docs.py +0 -0
  271. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_engine.py +0 -0
  272. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_files.py +0 -0
  273. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
  274. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
  275. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
  276. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_scope.py +0 -0
  277. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/__init__.py +0 -0
  278. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
  279. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
  280. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
  281. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
  282. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
  283. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
  284. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
  285. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
  286. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
  287. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
  288. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
  289. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
  290. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
  291. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
  292. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
  293. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
  294. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
  295. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
  296. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
  297. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
  298. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
  299. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
  300. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
  301. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
  302. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
  303. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
  304. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
  305. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
  306. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
  307. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
  308. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
  309. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
  310. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
  311. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
  312. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
  313. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
  314. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
  315. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
  316. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +0 -0
  317. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
  318. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
  319. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
  320. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
  321. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
  322. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
  323. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
  324. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
  325. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
  326. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
  327. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +0 -0
  328. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_extractous.py +0 -0
  329. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
  330. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
  331. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
  332. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
  333. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
  334. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
  335. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
  336. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
  337. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
  338. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
  339. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
  340. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
  341. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
  342. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
  343. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
  344. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
  345. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
  346. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
  347. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
  348. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
  349. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
  350. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
  351. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
  352. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
  353. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_jadx.py +0 -0
  354. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
  355. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
  356. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
  357. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
  358. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
  359. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
  360. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
  361. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
  362. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
  363. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
  364. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
  365. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
  366. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
  367. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
  368. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
  369. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
  370. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
  371. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
  372. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
  373. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
  374. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
  375. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
  376. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
  377. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
  378. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
  379. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
  380. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
  381. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
  382. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
  383. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
  384. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
  385. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
  386. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
  387. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
  388. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
  389. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
  390. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
  391. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
  392. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
  393. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
  394. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
  395. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
  396. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
  397. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
  398. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
  399. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
  400. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
  401. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
  402. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
  403. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
  404. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
  405. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
  406. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
  407. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
  408. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/testsslcert.pem +0 -0
  409. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/test/testsslkey.pem +0 -0
  410. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/devops_mutations.txt +0 -0
  411. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
  412. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
  413. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/nameservers.txt +0 -0
  414. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
  415. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
  416. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
  417. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
  418. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
  419. {bbot-2.2.0.5263rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bbot
3
- Version: 2.2.0.5263rc0
3
+ Version: 2.3.0.5328rc0
4
4
  Summary: OSINT automation for hackers.
5
5
  Home-page: https://github.com/blacklanternsecurity/bbot
6
6
  License: GPL-3.0
7
- Keywords: python,cli,automation,osint,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
7
+ 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
8
8
  Author: TheTechromancer
9
9
  Requires-Python: >=3.9,<4.0
10
10
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
@@ -20,7 +20,7 @@ Requires-Dist: ansible (>=7.3,<9.0)
20
20
  Requires-Dist: ansible-runner (>=2.3.2,<3.0.0)
21
21
  Requires-Dist: beautifulsoup4 (>=4.12.2,<5.0.0)
22
22
  Requires-Dist: cachetools (>=5.3.2,<6.0.0)
23
- Requires-Dist: cloudcheck (>=5.0.0.350,<6.0.0.0)
23
+ Requires-Dist: cloudcheck (>=6.0.0.602,<7.0.0.0)
24
24
  Requires-Dist: deepdiff (>=6.2.3,<8.0.0)
25
25
  Requires-Dist: dnspython (>=2.4.2,<3.0.0)
26
26
  Requires-Dist: httpx (>=0.27.0,<0.28.0)
@@ -35,7 +35,7 @@ Requires-Dist: pycryptodome (>=3.17,<4.0)
35
35
  Requires-Dist: pydantic (>=2.4.2,<3.0.0)
36
36
  Requires-Dist: pyjwt (>=2.7.0,<3.0.0)
37
37
  Requires-Dist: pyzmq (>=26.0.3,<27.0.0)
38
- Requires-Dist: radixtarget (>=1.0.0.15,<2.0.0.0)
38
+ Requires-Dist: radixtarget (>=2.0.0.50,<3.0.0.0)
39
39
  Requires-Dist: regex (>=2024.4.16,<2025.0.0)
40
40
  Requires-Dist: setproctitle (>=1.3.3,<2.0.0)
41
41
  Requires-Dist: socksio (>=1.0.0,<2.0.0)
@@ -145,6 +145,10 @@ description: Recursive web spider
145
145
  modules:
146
146
  - httpx
147
147
 
148
+ blacklist:
149
+ # Prevent spider from invalidating sessions by logging out
150
+ - "RE:/.*(sign|log)[_-]?out"
151
+
148
152
  config:
149
153
  web:
150
154
  # how many links to follow in a row
@@ -91,6 +91,10 @@ description: Recursive web spider
91
91
  modules:
92
92
  - httpx
93
93
 
94
+ blacklist:
95
+ # Prevent spider from invalidating sessions by logging out
96
+ - "RE:/.*(sign|log)[_-]?out"
97
+
94
98
  config:
95
99
  web:
96
100
  # how many links to follow in a row
@@ -1,4 +1,4 @@
1
1
  # version placeholder (replaced by poetry-dynamic-versioning)
2
- __version__ = "v2.2.0.5263rc"
2
+ __version__ = "v2.3.0.5328rc"
3
3
 
4
4
  from .scanner import Scanner, Preset
@@ -174,7 +174,7 @@ async def _main():
174
174
  if sys.stdin.isatty():
175
175
 
176
176
  # warn if any targets belong directly to a cloud provider
177
- for event in scan.target.events:
177
+ for event in scan.target.seeds.events:
178
178
  if event.type == "DNS_NAME":
179
179
  cloudcheck_result = scan.helpers.cloudcheck(event.host)
180
180
  if cloudcheck_result:
@@ -641,7 +641,7 @@ class EngineServer(EngineBase):
641
641
  except BaseException as e:
642
642
  if isinstance(e, (TimeoutError, asyncio.exceptions.TimeoutError)):
643
643
  self.log.warning(f"{self.name}: Timeout after {timeout:,} seconds in finished_tasks({tasks})")
644
- for task in tasks:
644
+ for task in list(tasks):
645
645
  task.cancel()
646
646
  self._await_cancelled_task(task)
647
647
  else:
@@ -683,5 +683,5 @@ class EngineServer(EngineBase):
683
683
  for client_id in list(self.tasks):
684
684
  await self.cancel_task(client_id)
685
685
  for client_id, tasks in self.child_tasks.items():
686
- for task in tasks:
686
+ for task in list(tasks):
687
687
  await self._await_cancelled_task(task)
@@ -341,6 +341,21 @@ class BaseEvent:
341
341
  return self.host
342
342
  return self._host_original
343
343
 
344
+ @property
345
+ def host_filterable(self):
346
+ """
347
+ A string version of the event that's used for regex-based blacklisting.
348
+
349
+ For example, the user can specify "REGEX:.*.evilcorp.com" in their blacklist, and this regex
350
+ will be applied against this property.
351
+ """
352
+ parsed_url = getattr(self, "parsed_url", None)
353
+ if parsed_url is not None:
354
+ return parsed_url.geturl()
355
+ if self.host is not None:
356
+ return str(self.host)
357
+ return ""
358
+
344
359
  @property
345
360
  def port(self):
346
361
  self.host
@@ -1114,8 +1129,7 @@ class DnsEvent(BaseEvent):
1114
1129
  class IP_RANGE(DnsEvent):
1115
1130
  def __init__(self, *args, **kwargs):
1116
1131
  super().__init__(*args, **kwargs)
1117
- net = ipaddress.ip_network(self.data, strict=False)
1118
- self.add_tag(f"ipv{net.version}")
1132
+ self.add_tag(f"ipv{self.host.version}")
1119
1133
 
1120
1134
  def sanitize_data(self, data):
1121
1135
  return str(ipaddress.ip_network(str(data), strict=False))
@@ -1689,6 +1703,13 @@ def make_event(
1689
1703
  if event_type == "USERNAME" and validators.soft_validate(data, "email"):
1690
1704
  event_type = "EMAIL_ADDRESS"
1691
1705
  tags.add("affiliate")
1706
+ # Convert single-host IP_RANGE to IP_ADDRESS
1707
+ if event_type == "IP_RANGE":
1708
+ with suppress(Exception):
1709
+ net = ipaddress.ip_network(data, strict=False)
1710
+ if net.prefixlen == net.max_prefixlen:
1711
+ event_type = "IP_ADDRESS"
1712
+ data = net.network_address
1692
1713
 
1693
1714
  event_class = globals().get(event_type, DefaultEvent)
1694
1715
 
@@ -64,8 +64,15 @@ class BloomFilter:
64
64
  hash = (hash * 0x01000193) % 2**32 # 16777619
65
65
  return hash
66
66
 
67
- def __del__(self):
67
+ def close(self):
68
+ """Explicitly close the memory-mapped file."""
68
69
  self.mmap_file.close()
69
70
 
71
+ def __del__(self):
72
+ try:
73
+ self.close()
74
+ except Exception:
75
+ pass
76
+
70
77
  def __contains__(self, item):
71
78
  return self.check(item)
@@ -14,7 +14,7 @@ from secrets import token_bytes
14
14
  from ansible_runner.interface import run
15
15
  from subprocess import CalledProcessError
16
16
 
17
- from ..misc import can_sudo_without_password, os_platform, rm_at_exit
17
+ from ..misc import can_sudo_without_password, os_platform, rm_at_exit, get_python_constraints
18
18
 
19
19
  log = logging.getLogger("bbot.core.helpers.depsinstaller")
20
20
 
@@ -176,10 +176,13 @@ class DepsInstaller:
176
176
 
177
177
  command = [sys.executable, "-m", "pip", "install", "--upgrade"] + packages
178
178
 
179
- if constraints:
180
- constraints_tempfile = self.parent_helper.tempfile(constraints, pipe=False)
181
- command.append("--constraint")
182
- command.append(constraints_tempfile)
179
+ # if no custom constraints are provided, use the constraints of the currently installed version of bbot
180
+ if constraints is not None:
181
+ constraints = get_python_constraints()
182
+
183
+ constraints_tempfile = self.parent_helper.tempfile(constraints, pipe=False)
184
+ command.append("--constraint")
185
+ command.append(constraints_tempfile)
183
186
 
184
187
  process = None
185
188
  try:
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
 
3
- from bbot.core.helpers.regexes import dns_name_regex
3
+ from bbot.core.helpers.regexes import dns_name_extraction_regex
4
4
  from bbot.core.helpers.misc import clean_dns_record, smart_decode
5
5
 
6
6
  log = logging.getLogger("bbot.core.helpers.dns")
@@ -198,7 +198,7 @@ def extract_targets(record):
198
198
  elif rdtype == "TXT":
199
199
  for s in record.strings:
200
200
  s = smart_decode(s)
201
- for match in dns_name_regex.finditer(s):
201
+ for match in dns_name_extraction_regex.finditer(s):
202
202
  start, end = match.span()
203
203
  host = s[start:end]
204
204
  add_result(rdtype, host)
@@ -12,10 +12,11 @@ from .diff import HttpCompare
12
12
  from .regex import RegexHelper
13
13
  from .wordcloud import WordCloud
14
14
  from .interactsh import Interactsh
15
- from ...scanner.target import Target
16
15
  from .depsinstaller import DepsInstaller
17
16
  from .async_helpers import get_event_loop
18
17
 
18
+ from bbot.scanner.target import BaseTarget
19
+
19
20
  log = logging.getLogger("bbot.core.helpers")
20
21
 
21
22
 
@@ -155,8 +156,8 @@ class ConfigAwareHelper:
155
156
  _filter = lambda x: x.is_dir() and self.regexes.scan_name_regex.match(x.name)
156
157
  self.clean_old(self.scans_dir, keep=self.keep_old_scans, filter=_filter)
157
158
 
158
- def make_target(self, *events, **kwargs):
159
- return Target(*events, **kwargs)
159
+ def make_target(self, *targets, **kwargs):
160
+ return BaseTarget(*targets, scan=self.scan, **kwargs)
160
161
 
161
162
  @property
162
163
  def config(self):
@@ -586,17 +586,18 @@ def is_dns_name(d, include_local=True):
586
586
  if include_local:
587
587
  if bbot_regexes.hostname_regex.match(d):
588
588
  return True
589
- if bbot_regexes.dns_name_regex.match(d):
589
+ if bbot_regexes.dns_name_validation_regex.match(d):
590
590
  return True
591
591
  return False
592
592
 
593
593
 
594
- def is_ip(d, version=None):
594
+ def is_ip(d, version=None, include_network=False):
595
595
  """
596
596
  Checks if the given string or object represents a valid IP address.
597
597
 
598
598
  Args:
599
599
  d (str or ipaddress.IPvXAddress): The IP address to check.
600
+ include_network (bool, optional): Whether to include network types (IPv4Network or IPv6Network). Defaults to False.
600
601
  version (int, optional): The IP version to validate (4 or 6). Default is None.
601
602
 
602
603
  Returns:
@@ -612,12 +613,17 @@ def is_ip(d, version=None):
612
613
  >>> is_ip('evilcorp.com')
613
614
  False
614
615
  """
616
+ ip = None
615
617
  try:
616
618
  ip = ipaddress.ip_address(d)
617
- if version is None or ip.version == version:
618
- return True
619
619
  except Exception:
620
- pass
620
+ if include_network:
621
+ try:
622
+ ip = ipaddress.ip_network(d, strict=False)
623
+ except Exception:
624
+ pass
625
+ if ip is not None and (version is None or ip.version == version):
626
+ return True
621
627
  return False
622
628
 
623
629
 
@@ -2807,3 +2813,21 @@ def safe_format(s, **kwargs):
2807
2813
  Format string while ignoring unused keys (prevents KeyError)
2808
2814
  """
2809
2815
  return s.format_map(SafeDict(kwargs))
2816
+
2817
+
2818
+ def get_python_constraints():
2819
+ req_regex = re.compile(r"([^(]+)\s*\((.*)\)", re.IGNORECASE)
2820
+
2821
+ def clean_requirement(req_string):
2822
+ # Extract package name and version constraints from format like "package (>=1.0,<2.0)"
2823
+ match = req_regex.match(req_string)
2824
+ if match:
2825
+ name, constraints = match.groups()
2826
+ return f"{name.strip()}{constraints}"
2827
+
2828
+ return req_string
2829
+
2830
+ from importlib.metadata import distribution
2831
+
2832
+ dist = distribution("bbot")
2833
+ return [clean_requirement(r) for r in dist.requires]
@@ -40,7 +40,8 @@ ip_range_regexes = list(re.compile(r, re.I) for r in _ip_range_regexes)
40
40
 
41
41
  # dns names with periods
42
42
  _dns_name_regex = r"(?:\w(?:[\w-]{0,100}\w)?\.)+(?:[xX][nN]--)?[^\W_]{1,63}\.?"
43
- dns_name_regex = re.compile(_dns_name_regex, re.I)
43
+ dns_name_extraction_regex = re.compile(_dns_name_regex, re.I)
44
+ dns_name_validation_regex = re.compile(r"^" + _dns_name_regex + r"$", re.I)
44
45
 
45
46
  # dns names without periods
46
47
  _hostname_regex = r"(?!\w*\.\w+)\w(?:[\w-]{0,100}\w)?"
@@ -58,7 +58,7 @@ class WebHelper(EngineClient):
58
58
  self.ssl_verify = self.config.get("ssl_verify", False)
59
59
  engine_debug = self.config.get("engine", {}).get("debug", False)
60
60
  super().__init__(
61
- server_kwargs={"config": self.config, "target": self.parent_helper.preset.target.radix_only},
61
+ server_kwargs={"config": self.config, "target": self.parent_helper.preset.target.minimal},
62
62
  debug=engine_debug,
63
63
  )
64
64
 
@@ -3,9 +3,9 @@
3
3
 
4
4
  import json
5
5
  import logging
6
- from datetime import datetime
7
6
  from pydantic import ConfigDict
8
7
  from typing import List, Optional
8
+ from datetime import datetime, timezone
9
9
  from typing_extensions import Annotated
10
10
  from pydantic.functional_validators import AfterValidator
11
11
  from sqlmodel import inspect, Column, Field, SQLModel, JSON, String, DateTime as SQLADateTime
@@ -114,6 +114,7 @@ class Event(BBOTBaseModel, table=True):
114
114
  discovery_context: str = ""
115
115
  discovery_path: List[str] = Field(default=[], sa_type=JSON)
116
116
  parent_chain: List[str] = Field(default=[], sa_type=JSON)
117
+ inserted_at: NaiveUTC = Field(default_factory=lambda: datetime.now(timezone.utc))
117
118
 
118
119
 
119
120
  ### SCAN ###
@@ -14,6 +14,9 @@ folder_blobs: false
14
14
  ### SCOPE ###
15
15
 
16
16
  scope:
17
+ # strict scope means only exact DNS names are considered in-scope
18
+ # subdomains are not included unless they are explicitly provided in the target list
19
+ strict: false
17
20
  # Filter by scope distance which events are displayed in the output
18
21
  # 0 == show only in-scope events (affiliates are always shown)
19
22
  # 1 == show all events up to distance-1 (1 hop from target)
@@ -38,7 +38,7 @@ class anubisdb(subdomain_enum):
38
38
  return True, "DNS name is unresolved"
39
39
  return await super().abort_if(event)
40
40
 
41
- def parse_results(self, r, query):
41
+ async def parse_results(self, r, query):
42
42
  results = set()
43
43
  json = r.json()
44
44
  if json:
@@ -116,7 +116,7 @@ class baddns(BaseModule):
116
116
  context=f'{{module}}\'s "{r_dict["module"]}" module found {{event.type}}: {r_dict["description"]}',
117
117
  )
118
118
  else:
119
- self.warning(f"Got unrecognized confidence level: {r['confidence']}")
119
+ self.warning(f"Got unrecognized confidence level: {r_dict['confidence']}")
120
120
 
121
121
  found_domains = r_dict.get("found_domains", None)
122
122
  if found_domains:
@@ -60,14 +60,14 @@ class bevigil(subdomain_enum_apikey):
60
60
  url = f"{self.base_url}/{self.helpers.quote(query)}/urls/"
61
61
  return await self.api_request(url)
62
62
 
63
- def parse_subdomains(self, r, query=None):
63
+ async def parse_subdomains(self, r, query=None):
64
64
  results = set()
65
65
  subdomains = r.json().get("subdomains")
66
66
  if subdomains:
67
67
  results.update(subdomains)
68
68
  return results
69
69
 
70
- def parse_urls(self, r, query=None):
70
+ async def parse_urls(self, r, query=None):
71
71
  results = set()
72
72
  urls = r.json().get("urls")
73
73
  if urls:
@@ -37,6 +37,6 @@ class binaryedge(subdomain_enum_apikey):
37
37
  url = f"{self.base_url}/query/domains/subdomain/{self.helpers.quote(query)}"
38
38
  return await self.api_request(url)
39
39
 
40
- def parse_results(self, r, query):
40
+ async def parse_results(self, r, query):
41
41
  j = r.json()
42
42
  return j.get("events", [])
@@ -33,7 +33,7 @@ class BufferOverrun(subdomain_enum_apikey):
33
33
  url = f"{self.commercial_base_url if self.commercial else self.base_url}?q=.{query}"
34
34
  return await self.api_request(url)
35
35
 
36
- def parse_results(self, r, query):
36
+ async def parse_results(self, r, query):
37
37
  j = r.json()
38
38
  subdomains_set = set()
39
39
  if isinstance(j, dict):
@@ -44,5 +44,4 @@ class BufferOverrun(subdomain_enum_apikey):
44
44
  subdomain = parts[4].strip()
45
45
  if subdomain and subdomain.endswith(f".{query}"):
46
46
  subdomains_set.add(subdomain)
47
- for subdomain in subdomains_set:
48
- yield subdomain
47
+ return subdomains_set
@@ -62,7 +62,7 @@ class builtwith(subdomain_enum_apikey):
62
62
  url = f"{self.base_url}/redirect1/api.json?KEY={{api_key}}&LOOKUP={query}"
63
63
  return await self.api_request(url)
64
64
 
65
- def parse_domains(self, r, query):
65
+ async def parse_domains(self, r, query):
66
66
  """
67
67
  This method returns a set of subdomains.
68
68
  Each subdomain is an "FQDN" that was reported in the "Detailed Technology Profile" page on builtwith.com
@@ -92,7 +92,7 @@ class builtwith(subdomain_enum_apikey):
92
92
  self.verbose(f"No results for {query}: {error}")
93
93
  return results_set
94
94
 
95
- def parse_redirects(self, r, query):
95
+ async def parse_redirects(self, r, query):
96
96
  """
97
97
  This method creates a set.
98
98
  Each entry in the set is either an Inbound or Outbound Redirect reported in the "Redirect Profile" page on builtwith.com
@@ -26,7 +26,8 @@ class c99(subdomain_enum_apikey):
26
26
  url = f"{self.base_url}/subdomainfinder?key={{api_key}}&domain={self.helpers.quote(query)}&json"
27
27
  return await self.api_request(url)
28
28
 
29
- def parse_results(self, r, query):
29
+ async def parse_results(self, r, query):
30
+ results = set()
30
31
  j = r.json()
31
32
  if isinstance(j, dict):
32
33
  subdomains = j.get("subdomains", [])
@@ -34,4 +35,5 @@ class c99(subdomain_enum_apikey):
34
35
  for s in subdomains:
35
36
  subdomain = s.get("subdomain", "")
36
37
  if subdomain:
37
- yield subdomain
38
+ results.add(subdomain)
39
+ return results
@@ -17,9 +17,11 @@ class certspotter(subdomain_enum):
17
17
  url = f"{self.base_url}/issuances?domain={self.helpers.quote(query)}&include_subdomains=true&expand=dns_names"
18
18
  return self.api_request(url, timeout=self.http_timeout + 30)
19
19
 
20
- def parse_results(self, r, query):
20
+ async def parse_results(self, r, query):
21
+ results = set()
21
22
  json = r.json()
22
23
  if json:
23
24
  for r in json:
24
25
  for dns_name in r.get("dns_names", []):
25
- yield dns_name.lstrip(".*").rstrip(".")
26
+ results.add(dns_name.lstrip(".*").rstrip("."))
27
+ return results
@@ -26,7 +26,8 @@ class chaos(subdomain_enum_apikey):
26
26
  url = f"{self.base_url}/{domain}/subdomains"
27
27
  return await self.api_request(url)
28
28
 
29
- def parse_results(self, r, query):
29
+ async def parse_results(self, r, query):
30
+ results = set()
30
31
  j = r.json()
31
32
  subdomains_set = set()
32
33
  if isinstance(j, dict):
@@ -39,4 +40,5 @@ class chaos(subdomain_enum_apikey):
39
40
  for s in subdomains_set:
40
41
  full_subdomain = f"{s}.{domain}"
41
42
  if full_subdomain and full_subdomain.endswith(f".{query}"):
42
- yield full_subdomain
43
+ results.add(full_subdomain)
44
+ return results
@@ -17,7 +17,7 @@ class columbus(subdomain_enum):
17
17
  url = f"{self.base_url}/{self.helpers.quote(query)}?days=365"
18
18
  return await self.api_request(url)
19
19
 
20
- def parse_results(self, r, query):
20
+ async def parse_results(self, r, query):
21
21
  results = set()
22
22
  json = r.json()
23
23
  if json and isinstance(json, list):
@@ -23,7 +23,8 @@ class crt(subdomain_enum):
23
23
  url = self.helpers.add_get_params(self.base_url, params).geturl()
24
24
  return await self.api_request(url, timeout=self.http_timeout + 30)
25
25
 
26
- def parse_results(self, r, query):
26
+ async def parse_results(self, r, query):
27
+ results = set()
27
28
  j = r.json()
28
29
  for cert_info in j:
29
30
  if not type(cert_info) == dict:
@@ -35,4 +36,5 @@ class crt(subdomain_enum):
35
36
  domain = cert_info.get("name_value")
36
37
  if domain:
37
38
  for d in domain.splitlines():
38
- yield d.lower()
39
+ results.add(d.lower())
40
+ return results
@@ -19,7 +19,7 @@ class digitorus(subdomain_enum):
19
19
  url = f"{self.base_url}/{self.helpers.quote(query)}"
20
20
  return await self.helpers.request(url)
21
21
 
22
- def parse_results(self, r, query):
22
+ async def parse_results(self, r, query):
23
23
  results = set()
24
24
  content = getattr(r, "text", "")
25
25
  extract_regex = re.compile(r"[\w.-]+\." + query, re.I)
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # Checks for and parses CAA DNS TXT records for IODEF reporting destination email addresses and/or URL's.
4
4
  #
5
- # NOTE: when the target domain is initially resolved basic "dns_name_regex" matched targets will be extracted so we do not perform that again here.
5
+ # NOTE: when the target domain is initially resolved basic "dns_name_extraction_regex" matched targets will be extracted so we do not perform that again here.
6
6
  #
7
7
  # Example CAA records,
8
8
  # 0 iodef "mailto:dnsadmin@example.com"
@@ -23,7 +23,7 @@ from bbot.modules.base import BaseModule
23
23
 
24
24
  import re
25
25
 
26
- from bbot.core.helpers.regexes import dns_name_regex, email_regex, url_regexes
26
+ from bbot.core.helpers.regexes import dns_name_extraction_regex, email_regex, url_regexes
27
27
 
28
28
  # Handle '0 iodef "mailto:support@hcaptcha.com"'
29
29
  # Handle '1 iodef "https://some.host.tld/caa;"'
@@ -109,7 +109,7 @@ class dnscaa(BaseModule):
109
109
 
110
110
  elif caa_match.group("property").lower().startswith("issue"):
111
111
  if self._dns_names:
112
- for match in dns_name_regex.finditer(caa_match.group("text")):
112
+ for match in dns_name_extraction_regex.finditer(caa_match.group("text")):
113
113
  start, end = match.span()
114
114
  name = caa_match.group("text")[start:end]
115
115
 
@@ -35,5 +35,5 @@ class fullhunt(subdomain_enum_apikey):
35
35
  response = await self.api_request(url)
36
36
  return response
37
37
 
38
- def parse_results(self, r, query):
38
+ async def parse_results(self, r, query):
39
39
  return r.json().get("hosts", [])
@@ -18,12 +18,14 @@ class hackertarget(subdomain_enum):
18
18
  response = await self.api_request(url)
19
19
  return response
20
20
 
21
- def parse_results(self, r, query):
21
+ async def parse_results(self, r, query):
22
+ results = set()
22
23
  for line in r.text.splitlines():
23
24
  host = line.split(",")[0]
24
25
  try:
25
26
  self.helpers.validators.validate_host(host)
26
- yield host
27
+ results.add(host)
27
28
  except ValueError:
28
29
  self.debug(f"Error validating API result: {line}")
29
30
  continue
31
+ return results
@@ -527,9 +527,8 @@ class excavate(BaseInternalModule, BaseInterceptModule):
527
527
  async def process(self, yara_results, event, yara_rule_settings, discovery_context):
528
528
  for identifier in yara_results.keys():
529
529
  for csp_str in yara_results[identifier]:
530
- domains = await self.helpers.re.findall(bbot_regexes.dns_name_regex, csp_str)
531
- unique_domains = set(domains)
532
- for domain in unique_domains:
530
+ domains = await self.excavate.scan.extract_in_scope_hostnames(csp_str)
531
+ for domain in domains:
533
532
  await self.report(domain, event, yara_rule_settings, discovery_context, event_type="DNS_NAME")
534
533
 
535
534
  class EmailExtractor(ExcavateRule):