bbot 2.0.1.4720rc0__py3-none-any.whl → 2.3.0.5401rc0__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 (278) 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 +12 -10
  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 +20 -21
  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 +29 -12
  86. bbot/modules/internal/dnsresolve.py +22 -22
  87. bbot/modules/internal/excavate.py +97 -59
  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 +8 -11
  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 +18 -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 -2
  146. bbot/presets/spider.yml +4 -0
  147. bbot/presets/subdomain-enum.yml +7 -7
  148. bbot/presets/web/dotnet-audit.yml +0 -1
  149. bbot/scanner/manager.py +5 -16
  150. bbot/scanner/preset/args.py +46 -26
  151. bbot/scanner/preset/environ.py +7 -2
  152. bbot/scanner/preset/path.py +7 -4
  153. bbot/scanner/preset/preset.py +36 -23
  154. bbot/scanner/scanner.py +172 -62
  155. bbot/scanner/target.py +236 -434
  156. bbot/scripts/docs.py +1 -1
  157. bbot/test/bbot_fixtures.py +13 -3
  158. bbot/test/conftest.py +132 -100
  159. bbot/test/fastapi_test.py +17 -0
  160. bbot/test/owasp_mastg.apk +0 -0
  161. bbot/test/run_tests.sh +4 -4
  162. bbot/test/test.conf +2 -0
  163. bbot/test/test_step_1/test__module__tests.py +0 -1
  164. bbot/test/test_step_1/test_bbot_fastapi.py +79 -0
  165. bbot/test/test_step_1/test_bloom_filter.py +2 -1
  166. bbot/test/test_step_1/test_cli.py +138 -64
  167. bbot/test/test_step_1/test_dns.py +61 -27
  168. bbot/test/test_step_1/test_engine.py +17 -19
  169. bbot/test/test_step_1/test_events.py +183 -30
  170. bbot/test/test_step_1/test_helpers.py +64 -29
  171. bbot/test/test_step_1/test_manager_deduplication.py +1 -1
  172. bbot/test/test_step_1/test_manager_scope_accuracy.py +333 -330
  173. bbot/test/test_step_1/test_modules_basic.py +68 -70
  174. bbot/test/test_step_1/test_presets.py +183 -100
  175. bbot/test/test_step_1/test_python_api.py +7 -2
  176. bbot/test/test_step_1/test_regexes.py +35 -5
  177. bbot/test/test_step_1/test_scan.py +39 -5
  178. bbot/test/test_step_1/test_scope.py +4 -3
  179. bbot/test/test_step_1/test_target.py +242 -145
  180. bbot/test/test_step_1/test_web.py +14 -10
  181. bbot/test/test_step_2/module_tests/base.py +15 -7
  182. bbot/test/test_step_2/module_tests/test_module_anubisdb.py +1 -1
  183. bbot/test/test_step_2/module_tests/test_module_apkpure.py +71 -0
  184. bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -1
  185. bbot/test/test_step_2/module_tests/test_module_azure_realm.py +1 -1
  186. bbot/test/test_step_2/module_tests/test_module_baddns.py +6 -6
  187. bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +62 -0
  188. bbot/test/test_step_2/module_tests/test_module_bevigil.py +29 -2
  189. bbot/test/test_step_2/module_tests/test_module_binaryedge.py +4 -2
  190. bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +2 -2
  191. bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +1 -1
  192. bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +35 -0
  193. bbot/test/test_step_2/module_tests/test_module_builtwith.py +2 -2
  194. bbot/test/test_step_2/module_tests/test_module_bypass403.py +1 -1
  195. bbot/test/test_step_2/module_tests/test_module_c99.py +126 -0
  196. bbot/test/test_step_2/module_tests/test_module_censys.py +4 -1
  197. bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +4 -0
  198. bbot/test/test_step_2/module_tests/test_module_code_repository.py +11 -1
  199. bbot/test/test_step_2/module_tests/test_module_columbus.py +1 -1
  200. bbot/test/test_step_2/module_tests/test_module_credshed.py +3 -3
  201. bbot/test/test_step_2/module_tests/test_module_dastardly.py +2 -1
  202. bbot/test/test_step_2/module_tests/test_module_dehashed.py +2 -2
  203. bbot/test/test_step_2/module_tests/test_module_digitorus.py +1 -1
  204. bbot/test/test_step_2/module_tests/test_module_discord.py +1 -1
  205. bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +103 -0
  206. bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +9 -10
  207. bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +1 -2
  208. bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +1 -2
  209. bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +4 -4
  210. bbot/test/test_step_2/module_tests/test_module_dnstlsrpt.py +64 -0
  211. bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -8
  212. bbot/test/test_step_2/module_tests/test_module_excavate.py +28 -48
  213. bbot/test/test_step_2/module_tests/test_module_extractous.py +54 -0
  214. bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +1 -1
  215. bbot/test/test_step_2/module_tests/test_module_filedownload.py +14 -14
  216. bbot/test/test_step_2/module_tests/test_module_git_clone.py +2 -2
  217. bbot/test/test_step_2/module_tests/test_module_github_org.py +19 -8
  218. bbot/test/test_step_2/module_tests/test_module_github_workflows.py +1 -1
  219. bbot/test/test_step_2/module_tests/test_module_gitlab.py +9 -4
  220. bbot/test/test_step_2/module_tests/test_module_google_playstore.py +83 -0
  221. bbot/test/test_step_2/module_tests/test_module_gowitness.py +4 -6
  222. bbot/test/test_step_2/module_tests/test_module_host_header.py +1 -1
  223. bbot/test/test_step_2/module_tests/test_module_http.py +4 -4
  224. bbot/test/test_step_2/module_tests/test_module_httpx.py +10 -8
  225. bbot/test/test_step_2/module_tests/test_module_hunterio.py +68 -4
  226. bbot/test/test_step_2/module_tests/test_module_jadx.py +55 -0
  227. bbot/test/test_step_2/module_tests/test_module_json.py +22 -9
  228. bbot/test/test_step_2/module_tests/test_module_leakix.py +7 -3
  229. bbot/test/test_step_2/module_tests/test_module_mysql.py +76 -0
  230. bbot/test/test_step_2/module_tests/test_module_myssl.py +1 -1
  231. bbot/test/test_step_2/module_tests/test_module_neo4j.py +1 -1
  232. bbot/test/test_step_2/module_tests/test_module_newsletters.py +16 -16
  233. bbot/test/test_step_2/module_tests/test_module_ntlm.py +8 -7
  234. bbot/test/test_step_2/module_tests/test_module_oauth.py +1 -1
  235. bbot/test/test_step_2/module_tests/test_module_otx.py +1 -1
  236. bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +1 -2
  237. bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -6
  238. bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +2 -9
  239. bbot/test/test_step_2/module_tests/test_module_passivetotal.py +3 -1
  240. bbot/test/test_step_2/module_tests/test_module_pgp.py +2 -2
  241. bbot/test/test_step_2/module_tests/test_module_portscan.py +9 -8
  242. bbot/test/test_step_2/module_tests/test_module_postgres.py +74 -0
  243. bbot/test/test_step_2/module_tests/test_module_postman.py +84 -253
  244. bbot/test/test_step_2/module_tests/test_module_postman_download.py +439 -0
  245. bbot/test/test_step_2/module_tests/test_module_rapiddns.py +93 -1
  246. bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +20 -1
  247. bbot/test/test_step_2/module_tests/test_module_sitedossier.py +2 -2
  248. bbot/test/test_step_2/module_tests/test_module_smuggler.py +14 -14
  249. bbot/test/test_step_2/module_tests/test_module_social.py +11 -1
  250. bbot/test/test_step_2/module_tests/test_module_speculate.py +4 -8
  251. bbot/test/test_step_2/module_tests/test_module_splunk.py +4 -4
  252. bbot/test/test_step_2/module_tests/test_module_sqlite.py +18 -0
  253. bbot/test/test_step_2/module_tests/test_module_sslcert.py +1 -1
  254. bbot/test/test_step_2/module_tests/test_module_stdout.py +5 -3
  255. bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +1 -1
  256. bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +208 -0
  257. bbot/test/test_step_2/module_tests/test_module_subdomains.py +1 -1
  258. bbot/test/test_step_2/module_tests/test_module_teams.py +8 -6
  259. bbot/test/test_step_2/module_tests/test_module_telerik.py +1 -1
  260. bbot/test/test_step_2/module_tests/test_module_trufflehog.py +317 -14
  261. bbot/test/test_step_2/module_tests/test_module_viewdns.py +1 -1
  262. bbot/test/test_step_2/module_tests/test_module_wayback.py +1 -1
  263. bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +2 -2
  264. bbot/wordlists/devops_mutations.txt +1 -1
  265. bbot/wordlists/ffuf_shortname_candidates.txt +1 -1
  266. bbot/wordlists/nameservers.txt +1 -1
  267. bbot/wordlists/paramminer_headers.txt +1 -1
  268. bbot/wordlists/paramminer_parameters.txt +1 -1
  269. bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +1 -1
  270. bbot/wordlists/valid_url_schemes.txt +1 -1
  271. {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5401rc0.dist-info}/METADATA +48 -18
  272. bbot-2.3.0.5401rc0.dist-info/RECORD +421 -0
  273. {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5401rc0.dist-info}/WHEEL +1 -1
  274. bbot/modules/unstructured.py +0 -163
  275. bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -102
  276. bbot-2.0.1.4720rc0.dist-info/RECORD +0 -387
  277. {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5401rc0.dist-info}/LICENSE +0 -0
  278. {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5401rc0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,83 @@
1
+ from .base import ModuleTestBase
2
+
3
+
4
+ class TestGoogle_Playstore(ModuleTestBase):
5
+ modules_overrides = ["google_playstore", "speculate"]
6
+
7
+ async def setup_after_prep(self, module_test):
8
+ await module_test.mock_dns({"blacklanternsecurity.com": {"A": ["127.0.0.99"]}})
9
+ module_test.httpx_mock.add_response(
10
+ url="https://play.google.com/store/search?q=blacklanternsecurity&c=apps",
11
+ text="""<!DOCTYPE html>
12
+ <html>
13
+ <head>
14
+ <title>"blacklanternsecurity" - Android Apps on Google Play</title>
15
+ </head>
16
+ <body>
17
+ <a href="/store/apps/details?id=com.bbot.test&pcampaignid=dontmatchme&pli=1"/>
18
+ <a href="/store/apps/details?id=com.bbot.other"/>
19
+ </body>
20
+ </html>""",
21
+ )
22
+ module_test.httpx_mock.add_response(
23
+ url="https://play.google.com/store/apps/details?id=com.bbot.test",
24
+ text="""<!DOCTYPE html>
25
+ <html>
26
+ <head>
27
+ <title>BBOT</title>
28
+ </head>
29
+ <body>
30
+ <meta name="appstore:developer_url" content="https://www.blacklanternsecurity.com">
31
+ </div>
32
+ </div>
33
+ </body>
34
+ </html>""",
35
+ )
36
+ module_test.httpx_mock.add_response(
37
+ url="https://play.google.com/store/apps/details?id=com.bbot.other",
38
+ text="""<!DOCTYPE html>
39
+ <html>
40
+ <head>
41
+ <title>BBOT</title>
42
+ </head>
43
+ <body>
44
+ <meta name="appstore:developer_url" content="">
45
+ <a href="mailto:support@blacklanternsecurity.com"></a>
46
+ </div>
47
+ </div>
48
+ </body>
49
+ </html>""",
50
+ )
51
+
52
+ def check(self, module_test, events):
53
+ assert len(events) == 6
54
+ assert 1 == len(
55
+ [
56
+ e
57
+ for e in events
58
+ if e.type == "DNS_NAME" and e.data == "blacklanternsecurity.com" and e.scope_distance == 0
59
+ ]
60
+ ), "Failed to emit target DNS_NAME"
61
+ assert 1 == len(
62
+ [e for e in events if e.type == "ORG_STUB" and e.data == "blacklanternsecurity" and e.scope_distance == 0]
63
+ ), "Failed to find ORG_STUB"
64
+ assert 1 == len(
65
+ [
66
+ e
67
+ for e in events
68
+ if e.type == "MOBILE_APP"
69
+ and "android" in e.tags
70
+ and e.data["id"] == "com.bbot.test"
71
+ and e.data["url"] == "https://play.google.com/store/apps/details?id=com.bbot.test"
72
+ ]
73
+ ), "Failed to find bbot android app"
74
+ assert 1 == len(
75
+ [
76
+ e
77
+ for e in events
78
+ if e.type == "MOBILE_APP"
79
+ and "android" in e.tags
80
+ and e.data["id"] == "com.bbot.other"
81
+ and e.data["url"] == "https://play.google.com/store/apps/details?id=com.bbot.other"
82
+ ]
83
+ ), "Failed to find other bbot android app"
@@ -27,8 +27,8 @@ class TestGowitness(ModuleTestBase):
27
27
  "headers": {"Server": "Apache/2.4.41 (Ubuntu)"},
28
28
  }
