bbot 2.0.1.4720rc0__py3-none-any.whl → 2.3.0.5397rc0__py3-none-any.whl

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 (267) hide show
  1. bbot/__init__.py +1 -1
  2. bbot/cli.py +3 -7
  3. bbot/core/config/files.py +0 -1
  4. bbot/core/config/logger.py +34 -4
  5. bbot/core/core.py +21 -4
  6. bbot/core/engine.py +9 -8
  7. bbot/core/event/base.py +131 -52
  8. bbot/core/helpers/bloom.py +10 -3
  9. bbot/core/helpers/command.py +8 -7
  10. bbot/core/helpers/depsinstaller/installer.py +31 -13
  11. bbot/core/helpers/diff.py +10 -10
  12. bbot/core/helpers/dns/brute.py +7 -4
  13. bbot/core/helpers/dns/dns.py +1 -2
  14. bbot/core/helpers/dns/engine.py +4 -6
  15. bbot/core/helpers/dns/helpers.py +2 -2
  16. bbot/core/helpers/dns/mock.py +0 -1
  17. bbot/core/helpers/files.py +1 -1
  18. bbot/core/helpers/helper.py +7 -4
  19. bbot/core/helpers/interactsh.py +3 -3
  20. bbot/core/helpers/libmagic.py +65 -0
  21. bbot/core/helpers/misc.py +65 -22
  22. bbot/core/helpers/names_generator.py +17 -3
  23. bbot/core/helpers/process.py +0 -20
  24. bbot/core/helpers/regex.py +1 -1
  25. bbot/core/helpers/regexes.py +12 -6
  26. bbot/core/helpers/validators.py +1 -2
  27. bbot/core/helpers/web/client.py +1 -1
  28. bbot/core/helpers/web/engine.py +1 -2
  29. bbot/core/helpers/web/web.py +4 -114
  30. bbot/core/helpers/wordcloud.py +5 -5
  31. bbot/core/modules.py +36 -27
  32. bbot/core/multiprocess.py +58 -0
  33. bbot/core/shared_deps.py +46 -3
  34. bbot/db/sql/models.py +147 -0
  35. bbot/defaults.yml +11 -9
  36. bbot/modules/anubisdb.py +2 -2
  37. bbot/modules/apkpure.py +63 -0
  38. bbot/modules/azure_tenant.py +2 -2
  39. bbot/modules/baddns.py +35 -19
  40. bbot/modules/baddns_direct.py +92 -0
  41. bbot/modules/baddns_zone.py +3 -8
  42. bbot/modules/badsecrets.py +4 -3
  43. bbot/modules/base.py +195 -51
  44. bbot/modules/bevigil.py +7 -7
  45. bbot/modules/binaryedge.py +7 -4
  46. bbot/modules/bufferoverrun.py +47 -0
  47. bbot/modules/builtwith.py +6 -10
  48. bbot/modules/bypass403.py +5 -5
  49. bbot/modules/c99.py +10 -7
  50. bbot/modules/censys.py +9 -13
  51. bbot/modules/certspotter.py +5 -3
  52. bbot/modules/chaos.py +9 -7
  53. bbot/modules/code_repository.py +1 -0
  54. bbot/modules/columbus.py +3 -3
  55. bbot/modules/crt.py +5 -3
  56. bbot/modules/deadly/dastardly.py +1 -1
  57. bbot/modules/deadly/ffuf.py +9 -9
  58. bbot/modules/deadly/nuclei.py +3 -3
  59. bbot/modules/deadly/vhost.py +4 -3
  60. bbot/modules/dehashed.py +1 -1
  61. bbot/modules/digitorus.py +1 -1
  62. bbot/modules/dnsbimi.py +145 -0
  63. bbot/modules/dnscaa.py +3 -3
  64. bbot/modules/dnsdumpster.py +4 -4
  65. bbot/modules/dnstlsrpt.py +144 -0
  66. bbot/modules/docker_pull.py +7 -5
  67. bbot/modules/dockerhub.py +2 -2
  68. bbot/modules/dotnetnuke.py +18 -19
  69. bbot/modules/emailformat.py +1 -1
  70. bbot/modules/extractous.py +122 -0
  71. bbot/modules/filedownload.py +9 -7
  72. bbot/modules/fullhunt.py +7 -4
  73. bbot/modules/generic_ssrf.py +5 -5
  74. bbot/modules/github_codesearch.py +3 -2
  75. bbot/modules/github_org.py +4 -4
  76. bbot/modules/github_workflows.py +4 -4
  77. bbot/modules/gitlab.py +2 -5
  78. bbot/modules/google_playstore.py +93 -0
  79. bbot/modules/gowitness.py +48 -50
  80. bbot/modules/hackertarget.py +5 -3
  81. bbot/modules/host_header.py +5 -5
  82. bbot/modules/httpx.py +1 -4
  83. bbot/modules/hunterio.py +3 -9
  84. bbot/modules/iis_shortnames.py +19 -30
  85. bbot/modules/internal/cloudcheck.py +27 -12
  86. bbot/modules/internal/dnsresolve.py +22 -20
  87. bbot/modules/internal/excavate.py +85 -48
  88. bbot/modules/internal/speculate.py +41 -32
  89. bbot/modules/internetdb.py +4 -2
  90. bbot/modules/ip2location.py +3 -5
  91. bbot/modules/ipneighbor.py +1 -1
  92. bbot/modules/ipstack.py +3 -8
  93. bbot/modules/jadx.py +87 -0
  94. bbot/modules/leakix.py +11 -10
  95. bbot/modules/myssl.py +2 -2
  96. bbot/modules/newsletters.py +2 -2
  97. bbot/modules/otx.py +5 -3
  98. bbot/modules/output/asset_inventory.py +7 -7
  99. bbot/modules/output/base.py +1 -1
  100. bbot/modules/output/csv.py +1 -1
  101. bbot/modules/output/http.py +20 -14
  102. bbot/modules/output/mysql.py +51 -0
  103. bbot/modules/output/neo4j.py +7 -2
  104. bbot/modules/output/postgres.py +49 -0
  105. bbot/modules/output/slack.py +0 -1
  106. bbot/modules/output/sqlite.py +29 -0
  107. bbot/modules/output/stdout.py +2 -2
  108. bbot/modules/output/teams.py +107 -6
  109. bbot/modules/paramminer_headers.py +5 -8
  110. bbot/modules/passivetotal.py +13 -13
  111. bbot/modules/portscan.py +32 -6
  112. bbot/modules/postman.py +50 -126
  113. bbot/modules/postman_download.py +220 -0
  114. bbot/modules/rapiddns.py +3 -8
  115. bbot/modules/report/asn.py +11 -11
  116. bbot/modules/robots.py +3 -3
  117. bbot/modules/securitytrails.py +7 -10
  118. bbot/modules/securitytxt.py +1 -1
  119. bbot/modules/shodan_dns.py +7 -9
  120. bbot/modules/sitedossier.py +1 -1
  121. bbot/modules/skymem.py +2 -2
  122. bbot/modules/social.py +2 -1
  123. bbot/modules/subdomaincenter.py +1 -1
  124. bbot/modules/subdomainradar.py +160 -0
  125. bbot/modules/telerik.py +8 -8
  126. bbot/modules/templates/bucket.py +1 -1
  127. bbot/modules/templates/github.py +22 -14
  128. bbot/modules/templates/postman.py +21 -0
  129. bbot/modules/templates/shodan.py +14 -13
  130. bbot/modules/templates/sql.py +95 -0
  131. bbot/modules/templates/subdomain_enum.py +51 -16
  132. bbot/modules/templates/webhook.py +2 -4
  133. bbot/modules/trickest.py +8 -37
  134. bbot/modules/trufflehog.py +10 -12
  135. bbot/modules/url_manipulation.py +3 -3
  136. bbot/modules/urlscan.py +1 -1
  137. bbot/modules/viewdns.py +1 -1
  138. bbot/modules/virustotal.py +8 -30
  139. bbot/modules/wafw00f.py +1 -1
  140. bbot/modules/wayback.py +1 -1
  141. bbot/modules/wpscan.py +17 -11
  142. bbot/modules/zoomeye.py +11 -6
  143. bbot/presets/baddns-thorough.yml +12 -0
  144. bbot/presets/fast.yml +16 -0
  145. bbot/presets/kitchen-sink.yml +1 -0
  146. bbot/presets/spider.yml +4 -0
  147. bbot/presets/subdomain-enum.yml +7 -7
  148. bbot/scanner/manager.py +5 -16
  149. bbot/scanner/preset/args.py +44 -26
  150. bbot/scanner/preset/environ.py +7 -2
  151. bbot/scanner/preset/path.py +7 -4
  152. bbot/scanner/preset/preset.py +36 -23
  153. bbot/scanner/scanner.py +172 -62
  154. bbot/scanner/target.py +236 -434
  155. bbot/scripts/docs.py +1 -1
  156. bbot/test/bbot_fixtures.py +13 -3
  157. bbot/test/conftest.py +132 -100
  158. bbot/test/fastapi_test.py +17 -0
  159. bbot/test/owasp_mastg.apk +0 -0
  160. bbot/test/run_tests.sh +4 -4
  161. bbot/test/test.conf +2 -0
  162. bbot/test/test_step_1/test_bbot_fastapi.py +82 -0
  163. bbot/test/test_step_1/test_bloom_filter.py +2 -0
  164. bbot/test/test_step_1/test_cli.py +138 -64
  165. bbot/test/test_step_1/test_dns.py +62 -25
  166. bbot/test/test_step_1/test_engine.py +17 -17
  167. bbot/test/test_step_1/test_events.py +183 -28
  168. bbot/test/test_step_1/test_helpers.py +64 -28
  169. bbot/test/test_step_1/test_manager_deduplication.py +1 -1
  170. bbot/test/test_step_1/test_manager_scope_accuracy.py +333 -330
  171. bbot/test/test_step_1/test_modules_basic.py +68 -70
  172. bbot/test/test_step_1/test_presets.py +184 -96
  173. bbot/test/test_step_1/test_python_api.py +7 -2
  174. bbot/test/test_step_1/test_regexes.py +35 -5
  175. bbot/test/test_step_1/test_scan.py +39 -5
  176. bbot/test/test_step_1/test_scope.py +4 -3
  177. bbot/test/test_step_1/test_target.py +243 -145
  178. bbot/test/test_step_1/test_web.py +14 -8
  179. bbot/test/test_step_2/module_tests/base.py +15 -7
  180. bbot/test/test_step_2/module_tests/test_module_anubisdb.py +1 -1
  181. bbot/test/test_step_2/module_tests/test_module_apkpure.py +71 -0
  182. bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -1
  183. bbot/test/test_step_2/module_tests/test_module_azure_realm.py +1 -1
  184. bbot/test/test_step_2/module_tests/test_module_baddns.py +6 -6
  185. bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +62 -0
  186. bbot/test/test_step_2/module_tests/test_module_bevigil.py +29 -2
  187. bbot/test/test_step_2/module_tests/test_module_binaryedge.py +4 -2
  188. bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +2 -2
  189. bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +1 -1
  190. bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +35 -0
  191. bbot/test/test_step_2/module_tests/test_module_builtwith.py +2 -2
  192. bbot/test/test_step_2/module_tests/test_module_bypass403.py +1 -1
  193. bbot/test/test_step_2/module_tests/test_module_c99.py +126 -0
  194. bbot/test/test_step_2/module_tests/test_module_censys.py +4 -1
  195. bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +4 -0
  196. bbot/test/test_step_2/module_tests/test_module_code_repository.py +11 -1
  197. bbot/test/test_step_2/module_tests/test_module_columbus.py +1 -1
  198. bbot/test/test_step_2/module_tests/test_module_credshed.py +3 -3
  199. bbot/test/test_step_2/module_tests/test_module_dastardly.py +2 -1
  200. bbot/test/test_step_2/module_tests/test_module_dehashed.py +2 -2
  201. bbot/test/test_step_2/module_tests/test_module_digitorus.py +1 -1
  202. bbot/test/test_step_2/module_tests/test_module_discord.py +1 -1
  203. bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +103 -0
  204. bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +9 -10
  205. bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +1 -2
  206. bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +1 -2
  207. bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +4 -4
  208. bbot/test/test_step_2/module_tests/test_module_dnstlsrpt.py +64 -0
  209. bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -8
  210. bbot/test/test_step_2/module_tests/test_module_excavate.py +17 -37
  211. bbot/test/test_step_2/module_tests/test_module_extractous.py +54 -0
  212. bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +1 -1
  213. bbot/test/test_step_2/module_tests/test_module_filedownload.py +14 -14
  214. bbot/test/test_step_2/module_tests/test_module_git_clone.py +2 -2
  215. bbot/test/test_step_2/module_tests/test_module_github_org.py +19 -8
  216. bbot/test/test_step_2/module_tests/test_module_github_workflows.py +1 -1
  217. bbot/test/test_step_2/module_tests/test_module_gitlab.py +9 -4
  218. bbot/test/test_step_2/module_tests/test_module_google_playstore.py +83 -0
  219. bbot/test/test_step_2/module_tests/test_module_gowitness.py +4 -4
  220. bbot/test/test_step_2/module_tests/test_module_host_header.py +1 -1
  221. bbot/test/test_step_2/module_tests/test_module_http.py +4 -4
  222. bbot/test/test_step_2/module_tests/test_module_httpx.py +10 -8
  223. bbot/test/test_step_2/module_tests/test_module_hunterio.py +68 -4
  224. bbot/test/test_step_2/module_tests/test_module_jadx.py +55 -0
  225. bbot/test/test_step_2/module_tests/test_module_json.py +22 -9
  226. bbot/test/test_step_2/module_tests/test_module_leakix.py +7 -3
  227. bbot/test/test_step_2/module_tests/test_module_mysql.py +76 -0
  228. bbot/test/test_step_2/module_tests/test_module_myssl.py +1 -1
  229. bbot/test/test_step_2/module_tests/test_module_neo4j.py +1 -1
  230. bbot/test/test_step_2/module_tests/test_module_newsletters.py +6 -6
  231. bbot/test/test_step_2/module_tests/test_module_ntlm.py +7 -7
  232. bbot/test/test_step_2/module_tests/test_module_oauth.py +1 -1
  233. bbot/test/test_step_2/module_tests/test_module_otx.py +1 -1
  234. bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +1 -2
  235. bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -6
  236. bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +2 -9
  237. bbot/test/test_step_2/module_tests/test_module_passivetotal.py +3 -1
  238. bbot/test/test_step_2/module_tests/test_module_portscan.py +9 -8
  239. bbot/test/test_step_2/module_tests/test_module_postgres.py +74 -0
  240. bbot/test/test_step_2/module_tests/test_module_postman.py +84 -253
  241. bbot/test/test_step_2/module_tests/test_module_postman_download.py +439 -0
  242. bbot/test/test_step_2/module_tests/test_module_rapiddns.py +93 -1
  243. bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +20 -1
  244. bbot/test/test_step_2/module_tests/test_module_sitedossier.py +2 -2
  245. bbot/test/test_step_2/module_tests/test_module_smuggler.py +1 -1
  246. bbot/test/test_step_2/module_tests/test_module_social.py +11 -1
  247. bbot/test/test_step_2/module_tests/test_module_speculate.py +2 -6
  248. bbot/test/test_step_2/module_tests/test_module_splunk.py +4 -4
  249. bbot/test/test_step_2/module_tests/test_module_sqlite.py +18 -0
  250. bbot/test/test_step_2/module_tests/test_module_sslcert.py +1 -1
  251. bbot/test/test_step_2/module_tests/test_module_stdout.py +5 -3
  252. bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +1 -1
  253. bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +208 -0
  254. bbot/test/test_step_2/module_tests/test_module_subdomains.py +1 -1
  255. bbot/test/test_step_2/module_tests/test_module_teams.py +8 -6
  256. bbot/test/test_step_2/module_tests/test_module_telerik.py +1 -1
  257. bbot/test/test_step_2/module_tests/test_module_trufflehog.py +317 -14
  258. bbot/test/test_step_2/module_tests/test_module_wayback.py +1 -1
  259. bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +2 -2
  260. {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5397rc0.dist-info}/METADATA +48 -18
  261. bbot-2.3.0.5397rc0.dist-info/RECORD +421 -0
  262. {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5397rc0.dist-info}/WHEEL +1 -1
  263. bbot/modules/unstructured.py +0 -163
  264. bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -102
  265. bbot-2.0.1.4720rc0.dist-info/RECORD +0 -387
  266. {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5397rc0.dist-info}/LICENSE +0 -0
  267. {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5397rc0.dist-info}/entry_points.txt +0 -0
