bbot 2.1.2.5158rc0__tar.gz → 2.1.2.5171rc0__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 (403) hide show
  1. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/PKG-INFO +2 -1
  2. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/__init__.py +1 -1
  3. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/event/base.py +30 -12
  4. bbot-2.1.2.5171rc0/bbot/core/helpers/libmagic.py +68 -0
  5. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/shared_deps.py +1 -1
  6. bbot-2.1.2.5158rc0/bbot/modules/unstructured.py → bbot-2.1.2.5171rc0/bbot/modules/extractous.py +19 -20
  7. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/preset.py +3 -0
  8. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_events.py +41 -0
  9. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +6 -6
  10. bbot-2.1.2.5171rc0/bbot/test/test_step_2/module_tests/test_module_extractous.py +54 -0
  11. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/pyproject.toml +2 -1
  12. bbot-2.1.2.5158rc0/bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -102
  13. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/LICENSE +0 -0
  14. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/README.md +0 -0
  15. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/cli.py +0 -0
  16. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/__init__.py +0 -0
  17. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/config/__init__.py +0 -0
  18. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/config/files.py +0 -0
  19. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/config/logger.py +0 -0
  20. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/core.py +0 -0
  21. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/engine.py +0 -0
  22. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/event/__init__.py +0 -0
  23. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/event/helpers.py +0 -0
  24. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/flags.py +0 -0
  25. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/__init__.py +0 -0
  26. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/async_helpers.py +0 -0
  27. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/bloom.py +0 -0
  28. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/cache.py +0 -0
  29. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/command.py +0 -0
  30. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
  31. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/depsinstaller/installer.py +0 -0
  32. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
  33. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/diff.py +0 -0
  34. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/__init__.py +0 -0
  35. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/brute.py +0 -0
  36. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/dns.py +0 -0
  37. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/engine.py +0 -0
  38. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/helpers.py +0 -0
  39. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/dns/mock.py +0 -0
  40. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/files.py +0 -0
  41. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/helper.py +0 -0
  42. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/interactsh.py +0 -0
  43. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/misc.py +0 -0
  44. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/names_generator.py +0 -0
  45. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/ntlm.py +0 -0
  46. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/process.py +0 -0
  47. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/ratelimiter.py +0 -0
  48. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/regex.py +0 -0
  49. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/regexes.py +0 -0
  50. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/url.py +0 -0
  51. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/validators.py +0 -0
  52. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/web/__init__.py +0 -0
  53. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/web/client.py +0 -0
  54. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/web/engine.py +0 -0
  55. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
  56. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/web/web.py +0 -0
  57. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/helpers/wordcloud.py +0 -0
  58. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/core/modules.py +0 -0
  59. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/defaults.yml +0 -0
  60. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/errors.py +0 -0
  61. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/logger.py +0 -0
  62. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/__init__.py +0 -0
  63. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ajaxpro.py +0 -0
  64. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/anubisdb.py +0 -0
  65. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/apkpure.py +0 -0
  66. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/azure_realm.py +0 -0
  67. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/azure_tenant.py +0 -0
  68. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/baddns.py +0 -0
  69. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/baddns_direct.py +0 -0
  70. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/baddns_zone.py +0 -0
  71. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/badsecrets.py +0 -0
  72. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/base.py +0 -0
  73. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bevigil.py +0 -0
  74. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/binaryedge.py +0 -0
  75. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_amazon.py +0 -0
  76. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_azure.py +0 -0
  77. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_digitalocean.py +0 -0
  78. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_file_enum.py +0 -0
  79. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_firebase.py +0 -0
  80. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bucket_google.py +0 -0
  81. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bufferoverrun.py +0 -0
  82. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/builtwith.py +0 -0
  83. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/bypass403.py +0 -0
  84. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/c99.py +0 -0
  85. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/censys.py +0 -0
  86. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/certspotter.py +0 -0
  87. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/chaos.py +0 -0
  88. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/code_repository.py +0 -0
  89. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/columbus.py +0 -0
  90. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/credshed.py +0 -0
  91. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/crt.py +0 -0
  92. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/deadly/dastardly.py +0 -0
  93. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/deadly/ffuf.py +0 -0
  94. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/deadly/nuclei.py +0 -0
  95. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/deadly/vhost.py +0 -0
  96. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dehashed.py +0 -0
  97. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/digitorus.py +0 -0
  98. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dnsbrute.py +0 -0
  99. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
  100. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dnscaa.py +0 -0
  101. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dnscommonsrv.py +0 -0
  102. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dnsdumpster.py +0 -0
  103. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/docker_pull.py +0 -0
  104. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dockerhub.py +0 -0
  105. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/dotnetnuke.py +0 -0
  106. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/emailformat.py +0 -0
  107. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ffuf_shortnames.py +0 -0
  108. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/filedownload.py +0 -0
  109. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/fingerprintx.py +0 -0
  110. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/fullhunt.py +0 -0
  111. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/generic_ssrf.py +0 -0
  112. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/git.py +0 -0
  113. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/git_clone.py +0 -0
  114. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/github_codesearch.py +0 -0
  115. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/github_org.py +0 -0
  116. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/github_workflows.py +0 -0
  117. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/gitlab.py +0 -0
  118. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/google_playstore.py +0 -0
  119. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/gowitness.py +0 -0
  120. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/hackertarget.py +0 -0
  121. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/host_header.py +0 -0
  122. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/httpx.py +0 -0
  123. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/hunt.py +0 -0
  124. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/hunterio.py +0 -0
  125. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/iis_shortnames.py +0 -0
  126. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/__init__.py +0 -0
  127. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/aggregate.py +0 -0
  128. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/base.py +0 -0
  129. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/cloudcheck.py +0 -0
  130. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/dnsresolve.py +0 -0
  131. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/excavate.py +0 -0
  132. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internal/speculate.py +0 -0
  133. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/internetdb.py +0 -0
  134. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ip2location.py +0 -0
  135. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ipneighbor.py +0 -0
  136. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ipstack.py +0 -0
  137. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/leakix.py +0 -0
  138. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/myssl.py +0 -0
  139. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/newsletters.py +0 -0
  140. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/ntlm.py +0 -0
  141. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/oauth.py +0 -0
  142. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/otx.py +0 -0
  143. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/__init__.py +0 -0
  144. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/asset_inventory.py +0 -0
  145. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/base.py +0 -0
  146. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/csv.py +0 -0
  147. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/discord.py +0 -0
  148. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/emails.py +0 -0
  149. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/http.py +0 -0
  150. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/json.py +0 -0
  151. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/neo4j.py +0 -0
  152. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/python.py +0 -0
  153. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/slack.py +0 -0
  154. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/splunk.py +0 -0
  155. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/stdout.py +0 -0
  156. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/subdomains.py +0 -0
  157. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/teams.py +0 -0
  158. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/txt.py +0 -0
  159. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/web_report.py +0 -0
  160. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/output/websocket.py +0 -0
  161. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/paramminer_cookies.py +0 -0
  162. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/paramminer_getparams.py +0 -0
  163. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/paramminer_headers.py +0 -0
  164. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/passivetotal.py +0 -0
  165. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/pgp.py +0 -0
  166. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/portscan.py +0 -0
  167. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/postman.py +0 -0
  168. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/postman_download.py +0 -0
  169. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/rapiddns.py +0 -0
  170. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/report/affiliates.py +0 -0
  171. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/report/asn.py +0 -0
  172. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/report/base.py +0 -0
  173. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/robots.py +0 -0
  174. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/secretsdb.py +0 -0
  175. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/securitytrails.py +0 -0
  176. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/securitytxt.py +0 -0
  177. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/shodan_dns.py +0 -0
  178. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/sitedossier.py +0 -0
  179. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/skymem.py +0 -0
  180. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/smuggler.py +0 -0
  181. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/social.py +0 -0
  182. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/sslcert.py +0 -0
  183. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/subdomaincenter.py +0 -0
  184. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/subdomainradar.py +0 -0
  185. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/telerik.py +0 -0
  186. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/bucket.py +0 -0
  187. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/github.py +0 -0
  188. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/postman.py +0 -0
  189. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/shodan.py +0 -0
  190. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
  191. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/templates/webhook.py +0 -0
  192. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/trickest.py +0 -0
  193. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/trufflehog.py +0 -0
  194. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/url_manipulation.py +0 -0
  195. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/urlscan.py +0 -0
  196. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/viewdns.py +0 -0
  197. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/virustotal.py +0 -0
  198. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/wafw00f.py +0 -0
  199. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/wappalyzer.py +0 -0
  200. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/wayback.py +0 -0
  201. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/wpscan.py +0 -0
  202. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/modules/zoomeye.py +0 -0
  203. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/baddns-thorough.yml +0 -0
  204. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/cloud-enum.yml +0 -0
  205. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/code-enum.yml +0 -0
  206. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/email-enum.yml +0 -0
  207. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/kitchen-sink.yml +0 -0
  208. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/spider.yml +0 -0
  209. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/subdomain-enum.yml +0 -0
  210. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
  211. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web/dirbust-light.yml +0 -0
  212. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
  213. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
  214. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web/paramminer.yml +0 -0
  215. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web-basic.yml +0 -0
  216. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web-screenshots.yml +0 -0
  217. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/presets/web-thorough.yml +0 -0
  218. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/__init__.py +0 -0
  219. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/dispatcher.py +0 -0
  220. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/manager.py +0 -0
  221. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/__init__.py +0 -0
  222. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/args.py +0 -0
  223. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/conditions.py +0 -0
  224. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/environ.py +0 -0
  225. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/preset/path.py +0 -0
  226. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/scanner.py +0 -0
  227. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/stats.py +0 -0
  228. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scanner/target.py +0 -0
  229. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/scripts/docs.py +0 -0
  230. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/__init__.py +0 -0
  231. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/bbot_fixtures.py +0 -0
  232. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/conftest.py +0 -0
  233. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/coverage.cfg +0 -0
  234. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/owasp_mastg.apk +0 -0
  235. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/run_tests.sh +0 -0
  236. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test.conf +0 -0
  237. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_output.ndjson +0 -0
  238. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/__init__.py +0 -0
  239. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
  240. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
  241. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_cli.py +0 -0
  242. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_command.py +0 -0
  243. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_config.py +0 -0
  244. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
  245. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_dns.py +0 -0
  246. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_docs.py +0 -0
  247. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_engine.py +0 -0
  248. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_files.py +0 -0
  249. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
  250. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
  251. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
  252. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -0
  253. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_presets.py +0 -0
  254. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
  255. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
  256. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_scan.py +0 -0
  257. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_scope.py +0 -0
  258. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_target.py +0 -0
  259. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_1/test_web.py +0 -0
  260. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/__init__.py +0 -0
  261. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
  262. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/base.py +0 -0
  263. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
  264. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
  265. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
  266. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
  267. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +0 -0
  268. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
  269. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
  270. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
  271. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
  272. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
  273. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
  274. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
  275. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
  276. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
  277. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
  278. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
  279. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
  280. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
  281. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +0 -0
  282. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
  283. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
  284. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
  285. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
  286. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
  287. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
  288. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
  289. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
  290. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
  291. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
  292. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
  293. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_columbus.py +0 -0
  294. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
  295. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
  296. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
  297. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dastardly.py +0 -0
  298. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
  299. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
  300. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
  301. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
  302. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
  303. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
  304. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
  305. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
  306. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
  307. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +0 -0
  308. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
  309. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
  310. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
  311. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
  312. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
  313. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
  314. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +0 -0
  315. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
  316. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
  317. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
  318. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
  319. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +0 -0
  320. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
  321. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
  322. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
  323. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
  324. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
  325. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
  326. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
  327. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
  328. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
  329. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
  330. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
  331. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
  332. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
  333. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_internetdb.py +0 -0
  334. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
  335. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
  336. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
  337. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
  338. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
  339. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
  340. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
  341. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
  342. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
  343. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
  344. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
  345. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
  346. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
  347. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
  348. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
  349. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
  350. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
  351. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +0 -0
  352. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
  353. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +0 -0
  354. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
  355. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
  356. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
  357. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_secretsdb.py +0 -0
  358. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
  359. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
  360. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
  361. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
  362. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
  363. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
  364. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
  365. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
  366. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
  367. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
  368. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
  369. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
  370. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
  371. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
  372. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
  373. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
  374. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
  375. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
  376. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +0 -0
  377. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
  378. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
  379. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
  380. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
  381. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
  382. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
  383. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
  384. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
  385. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
  386. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
  387. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
  388. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
  389. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
  390. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
  391. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
  392. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/testsslcert.pem +0 -0
  393. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/test/testsslkey.pem +0 -0
  394. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/devops_mutations.txt +0 -0
  395. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/ffuf_shortname_candidates.txt +0 -0
  396. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
  397. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/nameservers.txt +0 -0
  398. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
  399. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
  400. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
  401. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
  402. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
  403. {bbot-2.1.2.5158rc0 → bbot-2.1.2.5171rc0}/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.2.5158rc0