29
29
  module_test.set_expect_requests(respond_args=respond_args)
30
- request_args = dict(uri="/blacklanternsecurity")
31
- respond_args = dict(response_data="""blacklanternsecurity github <a data-bem""")
30
+ request_args = {"uri": "/blacklanternsecurity"}
31
+ respond_args = {"response_data": """blacklanternsecurity github <a data-bem"""}
32
32
  module_test.set_expect_requests(request_args, respond_args)
33
33
 
34
34
  # monkeypatch social
@@ -45,7 +45,7 @@ class TestGowitness(ModuleTestBase):
45
45
  webscreenshots = [e for e in events if e.type == "WEBSCREENSHOT"]
46
46
  assert webscreenshots, "failed to raise WEBSCREENSHOT events"
47
47
  assert not any(
48
- ["blob" in e.data for e in webscreenshots]
48
+ "blob" in e.data for e in webscreenshots
49
49
  ), "blob was included in WEBSCREENSHOT data when it shouldn't have been"
50
50
 
51
51
  screenshots_path = self.home_dir / "scans" / module_test.scan.name / "gowitness" / "screenshots"
@@ -101,6 +101,4 @@ class TestGoWitnessWithBlob(TestGowitness):
101
101
  def check(self, module_test, events):
102
102
  webscreenshots = [e for e in events if e.type == "WEBSCREENSHOT"]
