bbot 2.2.0.5242rc0__tar.gz → 2.2.0.5279rc0__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 (414) hide show
  1. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/PKG-INFO +1 -1
  2. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/__init__.py +1 -1
  3. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/config/logger.py +6 -3
  4. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/core.py +20 -3
  5. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/engine.py +3 -3
  6. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/event/base.py +16 -12
  7. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/command.py +4 -3
  8. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/depsinstaller/installer.py +13 -5
  9. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/misc.py +18 -0
  10. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/process.py +0 -18
  11. bbot-2.2.0.5279rc0/bbot/core/multiprocess.py +58 -0
  12. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/defaults.yml +3 -0
  13. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/censys.py +9 -13
  14. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/dnsresolve.py +12 -1
  15. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/speculate.py +33 -23
  16. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/leakix.py +2 -3
  17. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/passivetotal.py +9 -11
  18. bbot-2.2.0.5279rc0/bbot/presets/fast.yml +16 -0
  19. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/args.py +17 -1
  20. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/preset.py +8 -8
  21. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/scanner.py +4 -1
  22. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/bbot_fixtures.py +5 -2
  23. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/conftest.py +95 -84
  24. bbot-2.2.0.5279rc0/bbot/test/fastapi_test.py +17 -0
  25. bbot-2.2.0.5279rc0/bbot/test/test_step_1/test_bbot_fastapi.py +82 -0
  26. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_cli.py +29 -0
  27. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_dns.py +36 -0
  28. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_events.py +32 -1
  29. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -3
  30. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_presets.py +1 -2
  31. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_web.py +3 -0
  32. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +4 -1
  33. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -6
  34. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +5 -1
  35. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +3 -1
  36. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/pyproject.toml +4 -2
  37. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/LICENSE +0 -0
  38. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/README.md +0 -0
  39. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/cli.py +0 -0
  40. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/__init__.py +0 -0
  41. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/config/__init__.py +0 -0
  42. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/config/files.py +0 -0
  43. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/event/__init__.py +0 -0
  44. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/event/helpers.py +0 -0
  45. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/flags.py +0 -0
  46. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/__init__.py +0 -0
  47. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/async_helpers.py +0 -0
  48. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/bloom.py +0 -0
  49. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/cache.py +0 -0
  50. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
  51. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
  52. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/diff.py +0 -0
  53. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/__init__.py +0 -0
  54. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/brute.py +0 -0
  55. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/dns.py +0 -0
  56. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/engine.py +0 -0
  57. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/helpers.py +0 -0
  58. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/dns/mock.py +0 -0
  59. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/files.py +0 -0
  60. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/helper.py +0 -0
  61. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/interactsh.py +0 -0
  62. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/libmagic.py +0 -0
  63. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/names_generator.py +0 -0
  64. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/ntlm.py +0 -0
  65. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/ratelimiter.py +0 -0
  66. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/regex.py +0 -0
  67. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/regexes.py +0 -0
  68. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/url.py +0 -0
  69. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/validators.py +0 -0
  70. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/web/__init__.py +0 -0
  71. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/web/client.py +0 -0
  72. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/web/engine.py +0 -0
  73. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
  74. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/web/web.py +0 -0
  75. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/helpers/wordcloud.py +0 -0
  76. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/modules.py +0 -0
  77. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/core/shared_deps.py +0 -0
  78. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/db/sql/models.py +0 -0
  79. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/errors.py +0 -0
  80. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/logger.py +0 -0
  81. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/__init__.py +0 -0
  82. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ajaxpro.py +0 -0
  83. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/anubisdb.py +0 -0
  84. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/apkpure.py +0 -0
  85. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/azure_realm.py +0 -0
  86. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/azure_tenant.py +0 -0
  87. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/baddns.py +0 -0
  88. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/baddns_direct.py +0 -0
  89. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/baddns_zone.py +0 -0
  90. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/badsecrets.py +0 -0
  91. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/base.py +0 -0
  92. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bevigil.py +0 -0
  93. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/binaryedge.py +0 -0
  94. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_amazon.py +0 -0
  95. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_azure.py +0 -0
  96. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_digitalocean.py +0 -0
  97. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_file_enum.py +0 -0
  98. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_firebase.py +0 -0
  99. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bucket_google.py +0 -0
  100. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bufferoverrun.py +0 -0
  101. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/builtwith.py +0 -0
  102. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/bypass403.py +0 -0
  103. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/c99.py +0 -0
  104. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/certspotter.py +0 -0
  105. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/chaos.py +0 -0
  106. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/code_repository.py +0 -0
  107. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/columbus.py +0 -0
  108. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/credshed.py +0 -0
  109. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/crt.py +0 -0
  110. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/deadly/dastardly.py +0 -0
  111. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/deadly/ffuf.py +0 -0
  112. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/deadly/nuclei.py +0 -0
  113. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/deadly/vhost.py +0 -0
  114. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dehashed.py +0 -0
  115. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/digitorus.py +0 -0
  116. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnsbimi.py +0 -0
  117. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnsbrute.py +0 -0
  118. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
  119. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnscaa.py +0 -0
  120. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnscommonsrv.py +0 -0
  121. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dnsdumpster.py +0 -0
  122. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/docker_pull.py +0 -0
  123. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dockerhub.py +0 -0
  124. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/dotnetnuke.py +0 -0
  125. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/emailformat.py +0 -0
  126. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/extractous.py +0 -0
  127. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ffuf_shortnames.py +0 -0
  128. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/filedownload.py +0 -0
  129. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/fingerprintx.py +0 -0
  130. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/fullhunt.py +0 -0
  131. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/generic_ssrf.py +0 -0
  132. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/git.py +0 -0
  133. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/git_clone.py +0 -0
  134. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/github_codesearch.py +0 -0
  135. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/github_org.py +0 -0
  136. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/github_workflows.py +0 -0
  137. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/gitlab.py +0 -0
  138. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/google_playstore.py +0 -0
  139. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/gowitness.py +0 -0
  140. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/hackertarget.py +0 -0
  141. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/host_header.py +0 -0
  142. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/httpx.py +0 -0
  143. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/hunt.py +0 -0
  144. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/hunterio.py +0 -0
  145. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/iis_shortnames.py +0 -0
  146. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/__init__.py +0 -0
  147. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/aggregate.py +0 -0
  148. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/base.py +0 -0
  149. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/cloudcheck.py +0 -0
  150. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internal/excavate.py +0 -0
  151. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/internetdb.py +0 -0
  152. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ip2location.py +0 -0
  153. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ipneighbor.py +0 -0
  154. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ipstack.py +0 -0
  155. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/jadx.py +0 -0
  156. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/myssl.py +0 -0
  157. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/newsletters.py +0 -0
  158. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/ntlm.py +0 -0
  159. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/oauth.py +0 -0
  160. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/otx.py +0 -0
  161. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/__init__.py +0 -0
  162. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/asset_inventory.py +0 -0
  163. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/base.py +0 -0
  164. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/csv.py +0 -0
  165. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/discord.py +0 -0
  166. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/emails.py +0 -0
  167. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/http.py +0 -0
  168. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/json.py +0 -0
  169. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/neo4j.py +0 -0
  170. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/python.py +0 -0
  171. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/slack.py +0 -0
  172. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/splunk.py +0 -0
  173. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/sqlite.py +0 -0
  174. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/stdout.py +0 -0
  175. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/subdomains.py +0 -0
  176. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/teams.py +0 -0
  177. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/txt.py +0 -0
  178. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/web_report.py +0 -0
  179. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/output/websocket.py +0 -0
  180. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/paramminer_cookies.py +0 -0
  181. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/paramminer_getparams.py +0 -0
  182. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/paramminer_headers.py +0 -0
  183. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/pgp.py +0 -0
  184. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/portscan.py +0 -0
  185. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/postman.py +0 -0
  186. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/postman_download.py +0 -0
  187. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/rapiddns.py +0 -0
  188. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/report/affiliates.py +0 -0
  189. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/report/asn.py +0 -0
  190. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/report/base.py +0 -0
  191. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/robots.py +0 -0
  192. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/secretsdb.py +0 -0
  193. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/securitytrails.py +0 -0
  194. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/securitytxt.py +0 -0
  195. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/shodan_dns.py +0 -0
  196. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/sitedossier.py +0 -0
  197. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/skymem.py +0 -0
  198. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/smuggler.py +0 -0
  199. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/social.py +0 -0
  200. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/sslcert.py +0 -0
  201. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/subdomaincenter.py +0 -0
  202. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/subdomainradar.py +0 -0
  203. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/telerik.py +0 -0
  204. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/bucket.py +0 -0
  205. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/github.py +0 -0
  206. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/postman.py +0 -0
  207. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/shodan.py +0 -0
  208. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/sql.py +0 -0
  209. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
  210. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/templates/webhook.py +0 -0
  211. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/trickest.py +0 -0
  212. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/trufflehog.py +0 -0
  213. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/url_manipulation.py +0 -0
  214. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/urlscan.py +0 -0
  215. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/viewdns.py +0 -0
  216. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/virustotal.py +0 -0
  217. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/wafw00f.py +0 -0
  218. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/wappalyzer.py +0 -0
  219. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/wayback.py +0 -0
  220. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/wpscan.py +0 -0
  221. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/modules/zoomeye.py +0 -0
  222. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/baddns-thorough.yml +0 -0
  223. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/cloud-enum.yml +0 -0
  224. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/code-enum.yml +0 -0
  225. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/email-enum.yml +0 -0
  226. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/kitchen-sink.yml +0 -0
  227. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/spider.yml +0 -0
  228. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/subdomain-enum.yml +0 -0
  229. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
  230. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web/dirbust-light.yml +0 -0
  231. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
  232. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
  233. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web/paramminer.yml +0 -0
  234. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web-basic.yml +0 -0
  235. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web-screenshots.yml +0 -0
  236. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/presets/web-thorough.yml +0 -0
  237. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/__init__.py +0 -0
  238. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/dispatcher.py +0 -0
  239. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/manager.py +0 -0
  240. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/__init__.py +0 -0
  241. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/conditions.py +0 -0
  242. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/environ.py +0 -0
  243. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/preset/path.py +0 -0
  244. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/stats.py +0 -0
  245. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scanner/target.py +0 -0
  246. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/scripts/docs.py +0 -0
  247. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/__init__.py +0 -0
  248. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/coverage.cfg +0 -0
  249. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/owasp_mastg.apk +0 -0
  250. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/run_tests.sh +0 -0
  251. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test.conf +0 -0
  252. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_output.ndjson +0 -0
  253. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/__init__.py +0 -0
  254. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
  255. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
  256. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_command.py +0 -0
  257. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_config.py +0 -0
  258. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
  259. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_docs.py +0 -0
  260. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_engine.py +0 -0
  261. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_files.py +0 -0
  262. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
  263. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
  264. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
  265. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
  266. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
  267. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_scan.py +0 -0
  268. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_scope.py +0 -0
  269. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_1/test_target.py +0 -0
  270. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/__init__.py +0 -0
  271. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
  272. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/base.py +0 -0
  273. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
  274. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
  275. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
  276. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
  277. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
  278. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
  279. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
  280. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
  281. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
  282. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
  283. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
  284. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
  285. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
  286. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
  287. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
  288. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
  289. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
  290. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
  291. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
  292. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
  293. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
  294. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
  295. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
  296. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
  297. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
  298. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
  299. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
  300. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
  301. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
  302. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
  303. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
  304. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
  305. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
  306. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +0 -0
  307. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
  308. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
  309. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
  310. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +0 -0
  311. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
  312. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
  313. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
  314. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
  315. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
  316. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
  317. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
  318. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
  319. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
  320. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
  321. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +0 -0
  322. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_extractous.py +0 -0
  323. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
  324. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
  325. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
  326. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
  327. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
  328. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
  329. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
  330. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
  331. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
  332. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
  333. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
  334. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
  335. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
  336. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
  337. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
  338. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
  339. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
  340. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
  341. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
  342. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
  343. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
  344. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
  345. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
  346. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
  347. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
  348. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_jadx.py +0 -0
  349. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
  350. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
  351. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
  352. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
  353. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
  354. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
  355. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
  356. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
  357. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
  358. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
  359. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
  360. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
  361. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
  362. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
  363. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
  364. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
  365. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
  366. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
  367. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
  368. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
  369. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
  370. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
  371. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
  372. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
  373. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
  374. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
  375. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
  376. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
  377. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
  378. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_sqlite.py +0 -0
  379. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
  380. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
  381. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
  382. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
  383. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
  384. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
  385. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
  386. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
  387. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
  388. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
  389. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
  390. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
  391. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
  392. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
  393. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
  394. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
  395. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
  396. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
  397. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
  398. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
  399. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
  400. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
  401. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
  402. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
  403. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/testsslcert.pem +0 -0
  404. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/test/testsslkey.pem +0 -0
  405. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/devops_mutations.txt +0 -0
  406. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
  407. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
  408. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/nameservers.txt +0 -0
  409. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
  410. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
  411. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
  412. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
  413. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
  414. {bbot-2.2.0.5242rc0 → bbot-2.2.0.5279rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bbot
3
- Version: 2.2.0.5242rc0
3
+ Version: 2.2.0.5279rc0
4
4
  Summary: OSINT automation for hackers.
5
5
  Home-page: https://github.com/blacklanternsecurity/bbot
6
6
  License: GPL-3.0
@@ -1,4 +1,4 @@
1
1
  # version placeholder (replaced by poetry-dynamic-versioning)
2
- __version__ = "v2.2.0.5242rc"
2
+ __version__ = "v2.2.0.5279rc"
3
3
 
4
4
  from .scanner import Scanner, Preset
@@ -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.
@@ -1003,13 +1003,15 @@ class ClosestHostEvent(DictHostEvent):
1003
1003
  if parent_url is not None:
1004
1004
  self.data["url"] = parent_url.geturl()
1005
1005
  # inherit closest path
1006
- if not "path" in self.data and isinstance(parent.data, dict):
1006
+ if not "path" in self.data and isinstance(parent.data, dict) and not parent.type == "HTTP_RESPONSE":
1007
1007
  parent_path = parent.data.get("path", None)
1008
1008
  if parent_path is not None:
1009
1009
  self.data["path"] = parent_path
1010
1010
  # inherit closest host
1011
1011
  if parent.host:
1012
1012
  self.data["host"] = str(parent.host)
1013
+ # we do this to refresh the hash
1014
+ self.data = self.data
1013
1015
  break
1014
1016
  # die if we still haven't found a host
1015
1017
  if not self.host:
@@ -1559,6 +1561,8 @@ class FILESYSTEM(DictPathEvent):
1559
1561
  self.add_tag("compressed")
1560
1562
  self.add_tag(f"{compression}-archive")
1561
1563
  self.data["compression"] = compression
1564
+ # refresh hash
1565
+ self.data = self.data
1562
1566
 
1563
1567
 
1564
1568
  class RAW_DNS_RECORD(DictHostEvent, DnsEvent):
@@ -1639,23 +1643,23 @@ def make_event(
1639
1643
  tags = set(tags)
1640
1644
 
1641
1645
  if is_event(data):
1642
- data = copy(data)
1643
- if scan is not None and not data.scan:
1644
- data.scan = scan
1645
- if scans is not None and not data.scans:
1646
- data.scans = scans
1646
+ event = copy(data)
1647
+ if scan is not None and not event.scan:
1648
+ event.scan = scan
1649
+ if scans is not None and not event.scans:
1650
+ event.scans = scans
1647
1651
  if module is not None:
1648
- data.module = module
1652
+ event.module = module
1649
1653
  if parent is not None:
1650
- data.parent = parent
1654
+ event.parent = parent
1651
1655
  if context is not None:
1652
- data.discovery_context = context
1656
+ event.discovery_context = context
1653
1657
  if internal == True:
1654
- data.internal = True
1658
+ event.internal = True
1655
1659
  if tags:
1656
- data.tags = tags.union(data.tags)
1660
+ event.tags = tags.union(event.tags)
1657
1661
  event_type = data.type
1658
- return data
1662
+ return event
1659
1663
  else:
1660
1664
  if event_type is None:
1661
1665
  event_type, data = get_event_type(data)
@@ -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:
@@ -2807,3 +2807,21 @@ def safe_format(s, **kwargs):
2807
2807
  Format string while ignoring unused keys (prevents KeyError)
2808
2808
  """
2809
2809
  return s.format_map(SafeDict(kwargs))
2810
+
2811
+
2812
+ def get_python_constraints():
2813
+ req_regex = re.compile(r"([^(]+)\s*\((.*)\)", re.IGNORECASE)
2814
+
2815
+ def clean_requirement(req_string):
2816
+ # Extract package name and version constraints from format like "package (>=1.0,<2.0)"
2817
+ match = req_regex.match(req_string)
2818
+ if match:
2819
+ name, constraints = match.groups()
2820
+ return f"{name.strip()}{constraints}"
2821
+
2822
+ return req_string
2823
+
2824
+ from importlib.metadata import distribution
2825
+
2826
+ dist = distribution("bbot")
2827
+ return [clean_requirement(r) for r in dist.requires]
@@ -1,15 +1,11 @@
1
1
  import logging
2
2
  import traceback
3
3
  import threading
4
- import multiprocessing
5
4
  from multiprocessing.context import SpawnProcess
6
5
 
7
6
  from .misc import in_exception_chain
8
7
 
9
8
 
10
- current_process = multiprocessing.current_process()
11
-
12
-
13
9
  class BBOTThread(threading.Thread):
14
10
 
15
11
  default_name = "default bbot thread"
@@ -57,17 +53,3 @@ class BBOTProcess(SpawnProcess):
57
53
  if not in_exception_chain(e, (KeyboardInterrupt,)):
58
54
  log.warning(f"Error in {self.name}: {e}")
59
55
  log.trace(traceback.format_exc())
60
-
61
-
62
- if current_process.name == "MainProcess":
63
- # if this is the main bbot process, set the logger and queue for the first time
64
- from bbot.core import CORE
65
- from functools import partialmethod
66
-
67
- BBOTProcess.__init__ = partialmethod(
68
- BBOTProcess.__init__, log_level=CORE.logger.log_level, log_queue=CORE.logger.queue
69
- )
70
-
71
- # this makes our process class the default for process pools, etc.
72
- mp_context = multiprocessing.get_context("spawn")
73
- mp_context.Process = BBOTProcess
@@ -0,0 +1,58 @@
1
+ import os
2
+ import atexit
3
+ from contextlib import suppress
4
+
5
+
6
+ class SharedInterpreterState:
7
+ """
8
+ A class to track the primary BBOT process.
9
+
10
+ Used to prevent spawning multiple unwanted processes with multiprocessing.
11
+ """
12
+
13
+ def __init__(self):
14
+ self.main_process_var_name = "_BBOT_MAIN_PID"
15
+ self.scan_process_var_name = "_BBOT_SCAN_PID"
16
+ atexit.register(self.cleanup)
17
+
18
+ @property
19
+ def is_main_process(self):
20
+ is_main_process = self.main_pid == os.getpid()
21
+ return is_main_process
22
+
23
+ @property
24
+ def is_scan_process(self):
25
+ is_scan_process = os.getpid() == self.scan_pid
26
+ return is_scan_process
27
+
28
+ @property
29
+ def main_pid(self):
30
+ main_pid = int(os.environ.get(self.main_process_var_name, 0))
31
+ if main_pid == 0:
32
+ main_pid = os.getpid()
33
+ # if main PID is not set, set it to the current PID
34
+ os.environ[self.main_process_var_name] = str(main_pid)
35
+ return main_pid
36
+
37
+ @property
38
+ def scan_pid(self):
39
+ scan_pid = int(os.environ.get(self.scan_process_var_name, 0))
40
+ if scan_pid == 0:
41
+ scan_pid = os.getpid()
42
+ # if scan PID is not set, set it to the current PID
43
+ os.environ[self.scan_process_var_name] = str(scan_pid)
44
+ return scan_pid
45
+
46
+ def update_scan_pid(self):
47
+ os.environ[self.scan_process_var_name] = str(os.getpid())
48
+
49
+ def cleanup(self):
50
+ with suppress(Exception):
51
+ if self.is_main_process:
52
+ with suppress(KeyError):
53
+ del os.environ[self.main_process_var_name]
54
+ with suppress(KeyError):
55
+ del os.environ[self.scan_process_var_name]
56
+
57
+
58
+ SHARED_INTERPRETER_STATE = SharedInterpreterState()
@@ -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)
@@ -15,25 +15,21 @@ class censys(subdomain_enum_apikey):
15
15
  "author": "@TheTechromancer",
16
16
  "auth_required": True,
17
17
  }
18
- options = {"api_id": "", "api_secret": "", "max_pages": 5}
18
+ options = {"api_key": "", "max_pages": 5}
19
19
  options_desc = {
20
- "api_id": "Censys.io API ID",
21
- "api_secret": "Censys.io API Secret",
20
+ "api_key": "Censys.io API Key in the format of 'key:secret'",
22
21
  "max_pages": "Maximum number of pages to fetch (100 results per page)",
23
22
  }
24
23
 
25
24
  base_url = "https://search.censys.io/api"
26
25
 
27
26
  async def setup(self):
28
- self.api_id = self.config.get("api_id", "")
29
- self.api_secret = self.config.get("api_secret", "")
30
- self.auth = (self.api_id, self.api_secret)
31
27
  self.max_pages = self.config.get("max_pages", 5)
32
28
  return await super().setup()
33
29
 
34
30
  async def ping(self):
35
31
  url = f"{self.base_url}/v1/account"
36
- resp = await self.helpers.request(url, auth=self.auth)
32
+ resp = await self.api_request(url)
37
33
  d = resp.json()
38
34
  assert isinstance(d, dict), f"Invalid response from {url}: {resp}"
39
35
  quota = d.get("quota", {})
@@ -41,6 +37,11 @@ class censys(subdomain_enum_apikey):
41
37
  allowance = int(quota.get("allowance", 0))
42
38
  assert used < allowance, "No quota remaining"
43
39
 
40
+ def prepare_api_request(self, url, kwargs):
41
+ api_id, api_secret = self.api_key.split(":", 1)
42
+ kwargs["auth"] = (api_id, api_secret)
43
+ return url, kwargs
44
+
44
45
  async def query(self, query):
45
46
  results = set()
46
47
  cursor = ""
@@ -52,11 +53,10 @@ class censys(subdomain_enum_apikey):
52
53
  }
53
54
  if cursor:
54
55
  json_data.update({"cursor": cursor})
55
- resp = await self.helpers.request(
56
+ resp = await self.api_request(
56
57
  url,
57
58
  method="POST",
58
59
  json=json_data,
59
- auth=self.auth,
60
60
  )
61
61
 
62
62
  if resp is None:
@@ -96,7 +96,3 @@ class censys(subdomain_enum_apikey):
96
96
  break
97
97
 
98
98
  return results
99
-
100
- @property
101
- def auth_secret(self):
102
- return self.api_id and self.api_secret
@@ -79,7 +79,16 @@ class DNSResolve(BaseInterceptModule):
79
79
  await self.resolve_event(main_host_event, types=non_minimal_rdtypes)
80
80
  # check for wildcards if the event is within the scan's search distance
81
81
  if new_event and main_host_event.scope_distance <= self.scan.scope_search_distance:
82
- await self.handle_wildcard_event(main_host_event)
82
+ event_data_changed = await self.handle_wildcard_event(main_host_event)
83
+ if event_data_changed:
84
+ # since data has changed, we check again whether it's a duplicate
85
+ if self.scan.ingress_module.is_incoming_duplicate(event, add=True):
86
+ if not event._graph_important:
87
+ return False, "event was already emitted by its module"
88
+ else:
89
+ self.debug(
90
+ f"Event {event} was already emitted by its module, but it's graph-important so it gets a pass"
91
+ )
83
92
 
84
93
  # if there weren't any DNS children and it's not an IP address, tag as unresolved
85
94
  if not main_host_event.raw_dns_records and not event_is_ip:
@@ -152,6 +161,8 @@ class DNSResolve(BaseInterceptModule):
152
161
  if wildcard_data != event.data:
153
162
  self.debug(f'Wildcard detected, changing event.data "{event.data}" --> "{wildcard_data}"')
154
163
  event.data = wildcard_data
164
+ return True
165
+ return False
155
166
 
156
167
  async def emit_dns_children(self, event):
157
168
  for rdtype, children in event.dns_children.items():
@@ -32,10 +32,11 @@ class speculate(BaseInternalModule):
32
32
  "author": "@liquidsec",
33
33
  }
34
34
 
35
- options = {"max_hosts": 65536, "ports": "80,443"}
35
+ options = {"max_hosts": 65536, "ports": "80,443", "essential_only": False}
36
36
  options_desc = {
37
37
  "max_hosts": "Max number of IP_RANGE hosts to convert into IP_ADDRESS events",
38
38
  "ports": "The set of ports to speculate on",
39
+ "essential_only": "Only enable essential speculate features (no extra discovery)",
39
40
  }
40
41
  scope_distance_modifier = 1
41
42
  _priority = 4
@@ -52,6 +53,7 @@ class speculate(BaseInternalModule):
52
53
  self.emit_open_ports = self.open_port_consumers and not self.portscanner_enabled
53
54
  self.range_to_ip = True
54
55
  self.dns_disable = self.scan.config.get("dns", {}).get("disable", False)
56
+ self.essential_only = self.config.get("essential_only", False)
55
57
  self.org_stubs_seen = set()
56
58
 
57
59
  port_string = self.config.get("ports", "80,443")
@@ -75,6 +77,14 @@ class speculate(BaseInternalModule):
75
77
  return True
76
78
 
77
79
  async def handle_event(self, event):
80
+ ### BEGIN ESSENTIAL SPECULATION ###
81
+ # These features are required for smooth operation of bbot
82
+ # I.e. they are not "osinty" or intended to discover anything, they only compliment other modules
83
+
84
+ # we speculate on distance-1 stuff too, because distance-1 open ports are needed by certain modules like sslcert
85
+ event_in_scope_distance = event.scope_distance <= (self.scan.scope_search_distance + 1)
86
+ speculate_open_ports = self.emit_open_ports and event_in_scope_distance
87
+
78
88
  # generate individual IP addresses from IP range
79
89
  if event.type == "IP_RANGE" and self.range_to_ip:
80
90
  net = ipaddress.ip_network(event.data)
@@ -89,6 +99,28 @@ class speculate(BaseInternalModule):
89
99
  context=f"speculate converted range into individual IP_ADDRESS: {ip}",
90
100
  )
91
101
 
102
+ # IP_ADDRESS / DNS_NAME --> OPEN_TCP_PORT
103
+ if speculate_open_ports:
104
+ # don't act on unresolved DNS_NAMEs
105
+ usable_dns = False
106
+ if event.type == "DNS_NAME":
107
+ if self.dns_disable or ("a-record" in event.tags or "aaaa-record" in event.tags):
108
+ usable_dns = True
109
+
110
+ if event.type == "IP_ADDRESS" or usable_dns:
111
+ for port in self.ports:
112
+ await self.emit_event(
113
+ self.helpers.make_netloc(event.data, port),
114
+ "OPEN_TCP_PORT",
115
+ parent=event,
116
+ internal=True,
117
+ context="speculated {event.type}: {event.data}",
118
+ )
119
+
120
+ ### END ESSENTIAL SPECULATION ###
121
+ if self.essential_only:
122
+ return
123
+
92
124
  # parent domains
93
125
  if event.type.startswith("DNS_NAME"):
94
126
  parent = self.helpers.parent_domain(event.host_original)
@@ -97,10 +129,6 @@ class speculate(BaseInternalModule):
97
129
  parent, "DNS_NAME", parent=event, context=f"speculated parent {{event.type}}: {{event.data}}"
98
130
  )
99
131
 
100
- # we speculate on distance-1 stuff too, because distance-1 open ports are needed by certain modules like sslcert
101
- event_in_scope_distance = event.scope_distance <= (self.scan.scope_search_distance + 1)
102
- speculate_open_ports = self.emit_open_ports and event_in_scope_distance
103
-
104
132
  # URL --> OPEN_TCP_PORT
105
133
  event_is_url = event.type == "URL"
106
134
  if event_is_url or (event.type == "URL_UNVERIFIED" and self.open_port_consumers):
@@ -144,24 +172,6 @@ class speculate(BaseInternalModule):
144
172
  context="speculated {event.type}: {event.data}",
145
173
  )
146
174
 
147
- # IP_ADDRESS / DNS_NAME --> OPEN_TCP_PORT
148
- if speculate_open_ports:
149
- # don't act on unresolved DNS_NAMEs
150
- usable_dns = False
151
- if event.type == "DNS_NAME":
152
- if self.dns_disable or ("a-record" in event.tags or "aaaa-record" in event.tags):
153
- usable_dns = True
154
-
155
- if event.type == "IP_ADDRESS" or usable_dns:
156
- for port in self.ports:
157
- await self.emit_event(
158
- self.helpers.make_netloc(event.data, port),
159
- "OPEN_TCP_PORT",
160
- parent=event,
161
- internal=True,
162
- context="speculated {event.type}: {event.data}",
163
- )
164
-
165
175
  # ORG_STUB from TLD, SOCIAL, AZURE_TENANT
166
176
  org_stubs = set()
167
177
  if event.type == "DNS_NAME" and event.scope_distance == 0:
@@ -15,20 +15,19 @@ class leakix(subdomain_enum_apikey):
15
15
  }
16
16
 
17
17
  base_url = "https://leakix.net"
18
- ping_url = f"{base_url}/host/1.2.3.4.5"
18
+ ping_url = f"{base_url}/host/1.1.1.1"
19
19
 
20
20
  async def setup(self):
21
21
  ret = await super(subdomain_enum_apikey, self).setup()
22
- self.headers = {"Accept": "application/json"}
23
22
  self.api_key = self.config.get("api_key", "")
24
23
  if self.api_key:
25
- self.headers["api-key"] = self.api_key
26
24
  return await self.require_api_key()
27
25
  return ret
28
26
 
29
27
  def prepare_api_request(self, url, kwargs):
30
28
  if self.api_key:
31
29
  kwargs["headers"]["api-key"] = self.api_key
30
+ kwargs["headers"]["Accept"] = "application/json"
32
31
  return url, kwargs
33
32
 
34
33
  async def request_url(self, query):
@@ -11,36 +11,34 @@ class passivetotal(subdomain_enum_apikey):
11
11
  "author": "@TheTechromancer",
12
12
  "auth_required": True,
13
13
  }
14
- options = {"username": "", "api_key": ""}
15
- options_desc = {"username": "RiskIQ Username", "api_key": "RiskIQ API Key"}
14
+ options = {"api_key": ""}
15
+ options_desc = {"api_key": "PassiveTotal API Key in the format of 'username:api_key'"}
16
16
 
17
17
  base_url = "https://api.passivetotal.org/v2"
18
18
 
19
19
  async def setup(self):
20
- self.username = self.config.get("username", "")
21
- self.api_key = self.config.get("api_key", "")
22
- self.auth = (self.username, self.api_key)
23
20
  return await super().setup()
24
21
 
25
22
  async def ping(self):
26
23
  url = f"{self.base_url}/account/quota"
27
- j = (await self.api_request(url, auth=self.auth)).json()
24
+ j = (await self.api_request(url)).json()
28
25
  limit = j["user"]["limits"]["search_api"]
29
26
  used = j["user"]["counts"]["search_api"]
30
27
  assert used < limit, "No quota remaining"
31
28
 
29
+ def prepare_api_request(self, url, kwargs):
30
+ api_username, api_key = self.api_key.split(":", 1)
31
+ kwargs["auth"] = (api_username, api_key)
32
+ return url, kwargs
33
+
32
34
  async def abort_if(self, event):
33
35
  # RiskIQ is famous for their junk data
34
36
  return await super().abort_if(event) or "unresolved" in event.tags
35
37
 
36
38
  async def request_url(self, query):
37
39
  url = f"{self.base_url}/enrichment/subdomains?query={self.helpers.quote(query)}"
38
- return await self.api_request(url, auth=self.auth)
40
+ return await self.api_request(url)
39
41
 
40
42
  def parse_results(self, r, query):
41
43
  for subdomain in r.json().get("subdomains", []):
42
44
  yield f"{subdomain}.{query}"
43
-
44
- @property
45
- def auth_secret(self):
46
- return self.username and self.api_key
@@ -0,0 +1,16 @@
1
+ description: Scan only the provided targets as fast as possible - no extra discovery
2
+
3
+ exclude_modules:
4
+ - excavate
5
+
6
+ config:
7
+ # only scan the exact targets specified
8
+ scope:
9
+ strict: true
10
+ # speed up dns resolution by doing A/AAAA only - not MX/NS/SRV/etc
11
+ dns:
12
+ minimal: true
13
+ # essential speculation only
14
+ modules:
15
+ speculate:
16
+ essential_only: true