@@ -9,14 +9,16 @@ from .base import ModuleTestBase
9
9
 
10
10
 
11
11
  class TestTrufflehog(ModuleTestBase):
12
+ config_overrides = {"modules": {"postman_download": {"api_key": "asdf"}}}
12
13
  modules_overrides = [
13
14
  "github_org",
14
15
  "speculate",
15
16
  "git_clone",
16
- "unstructured",
17
17
  "github_workflows",
18
18
  "dockerhub",
19
19
  "docker_pull",
20
+ "postman",
21
+ "postman_download",
20
22
  "trufflehog",
21
23
  ]
22
24
 
@@ -24,6 +26,37 @@ class TestTrufflehog(ModuleTestBase):
24
26
 
25
27
  async def setup_before_prep(self, module_test):
26
28
  module_test.httpx_mock.add_response(url="https://api.github.com/zen")
29
+ module_test.httpx_mock.add_response(
30
+ url="https://api.getpostman.com/me",
31
+ json={
32
+ "user": {
33
+ "id": 000000,
34
+ "username": "test_key",
35
+ "email": "blacklanternsecurity@test.com",
36
+ "fullName": "Test Key",
37
+ "avatar": "",
38
+ "isPublic": True,
39
+ "teamId": 0,
40
+ "teamDomain": "",
41
+ "roles": ["user"],
42
+ },
43
+ "operations": [
44
+ {"name": "api_object_usage", "limit": 3, "usage": 0, "overage": 0},
45
+ {"name": "collection_run_limit", "limit": 25, "usage": 0, "overage": 0},
46
+ {"name": "file_storage_limit", "limit": 20, "usage": 0, "overage": 0},
47
+ {"name": "flow_count", "limit": 5, "usage": 0, "overage": 0},
48
+ {"name": "flow_requests", "limit": 5000, "usage": 0, "overage": 0},
49
+ {"name": "performance_test_limit", "limit": 25, "usage": 0, "overage": 0},
50
+ {"name": "postbot_calls", "limit": 50, "usage": 0, "overage": 0},
51
+ {"name": "reusable_packages", "limit": 3, "usage": 0, "overage": 0},
52
+ {"name": "test_data_retrieval", "limit": 1000, "usage": 0, "overage": 0},
53
+ {"name": "test_data_storage", "limit": 10, "usage": 0, "overage": 0},
54
+ {"name": "mock_usage", "limit": 1000, "usage": 0, "overage": 0},
55
+ {"name": "monitor_request_runs", "limit": 1000, "usage": 0, "overage": 0},
56
+ {"name": "api_usage", "limit": 1000, "usage": 0, "overage": 0},
57
+ ],
58
+ },
59
+ )
27
60
  module_test.httpx_mock.add_response(
28
61
  url="https://api.github.com/orgs/blacklanternsecurity",
29
62
  json={
@@ -813,6 +846,248 @@ class TestTrufflehog(ModuleTestBase):
813
846
  )
814
847
 
815
848
  async def setup_after_prep(self, module_test):
849
+ module_test.httpx_mock.add_response(
850
+ url="https://www.postman.com/_api/ws/proxy",
851
+ match_content=b'{"service": "search", "method": "POST", "path": "/search-all", "body": {"queryIndices": ["collaboration.workspace"], "queryText": "blacklanternsecurity", "size": 100, "from": 0, "clientTraceId": "", "requestOrigin": "srp", "mergeEntities": "true", "nonNestedRequests": "true", "domain": "public"}}',
852
+ json={
853
+ "data": [
854
+ {
855
+ "score": 611.41156,
856
+ "normalizedScore": 23,
857
+ "document": {
858
+ "watcherCount": 6,
859
+ "apiCount": 0,
860
+ "forkCount": 0,
861
+ "isblacklisted": "false",
862
+ "createdAt": "2021-06-15T14:03:51",
863
+ "publishertype": "team",
864
+ "publisherHandle": "blacklanternsecurity",
865
+ "id": "11498add-357d-4bc5-a008-0a2d44fb8829",
866
+ "slug": "bbot-public",
867
+ "updatedAt": "2024-07-30T11:00:35",
868
+ "entityType": "workspace",
869
+ "visibilityStatus": "public",
870
+ "forkcount": "0",
871
+ "tags": [],
872
+ "createdat": "2021-06-15T14:03:51",
873
+ "forkLabel": "",
874
+ "publisherName": "blacklanternsecurity",
875
+ "name": "BlackLanternSecurity BBOT [Public]",
876
+ "dependencyCount": 7,
877
+ "collectionCount": 6,
878
+ "warehouse__updated_at": "2024-07-30 11:00:00",
879
+ "privateNetworkFolders": [],
880
+ "isPublisherVerified": False,
881
+ "publisherType": "team",
882
+ "curatedInList": [],
883
+ "creatorId": "6900157",
884
+ "description": "",
885
+ "forklabel": "",
886
+ "publisherId": "299401",
887
+ "publisherLogo": "",
888
+ "popularity": 5,
889
+ "isPublic": True,
890
+ "categories": [],
891
+ "universaltags": "",
892
+ "views": 5788,
893
+ "summary": "BLS public workspaces.",
894
+ "memberCount": 2,
895
+ "isBlacklisted": False,
896
+ "publisherid": "299401",
897
+ "isPrivateNetworkEntity": False,
898
+ "isDomainNonTrivial": True,
899
+ "privateNetworkMeta": "",
900
+ "updatedat": "2021-10-20T16:19:29",
901
+ "documentType": "workspace",
902
+ },
903
+ "highlight": {"summary": "<b>BLS</b> BBOT api test."},
904
+ },
905
+ ],
906
+ "meta": {
907
+ "queryText": "blacklanternsecurity",
908
+ "total": {
909
+ "collection": 0,
910
+ "request": 0,
911
+ "workspace": 1,
912
+ "api": 0,
913
+ "team": 0,
914
+ "user": 0,
915
+ "flow": 0,
916
+ "apiDefinition": 0,
917
+ "privateNetworkFolder": 0,
918
+ },
919
+ "state": "AQ4",
920
+ "spellCorrection": {"count": {"all": 1, "workspace": 1}, "correctedQueryText": None},
921
+ "featureFlags": {
922
+ "enabledPublicResultCuration": True,
923
+ "boostByPopularity": True,
924
+ "reRankPostNormalization": True,
925
+ "enableUrlBarHostNameSearch": True,
926
+ },
927
+ },
928
+ },
929
+ )
930
+ module_test.httpx_mock.add_response(
931
+ url="https://www.postman.com/_api/ws/proxy",
932
+ match_content=b'{"service": "workspaces", "method": "GET", "path": "/workspaces?handle=blacklanternsecurity&slug=bbot-public"}',
933
+ json={
934
+ "meta": {"model": "workspace", "action": "find", "nextCursor": ""},
935
+ "data": [
936
+ {
937
+ "id": "3a7e4bdc-7ff7-4dd4-8eaa-61ddce1c3d1b",
938
+ "name": "BlackLanternSecurity BBOT [Public]",
939
+ "description": None,
940
+ "summary": "BLS public workspaces.",
941
+ "createdBy": "299401",
942
+ "updatedBy": "299401",
943
+ "team": None,
944
+ "createdAt": "2021-10-20T16:19:29",
945
+ "updatedAt": "2021-10-20T16:19:29",
946
+ "visibilityStatus": "public",
947
+ "profileInfo": {
948
+ "slug": "bbot-public",
949
+ "profileType": "team",
950
+ "profileId": "000000",
951
+ "publicHandle": "https://www.postman.com/blacklanternsecurity",
952
+ "publicImageURL": "",
953
+ "publicName": "BlackLanternSecurity",
954
+ "isVerified": False,
955
+ },
956
+ }
957
+ ],
958
+ },
959
+ )
960
+ module_test.httpx_mock.add_response(
961
+ url="https://api.getpostman.com/workspaces/3a7e4bdc-7ff7-4dd4-8eaa-61ddce1c3d1b",
962
+ json={
963
+ "workspace": {
964
+ "id": "3a7e4bdc-7ff7-4dd4-8eaa-61ddce1c3d1b",
965
+ "name": "BlackLanternSecurity BBOT [Public]",
966
+ "type": "personal",
967
+ "description": None,
968
+ "visibility": "public",
969
+ "createdBy": "00000000",
970
+ "updatedBy": "00000000",
971
+ "createdAt": "2021-11-17T06:09:01.000Z",
972
+ "updatedAt": "2021-11-17T08:57:16.000Z",
973
+ "collections": [
974
+ {
975
+ "id": "2aab9fd0-3715-4abe-8bb0-8cb0264d023f",
976
+ "name": "BBOT Public",
977
+ "uid": "10197090-2aab9fd0-3715-4abe-8bb0-8cb0264d023f",
978
+ },
979
+ ],
980
+ "environments": [
981
+ {
982
+ "id": "f770f816-9c6a-40f7-bde3-c0855d2a1089",
983
+ "name": "BBOT Test",
984
+ "uid": "10197090-f770f816-9c6a-40f7-bde3-c0855d2a1089",
985
+ }
986
+ ],
987
+ "apis": [],
988
+ }
989
+ },
990
+ )
991
+ module_test.httpx_mock.add_response(
992
+ url="https://www.postman.com/_api/workspace/3a7e4bdc-7ff7-4dd4-8eaa-61ddce1c3d1b/globals",
993
+ json={
994
+ "model_id": "8be7574b-219f-49e0-8d25-da447a882e4e",
995
+ "meta": {"model": "globals", "action": "find"},
996
+ "data": {
997
+ "workspace": "3a7e4bdc-7ff7-4dd4-8eaa-61ddce1c3d1b",
998
+ "lastUpdatedBy": "00000000",
999
+ "lastRevision": 1637239113000,
1000
+ "id": "8be7574b-219f-49e0-8d25-da447a882e4e",
1001
+ "values": [
1002
+ {
1003
+ "key": "endpoint_url",
1004
+ "value": "https://api.blacklanternsecurity.com/",
1005
+ "enabled": True,
1006
+ },
1007
+ ],
1008
+ "createdAt": "2021-11-17T06:09:01.000Z",
1009
+ "updatedAt": "2021-11-18T12:38:33.000Z",
1010
+ },
1011
+ },
1012
+ )
1013
+ module_test.httpx_mock.add_response(
1014
+ url="https://api.getpostman.com/environments/10197090-f770f816-9c6a-40f7-bde3-c0855d2a1089",
1015
+ json={
1016
+ "environment": {
1017
+ "id": "f770f816-9c6a-40f7-bde3-c0855d2a1089",
1018
+ "name": "BBOT Test",
1019
+ "owner": "00000000",
1020
+ "createdAt": "2021-11-17T06:29:54.000Z",
1021
+ "updatedAt": "2021-11-23T07:06:53.000Z",
1022
+ "values": [
1023
+ {
1024
+ "key": "temp_session_endpoint",
1025
+ "value": "https://api.blacklanternsecurity.com/",
1026
+ "enabled": True,
1027
+ },
1028
+ ],
1029
+ "isPublic": True,
1030
+ }
1031
+ },
1032
+ )
1033
+ module_test.httpx_mock.add_response(
1034
+ url="https://api.getpostman.com/collections/10197090-2aab9fd0-3715-4abe-8bb0-8cb0264d023f",
1035
+ json={
1036
+ "collection": {
1037
+ "info": {
1038
+ "_postman_id": "62b91565-d2e2-4bcd-8248-4dba2e3452f0",
1039
+ "name": "BBOT Public",
1040
+ "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
1041
+ "updatedAt": "2021-11-17T07:13:16.000Z",
1042
+ "createdAt": "2021-11-17T07:13:15.000Z",
1043
+ "lastUpdatedBy": "00000000",
1044
+ "uid": "172983-62b91565-d2e2-4bcd-8248-4dba2e3452f0",
1045
+ },
1046
+ "item": [
1047
+ {
1048
+ "name": "Generate API Session",
1049
+ "id": "c1bac38c-dfc9-4cc0-9c19-828cbc8543b1",
1050
+ "protocolProfileBehavior": {"disableBodyPruning": True},
1051
+ "request": {
1052
+ "method": "POST",
1053
+ "header": [{"key": "Content-Type", "value": "application/json"}],
1054
+ "body": {
1055
+ "mode": "raw",
1056
+ "raw": '{"username": "test", "password": "Test"}',
1057
+ },
1058
+ "url": {
1059
+ "raw": "https://admin:admin@the-internet.herokuapp.com/basic_auth",
1060
+ "host": ["https://admin:admin@the-internet.herokuapp.com/basic_auth"],
1061
+ },
1062
+ "description": "",
1063
+ },
1064
+ "response": [],
1065
+ "uid": "10197090-c1bac38c-dfc9-4cc0-9c19-828cbc8543b1",
1066
+ },
1067
+ {
1068
+ "name": "Generate API Session",
1069
+ "id": "c1bac38c-dfc9-4cc0-9c19-828cbc8543b1",
1070
+ "protocolProfileBehavior": {"disableBodyPruning": True},
1071
+ "request": {
1072
+ "method": "POST",
1073
+ "header": [{"key": "Content-Type", "value": "application/json"}],
1074
+ "body": {
1075
+ "mode": "raw",
1076
+ "raw": '{"username": "test", "password": "Test"}',
1077
+ },
1078
+ "url": {
1079
+ "raw": "https://admin:admin@internal.host.com",
1080
+ "host": ["https://admin:admin@internal.host.com"],
1081
+ },
1082
+ "description": "",
1083
+ },
1084
+ "response": [],
1085
+ "uid": "10197090-c1bac38c-dfc9-4cc0-9c19-828cbc8543b1",
1086
+ },
1087
+ ],
1088
+ }
1089
+ },
1090
+ )
816
1091
  temp_path = Path("/tmp/.bbot_test")
817
1092
  temp_repo_path = temp_path / "test_keys"
818
1093
  shutil.rmtree(temp_repo_path, ignore_errors=True)
@@ -850,22 +1125,26 @@ class TestTrufflehog(ModuleTestBase):
850
1125
  e
851
1126
  for e in events
852
1127
  if e.type == "VULNERABILITY"
853
- and (e.data["host"] == "hub.docker.com" or e.data["host"] == "github.com")
1128
+ and (
1129
+ e.data["host"] == "hub.docker.com"
1130
+ or e.data["host"] == "github.com"
1131
+ or e.data["host"] == "www.postman.com"
1132
+ )
854
1133
  and "Verified Secret Found." in e.data["description"]
855
1134
  and "Raw result: [https://admin:admin@the-internet.herokuapp.com]" in e.data["description"]
856
1135
  and "RawV2 result: [https://admin:admin@the-internet.herokuapp.com/basic_auth]" in e.data["description"]
857
1136
  ]