3
+ Version: 2.1.2.5171rc0
4
4
  Summary: OSINT automation for hackers.
5
5
  Home-page: https://github.com/blacklanternsecurity/bbot
6
6
  License: GPL-3.0
@@ -30,6 +30,7 @@ Requires-Dist: lxml (>=4.9.2,<6.0.0)
30
30
  Requires-Dist: mmh3 (>=4.1,<6.0)
31
31
  Requires-Dist: omegaconf (>=2.3.0,<3.0.0)
32
32
  Requires-Dist: psutil (>=5.9.4,<7.0.0)
33
+ Requires-Dist: puremagic (>=1.28,<2.0)
33
34
  Requires-Dist: pycryptodome (>=3.17,<4.0)
34
35
  Requires-Dist: pydantic (>=2.4.2,<3.0.0)
35
36
  Requires-Dist: pyjwt (>=2.7.0,<3.0.0)
@@ -1,4 +1,4 @@
1
1
  # version placeholder (replaced by poetry-dynamic-versioning)
2
- __version__ = "v2.1.2.5158rc"
2
+ __version__ = "v2.1.2.5171rc"
3
3
 
4
4
  from .scanner import Scanner, Preset
@@ -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)
@@ -1018,20 +1019,21 @@ class ClosestHostEvent(DictHostEvent):
1018
1019
  class DictPathEvent(DictEvent):
