bbot 2.1.0.5028rc0__tar.gz → 2.2.0.5263rc0__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.1.0.5028rc0 → bbot-2.2.0.5263rc0}/PKG-INFO +12 -9
  2. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/README.md +9 -7
  3. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/__init__.py +1 -1
  4. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/config/logger.py +34 -4
  5. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/core.py +20 -3
  6. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/engine.py +3 -3
  7. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/event/base.py +46 -24
  8. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/command.py +4 -3
  9. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/depsinstaller/installer.py +16 -2
  10. bbot-2.2.0.5263rc0/bbot/core/helpers/libmagic.py +68 -0
  11. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/process.py +0 -18
  12. bbot-2.2.0.5263rc0/bbot/core/multiprocess.py +58 -0
  13. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/shared_deps.py +46 -3
  14. bbot-2.2.0.5263rc0/bbot/db/sql/models.py +147 -0
  15. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/apkpure.py +15 -5
  16. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/baddns.py +1 -1
  17. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/baddns_direct.py +1 -1
  18. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/baddns_zone.py +1 -1
  19. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/badsecrets.py +1 -1
  20. bbot-2.2.0.5263rc0/bbot/modules/bufferoverrun.py +48 -0
  21. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/censys.py +9 -13
  22. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/deadly/dastardly.py +1 -1
  23. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/deadly/nuclei.py +1 -1
  24. bbot-2.2.0.5263rc0/bbot/modules/dnsbimi.py +145 -0
  25. bbot-2.1.0.5028rc0/bbot/modules/unstructured.py → bbot-2.2.0.5263rc0/bbot/modules/extractous.py +23 -49
  26. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/gowitness.py +42 -44
  27. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/dnsresolve.py +12 -1
  28. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/speculate.py +2 -23
  29. bbot-2.2.0.5263rc0/bbot/modules/jadx.py +87 -0
  30. bbot-2.2.0.5263rc0/bbot/modules/output/sqlite.py +29 -0
  31. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/passivetotal.py +9 -11
  32. bbot-2.2.0.5263rc0/bbot/modules/templates/sql.py +89 -0
  33. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/trufflehog.py +1 -1
  34. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/wpscan.py +8 -2
  35. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/preset.py +3 -0
  36. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/scanner.py +5 -2
  37. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/conftest.py +37 -17
  38. bbot-2.2.0.5263rc0/bbot/test/fastapi_test.py +17 -0
  39. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/run_tests.sh +1 -1
  40. bbot-2.2.0.5263rc0/bbot/test/test_step_1/test_bbot_fastapi.py +82 -0
  41. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_dns.py +36 -0
  42. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_events.py +73 -0
  43. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/base.py +4 -0
  44. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +6 -4
  45. bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +35 -0
  46. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +4 -1
  47. bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +103 -0
  48. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +6 -6
  49. bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_extractous.py +54 -0
  50. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +1 -1
  51. bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_jadx.py +55 -0
  52. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +3 -1
  53. bbot-2.2.0.5263rc0/bbot/test/test_step_2/module_tests/test_module_sqlite.py +18 -0
  54. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/pyproject.toml +9 -6
  55. bbot-2.1.0.5028rc0/bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -102
  56. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/LICENSE +0 -0
  57. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/cli.py +0 -0
  58. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/__init__.py +0 -0
  59. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/config/__init__.py +0 -0
  60. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/config/files.py +0 -0
  61. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/event/__init__.py +0 -0
  62. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/event/helpers.py +0 -0
  63. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/flags.py +0 -0
  64. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/__init__.py +0 -0
  65. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/async_helpers.py +0 -0
  66. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/bloom.py +0 -0
  67. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/cache.py +0 -0
  68. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
  69. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
  70. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/diff.py +0 -0
  71. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/__init__.py +0 -0
  72. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/brute.py +0 -0
  73. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/dns.py +0 -0
  74. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/engine.py +0 -0
  75. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/helpers.py +0 -0
  76. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/dns/mock.py +0 -0
  77. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/files.py +0 -0
  78. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/helper.py +0 -0
  79. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/interactsh.py +0 -0
  80. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/misc.py +0 -0
  81. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/names_generator.py +0 -0
  82. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/ntlm.py +0 -0
  83. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/ratelimiter.py +0 -0
  84. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/regex.py +0 -0
  85. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/regexes.py +0 -0
  86. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/url.py +0 -0
  87. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/validators.py +0 -0
  88. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/web/__init__.py +0 -0
  89. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/web/client.py +0 -0
  90. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/web/engine.py +0 -0
  91. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
  92. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/web/web.py +0 -0
  93. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/helpers/wordcloud.py +0 -0
  94. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/core/modules.py +0 -0
  95. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/defaults.yml +0 -0
  96. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/errors.py +0 -0
  97. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/logger.py +0 -0
  98. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/__init__.py +0 -0
  99. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ajaxpro.py +0 -0
  100. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/anubisdb.py +0 -0
  101. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/azure_realm.py +0 -0
  102. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/azure_tenant.py +0 -0
  103. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/base.py +0 -0
  104. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bevigil.py +0 -0
  105. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/binaryedge.py +0 -0
  106. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_amazon.py +0 -0
  107. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_azure.py +0 -0
  108. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_digitalocean.py +0 -0
  109. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_file_enum.py +0 -0
  110. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_firebase.py +0 -0
  111. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bucket_google.py +0 -0
  112. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/builtwith.py +0 -0
  113. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/bypass403.py +0 -0
  114. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/c99.py +0 -0
  115. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/certspotter.py +0 -0
  116. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/chaos.py +0 -0
  117. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/code_repository.py +0 -0
  118. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/columbus.py +0 -0
  119. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/credshed.py +0 -0
  120. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/crt.py +0 -0
  121. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/deadly/ffuf.py +0 -0
  122. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/deadly/vhost.py +0 -0
  123. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dehashed.py +0 -0
  124. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/digitorus.py +0 -0
  125. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dnsbrute.py +0 -0
  126. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
  127. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dnscaa.py +0 -0
  128. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dnscommonsrv.py +0 -0
  129. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dnsdumpster.py +0 -0
  130. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/docker_pull.py +0 -0
  131. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dockerhub.py +0 -0
  132. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/dotnetnuke.py +0 -0
  133. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/emailformat.py +0 -0
  134. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ffuf_shortnames.py +0 -0
  135. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/filedownload.py +0 -0
  136. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/fingerprintx.py +0 -0
  137. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/fullhunt.py +0 -0
  138. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/generic_ssrf.py +0 -0
  139. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/git.py +0 -0
  140. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/git_clone.py +0 -0
  141. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/github_codesearch.py +0 -0
  142. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/github_org.py +0 -0
  143. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/github_workflows.py +0 -0
  144. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/gitlab.py +0 -0
  145. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/google_playstore.py +0 -0
  146. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/hackertarget.py +0 -0
  147. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/host_header.py +0 -0
  148. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/httpx.py +0 -0
  149. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/hunt.py +0 -0
  150. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/hunterio.py +0 -0
  151. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/iis_shortnames.py +0 -0
  152. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/__init__.py +0 -0
  153. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/aggregate.py +0 -0
  154. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/base.py +0 -0
  155. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/cloudcheck.py +0 -0
  156. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internal/excavate.py +0 -0
  157. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/internetdb.py +0 -0
  158. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ip2location.py +0 -0
  159. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ipneighbor.py +0 -0
  160. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ipstack.py +0 -0
  161. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/leakix.py +0 -0
  162. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/myssl.py +0 -0
  163. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/newsletters.py +0 -0
  164. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/ntlm.py +0 -0
  165. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/oauth.py +0 -0
  166. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/otx.py +0 -0
  167. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/__init__.py +0 -0
  168. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/asset_inventory.py +0 -0
  169. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/base.py +0 -0
  170. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/csv.py +0 -0
  171. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/discord.py +0 -0
  172. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/emails.py +0 -0
  173. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/http.py +0 -0
  174. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/json.py +0 -0
  175. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/neo4j.py +0 -0
  176. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/python.py +0 -0
  177. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/slack.py +0 -0
  178. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/splunk.py +0 -0
  179. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/stdout.py +0 -0
  180. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/subdomains.py +0 -0
  181. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/teams.py +0 -0
  182. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/txt.py +0 -0
  183. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/web_report.py +0 -0
  184. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/output/websocket.py +0 -0
  185. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/paramminer_cookies.py +0 -0
  186. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/paramminer_getparams.py +0 -0
  187. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/paramminer_headers.py +0 -0
  188. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/pgp.py +0 -0
  189. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/portscan.py +0 -0
  190. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/postman.py +0 -0
  191. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/postman_download.py +0 -0
  192. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/rapiddns.py +0 -0
  193. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/report/affiliates.py +0 -0
  194. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/report/asn.py +0 -0
  195. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/report/base.py +0 -0
  196. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/robots.py +0 -0
  197. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/secretsdb.py +0 -0
  198. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/securitytrails.py +0 -0
  199. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/securitytxt.py +0 -0
  200. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/shodan_dns.py +0 -0
  201. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/sitedossier.py +0 -0
  202. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/skymem.py +0 -0
  203. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/smuggler.py +0 -0
  204. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/social.py +0 -0
  205. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/sslcert.py +0 -0
  206. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/subdomaincenter.py +0 -0
  207. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/subdomainradar.py +0 -0
  208. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/telerik.py +0 -0
  209. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/bucket.py +0 -0
  210. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/github.py +0 -0
  211. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/postman.py +0 -0
  212. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/shodan.py +0 -0
  213. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
  214. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/templates/webhook.py +0 -0
  215. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/trickest.py +0 -0
  216. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/url_manipulation.py +0 -0
  217. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/urlscan.py +0 -0
  218. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/viewdns.py +0 -0
  219. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/virustotal.py +0 -0
  220. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/wafw00f.py +0 -0
  221. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/wappalyzer.py +0 -0
  222. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/wayback.py +0 -0
  223. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/modules/zoomeye.py +0 -0
  224. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/baddns-thorough.yml +0 -0
  225. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/cloud-enum.yml +0 -0
  226. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/code-enum.yml +0 -0
  227. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/email-enum.yml +0 -0
  228. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/kitchen-sink.yml +0 -0
  229. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/spider.yml +0 -0
  230. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/subdomain-enum.yml +0 -0
  231. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
  232. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web/dirbust-light.yml +0 -0
  233. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
  234. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
  235. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web/paramminer.yml +0 -0
  236. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web-basic.yml +0 -0
  237. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web-screenshots.yml +0 -0
  238. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/presets/web-thorough.yml +0 -0
  239. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/__init__.py +0 -0
  240. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/dispatcher.py +0 -0
  241. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/manager.py +0 -0
  242. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/__init__.py +0 -0
  243. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/args.py +0 -0
  244. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/conditions.py +0 -0
  245. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/environ.py +0 -0
  246. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/preset/path.py +0 -0
  247. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/stats.py +0 -0
  248. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scanner/target.py +0 -0
  249. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/scripts/docs.py +0 -0
  250. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/__init__.py +0 -0
  251. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/bbot_fixtures.py +0 -0
  252. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/coverage.cfg +0 -0
  253. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/owasp_mastg.apk +0 -0
  254. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test.conf +0 -0
  255. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_output.ndjson +0 -0
  256. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/__init__.py +0 -0
  257. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
  258. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
  259. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_cli.py +0 -0
  260. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_command.py +0 -0
  261. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_config.py +0 -0
  262. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
  263. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_docs.py +0 -0
  264. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_engine.py +0 -0
  265. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_files.py +0 -0
  266. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
  267. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
  268. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
  269. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -0
  270. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_presets.py +0 -0
  271. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
  272. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
  273. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_scan.py +0 -0
  274. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_scope.py +0 -0
  275. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_target.py +0 -0
  276. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_1/test_web.py +0 -0
  277. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/__init__.py +0 -0
  278. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
  279. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
  280. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
  281. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
  282. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
  283. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
  284. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
  285. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
  286. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
  287. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
  288. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
  289. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
  290. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
  291. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
  292. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
  293. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
  294. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
  295. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
  296. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
  297. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
  298. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
  299. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
  300. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
  301. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
  302. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
  303. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
  304. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
  305. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
  306. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
  307. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
  308. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
  309. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
  310. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +0 -0
  311. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
  312. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
  313. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
  314. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
  315. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
  316. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
  317. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
  318. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
  319. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
  320. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
  321. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
  322. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
  323. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
  324. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
  325. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
  326. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
  327. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
  328. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
  329. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
  330. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
  331. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
  332. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
  333. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
  334. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
  335. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
  336. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
  337. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
  338. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
  339. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
  340. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
  341. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
  342. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
  343. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
  344. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
  345. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
  346. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
  347. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
  348. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
  349. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
  350. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
  351. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
  352. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
  353. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
  354. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
  355. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
  356. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
  357. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
  358. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
  359. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
  360. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
  361. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
  362. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
  363. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
  364. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
  365. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
  366. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
  367. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
  368. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
  369. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
  370. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
  371. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
  372. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
  373. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
  374. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
  375. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
  376. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
  377. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
  378. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
  379. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
  380. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
  381. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
  382. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
  383. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
  384. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
  385. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
  386. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
  387. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
  388. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
  389. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
  390. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
  391. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
  392. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
  393. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
  394. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
  395. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
  396. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
  397. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
  398. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
  399. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
  400. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
  401. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
  402. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
  403. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/testsslcert.pem +0 -0
  404. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/test/testsslkey.pem +0 -0
  405. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/devops_mutations.txt +0 -0
  406. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
  407. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
  408. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/nameservers.txt +0 -0
  409. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
  410. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
  411. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
  412. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
  413. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
  414. {bbot-2.1.0.5028rc0 → bbot-2.2.0.5263rc0}/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.1.0.5028rc0