103
103
  assert webscreenshots, "failed to raise WEBSCREENSHOT events"
104
- assert all(
105
- ["blob" in e.data and e.data["blob"] for e in webscreenshots]
106
- ), "blob not found in WEBSCREENSHOT data"
104
+ assert all("blob" in e.data and e.data["blob"] for e in webscreenshots), "blob not found in WEBSCREENSHOT data"
@@ -31,7 +31,7 @@ class TestHost_Header(ModuleTestBase):
31
31
  if subdomain_tag_overrides:
32
32
  return Response(f"Alive, host is: {subdomain_tag}.{self.fake_host}", status=200)
33
33
 
34
- return Response(f"Alive, host is: defaulthost.com", status=200)
34
+ return Response("Alive, host is: defaulthost.com", status=200)
35
35
 
36
36
  async def setup_before_prep(self, module_test):
37
37
  self.interactsh_mock_instance = module_test.mock_interactsh("host_header")
@@ -48,10 +48,10 @@ class TestHTTP(ModuleTestBase):
48
48
  )
49
49
 
50
50
  def check(self, module_test, events):
51
- assert self.got_event == True
52
- assert self.headers_correct == True
53
- assert self.method_correct == True
54
- assert self.url_correct == True
51
+ assert self.got_event is True
52
+ assert self.headers_correct is True
53
+ assert self.method_correct is True
54
+ assert self.url_correct is True
55
55
 