1019
1020
  def sanitize_data(self, data):
1020
1021
  new_data = dict(data)
1022
+ new_data["path"] = str(new_data["path"])
1021
1023
  file_blobs = getattr(self.scan, "_file_blobs", False)
1022
1024
  folder_blobs = getattr(self.scan, "_folder_blobs", False)
1023
1025
  blob = None
1024
1026
  try:
1025
- data_path = Path(data["path"])
1026
- if data_path.is_file():
1027
+ self._data_path = Path(data["path"])
1028
+ if self._data_path.is_file():
1027
1029
  self.add_tag("file")
1028
1030
  if file_blobs:
1029
- with open(data_path, "rb") as file:
1031
+ with open(self._data_path, "rb") as file:
1030
1032
  blob = file.read()
1031
- elif data_path.is_dir():
1033
+ elif self._data_path.is_dir():
1032
1034
  self.add_tag("folder")
1033
1035
  if folder_blobs:
1034
- blob = self._tar_directory(data_path)
1036
+ blob = self._tar_directory(self._data_path)
1035
1037
  except KeyError:
1036
1038
  pass
1037
1039
  if blob:
@@ -1540,7 +1542,23 @@ class WAF(DictHostEvent):
1540
1542
 
1541
1543
 
1542
1544
  class FILESYSTEM(DictPathEvent):