3
+ Version: 2.2.0.5263rc0
4
4
  Summary: OSINT automation for hackers.
5
5
  Home-page: https://github.com/blacklanternsecurity/bbot
6
6
  License: GPL-3.0
@@ -29,7 +29,8 @@ Requires-Dist: jinja2 (>=3.1.3,<4.0.0)
29
29
  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
- Requires-Dist: psutil (>=5.9.4,<6.0.0)
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)
@@ -108,13 +109,13 @@ config:
108
109
  threads: 25
109
110
  brute_threads: 1000
110
111
  # put your API keys here
111
- modules:
112
- github:
113
- api_key: ""
114
- chaos:
115
- api_key: ""
116
- securitytrails:
117
- api_key: ""
112
+ # modules:
113
+ # github:
114
+ # api_key: ""
115
+ # chaos:
116
+ # api_key: ""
117
+ # securitytrails:
118
+ # api_key: ""
118
119
 
119
120
  ```
120
121
 
@@ -268,6 +269,7 @@ include:
268
269
  - paramminer
269
270
  - dirbust-light
270
271
  - web-screenshots
272
+ - baddns-thorough
271
273
 
272
274
  config:
273
275
  modules:
@@ -409,6 +411,7 @@ For details, see [Configuration](https://www.blacklanternsecurity.com/bbot/Stabl
409
411
  - **Modules**
410
412
  - [List of Modules](https://www.blacklanternsecurity.com/bbot/Stable/modules/list_of_modules)
411
413
  - [Nuclei](https://www.blacklanternsecurity.com/bbot/Stable/modules/nuclei)
414
+ - [Custom YARA Rules](https://www.blacklanternsecurity.com/bbot/Stable/modules/custom_yara_rules)
412
415
  - **Misc**
413
416
  - [Contribution](https://www.blacklanternsecurity.com/bbot/Stable/contribution)
414
417
  - [Release History](https://www.blacklanternsecurity.com/bbot/Stable/release_history)
@@ -55,13 +55,13 @@ config:
55
55
  threads: 25
56
56
  brute_threads: 1000
57
57
  # put your API keys here
58
- modules:
59
- github:
60
- api_key: ""
61
- chaos:
62
- api_key: ""
63
- securitytrails:
64
- api_key: ""
58
+ # modules:
59
+ # github:
60
+ # api_key: ""
61
+ # chaos:
62
+ # api_key: ""
63
+ # securitytrails:
64
+ # api_key: ""
65
65
 
66
66
  ```