56
56
 
57
57
  class TestHTTPSIEMFriendly(TestHTTP):
@@ -1,8 +1,10 @@
1
1
  from .base import ModuleTestBase
2
2
 
3
3
 
4
- class TestHTTPX(ModuleTestBase):
4
+ class TestHTTPXBase(ModuleTestBase):
5
5
  targets = ["http://127.0.0.1:8888/url", "127.0.0.1:8888"]
6
+ module_name = "httpx"
7
+ modules_overrides = ["httpx", "excavate"]
6
8
  config_overrides = {"modules": {"httpx": {"store_responses": True}}}
7
9
 
8
10
  # HTML for a page with a login form
@@ -29,11 +31,11 @@ class TestHTTPX(ModuleTestBase):
29
31
  </html>"""
30
32
 
31
33
  async def setup_after_prep(self, module_test):
32
- request_args = dict(uri="/", headers={"test": "header"})
33
- respond_args = dict(response_data=self.html_without_login)
34
+ request_args = {"uri": "/", "headers": {"test": "header"}}
35
+ respond_args = {"response_data": self.html_without_login}
34
36
  module_test.set_expect_requests(request_args, respond_args)
35
- request_args = dict(uri="/url", headers={"test": "header"})
36
- respond_args = dict(response_data=self.html_with_login)
37
+ request_args = {"uri": "/url", "headers": {"test": "header"}}
38
+ respond_args = {"response_data": self.html_with_login}
37
39
  module_test.set_expect_requests(request_args, respond_args)
38
40
 
39
41
  def check(self, module_test, events):
@@ -42,7 +44,7 @@ class TestHTTPX(ModuleTestBase):
42
44
  for e in events:
43
45
  if e.type == "HTTP_RESPONSE":
44
46
  if e.data["path"] == "/":
45
- assert not "login-page" in e.tags
47
+ assert "login-page" not in e.tags
46
48
  open_port = True
47
49
  elif e.data["path"] == "/url":
48
50
  assert "login-page" in e.tags
@@ -122,8 +124,8 @@ class TestHTTPX_URLBlacklist(ModuleTestBase):
122
124
  assert 1 == len([e for e in events if e.type == "URL" and e.data == "http://127.0.0.1:8888/"])
123
125
  assert 1 == len([e for e in events if e.type == "URL" and e.data == "http://127.0.0.1:8888/test.aspx"])
124
126
  assert 1 == len([e for e in events if e.type == "URL" and e.data == "http://127.0.0.1:8888/test.txt"])
125
- assert not any([e for e in events if "URL" in e.type and ".svg" in e.data])
126
- assert not any([e for e in events if "URL" in e.type and ".woff" in e.data])
127
+ assert not any(e for e in events if "URL" in e.type and ".svg" in e.data)
128
+ assert not any(e for e in events if "URL" in e.type and ".woff" in e.data)
127
129
 
128
130
 
129
131
  class TestHTTPX_querystring_removed(ModuleTestBase):
@@ -2,7 +2,7 @@ from .base import ModuleTestBase
2
2
 
3
3
 
4
4
  class TestHunterio(ModuleTestBase):
5
- config_overrides = {"modules": {"hunterio": {"api_key": "asdf"}}}
5
+ config_overrides = {"modules": {"hunterio": {"api_key": ["asdf", "1234", "4321", "fdsa"]}}}
6
6
 
7
7
  async def setup_before_prep(self, module_test):
8
8
  module_test.httpx_mock.add_response(
@@ -17,7 +17,7 @@ class TestHunterio(ModuleTestBase):
17
17
  "reset_date": "1917-05-23",
18
18
  "team_id": 1234,
19
19
  "calls": {
20
- "_deprecation_notice": "Sums the searches and the verifications, giving an unprecise look of the available requests",
20
+ "_deprecation_notice": "Sums the searches and the verifications, giving an imprecise look of the available requests",
21
21
  "used": 999,
22
22
  "available": 2000,
23
23
  },
@@ -29,7 +29,7 @@ class TestHunterio(ModuleTestBase):
29
29
  },
30
30
  )
31
31
  module_test.httpx_mock.add_response(
32
- url="https://api.hunter.io/v2/domain-search?domain=blacklanternsecurity.com&api_key=asdf&limit=100&offset=0",
32
+ url="https://api.hunter.io/v2/domain-search?domain=blacklanternsecurity.com&api_key=fdsa&limit=100&offset=0",
33
33
  json={
34
34
  "data": {
35
35
  "domain": "blacklanternsecurity.com",
@@ -91,6 +91,70 @@ class TestHunterio(ModuleTestBase):
91
91
  },
92
92
  },
93
93
  )
94
+ module_test.httpx_mock.add_response(
95
+ url="https://api.hunter.io/v2/domain-search?domain=blacklanternsecurity.com&api_key=4321&limit=100&offset=100",
96
+ json={
97
+ "data": {
98
+ "domain": "blacklanternsecurity.com",
99
+ "disposable": False,
100
+ "webmail": False,
101
+ "accept_all": False,
102
+ "pattern": "{first}",
103
+ "organization": "Black Lantern Security",
104
+ "description": None,
105
+ "twitter": None,
106
+ "facebook": None,
107
+ "linkedin": "https://linkedin.com/company/black-lantern-security",
108
+ "instagram": None,
109
+ "youtube": None,
110
+ "technologies": ["jekyll", "nginx"],
111
+ "country": "US",
112
+ "state": "CA",
113
+ "city": "Night City",
114
+ "postal_code": "12345",
115
+ "street": "123 Any St",
116
+ "emails": [
117
+ {
118
+ "value": "fdsa@blacklanternsecurity.com",
119
+ "type": "generic",
120
+ "confidence": 77,
121
+ "sources": [
122
+ {
123
+ "domain": "blacklanternsecurity.com",
124
+ "uri": "http://blacklanternsecurity.com",
125
+ "extracted_on": "2021-06-09",
126
+ "last_seen_on": "2023-03-21",
127
+ "still_on_page": True,
128
+ }
129
+ ],
130
+ "first_name": None,
131
+ "last_name": None,
132
+ "position": None,
133
+ "seniority": None,
134
+ "department": "support",
135
+ "linkedin": None,
136
+ "twitter": None,
137
+ "phone_number": None,
138
+ "verification": {"date": None, "status": None},
139
+ }
140
+ ],
141
+ "linked_domains": [],
142
+ },
143
+ "meta": {
144
+ "results": 1,
145
+ "limit": 100,
146
+ "offset": 0,
147
+ "params": {
148
+ "domain": "blacklanternsecurity.com",
149
+ "company": None,
150
+ "type": None,
151
+ "seniority": None,
152
+ "department": None,
153
+ },
154
+ },
155
+ },
156
+ )
94
157
 
95
158
  def check(self, module_test, events):
96
- assert any(e.data == "asdf@blacklanternsecurity.com" for e in events), "Failed to detect email"
159
+ assert any(e.data == "asdf@blacklanternsecurity.com" for e in events), "Failed to detect email #1"
160
+ assert any(e.data == "fdsa@blacklanternsecurity.com" for e in events), "Failed to detect email #2"
@@ -0,0 +1,55 @@
1
+ from pathlib import Path
2
+ from bbot.core.helpers.libmagic import get_magic_info
3
+ from bbot.test.test_step_2.module_tests.base import ModuleTestBase, tempapkfile
4
+
5
+
6
+ class TestJadx(ModuleTestBase):
7
+ modules_overrides = ["apkpure", "google_playstore", "speculate", "jadx"]
8
+ apk_file = tempapkfile()
9
+
10
+ async def setup_after_prep(self, module_test):
11
+ await module_test.mock_dns({"blacklanternsecurity.com": {"A": ["127.0.0.99"]}})
12
+ module_test.httpx_mock.add_response(
13
+ url="https://play.google.com/store/search?q=blacklanternsecurity&c=apps",
14
+ text="""<!DOCTYPE html>
15
+ <html>
16
+ <head>
17
+ <title>"blacklanternsecurity" - Android Apps on Google Play</title>
18
+ </head>
19
+ <body>
20
+ <a href="/store/apps/details?id=com.bbot.test&pcampaignid=dontmatchme&pli=1"/>
21
+ </body>
22
+ </html>""",
23
+ )
24
+ module_test.httpx_mock.add_response(
25
+ url="https://play.google.com/store/apps/details?id=com.bbot.test",
26
+ text="""<!DOCTYPE html>
27
+ <html>
28
+ <head>
29
+ <title>BBOT</title>
30
+ </head>
31
+ <body>
32
+ <meta name="appstore:developer_url" content="https://www.blacklanternsecurity.com">
33
+ </div>
34
+ </div>
35
+ </body>
36
+ </html>""",
37
+ )
38
+ module_test.httpx_mock.add_response(
39
+ url="https://d.apkpure.com/b/XAPK/com.bbot.test?version=latest",
40
+ content=self.apk_file,
41
+ headers={
42
+ "Content-Type": "application/vnd.android.package-archive",
43
+ "Content-Disposition": "attachment; filename=com.bbot.test.apk",
44
+ },
45
+ )
46
+
47
+ def check(self, module_test, events):
48
+ filesystem_events = [e for e in events if e.type == "FILESYSTEM"]
49
+ apk_event = [e for e in filesystem_events if "file" in e.tags]
50
+ extension, mime_type, description, confidence = get_magic_info(apk_event[0].data["path"])
51
+ assert description == "Android Application Package", f"Downloaded file was detected as {description}"
52
+ extract_event = [e for e in filesystem_events if "folder" in e.tags]
53
+ assert 1 == len(extract_event), "Failed to extract apk"
54
+ extract_path = Path(extract_event[0].data["path"])
55
+ assert extract_path.is_dir(), "Destination apk doesn't exist"
@@ -9,6 +9,9 @@ class TestJSON(ModuleTestBase):
9
9
  dns_data = "blacklanternsecurity.com"
10
10
  context_data = f"Scan {module_test.scan.name} seeded with DNS_NAME: blacklanternsecurity.com"
11
11
 
12
+ scan_event = [e for e in events if e.type == "SCAN"][0]
13
+ dns_event = [e for e in events if e.type == "DNS_NAME"][0]
14
+
12
15
  # json events
13
16
  txt_file = module_test.scan.home / "output.json"
14
17
  lines = list(module_test.scan.helpers.read_file(txt_file))
@@ -16,30 +19,40 @@ class TestJSON(ModuleTestBase):
16
19
  json_events = [json.loads(line) for line in lines]
17
20
  scan_json = [e for e in json_events if e["type"] == "SCAN"]
18
21
  dns_json = [e for e in json_events if e["type"] == "DNS_NAME"]
19
- assert len(scan_json) == 1
22
+ assert len(scan_json) == 2
20
23
  assert len(dns_json) == 1
21
- scan_json = scan_json[0]
22
24
  dns_json = dns_json[0]
23
- assert scan_json["data"]["name"] == module_test.scan.name
24
- assert scan_json["data"]["id"] == module_test.scan.id
25
- assert scan_json["data"]["target"]["seeds"] == ["blacklanternsecurity.com"]
26
- assert scan_json["data"]["target"]["whitelist"] == ["blacklanternsecurity.com"]
25
+ scan = scan_json[0]
26
+ assert scan["data"]["name"] == module_test.scan.name
27
+ assert scan["data"]["id"] == module_test.scan.id
28
+ assert scan["id"] == module_test.scan.id
29
+ assert scan["uuid"] == str(module_test.scan.root_event.uuid)
30
+ assert scan["parent_uuid"] == str(module_test.scan.root_event.uuid)
31
+ assert scan["data"]["target"]["seeds"] == ["blacklanternsecurity.com"]
32
+ assert scan["data"]["target"]["whitelist"] == ["blacklanternsecurity.com"]
27
33
  assert dns_json["data"] == dns_data
34
+ assert dns_json["id"] == str(dns_event.id)
35
+ assert dns_json["uuid"] == str(dns_event.uuid)
36
+ assert dns_json["parent_uuid"] == str(module_test.scan.root_event.uuid)
28
37
  assert dns_json["discovery_context"] == context_data
29
38
  assert dns_json["discovery_path"] == [context_data]
30
- assert dns_json["parent_chain"] == ["DNS_NAME:1e57014aa7b0715bca68e4f597204fc4e1e851fc"]
39
+ assert dns_json["parent_chain"] == [dns_json["uuid"]]
31
40
 
32
41
  # event objects reconstructed from json
33
- scan_reconstructed = event_from_json(scan_json)
42
+ scan_reconstructed = event_from_json(scan_json[0])
34
43
  dns_reconstructed = event_from_json(dns_json)
35
44
  assert scan_reconstructed.data["name"] == module_test.scan.name
36
45
  assert scan_reconstructed.data["id"] == module_test.scan.id
46
+ assert scan_reconstructed.uuid == scan_event.uuid
47
+ assert scan_reconstructed.parent_uuid == scan_event.uuid
37
48
  assert scan_reconstructed.data["target"]["seeds"] == ["blacklanternsecurity.com"]
38
49
  assert scan_reconstructed.data["target"]["whitelist"] == ["blacklanternsecurity.com"]
39
50
  assert dns_reconstructed.data == dns_data
51
+ assert dns_reconstructed.uuid == dns_event.uuid
52
+ assert dns_reconstructed.parent_uuid == module_test.scan.root_event.uuid
40
53
  assert dns_reconstructed.discovery_context == context_data
41
54
  assert dns_reconstructed.discovery_path == [context_data]
42
- assert dns_reconstructed.parent_chain == ["DNS_NAME:1e57014aa7b0715bca68e4f597204fc4e1e851fc"]
55
+ assert dns_reconstructed.parent_chain == [dns_json["uuid"]]
43
56
 
44
57
 
45
58
  class TestJSONSIEMFriendly(ModuleTestBase):
@@ -6,12 +6,12 @@ class TestLeakIX(ModuleTestBase):
6
6
 
7
7
  async def setup_before_prep(self, module_test):
8
8
  module_test.httpx_mock.add_response(
9
- url="https://leakix.net/host/1.2.3.4.5",
9
+ url="https://leakix.net/host/1.1.1.1",
10
10
  match_headers={"api-key": "asdf"},
11
11
  json={"title": "Not Found", "description": "Host not found"},
12
12
  )
13
13
  module_test.httpx_mock.add_response(
14
- url=f"https://leakix.net/api/subdomains/blacklanternsecurity.com",
14
+ url="https://leakix.net/api/subdomains/blacklanternsecurity.com",
15
15
  match_headers={"api-key": "asdf"},
16
16
  json=[
17
17
  {
@@ -31,7 +31,11 @@ class TestLeakIX_NoAPIKey(ModuleTestBase):
31
31
 
32
32
  async def setup_before_prep(self, module_test):
33
33
  module_test.httpx_mock.add_response(
34
- url=f"https://leakix.net/api/subdomains/blacklanternsecurity.com",
34
+ url="https://leakix.net/host/1.1.1.1",
35
+ json={"title": "Not Found", "description": "Host not found"},
36
+ )
37
+ module_test.httpx_mock.add_response(
38
+ url="https://leakix.net/api/subdomains/blacklanternsecurity.com",
35
39
  json=[
36
40
  {
37
41
  "subdomain": "asdf.blacklanternsecurity.com",
@@ -0,0 +1,76 @@
1
+ import asyncio
2
+ import time
3
+
4
+ from .base import ModuleTestBase
5
+
6
+
7
+ class TestMySQL(ModuleTestBase):
8
+ targets = ["evilcorp.com"]
9
+ skip_distro_tests = True
10
+
11
+ async def setup_before_prep(self, module_test):
12
+ process = await asyncio.create_subprocess_exec(
13
+ "docker",
14
+ "run",
15
+ "--name",
16
+ "bbot-test-mysql",
17
+ "--rm",
18
+ "-e",
19
+ "MYSQL_ROOT_PASSWORD=bbotislife",
20
+ "-e",
21
+ "MYSQL_DATABASE=bbot",
22
+ "-p",
23
+ "3306:3306",
24
+ "-d",
25
+ "mysql",
26
+ stdout=asyncio.subprocess.PIPE,
27
+ stderr=asyncio.subprocess.PIPE,
28
+ )
29
+ stdout, stderr = await process.communicate()
30
+
31
+ import aiomysql
32
+
33
+ # wait for the container to start
34
+ start_time = time.time()
35
+ while True:
36
+ try:
37
+ conn = await aiomysql.connect(user="root", password="bbotislife", db="bbot", host="localhost")
38
+ conn.close()
39
+ break
40
+ except Exception as e:
41
+ if time.time() - start_time > 60: # timeout after 60 seconds
42
+ self.log.error("MySQL server did not start in time.")
43
+ raise e
44
+ await asyncio.sleep(1)
45
+
46
+ if process.returncode != 0:
47
+ self.log.error(f"Failed to start MySQL server: {stderr.decode()}")
48
+
49
+ async def check(self, module_test, events):
50
+ import aiomysql
51
+
52
+ # Connect to the MySQL database
53
+ conn = await aiomysql.connect(user="root", password="bbotislife", db="bbot", host="localhost")
54
+
55
+ try:
56
+ async with conn.cursor() as cur:
57
+ await cur.execute("SELECT * FROM event")
58
+ events = await cur.fetchall()
59
+ assert len(events) == 3, "No events found in MySQL database"
60
+
61
+ await cur.execute("SELECT * FROM scan")
62
+ scans = await cur.fetchall()
63
+ assert len(scans) == 1, "No scans found in MySQL database"
64
+
65
+ await cur.execute("SELECT * FROM target")
66
+ targets = await cur.fetchall()
67
+ assert len(targets) == 1, "No targets found in MySQL database"
68
+ finally:
69
+ conn.close()
70
+ process = await asyncio.create_subprocess_exec(
71
+ "docker", "stop", "bbot-test-mysql", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
72
+ )
73
+ stdout, stderr = await process.communicate()
74
+
75
+ if process.returncode != 0:
76
+ raise Exception(f"Failed to stop MySQL server: {stderr.decode()}")
@@ -5,7 +5,7 @@ class TestMySSL(ModuleTestBase):
5
5
  async def setup_after_prep(self, module_test):
6
6
  module_test.module.abort_if = lambda e: False
7
7
  module_test.httpx_mock.add_response(
8
- url=f"https://myssl.com/api/v1/discover_sub_domain?domain=blacklanternsecurity.com",
8
+ url="https://myssl.com/api/v1/discover_sub_domain?domain=blacklanternsecurity.com",
9
9
  json={
10
10
  "code": 0,
11
11
  "data": [
@@ -41,4 +41,4 @@ class TestNeo4j(ModuleTestBase):
41
41
  module_test.monkeypatch.setattr("neo4j.AsyncGraphDatabase.driver", MockDriver)
42
42
 
43
43
  def check(self, module_test, events):
44
- assert self.neo4j_used == True
44
+ assert self.neo4j_used is True
@@ -10,16 +10,16 @@ class TestNewsletters(ModuleTestBase):
10
10
  modules_overrides = ["speculate", "httpx", "newsletters"]
11
11
 
12
12
  html_with_newsletter = """