1543
- pass
1545
+ def __init__(self, *args, **kwargs):
1546
+ super().__init__(*args, **kwargs)
1547
+ if self._data_path.is_file():
1548
+ # detect type of file content using magic
1549
+ from bbot.core.helpers.libmagic import get_magic_info, get_compression
1550
+
1551
+ extension, mime_type, description, confidence = get_magic_info(self.data["path"])
1552
+ self.data["magic_extension"] = extension
1553
+ self.data["magic_mime_type"] = mime_type
1554
+ self.data["magic_description"] = description
1555
+ self.data["magic_confidence"] = confidence
1556
+ # detection compression
1557
+ compression = get_compression(mime_type)
1558
+ if compression:
1559
+ self.add_tag("compressed")
1560
+ self.add_tag(f"{compression}-archive")
1561
+ self.data["compression"] = compression
1544
1562
 
1545
1563
 
1546
1564
  class RAW_DNS_RECORD(DictHostEvent, DnsEvent):
@@ -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, "")
@@ -81,7 +81,7 @@ DEP_CHROMIUM = [
81
81
  {
82
82
  "name": "Install Chromium dependencies (Debian)",
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": "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",
85
85
  "state": "present",
86
86
  },
87
87
  "become": True,
@@ -1,9 +1,9 @@
1
- import os
1
+ from extractous import Extractor
2
2
 
3
3
  from bbot.modules.base import BaseModule
4
4
 
5
5
 
6
- class unstructured(BaseModule):
6
+ class extractous(BaseModule):
7
7
  watched_events = ["FILESYSTEM"]
8
8
  produced_events = ["RAW_TEXT"]
9
9
  flags = ["passive", "safe"]
@@ -63,15 +63,11 @@ class unstructured(BaseModule):
63
63
  "extensions": "File extensions to parse",
64
64
  }
65
65
 
66
- deps_apt = ["libmagic-dev", "poppler-utils", "tesseract-ocr", "libreoffice", "pandoc"]
67
- deps_pip = ["unstructured[all-docs]>=0.15.7,<1.0", "nltk>=3.9.0,<4.0"]
68
-
66
+ deps_pip = ["extractous"]
69
67
  scope_distance_modifier = 1
70
68
 
71
69
  async def setup(self):
72
70
  self.extensions = list(set([e.lower().strip(".") for e in self.config.get("extensions", [])]))
73
- # Do not send user statistics to the unstructured library
74
- os.environ["SCARF_NO_ANALYTICS"] = "true"
75
71
  return True
76
72
 
77
73
  async def filter_event(self, event):
@@ -94,22 +90,16 @@ class unstructured(BaseModule):
94
90
  )
95
91
  await self.emit_event(raw_text_event)
96
92
 