67
67
 
@@ -215,6 +215,7 @@ include:
215
215
  - paramminer
216
216
  - dirbust-light
217
217
  - web-screenshots
218
+ - baddns-thorough
218
219
 
219
220
  config:
220
221
  modules:
@@ -356,6 +357,7 @@ For details, see [Configuration](https://www.blacklanternsecurity.com/bbot/Stabl
356
357
  - **Modules**
357
358
  - [List of Modules](https://www.blacklanternsecurity.com/bbot/Stable/modules/list_of_modules)
358
359
  - [Nuclei](https://www.blacklanternsecurity.com/bbot/Stable/modules/nuclei)
360
+ - [Custom YARA Rules](https://www.blacklanternsecurity.com/bbot/Stable/modules/custom_yara_rules)
359
361
  - **Misc**
360
362
  - [Contribution](https://www.blacklanternsecurity.com/bbot/Stable/contribution)
361
363
  - [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.0.5028rc"
2
+ __version__ = "v2.2.0.5263rc"
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
@@ -5,9 +6,11 @@ from copy import copy
5
6
  import multiprocessing
6
7
  import logging.handlers
7
8
  from pathlib import Path
9
+ from contextlib import suppress
8
10
 
9
11
  from ..helpers.misc import mkdir, error_and_exit
10
12
  from ...logger import colorize, loglevel_mapping
13
+ from ..multiprocess import SHARED_INTERPRETER_STATE
11
14
 
12
15
 
13
16
  debug_format = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s %(filename)s:%(lineno)s %(message)s")
@@ -64,17 +67,44 @@ class BBOTLogger:
64
67
 
65
68
  self.listener = None
66
69
 
67
- self.process_name = multiprocessing.current_process().name
68
- 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"
69
73
  self.queue = multiprocessing.Queue()
70
74
  self.setup_queue_handler()
71
75
  # Start the QueueListener
72
76
  self.listener = logging.handlers.QueueListener(self.queue, *self.log_handlers.values())
73
77
  self.listener.start()
74
- atexit.register(self.listener.stop)
78
+ atexit.register(self.cleanup_logging)
75
79
 
76
80
  self.log_level = logging.INFO
77
81
 
82
+ def cleanup_logging(self):
83
+ # Close the queue handler
84
+ with suppress(Exception):
85
+ self.queue_handler.close()
86
+
87
+ # Clean root logger
88
+ root_logger = logging.getLogger()
89
+ for handler in list(root_logger.handlers):
90
+ with suppress(Exception):
91
+ root_logger.removeHandler(handler)
92
+ with suppress(Exception):
93
+ handler.close()
94
+
95
+ # Clean all other loggers
96
+ for logger in logging.Logger.manager.loggerDict.values():
97
+ if hasattr(logger, "handlers"): # Logger, not PlaceHolder
98
+ for handler in list(logger.handlers):
99
+ with suppress(Exception):
100
+ logger.removeHandler(handler)
101
+ with suppress(Exception):
102
+ handler.close()
103
+
104
+ # Stop queue listener
105
+ with suppress(Exception):
106
+ self.listener.stop()
107
+
78
108
  def setup_queue_handler(self, logging_queue=None, log_level=logging.DEBUG):
79
109
  if logging_queue is None:
80
110
  logging_queue = self.queue
@@ -86,7 +116,7 @@ class BBOTLogger:
86
116
 
87
117
  self.core_logger.setLevel(log_level)
88
118
  # disable asyncio logging for child processes
89
- if self.process_name != "MainProcess":
119
+ if not SHARED_INTERPRETER_STATE.is_main_process:
90
120
  logging.getLogger("asyncio").setLevel(logging.ERROR)
91
121
 
92
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.
@@ -503,12 +503,13 @@ class BaseEvent:
503
503
  for t in list(self.tags):
504
504
  if t.startswith("distance-"):
505
505
  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}")
506
+ if self.host:
507
+ if scope_distance == 0:
508
+ self.add_tag("in-scope")
509
+ self.remove_tag("affiliate")
510
+ else:
511
+ self.remove_tag("in-scope")
512
+ self.add_tag(f"distance-{new_scope_distance}")
512
513
  self._scope_distance = new_scope_distance
513
514
  # apply recursively to parent events
514
515
  parent_scope_distance = getattr(self.parent, "scope_distance", None)
@@ -1002,13 +1003,15 @@ class ClosestHostEvent(DictHostEvent):
1002
1003
  if parent_url is not None:
1003
1004
  self.data["url"] = parent_url.geturl()
1004
1005
  # inherit closest path
1005
- 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":
1006
1007
  parent_path = parent.data.get("path", None)
1007
1008
  if parent_path is not None:
1008
1009
  self.data["path"] = parent_path
1009
1010
  # inherit closest host
1010
1011
  if parent.host:
1011
1012
  self.data["host"] = str(parent.host)
1013
+ # we do this to refresh the hash
1014
+ self.data = self.data
1012
1015
  break
1013
1016
  # die if we still haven't found a host
1014
1017
  if not self.host:
@@ -1018,20 +1021,21 @@ class ClosestHostEvent(DictHostEvent):
1018
1021
  class DictPathEvent(DictEvent):
1019
1022
  def sanitize_data(self, data):
1020
1023
  new_data = dict(data)
1024
+ new_data["path"] = str(new_data["path"])
1021
1025
  file_blobs = getattr(self.scan, "_file_blobs", False)
1022
1026
  folder_blobs = getattr(self.scan, "_folder_blobs", False)
1023
1027
  blob = None
1024
1028
  try:
1025
- data_path = Path(data["path"])
1026
- if data_path.is_file():
1029
+ self._data_path = Path(data["path"])
1030
+ if self._data_path.is_file():
1027
1031
  self.add_tag("file")
1028
1032
  if file_blobs:
1029
- with open(data_path, "rb") as file:
1033
+ with open(self._data_path, "rb") as file:
1030
1034
  blob = file.read()
1031
- elif data_path.is_dir():
1035
+ elif self._data_path.is_dir():
1032
1036
  self.add_tag("folder")
1033
1037
  if folder_blobs:
1034
- blob = self._tar_directory(data_path)
1038
+ blob = self._tar_directory(self._data_path)
1035
1039
  except KeyError:
1036
1040
  pass
1037
1041
  if blob:
@@ -1540,7 +1544,25 @@ class WAF(DictHostEvent):
1540
1544
 
1541
1545
 
1542
1546
  class FILESYSTEM(DictPathEvent):
1543
- pass
1547
+ def __init__(self, *args, **kwargs):
1548
+ super().__init__(*args, **kwargs)
1549
+ if self._data_path.is_file():
1550
+ # detect type of file content using magic
1551
+ from bbot.core.helpers.libmagic import get_magic_info, get_compression
1552
+
1553
+ extension, mime_type, description, confidence = get_magic_info(self.data["path"])
1554
+ self.data["magic_extension"] = extension
1555
+ self.data["magic_mime_type"] = mime_type
1556
+ self.data["magic_description"] = description
1557
+ self.data["magic_confidence"] = confidence
1558
+ # detection compression
1559
+ compression = get_compression(mime_type)
1560
+ if compression:
1561
+ self.add_tag("compressed")
1562
+ self.add_tag(f"{compression}-archive")
1563
+ self.data["compression"] = compression
1564
+ # refresh hash
1565
+ self.data = self.data
1544
1566
 
1545
1567
 
1546
1568
  class RAW_DNS_RECORD(DictHostEvent, DnsEvent):
@@ -1621,23 +1643,23 @@ def make_event(
1621
1643
  tags = set(tags)
1622
1644
 
1623
1645
  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
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
1629
1651
  if module is not None:
1630
- data.module = module
1652
+ event.module = module
1631
1653
  if parent is not None:
1632
- data.parent = parent
1654
+ event.parent = parent
1633
1655
  if context is not None:
1634
- data.discovery_context = context
1656
+ event.discovery_context = context
1635
1657
  if internal == True:
1636
- data.internal = True
1658
+ event.internal = True
1637
1659
  if tags:
1638
- data.tags = tags.union(data.tags)
1660
+ event.tags = tags.union(event.tags)
1639
1661
  event_type = data.type
1640
- return data
1662
+ return event
1641
1663
  else:
1642
1664
  if event_type is None:
1643
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
 
@@ -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 = ""
@@ -248,7 +253,7 @@ class DepsInstaller:
248
253
  return success
249
254
 
250
255
  def ansible_run(self, tasks=None, module=None, args=None, ansible_args=None):
251
- _ansible_args = {"ansible_connection": "local"}
256
+ _ansible_args = {"ansible_connection": "local", "ansible_python_interpreter": sys.executable}
252
257
  if ansible_args is not None:
253
258
  _ansible_args.update(ansible_args)
254
259
  module_args = None
@@ -342,7 +347,16 @@ class DepsInstaller:
342
347
  # ensure tldextract data is cached
343
348
  self.parent_helper.tldextract("evilcorp.co.uk")
344
349
  # command: package_name
345
- core_deps = {"unzip": "unzip", "curl": "curl"}
350
+ core_deps = {
351
+ "unzip": "unzip",
352
+ "zipinfo": "unzip",
353
+ "curl": "curl",
354
+ "git": "git",
355
+ "make": "make",
356
+ "gcc": "gcc",
357
+ "bash": "bash",
358
+ "which": "which",
359
+ }
346
360
  for command, package_name in core_deps.items():
347
361
  if not self.parent_helper.which(command):
348
362
  to_install.add(package_name)
@@ -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, "")
@@ -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()
@@ -79,13 +79,23 @@ DEP_CHROMIUM = [
79
79
  "ignore_errors": True,
80
80
  },
81
81
  {
82
- "name": "Install Chromium dependencies (Debian)",
82
+ "name": "Install Chromium dependencies (Ubuntu 24.04)",
83
83
  "package": {
84
- "name": "libasound2,libatk-bridge2.0-0,libatk1.0-0,libcairo2,libcups2,libdrm2,libgbm1,libnss3,libpango-1.0-0,libxcomposite1,libxdamage1,libxfixes3,libxkbcommon0,libxrandr2",
84
+ "name": "libasound2t64,libatk-bridge2.0-0,libatk1.0-0,libcairo2,libcups2,libdrm2,libgbm1,libnss3,libpango-1.0-0,libglib2.0-0,libxcomposite1,libxdamage1,libxfixes3,libxkbcommon0,libxrandr2",
85
85
  "state": "present",
86
86
  },
87
87
  "become": True,
88
- "when": "ansible_facts['os_family'] == 'Debian'",
88
+ "when": "ansible_facts['distribution'] == 'Ubuntu' and ansible_facts['distribution_version'] == '24.04'",
89
+ "ignore_errors": True,
90
+ },
91
+ {
92
+ "name": "Install Chromium dependencies (Other Debian-based)",
93
+ "package": {
94
+ "name": "libasound2,libatk-bridge2.0-0,libatk1.0-0,libcairo2,libcups2,libdrm2,libgbm1,libnss3,libpango-1.0-0,libglib2.0-0,libxcomposite1,libxdamage1,libxfixes3,libxkbcommon0,libxrandr2",
95
+ "state": "present",
96
+ },
97
+ "become": True,
98
+ "when": "ansible_facts['os_family'] == 'Debian' and not (ansible_facts['distribution'] == 'Ubuntu' and ansible_facts['distribution_version'] == '24.04')",
89
99
  "ignore_errors": True,
90
100
  },
91
101
  {
@@ -149,6 +159,39 @@ DEP_MASSCAN = [
149
159
  },
150
160
  ]
151
161
 
162
+ DEP_JAVA = [
163
+ {
164
+ "name": "Check if Java is installed",
165
+ "command": "which java",
166
+ "register": "java_installed",
167
+ "ignore_errors": True,
168
+ },
169
+ {
170
+ "name": "Install latest JRE (Debian)",
171
+ "package": {"name": ["default-jre"], "state": "present"},
172
+ "become": True,
173
+ "when": "ansible_facts['os_family'] == 'Debian' and java_installed.rc != 0",
174
+ },
175
+ {
176
+ "name": "Install latest JRE (Arch)",
177
+ "package": {"name": ["jre-openjdk"], "state": "present"},
178
+ "become": True,
179
+ "when": "ansible_facts['os_family'] == 'Archlinux' and java_installed.rc != 0",
180
+ },
181
+ {
182
+ "name": "Install latest JRE (Fedora)",
183
+ "package": {"name": ["which", "java-latest-openjdk-headless"], "state": "present"},
184
+ "become": True,
185
+ "when": "ansible_facts['os_family'] == 'RedHat' and java_installed.rc != 0",
186
+ },
187
+ {
188
+ "name": "Install latest JRE (Alpine)",
189
+ "package": {"name": ["openjdk11"], "state": "present"},
190
+ "become": True,
191
+ "when": "ansible_facts['os_family'] == 'Alpine' and java_installed.rc != 0",
192
+ },
193
+ ]
194
+
152
195
  # shared module dependencies -- ffuf, massdns, chromium, etc.
153
196
  SHARED_DEPS = {}
154
197
  for var, val in list(locals().items()):