13
- <input aria-required="true"
14
- class="form-input form-input-text required"
15
- data-at="form-email"
16
- data-describedby="form-validation-error-box-element-5"
17
- data-label-inside="Enter your email"
18
- id="field-5f329905b4bfe1027b44513f94b50363-0"
19
- name="Enter your email"
20
- placeholder="Enter your email"
21
- required=""
22
- title="Enter your email"
13
+ <input aria-required="true"
14
+ class="form-input form-input-text required"
15
+ data-at="form-email"
16
+ data-describedby="form-validation-error-box-element-5"
17
+ data-label-inside="Enter your email"
18
+ id="field-5f329905b4bfe1027b44513f94b50363-0"
19
+ name="Enter your email"
20
+ placeholder="Enter your email"
21
+ required=""
22
+ title="Enter your email"
23
23
  type="email" value=""/>
24
24
  """
25
25
 
@@ -33,11 +33,11 @@ class TestNewsletters(ModuleTestBase):
33
33
  """
34
34
 
35
35
  async def setup_after_prep(self, module_test):
36
- request_args = dict(uri="/found", headers={"test": "header"})
37
- respond_args = dict(response_data=self.html_with_newsletter)
36
+ request_args = {"uri": "/found", "headers": {"test": "header"}}
37
+ respond_args = {"response_data": self.html_with_newsletter}
38
38
  module_test.set_expect_requests(request_args, respond_args)