858
- # Trufflehog should find 3 verifiable secrets, 1 from the github, 1 from the workflow log and 1 from the docker image. Unstructured will extract the text file but trufflehog should reject it as its already scanned the containing folder
859
- assert 3 == len(vuln_events), "Failed to find secret in events"
1137
+ # Trufflehog should find 4 verifiable secrets, 1 from the github, 1 from the workflow log, 1 from the docker image and 1 from the postman.
1138
+ assert 4 == len(vuln_events), "Failed to find secret in events"
860
1139
  github_repo_event = [e for e in vuln_events if "test_keys" in e.data["description"]][0].parent
861
1140
  folder = Path(github_repo_event.data["path"])
862
1141
  assert folder.is_dir(), "Destination folder doesn't exist"
863
1142
  with open(folder / "keys.txt") as f:
864
1143
  content = f.read()
865
1144
  assert content == self.file_content, "File content doesn't match"
866
- filesystem_events = [e.parent for e in vuln_events if "bbot" in e.data["description"]]
867
- assert len(filesystem_events) == 3
868
- assert all([e.type == "FILESYSTEM" for e in filesystem_events])
1145
+ filesystem_events = [e.parent for e in vuln_events]
1146
+ assert len(filesystem_events) == 4
1147
+ assert all(e.type == "FILESYSTEM" for e in filesystem_events)
869
1148
  assert 1 == len(
870
1149
  [
871
1150
  e
@@ -889,31 +1168,45 @@ class TestTrufflehog(ModuleTestBase):
889
1168
  and Path(e.data["path"]).is_file()
890
1169
  ]
891
1170
  ), "Docker image file does not exist"