97
- async def finish(self):
98
- del os.environ["SCARF_NO_ANALYTICS"]
99
- return
100
-
101
93
 
102
94
  def extract_text(file_path):
103
95
  """
104
- extract_text Extracts plaintext from a document path using unstructured.
96
+ extract_text Extracts plaintext from a document path using extractous.
105
97
 
106
98
  :param file_path: The path of the file to extract text from.
107
99
  :return: ASCII-encoded plaintext extracted from the document.
108
100
  """
109
101
 
110
- from unstructured.partition.auto import partition
111
-
112
- unstructured_file_types = [
102
+ extractable_file_types = [
113
103
  ".csv",
114
104
  ".eml",
115
105
  ".msg",
@@ -135,12 +125,21 @@ def extract_text(file_path):
135
125
  ".xml",
136
126
  ]
137
127
 
138
- # If the file can be extracted with unstructured use its partition function or try and read it
139
- if any(file_path.lower().endswith(file_type) for file_type in unstructured_file_types):
128
+ # If the file can be extracted with extractous use its partition function or try and read it
129
+ if any(file_path.lower().endswith(file_type) for file_type in extractable_file_types):
140
130
  try:
141
- elements = partition(filename=file_path)
142
- return "\n\n".join(element.text for element in elements)
143
- except ValueError:
131
+ extractor = Extractor()
132
+ reader = extractor.extract_file(str(file_path))
133
+
134
+ result = ""
135
+ buffer = reader.read(4096)
136
+ while len(buffer) > 0:
137
+ result += buffer.decode("utf-8")
138
+ buffer = reader.read(4096)
139
+
140
+ return result.strip()
141
+
142
+ except Exception:
144
143
  with open(file_path, "rb") as file:
145
144
  return file.read().decode("utf-8", errors="ignore")
146
145
  else:
@@ -376,6 +376,9 @@ class Preset:
376
376
  # misc
377
377
  self.force_start = self.force_start | other.force_start
378
378
  self._cli = self._cli | other._cli
379
+ # transfer args
380
+ if other._args is not None:
381
+ self._args = other._args
379
382
 
380
383
  def bake(self, scan=None):
381
384
  """
@@ -925,3 +925,44 @@ def test_event_closest_host():
925
925
  vuln = scan.make_event(
926
926
  {"path": "/tmp/asdf.txt", "description": "test", "severity": "HIGH"}, "VULNERABILITY", parent=event3
927
927
  )
928
+
929
+
930
+ def test_event_magic():
931
+ from bbot.core.helpers.libmagic import get_magic_info, get_compression
932
+
933
+ import base64
934
+
935
+ zip_base64 = "UEsDBAoDAAAAAOMmZ1lR4FaHBQAAAAUAAAAIAAAAYXNkZi50eHRhc2RmClBLAQI/AwoDAAAAAOMmZ1lR4FaHBQAAAAUAAAAIACQAAAAAAAAAIICkgQAAAABhc2RmLnR4dAoAIAAAAAAAAQAYAICi2B77MNsBgKLYHvsw2wGAotge+zDbAVBLBQYAAAAAAQABAFoAAAArAAAAAAA="
936
+ zip_bytes = base64.b64decode(zip_base64)
937
+ zip_file = Path("/tmp/.bbottestzipasdkfjalsdf.zip")
938
+ with open(zip_file, "wb") as f:
939
+ f.write(zip_bytes)
940
+
941
+ # test magic helpers
942
+ extension, mime_type, description, confidence = get_magic_info(zip_file)
943
+ assert extension == ".zip"
944
+ assert mime_type == "application/zip"
945
+ assert description == "PKZIP Archive file"
946
+ assert confidence > 0
947
+ assert get_compression(mime_type) == "zip"
948
+
949
+ # test filesystem event - file
950
+ scan = Scanner()
951
+ event = scan.make_event({"path": zip_file}, "FILESYSTEM", parent=scan.root_event)
952
+ assert event.data == {
953
+ "path": "/tmp/.bbottestzipasdkfjalsdf.zip",
954
+ "magic_extension": ".zip",
955
+ "magic_mime_type": "application/zip",
956
+ "magic_description": "PKZIP Archive file",
957
+ "magic_confidence": 0.9,
958
+ "compression": "zip",
959
+ }
960
+ assert event.tags == {"file", "zip-archive", "compressed"}
961
+
962
+ # test filesystem event - folder
963
+ scan = Scanner()
964
+ event = scan.make_event({"path": "/tmp"}, "FILESYSTEM", parent=scan.root_event)
965
+ assert event.data == {"path": "/tmp"}
966
+ assert event.tags == {"folder"}
967
+
968
+ zip_file.unlink()
@@ -894,7 +894,7 @@ class TestExcavateHeaders(ModuleTestBase):
894
894
 
895
895
  class TestExcavateRAWTEXT(ModuleTestBase):
896
896
  targets = ["http://127.0.0.1:8888/", "test.notreal"]
897
- modules_overrides = ["excavate", "httpx", "filedownload", "unstructured"]
897
+ modules_overrides = ["excavate", "httpx", "filedownload", "extractous"]
898
898
  config_overrides = {"scope": {"report_distance": 1}, "web": {"spider_distance": 2, "spider_depth": 2}}
899
899
 
900
900
  pdf_data = r"""%PDF-1.3
@@ -965,7 +965,7 @@ trailer
965
965
  startxref
966
966
  1669
967
967
  %%EOF"""
968
- unstructured_response = """This is an email example@blacklanternsecurity.notreal
968
+ extractous_response = """This is an email example@blacklanternsecurity.notreal
969
969
 
970
970
  An example JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
971
971
 
@@ -995,13 +995,13 @@ A href <a href='/donot_detect.js'>Click me</a>"""
995
995
  raw_text_events = [e for e in events if e.type == "RAW_TEXT"]
996
996
  assert 1 == len(raw_text_events), "Failed to emit RAW_TEXT event"
997
997
  assert (
998
- raw_text_events[0].data == self.unstructured_response
998
+ raw_text_events[0].data == self.extractous_response
999
999
  ), f"Text extracted from PDF is incorrect, got {raw_text_events[0].data}"
1000
1000
  email_events = [e for e in events if e.type == "EMAIL_ADDRESS"]
1001
1001
  assert 1 == len(email_events), "Failed to emit EMAIL_ADDRESS event"
1002
1002
  assert (
1003
1003
  email_events[0].data == "example@blacklanternsecurity.notreal"
1004
- ), f"Email extracted from unstructured text is incorrect, got {email_events[0].data}"
1004
+ ), f"Email extracted from extractous text is incorrect, got {email_events[0].data}"
1005
1005
  finding_events = [e for e in events if e.type == "FINDING"]