39
- request_args = dict(uri="/missing", headers={"test": "header"})
40
- respond_args = dict(response_data=self.html_without_newsletter)
39
+ request_args = {"uri": "/missing", "headers": {"test": "header"}}
40
+ respond_args = {"response_data": self.html_without_newsletter}
41
41
  module_test.set_expect_requests(request_args, respond_args)
42
42
 
43
43
  def check(self, module_test, events):
@@ -53,5 +53,5 @@ class TestNewsletters(ModuleTestBase):
53
53
  # Verify Negative Result (should skip this statement if correct)
54
54
  elif event.data["url"] == self.missing_tgt:
55
55
  missing = False
56
- assert found, f"NEWSLETTER 'Found' Error - Expect status of True but got False"
57
- assert missing, f"NEWSLETTER 'Missing' Error - Expect status of True but got False"
56
+ assert found, "NEWSLETTER 'Found' Error - Expect status of True but got False"
57
+ assert missing, "NEWSLETTER 'Missing' Error - Expect status of True but got False"
@@ -7,16 +7,17 @@ class TestNTLM(ModuleTestBase):
7
7
  config_overrides = {"modules": {"ntlm": {"try_all": True}}}
8
8
 
9
9
  async def setup_after_prep(self, module_test):
10
- request_args = dict(uri="/", headers={"test": "header"})
10
+ request_args = {"uri": "/", "headers": {"test": "header"}}
11
11
  module_test.set_expect_requests(request_args, {})