1171
+ assert 1 == len(
1172
+ [
1173
+ e
1174
+ for e in filesystem_events
1175
+ if e.data["path"].endswith(
1176
+ "/postman_workspaces/BlackLanternSecurity BBOT [Public]/3a7e4bdc-7ff7-4dd4-8eaa-61ddce1c3d1b.zip"
1177
+ )
1178
+ and Path(e.data["path"]).is_file()
1179
+ ]
1180
+ ), "Failed to find blacklanternsecurity postman workspace"
892
1181
 
893
1182
 
894
1183
  class TestTrufflehog_NonVerified(TestTrufflehog):
895
- config_overrides = {"modules": {"trufflehog": {"only_verified": False}}}
1184
+ config_overrides = {"modules": {"trufflehog": {"only_verified": False}, "postman_download": {"api_key": "asdf"}}}
896
1185
 
897
1186
  def check(self, module_test, events):
898
1187
  finding_events = [
899
1188
  e
900
1189
  for e in events
901
1190
  if e.type == e.type == "FINDING"
902
- and (e.data["host"] == "hub.docker.com" or e.data["host"] == "github.com")
1191
+ and (
1192
+ e.data["host"] == "hub.docker.com"
1193
+ or e.data["host"] == "github.com"
1194
+ or e.data["host"] == "www.postman.com"
1195
+ )
903
1196
  and "Potential Secret Found." in e.data["description"]
904
1197
  and "Raw result: [https://admin:admin@internal.host.com]" in e.data["description"]
905
1198
  ]
