bbot 2.1.2.5156rc0__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.1.2.5156rc0 → bbot-2.3.0.5328rc0}/PKG-INFO +10 -4
  2. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/README.md +5 -0
  3. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/__init__.py +1 -1
  4. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/cli.py +1 -1
  5. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/logger.py +6 -3
  6. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/core.py +20 -3
  7. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/engine.py +5 -5
  8. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/base.py +69 -26
  9. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/bloom.py +8 -1
  10. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/command.py +4 -3
  11. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/installer.py +14 -5
  12. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/helpers.py +2 -2
  13. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/helper.py +4 -3
  14. bbot-2.3.0.5328rc0/bbot/core/helpers/libmagic.py +68 -0
  15. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/misc.py +29 -5
  16. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/process.py +0 -18
  17. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/regexes.py +2 -1
  18. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/web.py +1 -1
  19. bbot-2.3.0.5328rc0/bbot/core/multiprocess.py +58 -0
  20. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/shared_deps.py +46 -3
  21. bbot-2.3.0.5328rc0/bbot/db/sql/models.py +148 -0
  22. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/defaults.yml +3 -0
  23. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/anubisdb.py +1 -1
  24. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/apkpure.py +15 -5
  25. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns.py +2 -2
  26. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns_direct.py +1 -1
  27. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/baddns_zone.py +1 -1
  28. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/badsecrets.py +1 -1
  29. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bevigil.py +2 -2
  30. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/binaryedge.py +1 -1
  31. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bufferoverrun.py +2 -3
  32. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/builtwith.py +2 -2
  33. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/c99.py +4 -2
  34. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/censys.py +9 -13
  35. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/certspotter.py +4 -2
  36. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/chaos.py +4 -2
  37. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/columbus.py +1 -1
  38. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/crt.py +4 -2
  39. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/dastardly.py +1 -1
  40. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/digitorus.py +1 -1
  41. bbot-2.3.0.5328rc0/bbot/modules/dnsbimi.py +145 -0
  42. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnscaa.py +3 -3
  43. bbot-2.1.2.5156rc0/bbot/modules/unstructured.py → bbot-2.3.0.5328rc0/bbot/modules/extractous.py +23 -49
  44. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/fullhunt.py +1 -1
  45. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hackertarget.py +4 -2
  46. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/dnsresolve.py +12 -1
  47. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/excavate.py +2 -3
  48. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/speculate.py +34 -24
  49. bbot-2.3.0.5328rc0/bbot/modules/jadx.py +87 -0
  50. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/leakix.py +6 -5
  51. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/myssl.py +1 -1
  52. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/otx.py +4 -2
  53. bbot-2.3.0.5328rc0/bbot/modules/output/postgres.py +49 -0
  54. bbot-2.3.0.5328rc0/bbot/modules/output/sqlite.py +29 -0
  55. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/passivetotal.py +13 -13
  56. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/rapiddns.py +2 -7
  57. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/securitytrails.py +4 -2
  58. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/shodan_dns.py +1 -1
  59. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/subdomaincenter.py +1 -1
  60. bbot-2.3.0.5328rc0/bbot/modules/templates/sql.py +90 -0
  61. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/subdomain_enum.py +3 -3
  62. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/trickest.py +1 -1
  63. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/trufflehog.py +1 -1
  64. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/virustotal.py +2 -7
  65. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/zoomeye.py +5 -3
  66. bbot-2.3.0.5328rc0/bbot/presets/fast.yml +16 -0
  67. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/spider.yml +4 -0
  68. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/manager.py +1 -2
  69. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/args.py +20 -4
  70. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/path.py +3 -1
  71. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/preset.py +21 -12
  72. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/scanner.py +12 -4
  73. bbot-2.3.0.5328rc0/bbot/scanner/target.py +345 -0
  74. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/bbot_fixtures.py +5 -2
  75. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/conftest.py +95 -84
  76. bbot-2.3.0.5328rc0/bbot/test/fastapi_test.py +17 -0
  77. bbot-2.3.0.5328rc0/bbot/test/test_step_1/test_bbot_fastapi.py +82 -0
  78. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_bloom_filter.py +2 -0
  79. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_cli.py +36 -0
  80. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_dns.py +38 -1
  81. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_events.py +89 -3
  82. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_helpers.py +17 -0
  83. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -3
  84. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_presets.py +51 -38
  85. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_python_api.py +4 -0
  86. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_scan.py +8 -2
  87. bbot-2.3.0.5328rc0/bbot/test/test_step_1/test_target.py +407 -0
  88. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_web.py +3 -0
  89. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/base.py +6 -2
  90. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +6 -4
  91. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +4 -1
  92. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +2 -1
  93. bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +103 -0
  94. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -6
  95. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +6 -6
  96. bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_extractous.py +54 -0
  97. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +1 -1
  98. bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_jadx.py +55 -0
  99. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +5 -1
  100. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +3 -1
  101. bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_postgres.py +74 -0
  102. bbot-2.3.0.5328rc0/bbot/test/test_step_2/module_tests/test_module_sqlite.py +18 -0
  103. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/pyproject.toml +10 -7
  104. bbot-2.1.2.5156rc0/bbot/scanner/target.py +0 -543
  105. bbot-2.1.2.5156rc0/bbot/test/test_step_1/test_target.py +0 -309
  106. bbot-2.1.2.5156rc0/bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -102
  107. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/LICENSE +0 -0
  108. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/__init__.py +0 -0
  109. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/__init__.py +0 -0
  110. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/config/files.py +0 -0
  111. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/__init__.py +0 -0
  112. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/event/helpers.py +0 -0
  113. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/flags.py +0 -0
  114. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/__init__.py +0 -0
  115. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/async_helpers.py +0 -0
  116. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/cache.py +0 -0
  117. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
  118. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
  119. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/diff.py +0 -0
  120. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/__init__.py +0 -0
  121. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/brute.py +0 -0
  122. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/dns.py +0 -0
  123. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/engine.py +0 -0
  124. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/dns/mock.py +0 -0
  125. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/files.py +0 -0
  126. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/interactsh.py +0 -0
  127. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/names_generator.py +0 -0
  128. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/ntlm.py +0 -0
  129. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/ratelimiter.py +0 -0
  130. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/regex.py +0 -0
  131. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/url.py +0 -0
  132. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/validators.py +0 -0
  133. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/__init__.py +0 -0
  134. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/client.py +0 -0
  135. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/engine.py +0 -0
  136. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
  137. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/helpers/wordcloud.py +0 -0
  138. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/core/modules.py +0 -0
  139. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/errors.py +0 -0
  140. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/logger.py +0 -0
  141. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/__init__.py +0 -0
  142. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ajaxpro.py +0 -0
  143. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/azure_realm.py +0 -0
  144. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/azure_tenant.py +0 -0
  145. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/base.py +0 -0
  146. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_amazon.py +0 -0
  147. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_azure.py +0 -0
  148. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_digitalocean.py +0 -0
  149. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_file_enum.py +0 -0
  150. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_firebase.py +0 -0
  151. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bucket_google.py +0 -0
  152. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/bypass403.py +0 -0
  153. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/code_repository.py +0 -0
  154. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/credshed.py +0 -0
  155. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/ffuf.py +0 -0
  156. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/nuclei.py +0 -0
  157. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/deadly/vhost.py +0 -0
  158. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dehashed.py +0 -0
  159. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsbrute.py +0 -0
  160. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
  161. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnscommonsrv.py +0 -0
  162. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dnsdumpster.py +0 -0
  163. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/docker_pull.py +0 -0
  164. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dockerhub.py +0 -0
  165. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/dotnetnuke.py +0 -0
  166. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/emailformat.py +0 -0
  167. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ffuf_shortnames.py +0 -0
  168. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/filedownload.py +0 -0
  169. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/fingerprintx.py +0 -0
  170. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/generic_ssrf.py +0 -0
  171. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/git.py +0 -0
  172. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/git_clone.py +0 -0
  173. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_codesearch.py +0 -0
  174. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_org.py +0 -0
  175. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/github_workflows.py +0 -0
  176. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/gitlab.py +0 -0
  177. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/google_playstore.py +0 -0
  178. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/gowitness.py +0 -0
  179. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/host_header.py +0 -0
  180. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/httpx.py +0 -0
  181. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hunt.py +0 -0
  182. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/hunterio.py +0 -0
  183. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/iis_shortnames.py +0 -0
  184. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/__init__.py +0 -0
  185. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/aggregate.py +0 -0
  186. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/base.py +0 -0
  187. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internal/cloudcheck.py +0 -0
  188. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/internetdb.py +0 -0
  189. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ip2location.py +0 -0
  190. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ipneighbor.py +0 -0
  191. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ipstack.py +0 -0
  192. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/newsletters.py +0 -0
  193. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/ntlm.py +0 -0
  194. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/oauth.py +0 -0
  195. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/__init__.py +0 -0
  196. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/asset_inventory.py +0 -0
  197. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/base.py +0 -0
  198. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/csv.py +0 -0
  199. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/discord.py +0 -0
  200. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/emails.py +0 -0
  201. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/http.py +0 -0
  202. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/json.py +0 -0
  203. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/neo4j.py +0 -0
  204. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/python.py +0 -0
  205. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/slack.py +0 -0
  206. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/splunk.py +0 -0
  207. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/stdout.py +0 -0
  208. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/subdomains.py +0 -0
  209. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/teams.py +0 -0
  210. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/txt.py +0 -0
  211. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/web_report.py +0 -0
  212. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/output/websocket.py +0 -0
  213. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_cookies.py +0 -0
  214. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_getparams.py +0 -0
  215. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/paramminer_headers.py +0 -0
  216. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/pgp.py +0 -0
  217. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/portscan.py +0 -0
  218. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/postman.py +0 -0
  219. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/postman_download.py +0 -0
  220. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/affiliates.py +0 -0
  221. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/asn.py +0 -0
  222. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/report/base.py +0 -0
  223. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/robots.py +0 -0
  224. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/secretsdb.py +0 -0
  225. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/securitytxt.py +0 -0
  226. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/sitedossier.py +0 -0
  227. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/skymem.py +0 -0
  228. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/smuggler.py +0 -0
  229. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/social.py +0 -0
  230. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/sslcert.py +0 -0
  231. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/subdomainradar.py +0 -0
  232. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/telerik.py +0 -0
  233. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/bucket.py +0 -0
  234. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/github.py +0 -0
  235. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/postman.py +0 -0
  236. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/shodan.py +0 -0
  237. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/templates/webhook.py +0 -0
  238. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/url_manipulation.py +0 -0
  239. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/urlscan.py +0 -0
  240. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/viewdns.py +0 -0
  241. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wafw00f.py +0 -0
  242. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wappalyzer.py +0 -0
  243. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wayback.py +0 -0
  244. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/modules/wpscan.py +0 -0
  245. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/baddns-thorough.yml +0 -0
  246. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/cloud-enum.yml +0 -0
  247. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/code-enum.yml +0 -0
  248. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/email-enum.yml +0 -0
  249. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/kitchen-sink.yml +0 -0
  250. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/subdomain-enum.yml +0 -0
  251. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
  252. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dirbust-light.yml +0 -0
  253. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
  254. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
  255. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web/paramminer.yml +0 -0
  256. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-basic.yml +0 -0
  257. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-screenshots.yml +0 -0
  258. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/presets/web-thorough.yml +0 -0
  259. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/__init__.py +0 -0
  260. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/dispatcher.py +0 -0
  261. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/__init__.py +0 -0
  262. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/conditions.py +0 -0
  263. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/preset/environ.py +0 -0
  264. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scanner/stats.py +0 -0
  265. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/scripts/docs.py +0 -0
  266. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/__init__.py +0 -0
  267. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/coverage.cfg +0 -0
  268. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/owasp_mastg.apk +0 -0
  269. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/run_tests.sh +0 -0
  270. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test.conf +0 -0
  271. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_output.ndjson +0 -0
  272. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/__init__.py +0 -0
  273. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
  274. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_command.py +0 -0
  275. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_config.py +0 -0
  276. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
  277. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_docs.py +0 -0
  278. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_engine.py +0 -0
  279. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_files.py +0 -0
  280. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
  281. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
  282. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
  283. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_1/test_scope.py +0 -0
  284. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/__init__.py +0 -0
  285. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
  286. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
  287. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
  288. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
  289. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
  290. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
  291. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
  292. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
  293. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
  294. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
  295. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
  296. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
  297. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
  298. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
  299. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
  300. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
  301. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
  302. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
  303. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
  304. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
  305. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
  306. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
  307. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
  308. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
  309. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
  310. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
  311. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
  312. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
  313. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
  314. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
  315. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
  316. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
  317. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
  318. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
  319. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
  320. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
  321. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
  322. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
  323. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
  324. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
  325. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
  326. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
  327. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
  328. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
  329. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
  330. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
  331. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
  332. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
  333. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
  334. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
  335. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
  336. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
  337. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
  338. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
  339. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
  340. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
  341. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
  342. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
  343. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
  344. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
  345. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
  346. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
  347. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
  348. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
  349. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
  350. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
  351. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
  352. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
  353. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
  354. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
  355. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
  356. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
  357. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
  358. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
  359. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
  360. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
  361. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
  362. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
  363. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
  364. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
  365. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
  366. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
  367. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
  368. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
  369. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
  370. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
  371. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
  372. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
  373. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
  374. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
  375. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
  376. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
  377. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
  378. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
  379. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
  380. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
  381. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
  382. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
  383. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
  384. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
  385. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
  386. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
  387. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
  388. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
  389. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
  390. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
  391. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
  392. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
  393. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
  394. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
  395. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
  396. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
  397. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
  398. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
  399. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
  400. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
  401. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
  402. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
  403. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
  404. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
  405. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
  406. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
  407. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
  408. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/testsslcert.pem +0 -0
  409. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/test/testsslkey.pem +0 -0
  410. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/devops_mutations.txt +0 -0
  411. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
  412. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
  413. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/nameservers.txt +0 -0
  414. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
  415. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
  416. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
  417. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
  418. {bbot-2.1.2.5156rc0 → bbot-2.3.0.5328rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
  419. {bbot-2.1.2.5156rc0 → 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.1.2.5156rc0
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)
@@ -30,11 +30,12 @@ Requires-Dist: lxml (>=4.9.2,<6.0.0)
30
30
  Requires-Dist: mmh3 (>=4.1,<6.0)
31
31
  Requires-Dist: omegaconf (>=2.3.0,<3.0.0)
32
32
  Requires-Dist: psutil (>=5.9.4,<7.0.0)
33
+ Requires-Dist: puremagic (>=1.28,<2.0)
33
34
  Requires-Dist: pycryptodome (>=3.17,<4.0)
34
35
  Requires-Dist: pydantic (>=2.4.2,<3.0.0)
35
36
  Requires-Dist: pyjwt (>=2.7.0,<3.0.0)
36
37
  Requires-Dist: pyzmq (>=26.0.3,<27.0.0)
37
- Requires-Dist: radixtarget (>=1.0.0.15,<2.0.0.0)
38
+ Requires-Dist: radixtarget (>=2.0.0.50,<3.0.0.0)
38
39
  Requires-Dist: regex (>=2024.4.16,<2025.0.0)
39
40
  Requires-Dist: setproctitle (>=1.3.3,<2.0.0)
40
41
  Requires-Dist: socksio (>=1.0.0,<2.0.0)
@@ -144,6 +145,10 @@ description: Recursive web spider
144
145
  modules:
145
146
  - httpx
146
147
 
148
+ blacklist:
149
+ # Prevent spider from invalidating sessions by logging out
150
+ - "RE:/.*(sign|log)[_-]?out"
151
+
147
152
  config:
148
153
  web:
149
154
  # how many links to follow in a row
@@ -410,6 +415,7 @@ For details, see [Configuration](https://www.blacklanternsecurity.com/bbot/Stabl
410
415
  - **Modules**
411
416
  - [List of Modules](https://www.blacklanternsecurity.com/bbot/Stable/modules/list_of_modules)
412
417
  - [Nuclei](https://www.blacklanternsecurity.com/bbot/Stable/modules/nuclei)
418
+ - [Custom YARA Rules](https://www.blacklanternsecurity.com/bbot/Stable/modules/custom_yara_rules)
413
419
  - **Misc**
414
420
  - [Contribution](https://www.blacklanternsecurity.com/bbot/Stable/contribution)
415
421
  - [Release History](https://www.blacklanternsecurity.com/bbot/Stable/release_history)
@@ -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
@@ -357,6 +361,7 @@ For details, see [Configuration](https://www.blacklanternsecurity.com/bbot/Stabl
357
361
  - **Modules**
358
362
  - [List of Modules](https://www.blacklanternsecurity.com/bbot/Stable/modules/list_of_modules)
359
363
  - [Nuclei](https://www.blacklanternsecurity.com/bbot/Stable/modules/nuclei)
364
+ - [Custom YARA Rules](https://www.blacklanternsecurity.com/bbot/Stable/modules/custom_yara_rules)
360
365
  - **Misc**
361
366
  - [Contribution](https://www.blacklanternsecurity.com/bbot/Stable/contribution)
362
367
  - [Release History](https://www.blacklanternsecurity.com/bbot/Stable/release_history)
@@ -1,4 +1,4 @@
1
1
  # version placeholder (replaced by poetry-dynamic-versioning)
2
- __version__ = "v2.1.2.5156rc"
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:
@@ -1,3 +1,4 @@
1
+ import os
1
2
  import sys
2
3
  import atexit
3
4
  import logging
@@ -9,6 +10,7 @@ from contextlib import suppress
9
10
 
10
11
  from ..helpers.misc import mkdir, error_and_exit
11
12
  from ...logger import colorize, loglevel_mapping
13
+ from ..multiprocess import SHARED_INTERPRETER_STATE
12
14
 
13
15
 
14
16
  debug_format = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s %(filename)s:%(lineno)s %(message)s")
@@ -65,8 +67,9 @@ class BBOTLogger:
65
67
 
66
68
  self.listener = None
67
69
 
68
- self.process_name = multiprocessing.current_process().name
69
- if self.process_name == "MainProcess":
70
+ # if we haven't set up logging yet, do it now
71
+ if not "_BBOT_LOGGING_SETUP" in os.environ:
72
+ os.environ["_BBOT_LOGGING_SETUP"] = "1"
70
73
  self.queue = multiprocessing.Queue()
71
74
  self.setup_queue_handler()
72
75
  # Start the QueueListener
@@ -113,7 +116,7 @@ class BBOTLogger:
113
116
 
114
117
  self.core_logger.setLevel(log_level)
115
118
  # disable asyncio logging for child processes
116
- if self.process_name != "MainProcess":
119
+ if not SHARED_INTERPRETER_STATE.is_main_process:
117
120
  logging.getLogger("asyncio").setLevel(logging.ERROR)
118
121
 
119
122
  def addLoggingLevel(self, levelName, levelNum, methodName=None):
@@ -6,6 +6,7 @@ from contextlib import suppress
6
6
  from omegaconf import OmegaConf
7
7
 
8
8
  from bbot.errors import BBOTError
9
+ from .multiprocess import SHARED_INTERPRETER_STATE
9
10
 
10
11
 
11
12
  DEFAULT_CONFIG = None
@@ -41,9 +42,23 @@ class BBOTCore:
41
42
  self.logger
42
43
  self.log = logging.getLogger("bbot.core")
43
44
 
45
+ self._prep_multiprocessing()
46
+
47
+ def _prep_multiprocessing(self):
44
48
  import multiprocessing
49
+ from .helpers.process import BBOTProcess
50
+
51
+ if SHARED_INTERPRETER_STATE.is_main_process:
52
+ # if this is the main bbot process, set the logger and queue for the first time
53
+ from functools import partialmethod
45
54
 
46
- self.process_name = multiprocessing.current_process().name
55
+ BBOTProcess.__init__ = partialmethod(
56
+ BBOTProcess.__init__, log_level=self.logger.log_level, log_queue=self.logger.queue
57
+ )
58
+
59
+ # this makes our process class the default for process pools, etc.
60
+ mp_context = multiprocessing.get_context("spawn")
61
+ mp_context.Process = BBOTProcess
47
62
 
48
63
  @property
49
64
  def home(self):
@@ -187,12 +202,14 @@ class BBOTCore:
187
202
  if os.environ.get("BBOT_TESTING", "") == "True":
188
203
  process = self.create_thread(*args, **kwargs)
189
204
  else:
190
- if self.process_name == "MainProcess":
205
+ if SHARED_INTERPRETER_STATE.is_scan_process:
191
206
  from .helpers.process import BBOTProcess
192
207
 
193
208
  process = BBOTProcess(*args, **kwargs)
194
209
  else:
195
- raise BBOTError(f"Tried to start server from process {self.process_name}")
210
+ import multiprocessing
211
+
212
+ raise BBOTError(f"Tried to start server from process {multiprocessing.current_process().name}")
196
213
  process.daemon = True
197
214
  return process
198
215
 
@@ -10,6 +10,7 @@ import traceback
10
10
  import contextlib
11
11
  import contextvars
12
12
  import zmq.asyncio
13
+ import multiprocessing
13
14
  from pathlib import Path
14
15
  from concurrent.futures import CancelledError
15
16
  from contextlib import asynccontextmanager, suppress
@@ -17,6 +18,7 @@ from contextlib import asynccontextmanager, suppress
17
18
  from bbot.core import CORE
18
19
  from bbot.errors import BBOTEngineError
19
20
  from bbot.core.helpers.async_helpers import get_event_loop
21
+ from bbot.core.multiprocess import SHARED_INTERPRETER_STATE
20
22
  from bbot.core.helpers.misc import rand_string, in_exception_chain
21
23
 
22
24
 
@@ -264,10 +266,8 @@ class EngineClient(EngineBase):
264
266
  return [s for s in self.CMDS if isinstance(s, str)]
265
267
 
266
268
  def start_server(self):
267
- import multiprocessing
268
-
269
269
  process_name = multiprocessing.current_process().name
270
- if process_name == "MainProcess":
270
+ if SHARED_INTERPRETER_STATE.is_scan_process:
271
271
  kwargs = dict(self.server_kwargs)
272
272
  # if we're in tests, we use a single event loop to avoid weird race conditions
273
273
  # this allows us to more easily mock http, etc.
@@ -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
@@ -503,12 +518,13 @@ class BaseEvent:
503
518
  for t in list(self.tags):
504
519
  if t.startswith("distance-"):
505
520
  self.remove_tag(t)
506
- if scope_distance == 0:
507
- self.add_tag("in-scope")
508
- self.remove_tag("affiliate")
509
- else:
510
- self.remove_tag("in-scope")
511
- self.add_tag(f"distance-{new_scope_distance}")
521
+ if self.host:
522
+ if scope_distance == 0:
523
+ self.add_tag("in-scope")
524
+ self.remove_tag("affiliate")
525
+ else:
526
+ self.remove_tag("in-scope")
527
+ self.add_tag(f"distance-{new_scope_distance}")
512
528
  self._scope_distance = new_scope_distance
513
529
  # apply recursively to parent events
514
530
  parent_scope_distance = getattr(self.parent, "scope_distance", None)
@@ -1002,13 +1018,15 @@ class ClosestHostEvent(DictHostEvent):
1002
1018
  if parent_url is not None:
1003
1019
  self.data["url"] = parent_url.geturl()
1004
1020
  # inherit closest path
1005
- if not "path" in self.data and isinstance(parent.data, dict):
1021
+ if not "path" in self.data and isinstance(parent.data, dict) and not parent.type == "HTTP_RESPONSE":
1006
1022
  parent_path = parent.data.get("path", None)
1007
1023
  if parent_path is not None:
1008
1024
  self.data["path"] = parent_path
1009
1025
  # inherit closest host
1010
1026
  if parent.host:
1011
1027
  self.data["host"] = str(parent.host)
1028
+ # we do this to refresh the hash
1029
+ self.data = self.data
1012
1030
  break
1013
1031
  # die if we still haven't found a host
1014
1032
  if not self.host:
@@ -1018,20 +1036,21 @@ class ClosestHostEvent(DictHostEvent):
1018
1036
  class DictPathEvent(DictEvent):
1019
1037
  def sanitize_data(self, data):
1020
1038
  new_data = dict(data)
1039
+ new_data["path"] = str(new_data["path"])
1021
1040
  file_blobs = getattr(self.scan, "_file_blobs", False)
1022
1041
  folder_blobs = getattr(self.scan, "_folder_blobs", False)
1023
1042
  blob = None
1024
1043
  try:
1025
- data_path = Path(data["path"])
1026
- if data_path.is_file():
1044
+ self._data_path = Path(data["path"])
1045
+ if self._data_path.is_file():
1027
1046
  self.add_tag("file")
1028
1047
  if file_blobs:
1029
- with open(data_path, "rb") as file:
1048
+ with open(self._data_path, "rb") as file:
1030
1049
  blob = file.read()
1031
- elif data_path.is_dir():
1050
+ elif self._data_path.is_dir():
1032
1051
  self.add_tag("folder")
1033
1052
  if folder_blobs:
1034
- blob = self._tar_directory(data_path)
1053
+ blob = self._tar_directory(self._data_path)
1035
1054
  except KeyError:
1036
1055
  pass
1037
1056
  if blob:
@@ -1110,8 +1129,7 @@ class DnsEvent(BaseEvent):
1110
1129
  class IP_RANGE(DnsEvent):
1111
1130
  def __init__(self, *args, **kwargs):
1112
1131
  super().__init__(*args, **kwargs)
1113
- net = ipaddress.ip_network(self.data, strict=False)
1114
- self.add_tag(f"ipv{net.version}")
1132
+ self.add_tag(f"ipv{self.host.version}")
1115
1133
 
1116
1134
  def sanitize_data(self, data):
1117
1135
  return str(ipaddress.ip_network(str(data), strict=False))
@@ -1540,7 +1558,25 @@ class WAF(DictHostEvent):
1540
1558
 
1541
1559
 
1542
1560
  class FILESYSTEM(DictPathEvent):
1543
- pass
1561
+ def __init__(self, *args, **kwargs):
1562
+ super().__init__(*args, **kwargs)
1563
+ if self._data_path.is_file():
1564
+ # detect type of file content using magic
1565
+ from bbot.core.helpers.libmagic import get_magic_info, get_compression
1566
+
1567
+ extension, mime_type, description, confidence = get_magic_info(self.data["path"])
1568
+ self.data["magic_extension"] = extension
1569
+ self.data["magic_mime_type"] = mime_type
1570
+ self.data["magic_description"] = description
1571
+ self.data["magic_confidence"] = confidence
1572
+ # detection compression
1573
+ compression = get_compression(mime_type)
1574
+ if compression:
1575
+ self.add_tag("compressed")
1576
+ self.add_tag(f"{compression}-archive")
1577
+ self.data["compression"] = compression
1578
+ # refresh hash
1579
+ self.data = self.data
1544
1580
 
1545
1581
 
1546
1582
  class RAW_DNS_RECORD(DictHostEvent, DnsEvent):
@@ -1621,23 +1657,23 @@ def make_event(
1621
1657
  tags = set(tags)
1622
1658
 
1623
1659
  if is_event(data):
1624
- data = copy(data)
1625
- if scan is not None and not data.scan:
1626
- data.scan = scan
1627
- if scans is not None and not data.scans:
1628
- data.scans = scans
1660
+ event = copy(data)
1661
+ if scan is not None and not event.scan:
1662
+ event.scan = scan
1663
+ if scans is not None and not event.scans:
1664
+ event.scans = scans
1629
1665
  if module is not None:
1630
- data.module = module
1666
+ event.module = module
1631
1667
  if parent is not None:
1632
- data.parent = parent
1668
+ event.parent = parent
1633
1669
  if context is not None:
1634
- data.discovery_context = context
1670
+ event.discovery_context = context
1635
1671
  if internal == True:
1636
- data.internal = True
1672
+ event.internal = True
1637
1673
  if tags:
1638
- data.tags = tags.union(data.tags)
1674
+ event.tags = tags.union(event.tags)
1639
1675
  event_type = data.type
1640
- return data
1676
+ return event
1641
1677
  else:
1642
1678
  if event_type is None:
1643
1679
  event_type, data = get_event_type(data)
@@ -1667,6 +1703,13 @@ def make_event(
1667
1703
  if event_type == "USERNAME" and validators.soft_validate(data, "email"):
1668
1704
  event_type = "EMAIL_ADDRESS"
1669
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
1670
1713
 
1671
1714
  event_class = globals().get(event_type, DefaultEvent)
1672
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)
@@ -210,9 +210,10 @@ async def _write_proc_line(proc, chunk):
210
210
  return True
211
211
  except Exception as e:
212
212
  proc_args = [str(s) for s in getattr(proc, "args", [])]
213
- command = " ".join(proc_args)
214
- log.warning(f"Error writing line to stdin for command: {command}: {e}")
215
- log.trace(traceback.format_exc())
213
+ command = " ".join(proc_args).strip()
214
+ if command:
215
+ log.warning(f"Error writing line to stdin for command: {command}: {e}")
216
+ log.trace(traceback.format_exc())
216
217
  return False
217
218
 
218
219
 
@@ -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
 
@@ -44,6 +44,11 @@ class DepsInstaller:
44
44
  self.parent_helper.mkdir(self.command_status)
45
45
  self.setup_status = self.read_setup_status()
46
46
 
47
+ # make sure we're using a minimal git config
48
+ self.minimal_git_config = self.data_dir / "minimal_git.config"
49
+ self.minimal_git_config.touch()
50
+ os.environ["GIT_CONFIG_GLOBAL"] = str(self.minimal_git_config)
51
+
47
52
  self.deps_behavior = self.parent_helper.config.get("deps_behavior", "abort_on_failure").lower()
48
53
  self.ansible_debug = self.core.logger.log_level <= logging.DEBUG
49
54
  self.venv = ""
@@ -171,10 +176,13 @@ class DepsInstaller:
171
176
 
172
177
  command = [sys.executable, "-m", "pip", "install", "--upgrade"] + packages
173
178
 
174
- if constraints:
175
- constraints_tempfile = self.parent_helper.tempfile(constraints, pipe=False)
176
- command.append("--constraint")
177
- 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)
178
186
 
179
187
  process = None
180
188
  try:
@@ -350,6 +358,7 @@ class DepsInstaller:
350
358
  "make": "make",
351
359
  "gcc": "gcc",
352
360
  "bash": "bash",
361
+ "which": "which",
353
362
  }
354
363
  for command, package_name in core_deps.items():
355
364
  if not self.parent_helper.which(command):
@@ -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):
@@ -0,0 +1,68 @@
1
+ import puremagic
2
+
3
+
4
+ def get_magic_info(file):
5
+
6
+ magic_detections = puremagic.magic_file(file)
7
+ if magic_detections:
8
+ magic_detections.sort(key=lambda x: x.confidence, reverse=True)
9
+ detection = magic_detections[0]
10
+ return detection.extension, detection.mime_type, detection.name, detection.confidence
11
+ return "", "", "", 0
12
+
13
+
14
+ def get_compression(mime_type):
15
+ mime_type = mime_type.lower()
16
+ # from https://github.com/cdgriffith/puremagic/blob/master/puremagic/magic_data.json
17
+ compression_map = {
18
+ "application/gzip": "gzip", # Gzip compressed file
19
+ "application/zip": "zip", # Zip archive
20
+ "application/x-bzip2": "bzip2", # Bzip2 compressed file
21
+ "application/x-xz": "xz", # XZ compressed file
22
+ "application/x-7z-compressed": "7z", # 7-Zip archive
23
+ "application/vnd.rar": "rar", # RAR archive
24
+ "application/x-lzma": "lzma", # LZMA compressed file
25
+ "application/x-compress": "compress", # Unix compress file
26
+ "application/zstd": "zstd", # Zstandard compressed file
27
+ "application/x-lz4": "lz4", # LZ4 compressed file
28
+ "application/x-tar": "tar", # Tar archive
29
+ "application/x-zip-compressed-fb2": "zip", # Zip archive (FB2)
30
+ "application/epub+zip": "zip", # EPUB book (Zip archive)
31
+ "application/pak": "pak", # PAK archive
32
+ "application/x-lha": "lha", # LHA archive
33
+ "application/arj": "arj", # ARJ archive
34
+ "application/vnd.ms-cab-compressed": "cab", # Microsoft Cabinet archive
35
+ "application/x-sit": "sit", # StuffIt archive
36
+ "application/binhex": "binhex", # BinHex encoded file
37
+ "application/x-lrzip": "lrzip", # Long Range ZIP
38
+ "application/x-alz": "alz", # ALZip archive
39
+ "application/x-tgz": "tgz", # Gzip compressed Tar archive
40
+ "application/x-gzip": "gzip", # Gzip compressed file
41
+ "application/x-lzip": "lzip", # Lzip compressed file
42
+ "application/x-zstd-compressed-tar": "zstd", # Zstandard compressed Tar archive
43
+ "application/x-lz4-compressed-tar": "lz4", # LZ4 compressed Tar archive
44
+ "application/vnd.comicbook+zip": "zip", # Comic book archive (Zip)
45
+ "application/vnd.palm": "palm", # Palm OS data
46
+ "application/fictionbook2+zip": "zip", # FictionBook 2.0 (Zip)
47
+ "application/fictionbook3+zip": "zip", # FictionBook 3.0 (Zip)
48
+ "application/x-cpio": "cpio", # CPIO archive
49
+ "application/x-java-pack200": "pack200", # Java Pack200 archive
50
+ "application/x-par2": "par2", # PAR2 recovery file
51
+ "application/x-rar-compressed": "rar", # RAR archive
52
+ "application/java-archive": "zip", # Java Archive (JAR)
53
+ "application/x-webarchive": "zip", # Web archive (Zip)
54
+ "application/vnd.android.package-archive": "zip", # Android package (APK)
55
+ "application/x-itunes-ipa": "zip", # iOS application archive (IPA)
56
+ "application/x-stuffit": "sit", # StuffIt archive
57
+ "application/x-archive": "ar", # Unix archive
58
+ "application/x-qpress": "qpress", # Qpress archive
59
+ "application/x-xar": "xar", # XAR archive
60
+ "application/x-ace": "ace", # ACE archive
61
+ "application/x-zoo": "zoo", # Zoo archive
62
+ "application/x-arc": "arc", # ARC archive
63
+ "application/x-zstd-compressed-tar": "zstd", # Zstandard compressed Tar archive
64
+ "application/x-lz4-compressed-tar": "lz4", # LZ4 compressed Tar archive
65
+ "application/vnd.comicbook-rar": "rar", # Comic book archive (RAR)
66
+ }
67
+
68
+ return compression_map.get(mime_type, "")
@@ -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]