1006
1006
  assert 2 == len(finding_events), "Failed to emit FINDING events"
1007
1007
  assert any(
@@ -1026,7 +1026,7 @@ A href <a href='/donot_detect.js'>Click me</a>"""
1026
1026
  url_events = [e.data for e in events if e.type == "URL_UNVERIFIED"]
1027
1027
  assert (
1028
1028
  "https://www.test.notreal/about" in url_events
1029
- ), f"URL extracted from unstructured text is incorrect, got {url_events}"
1029
+ ), f"URL extracted from extractous text is incorrect, got {url_events}"
1030
1030
  assert (
1031
1031
  "/donot_detect.js" not in url_events
1032
- ), f"URL extracted from unstructured text is incorrect, got {url_events}"
1032
+ ), f"URL extracted from extractous text is incorrect, got {url_events}"
@@ -0,0 +1,54 @@
1
+ import base64
2
+ from pathlib import Path
3
+ from .base import ModuleTestBase
4
+
5
+
6
+ class TestExtractous(ModuleTestBase):
7
+ targets = ["http://127.0.0.1:8888"]
8
+ modules_overrides = ["extractous", "filedownload", "httpx", "excavate", "speculate"]
9
+ config_overrides = {"web": {"spider_distance": 2, "spider_depth": 2}}
10
+
11
+ pdf_data = base64.b64decode(
12
+ "JVBERi0xLjMKJe+/ve+/ve+/ve+/vSBSZXBvcnRMYWIgR2VuZXJhdGVkIFBERiBkb2N1bWVudCBodHRwOi8vd3d3LnJlcG9ydGxhYi5jb20KMSAwIG9iago8PAovRjEgMiAwIFIKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL0Jhc2VGb250IC9IZWx2ZXRpY2EgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcgL05hbWUgL0YxIC9TdWJ0eXBlIC9UeXBlMSAvVHlwZSAvRm9udAo+PgplbmRvYmoKMyAwIG9iago8PAovQ29udGVudHMgNyAwIFIgL01lZGlhQm94IFsgMCAwIDU5NS4yNzU2IDg0MS44ODk4IF0gL1BhcmVudCA2IDAgUiAvUmVzb3VyY2VzIDw8Ci9Gb250IDEgMCBSIC9Qcm9jU2V0IFsgL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdCj4+IC9Sb3RhdGUgMCAvVHJhbnMgPDwKCj4+IAogIC9UeXBlIC9QYWdlCj4+CmVuZG9iago0IDAgb2JqCjw8Ci9QYWdlTW9kZSAvVXNlTm9uZSAvUGFnZXMgNiAwIFIgL1R5cGUgL0NhdGFsb2cKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0F1dGhvciAoYW5vbnltb3VzKSAvQ3JlYXRpb25EYXRlIChEOjIwMjQwNjAzMTg1ODE2KzAwJzAwJykgL0NyZWF0b3IgKFJlcG9ydExhYiBQREYgTGlicmFyeSAtIHd3dy5yZXBvcnRsYWIuY29tKSAvS2V5d29yZHMgKCkgL01vZERhdGUgKEQ6MjAyNDA2MDMxODU4MTYrMDAnMDAnKSAvUHJvZHVjZXIgKFJlcG9ydExhYiBQREYgTGlicmFyeSAtIHd3dy5yZXBvcnRsYWIuY29tKSAKICAvU3ViamVjdCAodW5zcGVjaWZpZWQpIC9UaXRsZSAodW50aXRsZWQpIC9UcmFwcGVkIC9GYWxzZQo+PgplbmRvYmoKNiAwIG9iago8PAovQ291bnQgMSAvS2lkcyBbIDMgMCBSIF0gL1R5cGUgL1BhZ2VzCj4+CmVuZG9iago3IDAgb2JqCjw8Ci9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZSAvRmxhdGVEZWNvZGUgXSAvTGVuZ3RoIDEwNwo+PgpzdHJlYW0KR2FwUWgwRT1GLDBVXEgzVFxwTllUXlFLaz90Yz5JUCw7VyNVMV4yM2loUEVNXz9DVzRLSVNpOTBNakdeMixGUyM8UkM1K2MsbilaOyRiSyRiIjVJWzwhXlREI2dpXSY9NVgsWzVAWUBWfj5lbmRzdHJlYW0KZW5kb2JqCnhyZWYKMCA4CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDA3MyAwMDAwMCBuIAowMDAwMDAwMTA0IDAwMDAwIG4gCjAwMDAwMDAyMTEgMDAwMDAgbiAKMDAwMDAwMDQxNCAwMDAwMCBuIAowMDAwMDAwNDgyIDAwMDAwIG4gCjAwMDAwMDA3NzggMDAwMDAgbiAKMDAwMDAwMDgzNyAwMDAwMCBuIAp0cmFpbGVyCjw8Ci9JRCAKWzw4MGQ5ZjViOTY0ZmM5OTI4NDUwMWRlYjdhNmE2MzdmNz48ODBkOWY1Yjk2NGZjOTkyODQ1MDFkZWI3YTZhNjM3Zjc+XQolIFJlcG9ydExhYiBnZW5lcmF0ZWQgUERGIGRvY3VtZW50IC0tIGRpZ2VzdCAoaHR0cDovL3d3dy5yZXBvcnRsYWIuY29tKQoKL0luZm8gNSAwIFIKL1Jvb3QgNCAwIFIKL1NpemUgOAo+PgpzdGFydHhyZWYKMTAzNAolJUVPRg=="
13
+ )
14
+
15
+ docx_data = base64.b64decode(
16
+ "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"
17
+ )
18
+
19
+ expected_result_pdf = "Hello, World!"
20
+ expected_result_docx = "Hello, World!!"
21
+
22
+ async def setup_after_prep(self, module_test):
23
+ module_test.set_expect_requests(
24
+ dict(uri="/"),
25
+ dict(response_data='<a href="/Test_PDF"/><a href="/Test_DOCX"/>'),
26
+ )
27
+ module_test.set_expect_requests(
28
+ dict(uri="/Test_PDF"),
29
+ dict(response_data=self.pdf_data, headers={"Content-Type": "application/pdf"}),
30
+ )
31
+ module_test.set_expect_requests(
32
+ dict(uri="/Test_DOCX"),
33
+ dict(
34
+ response_data=self.docx_data,
35
+ headers={"Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
36
+ ),
37
+ )
38
+
39
+ def check(self, module_test, events):
40
+ filesystem_events = [e for e in events if e.type == "FILESYSTEM"]
41
+ assert 2 == len(filesystem_events), filesystem_events
42
+ for filesystem_event in filesystem_events:
43
+ file = Path(filesystem_event.data["path"])
44
+ assert file.is_file(), "Destination file doesn't exist"
45
+ assert (
46
+ open(file, "rb").read() == self.pdf_data or open(file, "rb").read() == self.docx_data
47
+ ), f"File at {file} does not contain the correct content"
48
+ raw_text_events = [e for e in events if e.type == "RAW_TEXT"]
49
+ assert 2 == len(raw_text_events), "Failed to emit RAW_TEXT event"
50
+ for raw_text_event in raw_text_events:
51
+ assert raw_text_event.data in [
52
+ self.expected_result_pdf,
53
+ self.expected_result_docx,
54
+ ], f"Text extracted from {raw_text_event.data['path']} is incorrect, got {raw_text_event.data}"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "bbot"
3
- version = "v2.1.2.5158rc"
3
+ version = "v2.1.2.5171rc"
4
4
  description = "OSINT automation for hackers."
5
5
  authors = [
6
6
  "TheTechromancer",
@@ -55,6 +55,7 @@ setproctitle = "^1.3.3"
55
55
  yara-python = "^4.5.1"
56
56
  pyzmq = "^26.0.3"
57
57
  httpx = "^0.27.0"
58
+ puremagic = "^1.28"
58
59
 
59
60
  [tool.poetry.group.dev.dependencies]
60
61
  flake8 = ">=6,<8"
@@ -1,102 +0,0 @@
1
- from pathlib import Path
2
- from .base import ModuleTestBase
3
-
4
-
5
- class TestUnstructured(ModuleTestBase):
6
- targets = ["http://127.0.0.1:8888"]
7
- modules_overrides = ["unstructured", "filedownload", "httpx", "excavate", "speculate"]
8
- config_overrides = {"web": {"spider_distance": 2, "spider_depth": 2}}
9
-
10
- pdf_data = r"""%PDF-1.3
11
- %���� ReportLab Generated PDF document http://www.reportlab.com
12
- 1 0 obj
13
- <<
14
- /F1 2 0 R
15
- >>
16
- endobj
17
- 2 0 obj
18
- <<
19
- /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
20
- >>
21
- endobj
22
- 3 0 obj
23
- <<
24
- /Contents 7 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 6 0 R /Resources <<
25
- /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
26
- >> /Rotate 0 /Trans <<
27
-
28
- >>
29
- /Type /Page
30
- >>
31
- endobj
32
- 4 0 obj
33
- <<
34
- /PageMode /UseNone /Pages 6 0 R /Type /Catalog
35
- >>
36
- endobj
37
- 5 0 obj
38
- <<
39
- /Author (anonymous) /CreationDate (D:20240603185816+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240603185816+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
40
- /Subject (unspecified) /Title (untitled) /Trapped /False
41
- >>
42
- endobj
43
- 6 0 obj
44
- <<
45
- /Count 1 /Kids [ 3 0 R ] /Type /Pages
46
- >>
47
- endobj
48
- 7 0 obj
49
- <<
50
- /Filter [ /ASCII85Decode /FlateDecode ] /Length 107
51
- >>
52
- stream
53
- GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_?CW4KISi90MjG^2,FS#<RC5+c,n)Z;$bK$b"5I[<!^TD#gi]&=5X,[5@Y@V~>endstream
54
- endobj
55
- xref
56
- 0 8
57
- 0000000000 65535 f
58
- 0000000073 00000 n
59
- 0000000104 00000 n
60
- 0000000211 00000 n
61
- 0000000414 00000 n
62
- 0000000482 00000 n
63
- 0000000778 00000 n
64
- 0000000837 00000 n
65
- trailer
66
- <<
67
- /ID
68
- [<80d9f5b964fc99284501deb7a6a637f7><80d9f5b964fc99284501deb7a6a637f7>]
69
- % ReportLab generated PDF document -- digest (http://www.reportlab.com)
70
-
71
- /Info 5 0 R
72
- /Root 4 0 R
73
- /Size 8
74
- >>
75
- startxref
76
- 1034
77
- %%EOF"""
78
-
79
- unstructured_response = "Hello, World!"
80
-
81
- async def setup_after_prep(self, module_test):
82
- module_test.set_expect_requests(
83
- dict(uri="/"),
84
- dict(response_data='<a href="/Test_PDF"/>'),
85
- )
86
- module_test.set_expect_requests(
87
- dict(uri="/Test_PDF"),
88
- dict(response_data=self.pdf_data, headers={"Content-Type": "application/pdf"}),
89
- )
90
-
91
- def check(self, module_test, events):
92
- filesystem_events = [e for e in events if e.type == "FILESYSTEM"]
93
- assert 1 == len(filesystem_events), filesystem_events
94
- filesystem_event = filesystem_events[0]
95
- file = Path(filesystem_event.data["path"])
96
- assert file.is_file(), "Destination file doesn't exist"
97
- assert open(file).read() == self.pdf_data, f"File at {file} does not contain the correct content"
98
- raw_text_events = [e for e in events if e.type == "RAW_TEXT"]
99
- assert 1 == len(raw_text_events), "Failed to emit RAW_TEXT event"
100
- assert (
101
- raw_text_events[0].data == self.unstructured_response
102
- ), f"Text extracted from PDF is incorrect, got {raw_text_events[0].data}"
File without changes
File without changes
File without changes