906
- # Trufflehog should find 3 unverifiable secrets, 1 from the github, 1 from the workflow log and 1 from the docker image. Unstructured will extract the text file but trufflehog should reject it as its already scanned the containing folder
907
- assert 3 == len(finding_events), "Failed to find secret in events"
1199
+ # Trufflehog should find 4 unverifiable secrets, 1 from the github, 1 from the workflow log, 1 from the docker image and 1 from the postman.
1200
+ assert 4 == len(finding_events), "Failed to find secret in events"
908
1201
  github_repo_event = [e for e in finding_events if "test_keys" in e.data["description"]][0].parent
909
1202
  folder = Path(github_repo_event.data["path"])
910
1203
  assert folder.is_dir(), "Destination folder doesn't exist"
911
1204
  with open(folder / "keys.txt") as f:
912
1205
  content = f.read()
913
1206
  assert content == self.file_content, "File content doesn't match"
914
- filesystem_events = [e.parent for e in finding_events if "bbot" in e.data["description"]]
915
- assert len(filesystem_events) == 3
916
- assert all([e.type == "FILESYSTEM" for e in filesystem_events])
1207
+ filesystem_events = [e.parent for e in finding_events]
1208
+ assert len(filesystem_events) == 4
1209
+ assert all(e.type == "FILESYSTEM" for e in filesystem_events)
917
1210
  assert 1 == len(
918
1211
  [
919
1212
  e
@@ -937,3 +1230,13 @@ class TestTrufflehog_NonVerified(TestTrufflehog):
937
1230
  and Path(e.data["path"]).is_file()
938
1231
  ]
939
1232
  ), "Docker image file does not exist"