12
- request_args = dict(
13
- uri="/oab/", headers={"Authorization": "NTLM TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKAGFKAAAADw=="}
14
- )
15
- respond_args = dict(
16
- headers={
12
+ request_args = {
13
+ "uri": "/oab/",
14
+ "headers": {"Authorization": "NTLM TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKAGFKAAAADw=="},
15
+ }
16
+ respond_args = {
17
+ "headers": {
17
18
  "WWW-Authenticate": "NTLM TlRMTVNTUAACAAAABgAGADgAAAAVgoni89aZT4Q0mH0AAAAAAAAAAHYAdgA+AAAABgGxHQAAAA9WAE4ATwACAAYAVgBOAE8AAQAKAEUAWABDADAAMQAEABIAdgBuAG8ALgBsAG8AYwBhAGwAAwAeAEUAWABDADAAMQAuAHYAbgBvAC4AbABvAGMAYQBsAAUAEgB2AG4AbwAuAGwAbwBjAGEAbAAHAAgAXxo0p/6L2QEAAAAA"
18
19
  }
19
- )
20
+ }
20
21
  module_test.set_expect_requests(request_args, respond_args)
21
22
 
22
23
  def check(self, module_test, events):
@@ -167,7 +167,7 @@ class TestOAUTH(ModuleTestBase):
167
167
  async def setup_after_prep(self, module_test):
168
168
  await module_test.mock_dns({"evilcorp.com": {"A": ["127.0.0.1"]}})
169
169
  module_test.httpx_mock.add_response(
170
- url=f"https://login.microsoftonline.com/getuserrealm.srf?login=test@evilcorp.com",
170
+ url="https://login.microsoftonline.com/getuserrealm.srf?login=test@evilcorp.com",
171
171
  json=Azure_Realm.response_json,
172
172
  )
173
173
  module_test.httpx_mock.add_response(
@@ -4,7 +4,7 @@ from .base import ModuleTestBase
4
4
  class TestOTX(ModuleTestBase):
5
5
  async def setup_after_prep(self, module_test):
6
6
  module_test.httpx_mock.add_response(
7
- url=f"https://otx.alienvault.com/api/v1/indicators/domain/blacklanternsecurity.com/passive_dns",
7
+ url="https://otx.alienvault.com/api/v1/indicators/domain/blacklanternsecurity.com/passive_dns",
8
8
  json={
9
9
  "passive_dns": [
10
10
  {
@@ -28,7 +28,7 @@ class TestParamminer_Cookies(Paramminer_Headers):
28
28
  module_test.monkeypatch.setattr(
29
29
  helper.HttpCompare, "gen_cache_buster", lambda *args, **kwargs: {"AAAAAA": "1"}
30
30
  )
31
- expect_args = dict(headers={"Cookie": "admincookie=AAAAAAAAAAAAAA"})
31
+ expect_args = {"headers": {"Cookie": "admincookie=AAAAAAAAAAAAAA"}}
32
32
  respond_args = {"response_data": self.cookies_body_match}
33
33
  module_test.set_expect_requests(expect_args=expect_args, respond_args=respond_args)
34
34
 
@@ -36,7 +36,6 @@ class TestParamminer_Cookies(Paramminer_Headers):
36
36
  module_test.set_expect_requests(respond_args=respond_args)
37
37
 
38
38
  def check(self, module_test, events):
39
-
40
39
  found_reflected_cookie = False
41
40
  false_positive_match = False
42
41