1233
+ assert 1 == len(
1234
+ [
1235
+ e
1236
+ for e in filesystem_events
1237
+ if e.data["path"].endswith(
1238
+ "/postman_workspaces/BlackLanternSecurity BBOT [Public]/3a7e4bdc-7ff7-4dd4-8eaa-61ddce1c3d1b.zip"
1239
+ )
1240
+ and Path(e.data["path"]).is_file()
1241
+ ]
1242
+ ), "Failed to find blacklanternsecurity postman workspace"
@@ -4,7 +4,7 @@ from .base import ModuleTestBase
4
4
  class TestWayback(ModuleTestBase):
5
5
  async def setup_after_prep(self, module_test):
6
6
  module_test.httpx_mock.add_response(
7
- url=f"http://web.archive.org/cdx/search/cdx?url=blacklanternsecurity.com&matchType=domain&output=json&fl=original&collapse=original",
7
+ url="http://web.archive.org/cdx/search/cdx?url=blacklanternsecurity.com&matchType=domain&output=json&fl=original&collapse=original",
8
8
  json=[["original"], ["http://asdf.blacklanternsecurity.com"]],
9
9
  )
10
10
 
@@ -120,7 +120,7 @@ class TestSubdomainEnumWildcardBaseline(ModuleTestBase):
120
120
 
121
121
  def check(self, module_test, events):
122
122
  assert self.queries == ["walmart.cn"]
123
- assert len(events) == 6
123
+ assert len(events) == 7
124
124
  assert 2 == len(
125
125
  [
126
126
  e
@@ -185,7 +185,7 @@ def custom_lookup(query, rdtype):
185
185
  def check(self, module_test, events):
186
186
  # no subdomain enum should happen on this domain!
187
187
  assert self.queries == []
188
- assert len(events) == 6
188
+ assert len(events) == 7
189
189
  assert 2 == len(
190
190
  [e for e in events if e.type == "IP_ADDRESS" and str(e.module) == "A" and e.scope_distance == 1]
191
191
  )
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bbot
3
- Version: 2.0.1.4720rc0
3
+ Version: 2.3.0.5397rc0
4
4
  Summary: OSINT automation for hackers.
5
5
  Home-page: https://github.com/blacklanternsecurity/bbot
6
6
  License: GPL-3.0
7
- Keywords: python,cli,automation,osint,neo4j,scanner,python-library,hacking,recursion,pentesting,recon,command-line-tool,bugbounty,subdomains,security-tools,subdomain-scanner,osint-framework,attack-surface,subdomain-enumeration,osint-tool
7
+ Keywords: python,cli,automation,osint,threat-intel,intelligence,neo4j,scanner,python-library,hacking,recursion,pentesting,recon,command-line-tool,bugbounty,subdomains,security-tools,subdomain-scanner,osint-framework,attack-surface,subdomain-enumeration,osint-tool
8
8
  Author: TheTechromancer
9
9
  Requires-Python: >=3.9,<4.0
10
10
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
@@ -14,26 +14,28 @@ Classifier: Programming Language :: Python :: 3.9
14
14
  Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
17
18
  Classifier: Topic :: Security
18
19
  Requires-Dist: ansible (>=7.3,<9.0)
19
20
  Requires-Dist: ansible-runner (>=2.3.2,<3.0.0)
20
21
  Requires-Dist: beautifulsoup4 (>=4.12.2,<5.0.0)
21
22
  Requires-Dist: cachetools (>=5.3.2,<6.0.0)
22
- Requires-Dist: cloudcheck (>=5.0.0.350,<6.0.0.0)
23
+ Requires-Dist: cloudcheck (>=6.0.0.602,<7.0.0.0)
23
24
  Requires-Dist: deepdiff (>=6.2.3,<8.0.0)
24
25
  Requires-Dist: dnspython (>=2.4.2,<3.0.0)
25
26
  Requires-Dist: httpx (>=0.27.0,<0.28.0)
26
27
  Requires-Dist: idna (>=3.4,<4.0)
27
28
  Requires-Dist: jinja2 (>=3.1.3,<4.0.0)
28
29
  Requires-Dist: lxml (>=4.9.2,<6.0.0)
29
- Requires-Dist: mmh3 (>=4.1.0,<5.0.0)
30
+ Requires-Dist: mmh3 (>=4.1,<6.0)
30
31
  Requires-Dist: omegaconf (>=2.3.0,<3.0.0)
31
- 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)
32
34
  Requires-Dist: pycryptodome (>=3.17,<4.0)
33
35
  Requires-Dist: pydantic (>=2.4.2,<3.0.0)
34
36
  Requires-Dist: pyjwt (>=2.7.0,<3.0.0)
35
37
  Requires-Dist: pyzmq (>=26.0.3,<27.0.0)
36
- Requires-Dist: radixtarget (>=1.0.0.15,<2.0.0.0)
38
+ Requires-Dist: radixtarget (>=2.0.0.50,<3.0.0.0)
37
39
  Requires-Dist: regex (>=2024.4.16,<2025.0.0)
38
40
  Requires-Dist: setproctitle (>=1.3.3,<2.0.0)
39
41
  Requires-Dist: socksio (>=1.0.0,<2.0.0)
@@ -52,7 +54,7 @@ Description-Content-Type: text/markdown
52
54
 
53
55
  [![bbot_banner](https://github.com/user-attachments/assets/f02804ce-9478-4f1e-ac4d-9cf5620a3214)](https://github.com/blacklanternsecurity/bbot)
54
56
 
55
- [![Python Version](https://img.shields.io/badge/python-3.9+-FF8400)](https://www.python.org) [![License](https://img.shields.io/badge/license-GPLv3-FF8400.svg)](https://github.com/blacklanternsecurity/bbot/blob/dev/LICENSE) [![DEF CON Recon Village 2024](https://img.shields.io/badge/DEF%20CON%20Demo%20Labs-2023-FF8400.svg)](https://www.reconvillage.org/talks) [![PyPi Downloads](https://static.pepy.tech/personalized-badge/bbot?right_color=orange&left_color=grey)](https://pepy.tech/project/bbot) [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Tests](https://github.com/blacklanternsecurity/bbot/actions/workflows/tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/bbot/actions?query=workflow%3A"tests") [![Codecov](https://codecov.io/gh/blacklanternsecurity/bbot/branch/dev/graph/badge.svg?token=IR5AZBDM5K)](https://codecov.io/gh/blacklanternsecurity/bbot) [![Discord](https://img.shields.io/discord/859164869970362439)](https://discord.com/invite/PZqkgxu5SA)
57
+ [![Python Version](https://img.shields.io/badge/python-3.9+-FF8400)](https://www.python.org) [![License](https://img.shields.io/badge/license-GPLv3-FF8400.svg)](https://github.com/blacklanternsecurity/bbot/blob/dev/LICENSE) [![DEF CON Recon Village 2024](https://img.shields.io/badge/DEF%20CON%20Demo%20Labs-2023-FF8400.svg)](https://www.reconvillage.org/talks) [![PyPi Downloads](https://static.pepy.tech/personalized-badge/bbot?right_color=orange&left_color=grey)](https://pepy.tech/project/bbot) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![Tests](https://github.com/blacklanternsecurity/bbot/actions/workflows/tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/bbot/actions?query=workflow%3A"tests") [![Codecov](https://codecov.io/gh/blacklanternsecurity/bbot/branch/dev/graph/badge.svg?token=IR5AZBDM5K)](https://codecov.io/gh/blacklanternsecurity/bbot) [![Discord](https://img.shields.io/discord/859164869970362439)](https://discord.com/invite/PZqkgxu5SA)
56
58
 
57
59
  ### **BEE·bot** is a multipurpose scanner inspired by [Spiderfoot](https://github.com/smicallef/spiderfoot), built to automate your **Recon**, **Bug Bounties**, and **ASM**!
58
60
 
@@ -107,13 +109,13 @@ config:
107
109
  threads: 25
108
110
  brute_threads: 1000
109
111
  # put your API keys here
110
- modules:
111
- github:
112
- api_key: ""
113
- chaos:
114
- api_key: ""
115
- securitytrails:
116
- api_key: ""
112
+ # modules:
113
+ # github:
114
+ # api_key: ""
115
+ # chaos:
116
+ # api_key: ""
117
+ # securitytrails:
118
+ # api_key: ""
117
119
 
118
120
  ```
119
121
 
@@ -143,6 +145,10 @@ description: Recursive web spider
143
145
  modules:
144
146
  - httpx
145
147
 
148
+ blacklist:
149
+ # Prevent spider from invalidating sessions by logging out
150
+ - "RE:/.*(sign|log)[_-]?out"
151
+
146
152
  config:
147
153
  web:
148
154
  # how many links to follow in a row
@@ -243,10 +249,10 @@ flags:
243
249
 
244
250
  ```bash
245
251
  # everything everywhere all at once
246
- bbot -t evilcorp.com -p kitchen-sink
252
+ bbot -t evilcorp.com -p kitchen-sink --allow-deadly
247
253
 
248
254
  # roughly equivalent to:
249
- bbot -t evilcorp.com -p subdomain-enum cloud-enum code-enum email-enum spider web-basic paramminer dirbust-light web-screenshots
255
+ bbot -t evilcorp.com -p subdomain-enum cloud-enum code-enum email-enum spider web-basic paramminer dirbust-light web-screenshots --allow-deadly
250
256
  ```
251
257
 
252
258
  <!-- BBOT KITCHEN-SINK PRESET EXPANDABLE -->
@@ -267,6 +273,7 @@ include:
267
273
  - paramminer
268
274
  - dirbust-light
269
275
  - web-screenshots
276
+ - baddns-thorough
270
277
 
271
278
  config:
272
279
  modules:
@@ -287,6 +294,24 @@ Click the graph below to explore the [inner workings](https://www.blacklanternse
287
294
 
288
295
  [![image](https://github.com/blacklanternsecurity/bbot/assets/20261699/e55ba6bd-6d97-48a6-96f0-e122acc23513)](https://www.blacklanternsecurity.com/bbot/Stable/how_it_works/)
289
296
 
297
+ ## Output Modules
298
+
299
+ - [Neo4j](docs/scanning/output.md#neo4j)
300
+ - [Teams](docs/scanning/output.md#teams)
301
+ - [Discord](docs/scanning/output.md#discord)
302
+ - [Slack](docs/scanning/output.md#slack)
303
+ - [Postgres](docs/scanning/output.md#postgres)
304
+ - [MySQL](docs/scanning/output.md#mysql)
305
+ - [SQLite](docs/scanning/output.md#sqlite)
306
+ - [Splunk](docs/scanning/output.md#splunk)
307
+ - [Elasticsearch](docs/scanning/output.md#elasticsearch)
308
+ - [CSV](docs/scanning/output.md#csv)
309
+ - [JSON](docs/scanning/output.md#json)
310
+ - [HTTP](docs/scanning/output.md#http)
311
+ - [Websocket](docs/scanning/output.md#websocket)
312
+
313
+ ...and [more](docs/scanning/output.md)!
314
+
290
315
  ## BBOT as a Python Library
291
316
 
292
317
  #### Synchronous
@@ -355,13 +380,17 @@ For more information, see [Targets](https://www.blacklanternsecurity.com/bbot/St
355
380
 
356
381
  Similar to Amass or Subfinder, BBOT supports API keys for various third-party services such as SecurityTrails, etc.
357
382
 
358
- The standard way to do this is to enter your API keys in **`~/.config/bbot/bbot.yml`**:
383
+ The standard way to do this is to enter your API keys in **`~/.config/bbot/bbot.yml`**. Note that multiple API keys are allowed:
359
384
  ```yaml
360
385
  modules:
361
386
  shodan_dns:
362
387
  api_key: 4f41243847da693a4f356c0486114bc6
363
388
  c99:
364
- api_key: 21a270d5f59c9b05813a72bb41707266
389
+ # multiple API keys
390
+ api_key:
391
+ - 21a270d5f59c9b05813a72bb41707266
392
+ - ea8f243d9885cf8ce9876a580224fd3c
393
+ - 5bc6ed268ab6488270e496d3183a1a27
365
394
  virustotal:
366
395
  api_key: dd5f0eee2e4a99b71a939bded450b246
367
396
  securitytrails:
@@ -404,6 +433,7 @@ For details, see [Configuration](https://www.blacklanternsecurity.com/bbot/Stabl
404
433
  - **Modules**
405
434
  - [List of Modules](https://www.blacklanternsecurity.com/bbot/Stable/modules/list_of_modules)
406
435
  - [Nuclei](https://www.blacklanternsecurity.com/bbot/Stable/modules/nuclei)
436
+ - [Custom YARA Rules](https://www.blacklanternsecurity.com/bbot/Stable/modules/custom_yara_rules)
407
437
  - **Misc**
408
438
  - [Contribution](https://www.blacklanternsecurity.com/bbot/Stable/contribution)
409
439
  - [Release History](https://www.blacklanternsecurity.com/bbot/Stable/release_history)