bbot 2.3.0.5376rc0__py3-none-any.whl → 2.3.0.5382rc0__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 (143) hide show
  1. bbot/__init__.py +1 -1
  2. bbot/cli.py +2 -2
  3. bbot/core/config/logger.py +1 -1
  4. bbot/core/core.py +1 -1
  5. bbot/core/event/base.py +13 -13
  6. bbot/core/helpers/command.py +4 -4
  7. bbot/core/helpers/depsinstaller/installer.py +5 -5
  8. bbot/core/helpers/diff.py +7 -7
  9. bbot/core/helpers/dns/brute.py +1 -1
  10. bbot/core/helpers/dns/dns.py +1 -1
  11. bbot/core/helpers/dns/engine.py +4 -4
  12. bbot/core/helpers/files.py +1 -1
  13. bbot/core/helpers/helper.py +3 -1
  14. bbot/core/helpers/interactsh.py +3 -3
  15. bbot/core/helpers/misc.py +11 -11
  16. bbot/core/helpers/regex.py +1 -1
  17. bbot/core/helpers/regexes.py +3 -3
  18. bbot/core/helpers/validators.py +1 -1
  19. bbot/core/helpers/web/client.py +1 -1
  20. bbot/core/helpers/web/engine.py +1 -1
  21. bbot/core/helpers/web/web.py +2 -2
  22. bbot/core/helpers/wordcloud.py +5 -5
  23. bbot/core/modules.py +21 -21
  24. bbot/modules/azure_tenant.py +2 -2
  25. bbot/modules/base.py +16 -16
  26. bbot/modules/bypass403.py +5 -5
  27. bbot/modules/c99.py +1 -1
  28. bbot/modules/columbus.py +1 -1
  29. bbot/modules/deadly/ffuf.py +8 -8
  30. bbot/modules/deadly/nuclei.py +1 -1
  31. bbot/modules/deadly/vhost.py +3 -3
  32. bbot/modules/dnsbimi.py +1 -1
  33. bbot/modules/dnsdumpster.py +2 -2
  34. bbot/modules/dockerhub.py +1 -1
  35. bbot/modules/extractous.py +1 -1
  36. bbot/modules/filedownload.py +1 -1
  37. bbot/modules/generic_ssrf.py +3 -3
  38. bbot/modules/github_workflows.py +1 -1
  39. bbot/modules/gowitness.py +7 -7
  40. bbot/modules/host_header.py +5 -5
  41. bbot/modules/httpx.py +1 -1
  42. bbot/modules/iis_shortnames.py +6 -6
  43. bbot/modules/internal/cloudcheck.py +5 -5
  44. bbot/modules/internal/dnsresolve.py +7 -7
  45. bbot/modules/internal/excavate.py +5 -5
  46. bbot/modules/internal/speculate.py +4 -4
  47. bbot/modules/ipneighbor.py +1 -1
  48. bbot/modules/jadx.py +1 -1
  49. bbot/modules/newsletters.py +2 -2
  50. bbot/modules/output/asset_inventory.py +6 -6
  51. bbot/modules/output/base.py +1 -1
  52. bbot/modules/output/csv.py +1 -1
  53. bbot/modules/output/stdout.py +2 -2
  54. bbot/modules/paramminer_headers.py +3 -3
  55. bbot/modules/portscan.py +3 -3
  56. bbot/modules/report/asn.py +11 -11
  57. bbot/modules/robots.py +3 -3
  58. bbot/modules/securitytxt.py +1 -1
  59. bbot/modules/sitedossier.py +1 -1
  60. bbot/modules/social.py +1 -1
  61. bbot/modules/subdomainradar.py +1 -1
  62. bbot/modules/telerik.py +7 -7
  63. bbot/modules/templates/bucket.py +1 -1
  64. bbot/modules/templates/github.py +1 -1
  65. bbot/modules/templates/shodan.py +1 -1
  66. bbot/modules/templates/subdomain_enum.py +1 -1
  67. bbot/modules/templates/webhook.py +1 -1
  68. bbot/modules/trufflehog.py +1 -1
  69. bbot/modules/url_manipulation.py +3 -3
  70. bbot/modules/urlscan.py +1 -1
  71. bbot/modules/viewdns.py +1 -1
  72. bbot/modules/wafw00f.py +1 -1
  73. bbot/scanner/preset/args.py +10 -10
  74. bbot/scanner/preset/preset.py +9 -9
  75. bbot/scanner/scanner.py +17 -17
  76. bbot/scanner/target.py +1 -1
  77. bbot/scripts/docs.py +1 -1
  78. bbot/test/bbot_fixtures.py +1 -1
  79. bbot/test/conftest.py +1 -1
  80. bbot/test/run_tests.sh +4 -4
  81. bbot/test/test_step_1/test_bbot_fastapi.py +2 -2
  82. bbot/test/test_step_1/test_cli.py +56 -56
  83. bbot/test/test_step_1/test_dns.py +15 -15
  84. bbot/test/test_step_1/test_engine.py +17 -17
  85. bbot/test/test_step_1/test_events.py +22 -22
  86. bbot/test/test_step_1/test_helpers.py +26 -26
  87. bbot/test/test_step_1/test_manager_scope_accuracy.py +306 -306
  88. bbot/test/test_step_1/test_modules_basic.py +52 -53
  89. bbot/test/test_step_1/test_presets.py +81 -81
  90. bbot/test/test_step_1/test_regexes.py +5 -5
  91. bbot/test/test_step_1/test_scan.py +4 -4
  92. bbot/test/test_step_1/test_target.py +25 -25
  93. bbot/test/test_step_1/test_web.py +5 -5
  94. bbot/test/test_step_2/module_tests/base.py +6 -6
  95. bbot/test/test_step_2/module_tests/test_module_anubisdb.py +1 -1
  96. bbot/test/test_step_2/module_tests/test_module_azure_realm.py +1 -1
  97. bbot/test/test_step_2/module_tests/test_module_baddns.py +6 -6
  98. bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +2 -4
  99. bbot/test/test_step_2/module_tests/test_module_bevigil.py +4 -4
  100. bbot/test/test_step_2/module_tests/test_module_binaryedge.py +2 -2
  101. bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +2 -2
  102. bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +1 -1
  103. bbot/test/test_step_2/module_tests/test_module_builtwith.py +2 -2
  104. bbot/test/test_step_2/module_tests/test_module_c99.py +9 -9
  105. bbot/test/test_step_2/module_tests/test_module_columbus.py +1 -1
  106. bbot/test/test_step_2/module_tests/test_module_credshed.py +2 -2
  107. bbot/test/test_step_2/module_tests/test_module_dehashed.py +1 -1
  108. bbot/test/test_step_2/module_tests/test_module_digitorus.py +1 -1
  109. bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +8 -8
  110. bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +2 -2
  111. bbot/test/test_step_2/module_tests/test_module_excavate.py +10 -10
  112. bbot/test/test_step_2/module_tests/test_module_extractous.py +9 -9
  113. bbot/test/test_step_2/module_tests/test_module_filedownload.py +14 -14
  114. bbot/test/test_step_2/module_tests/test_module_git_clone.py +2 -2
  115. bbot/test/test_step_2/module_tests/test_module_gowitness.py +4 -4
  116. bbot/test/test_step_2/module_tests/test_module_host_header.py +1 -1
  117. bbot/test/test_step_2/module_tests/test_module_http.py +4 -4
  118. bbot/test/test_step_2/module_tests/test_module_httpx.py +7 -7
  119. bbot/test/test_step_2/module_tests/test_module_leakix.py +2 -2
  120. bbot/test/test_step_2/module_tests/test_module_myssl.py +1 -1
  121. bbot/test/test_step_2/module_tests/test_module_neo4j.py +1 -1
  122. bbot/test/test_step_2/module_tests/test_module_newsletters.py +6 -6
  123. bbot/test/test_step_2/module_tests/test_module_ntlm.py +7 -7
  124. bbot/test/test_step_2/module_tests/test_module_oauth.py +1 -1
  125. bbot/test/test_step_2/module_tests/test_module_otx.py +1 -1
  126. bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +1 -1
  127. bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +2 -2
  128. bbot/test/test_step_2/module_tests/test_module_portscan.py +3 -3
  129. bbot/test/test_step_2/module_tests/test_module_postgres.py +1 -1
  130. bbot/test/test_step_2/module_tests/test_module_rapiddns.py +9 -9
  131. bbot/test/test_step_2/module_tests/test_module_sitedossier.py +2 -2
  132. bbot/test/test_step_2/module_tests/test_module_smuggler.py +1 -1
  133. bbot/test/test_step_2/module_tests/test_module_speculate.py +2 -6
  134. bbot/test/test_step_2/module_tests/test_module_splunk.py +4 -4
  135. bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +1 -1
  136. bbot/test/test_step_2/module_tests/test_module_subdomains.py +1 -1
  137. bbot/test/test_step_2/module_tests/test_module_trufflehog.py +2 -2
  138. bbot/test/test_step_2/module_tests/test_module_wayback.py +1 -1
  139. {bbot-2.3.0.5376rc0.dist-info → bbot-2.3.0.5382rc0.dist-info}/METADATA +2 -2
  140. {bbot-2.3.0.5376rc0.dist-info → bbot-2.3.0.5382rc0.dist-info}/RECORD +143 -143
  141. {bbot-2.3.0.5376rc0.dist-info → bbot-2.3.0.5382rc0.dist-info}/LICENSE +0 -0
  142. {bbot-2.3.0.5376rc0.dist-info → bbot-2.3.0.5382rc0.dist-info}/WHEEL +0 -0
  143. {bbot-2.3.0.5376rc0.dist-info → bbot-2.3.0.5382rc0.dist-info}/entry_points.txt +0 -0
@@ -23,27 +23,27 @@ async def test_modules_basic_checks(events, httpx_mock):
23
23
  localhost = scan.make_event("127.0.0.1", parent=scan.root_event)
24
24
  # ip addresses should be accepted
25
25
  result, reason = base_output_module_1._event_precheck(localhost)
26
- assert result == True
26
+ assert result is True
27
27
  assert reason == "precheck succeeded"
28
28
  # internal events should be rejected
29
29
  localhost._internal = True
30
30
  result, reason = base_output_module_1._event_precheck(localhost)
31
- assert result == False
31
+ assert result is False
32
32
  assert reason == "_internal is True"
33
33
  localhost._internal = False
34
34
  result, reason = base_output_module_1._event_precheck(localhost)
35
- assert result == True
35
+ assert result is True
36
36
  assert reason == "precheck succeeded"
37
37
  # unwatched events should be rejected
38
38
  dns_name = scan.make_event("evilcorp.com", parent=scan.root_event)
39
39
  result, reason = base_output_module_1._event_precheck(dns_name)
40
- assert result == False
40
+ assert result is False
41
41
  assert reason == "its type is not in watched_events"
42
42
  # omitted events matching watched types should be accepted
43
43
  url_unverified = scan.make_event("http://127.0.0.1", "URL_UNVERIFIED", parent=scan.root_event)
44
44
  url_unverified._omit = True
45
45
  result, reason = base_output_module_1._event_precheck(url_unverified)
46
- assert result == True
46
+ assert result is True
47
47
  assert reason == "its type is explicitly in watched_events"
48
48
 
49
49
  base_output_module_2 = BaseOutputModule(scan)
@@ -51,42 +51,42 @@ async def test_modules_basic_checks(events, httpx_mock):
51
51
  # normal events should be accepted
52
52
  localhost = scan.make_event("127.0.0.1", parent=scan.root_event)
53
53
  result, reason = base_output_module_2._event_precheck(localhost)
54
- assert result == True
54
+ assert result is True
55
55
  assert reason == "precheck succeeded"
56
56
  # internal events should be rejected
57
57
  localhost._internal = True
58
58
  result, reason = base_output_module_2._event_precheck(localhost)
59
- assert result == False
59
+ assert result is False
60
60
  assert reason == "_internal is True"
61
61
  localhost._internal = False
62
62
  result, reason = base_output_module_2._event_precheck(localhost)
63
- assert result == True
63
+ assert result is True
64
64
  assert reason == "precheck succeeded"
65
65
  # omitted events should be rejected
66
66
  localhost._omit = True
67
67
  result, reason = base_output_module_2._event_precheck(localhost)
68
- assert result == False
68
+ assert result is False
69
69
  assert reason == "_omit is True"
70
70
  # normal event should be accepted
71
71
  url_unverified = scan.make_event("http://127.0.0.1", "URL_UNVERIFIED", parent=scan.root_event)
72
72
  result, reason = base_output_module_2._event_precheck(url_unverified)
73
- assert result == True
73
+ assert result is True
74
74
  assert reason == "precheck succeeded"
75
75
  # omitted event types should be marked during scan egress
76
76
  await scan.egress_module.handle_event(url_unverified)
77
77
  result, reason = base_output_module_2._event_precheck(url_unverified)
78
- assert result == False
78
+ assert result is False
79
79
  assert reason == "_omit is True"
80
80
  # omitted events that are targets should be accepted
81
81
  dns_name = scan.make_event("evilcorp.com", "DNS_NAME", parent=scan.root_event)
82
82
  dns_name._omit = True
83
83
  result, reason = base_output_module_2._event_precheck(dns_name)
84
- assert result == False
84
+ assert result is False
85
85
  assert reason == "_omit is True"
86
86
  # omitted results that are targets should be accepted
87
87
  dns_name.add_tag("target")
88
88
  result, reason = base_output_module_2._event_precheck(dns_name)
89
- assert result == True
89
+ assert result is True
90
90
  assert reason == "it's a target"
91
91
 
92
92
  # common event filtering tests
@@ -97,18 +97,18 @@ async def test_modules_basic_checks(events, httpx_mock):
97
97
  # base cases
98
98
  base_module._watched_events = None
99
99
  base_module.watched_events = ["*"]
100
- assert base_module._event_precheck(events.emoji)[0] == True
100
+ assert base_module._event_precheck(events.emoji)[0] is True
101
101
  base_module._watched_events = None
102
102
  base_module.watched_events = ["IP_ADDRESS"]
103
- assert base_module._event_precheck(events.ipv4)[0] == True
104
- assert base_module._event_precheck(events.domain)[0] == False
105
- assert base_module._event_precheck(events.localhost)[0] == True
106
- assert base_module._event_precheck(localhost2)[0] == True
103
+ assert base_module._event_precheck(events.ipv4)[0] is True
104
+ assert base_module._event_precheck(events.domain)[0] is False
105
+ assert base_module._event_precheck(events.localhost)[0] is True
106
+ assert base_module._event_precheck(localhost2)[0] is True
107
107
  # target only
108
108
  base_module.target_only = True
109
- assert base_module._event_precheck(localhost2)[0] == False
109
+ assert base_module._event_precheck(localhost2)[0] is False
110
110
  localhost2.add_tag("target")
111
- assert base_module._event_precheck(localhost2)[0] == True
111
+ assert base_module._event_precheck(localhost2)[0] is True
112
112
  base_module.target_only = False
113
113
 
114
114
  # in scope only
@@ -147,11 +147,11 @@ async def test_modules_basic_checks(events, httpx_mock):
147
147
  for flag in flags:
148
148
  all_flags.add(flag)
149
149
  if preloaded["type"] == "scan":
150
- assert ("active" in flags and not "passive" in flags) or (
151
- not "active" in flags and "passive" in flags
150
+ assert ("active" in flags and "passive" not in flags) or (
151
+ "active" not in flags and "passive" in flags
152
152
  ), f'module "{module_name}" must have either "active" or "passive" flag'
153
- assert ("safe" in flags and not "aggressive" in flags) or (
154
- not "safe" in flags and "aggressive" in flags
153
+ assert ("safe" in flags and "aggressive" not in flags) or (
154
+ "safe" not in flags and "aggressive" in flags
155
155
  ), f'module "{module_name}" must have either "safe" or "aggressive" flag'
156
156
  assert not (
157
157
  "web-basic" in flags and "web-thorough" in flags
@@ -174,15 +174,15 @@ async def test_modules_basic_checks(events, httpx_mock):
174
174
 
175
175
  assert type(watched_events) == list
176
176
  assert type(produced_events) == list
177
- if not preloaded.get("type", "") in ("internal",):
177
+ if preloaded.get("type", "") not in ("internal",):
178
178
  assert watched_events, f"{module_name}.watched_events must not be empty"
179
179
  assert type(watched_events) == list, f"{module_name}.watched_events must be of type list"
180
180
  assert type(produced_events) == list, f"{module_name}.produced_events must be of type list"
181
181
  assert all(
182
- [type(t) == str for t in watched_events]
182
+ type(t) == str for t in watched_events
183
183
  ), f"{module_name}.watched_events entries must be of type string"
184
184
  assert all(
185
- [type(t) == str for t in produced_events]
185
+ type(t) == str for t in produced_events
186
186
  ), f"{module_name}.produced_events entries must be of type string"
187
187
 
188
188
  assert type(preloaded.get("deps_pip", [])) == list, f"{module_name}.deps_pip must be of type list"
@@ -268,35 +268,35 @@ async def test_modules_basic_perhostonly(bbot_scanner):
268
268
  valid_5, reason_5 = await module._event_postcheck(url_5)
269
269
 
270
270
  if mod_name == "mod_normal":
271
- assert valid_1 == True
272
- assert valid_2 == True
273
- assert valid_3 == True
274
- assert valid_4 == True
275
- assert valid_5 == True
271
+ assert valid_1 is True
272
+ assert valid_2 is True
273
+ assert valid_3 is True
274
+ assert valid_4 is True
275
+ assert valid_5 is True
276
276
  elif mod_name == "mod_host_only":
277
- assert valid_1 == True
278
- assert valid_2 == False
277
+ assert valid_1 is True
278
+ assert valid_2 is False
279
279
  assert "per_host_only=True" in reason_2
280
- assert valid_3 == False
280
+ assert valid_3 is False
281
281
  assert "per_host_only=True" in reason_3
282
- assert valid_4 == True
283
- assert valid_5 == True
282
+ assert valid_4 is True
283
+ assert valid_5 is True
284
284
  elif mod_name == "mod_hostport_only":
285
- assert valid_1 == True
286
- assert valid_2 == False
285
+ assert valid_1 is True
286
+ assert valid_2 is False
287
287
  assert "per_hostport_only=True" in reason_2
288
- assert valid_3 == True
289
- assert valid_4 == True
290
- assert valid_5 == True
288
+ assert valid_3 is True
289
+ assert valid_4 is True
290
+ assert valid_5 is True
291
291
  elif mod_name == "mod_domain_only":
292
- assert valid_1 == True
293
- assert valid_2 == False
292
+ assert valid_1 is True
293
+ assert valid_2 is False
294
294
  assert "per_domain_only=True" in reason_2
295
- assert valid_3 == False
295
+ assert valid_3 is False
296
296
  assert "per_domain_only=True" in reason_3
297
- assert valid_4 == False
297
+ assert valid_4 is False
298
298
  assert "per_domain_only=True" in reason_4
299
- assert valid_5 == True
299
+ assert valid_5 is True
300
300
 
301
301
  await scan._cleanup()
302
302
 
@@ -331,15 +331,15 @@ async def test_modules_basic_perdomainonly(bbot_scanner, monkeypatch):
331
331
  valid_1, reason_1 = await module._event_postcheck(url_1)
332
332
  valid_2, reason_2 = await module._event_postcheck(url_2)
333
333
 
334
- if module.per_domain_only == True:
335
- assert valid_1 == True
336
- assert valid_2 == False
334
+ if module.per_domain_only is True:
335
+ assert valid_1 is True
336
+ assert valid_2 is False
337
337
  assert hash("evilcorp.com") in module._per_host_tracker
338
338
  assert reason_2 == "per_domain_only enabled and already seen domain"
339
339
 
340
340
  else:
341
- assert valid_1 == True
342
- assert valid_2 == True
341
+ assert valid_1 is True
342
+ assert valid_2 is True
343
343
 
344
344
  await per_domain_scan._cleanup()
345
345
 
@@ -397,7 +397,6 @@ async def test_modules_basic_stats(helpers, events, bbot_scanner, httpx_mock, mo
397
397
  "ORG_STUB": 1,
398
398
  "URL_UNVERIFIED": 1,
399
399
  "FINDING": 1,
400
- "ORG_STUB": 1,
401
400
  }
402
401
 
403
402
  assert set(scan.stats.module_stats) == {"speculate", "host", "TARGET", "python", "dummy", "dnsresolve"}
@@ -16,7 +16,7 @@ from bbot.scanner import Scanner, Preset
16
16
  def test_preset_descriptions():
17
17
  # ensure very preset has a description
18
18
  preset = Preset()
19
- for yaml_file, (loaded_preset, category, preset_path, original_filename) in preset.all_presets.items():
19
+ for (loaded_preset, category, preset_path, original_filename) in preset.all_presets.values():
20
20
  assert (
21
21
  loaded_preset.description
22
22
  ), f'Preset "{loaded_preset.name}" at {original_filename} does not have a description.'
@@ -174,15 +174,15 @@ def test_preset_scope():
174
174
 
175
175
  # test target merging
176
176
  scan = Scanner("1.2.3.4", preset=Preset.from_dict({"target": ["evilcorp.com"]}))
177
- assert set([str(h) for h in scan.preset.target.seeds.hosts]) == {"1.2.3.4/32", "evilcorp.com"}
178
- assert set([e.data for e in scan.target.seeds]) == {"1.2.3.4", "evilcorp.com"}
179
- assert set([e.data for e in scan.target.whitelist]) == {"1.2.3.4", "evilcorp.com"}
177
+ assert {str(h) for h in scan.preset.target.seeds.hosts} == {"1.2.3.4/32", "evilcorp.com"}
178
+ assert {e.data for e in scan.target.seeds} == {"1.2.3.4", "evilcorp.com"}
179
+ assert {e.data for e in scan.target.whitelist} == {"1.2.3.4", "evilcorp.com"}
180
180
 
181
181
  blank_preset = Preset()
182
182
  blank_preset = blank_preset.bake()
183
183
  assert not blank_preset.target.seeds
184
184
  assert not blank_preset.target.whitelist
185
- assert blank_preset.strict_scope == False
185
+ assert blank_preset.strict_scope is False
186
186
 
187
187
  preset1 = Preset(
188
188
  "evilcorp.com",
@@ -194,13 +194,13 @@ def test_preset_scope():
194
194
 
195
195
  # make sure target logic works as expected
196
196
  assert "evilcorp.com" in preset1_baked.target.seeds
197
- assert not "evilcorp.com" in preset1_baked.target.whitelist
197
+ assert "evilcorp.com" not in preset1_baked.target.whitelist
198
198
  assert "asdf.evilcorp.com" in preset1_baked.target.seeds
199
- assert not "asdf.evilcorp.com" in preset1_baked.target.whitelist
199
+ assert "asdf.evilcorp.com" not in preset1_baked.target.whitelist
200
200
  assert "asdf.evilcorp.ce" in preset1_baked.whitelist
201
201
  assert "evilcorp.ce" in preset1_baked.whitelist
202
202
  assert "test.www.evilcorp.ce" in preset1_baked.blacklist
203
- assert not "evilcorp.ce" in preset1_baked.blacklist
203
+ assert "evilcorp.ce" not in preset1_baked.blacklist
204
204
  assert preset1_baked.in_scope("www.evilcorp.ce")
205
205
  assert not preset1_baked.in_scope("evilcorp.com")
206
206
  assert not preset1_baked.in_scope("asdf.test.www.evilcorp.ce")
@@ -228,20 +228,20 @@ def test_preset_scope():
228
228
  assert "www.evilcorp.ce" in preset1_baked.target.seeds
229
229
  assert "evilcorp.org" in preset1_baked.target.seeds
230
230
  # strict scope is enabled
231
- assert not "asdf.www.evilcorp.ce" in preset1_baked.target.seeds
232
- assert not "asdf.evilcorp.org" in preset1_baked.target.seeds
233
- assert not "asdf.evilcorp.com" in preset1_baked.target.seeds
234
- assert not "asdf.www.evilcorp.ce" in preset1_baked.target.seeds
231
+ assert "asdf.www.evilcorp.ce" not in preset1_baked.target.seeds
232
+ assert "asdf.evilcorp.org" not in preset1_baked.target.seeds
233
+ assert "asdf.evilcorp.com" not in preset1_baked.target.seeds
234
+ assert "asdf.www.evilcorp.ce" not in preset1_baked.target.seeds
235
235
  assert "evilcorp.ce" in preset1_baked.whitelist
236
236
  assert "evilcorp.de" in preset1_baked.whitelist
237
- assert not "asdf.evilcorp.de" in preset1_baked.whitelist
238
- assert not "asdf.evilcorp.ce" in preset1_baked.whitelist
237
+ assert "asdf.evilcorp.de" not in preset1_baked.whitelist
238
+ assert "asdf.evilcorp.ce" not in preset1_baked.whitelist
239
239
  # blacklist should be merged, strict scope does not apply
240
240
  assert "test.www.evilcorp.ce" in preset1_baked.blacklist
241
241
  assert "test.www.evilcorp.de" in preset1_baked.blacklist
242
242
  assert "asdf.test.www.evilcorp.ce" in preset1_baked.blacklist
243
243
  assert "asdf.test.www.evilcorp.de" in preset1_baked.blacklist
244
- assert not "asdf.test.www.evilcorp.org" in preset1_baked.blacklist
244
+ assert "asdf.test.www.evilcorp.org" not in preset1_baked.blacklist
245
245
  # only the base domain of evilcorp.de should be in scope
246
246
  assert not preset1_baked.in_scope("evilcorp.com")
247
247
  assert not preset1_baked.in_scope("evilcorp.org")
@@ -290,7 +290,7 @@ def test_preset_scope():
290
290
  assert not preset_nowhitelist_baked.in_scope("1.2.3.4/24")
291
291
 
292
292
  assert "www.evilcorp.org" in preset_whitelist_baked.target.seeds
293
- assert not "www.evilcorp.org" in preset_whitelist_baked.target.whitelist
293
+ assert "www.evilcorp.org" not in preset_whitelist_baked.target.whitelist
294
294
  assert "1.2.3.4" in preset_whitelist_baked.whitelist
295
295
  assert not preset_whitelist_baked.in_scope("www.evilcorp.org")
296
296
  assert not preset_whitelist_baked.in_scope("www.evilcorp.de")
@@ -303,15 +303,15 @@ def test_preset_scope():
303
303
  assert preset_whitelist_baked.whitelisted("1.2.3.4/28")
304
304
  assert preset_whitelist_baked.whitelisted("1.2.3.4/24")
305
305
 
306
- assert set([e.data for e in preset_nowhitelist_baked.seeds]) == {"evilcorp.com"}
307
- assert set([e.data for e in preset_nowhitelist_baked.whitelist]) == {"evilcorp.com"}
308
- assert set([e.data for e in preset_whitelist_baked.seeds]) == {"evilcorp.org"}
309
- assert set([e.data for e in preset_whitelist_baked.whitelist]) == {"1.2.3.0/24", "http://evilcorp.net/"}
306
+ assert {e.data for e in preset_nowhitelist_baked.seeds} == {"evilcorp.com"}
307
+ assert {e.data for e in preset_nowhitelist_baked.whitelist} == {"evilcorp.com"}
308
+ assert {e.data for e in preset_whitelist_baked.seeds} == {"evilcorp.org"}
309
+ assert {e.data for e in preset_whitelist_baked.whitelist} == {"1.2.3.0/24", "http://evilcorp.net/"}
310
310
 
311
311
  preset_nowhitelist.merge(preset_whitelist)
312
312
  preset_nowhitelist_baked = preset_nowhitelist.bake()
313
- assert set([e.data for e in preset_nowhitelist_baked.seeds]) == {"evilcorp.com", "evilcorp.org"}
314
- assert set([e.data for e in preset_nowhitelist_baked.whitelist]) == {"1.2.3.0/24", "http://evilcorp.net/"}
313
+ assert {e.data for e in preset_nowhitelist_baked.seeds} == {"evilcorp.com", "evilcorp.org"}
314
+ assert {e.data for e in preset_nowhitelist_baked.whitelist} == {"1.2.3.0/24", "http://evilcorp.net/"}
315
315
  assert "www.evilcorp.org" in preset_nowhitelist_baked.seeds
316
316
  assert "www.evilcorp.com" in preset_nowhitelist_baked.seeds
317
317
  assert "1.2.3.4" in preset_nowhitelist_baked.whitelist
@@ -325,12 +325,12 @@ def test_preset_scope():
325
325
  preset_whitelist = Preset("evilcorp.org", whitelist=["1.2.3.4/24"])
326
326
  preset_whitelist.merge(preset_nowhitelist)
327
327
  preset_whitelist_baked = preset_whitelist.bake()
328
- assert set([e.data for e in preset_whitelist_baked.seeds]) == {"evilcorp.com", "evilcorp.org"}
329
- assert set([e.data for e in preset_whitelist_baked.whitelist]) == {"1.2.3.0/24"}
328
+ assert {e.data for e in preset_whitelist_baked.seeds} == {"evilcorp.com", "evilcorp.org"}
329
+ assert {e.data for e in preset_whitelist_baked.whitelist} == {"1.2.3.0/24"}
330
330
  assert "www.evilcorp.org" in preset_whitelist_baked.seeds
331
331
  assert "www.evilcorp.com" in preset_whitelist_baked.seeds
332
- assert not "www.evilcorp.org" in preset_whitelist_baked.target.whitelist
333
- assert not "www.evilcorp.com" in preset_whitelist_baked.target.whitelist
332
+ assert "www.evilcorp.org" not in preset_whitelist_baked.target.whitelist
333
+ assert "www.evilcorp.com" not in preset_whitelist_baked.target.whitelist
334
334
  assert "1.2.3.4" in preset_whitelist_baked.whitelist
335
335
  assert not preset_whitelist_baked.in_scope("www.evilcorp.org")
336
336
  assert not preset_whitelist_baked.in_scope("www.evilcorp.com")
@@ -342,16 +342,16 @@ def test_preset_scope():
342
342
  preset_nowhitelist2 = Preset("evilcorp.de")
343
343
  preset_nowhitelist1_baked = preset_nowhitelist1.bake()
344
344
  preset_nowhitelist2_baked = preset_nowhitelist2.bake()
345
- assert set([e.data for e in preset_nowhitelist1_baked.seeds]) == {"evilcorp.com"}
346
- assert set([e.data for e in preset_nowhitelist2_baked.seeds]) == {"evilcorp.de"}
347
- assert set([e.data for e in preset_nowhitelist1_baked.whitelist]) == {"evilcorp.com"}
348
- assert set([e.data for e in preset_nowhitelist2_baked.whitelist]) == {"evilcorp.de"}
345
+ assert {e.data for e in preset_nowhitelist1_baked.seeds} == {"evilcorp.com"}
346
+ assert {e.data for e in preset_nowhitelist2_baked.seeds} == {"evilcorp.de"}
347
+ assert {e.data for e in preset_nowhitelist1_baked.whitelist} == {"evilcorp.com"}
348
+ assert {e.data for e in preset_nowhitelist2_baked.whitelist} == {"evilcorp.de"}
349
349
  preset_nowhitelist1.merge(preset_nowhitelist2)
350
350
  preset_nowhitelist1_baked = preset_nowhitelist1.bake()
351
- assert set([e.data for e in preset_nowhitelist1_baked.seeds]) == {"evilcorp.com", "evilcorp.de"}
352
- assert set([e.data for e in preset_nowhitelist2_baked.seeds]) == {"evilcorp.de"}
353
- assert set([e.data for e in preset_nowhitelist1_baked.whitelist]) == {"evilcorp.com", "evilcorp.de"}
354
- assert set([e.data for e in preset_nowhitelist2_baked.whitelist]) == {"evilcorp.de"}
351
+ assert {e.data for e in preset_nowhitelist1_baked.seeds} == {"evilcorp.com", "evilcorp.de"}
352
+ assert {e.data for e in preset_nowhitelist2_baked.seeds} == {"evilcorp.de"}
353
+ assert {e.data for e in preset_nowhitelist1_baked.whitelist} == {"evilcorp.com", "evilcorp.de"}
354
+ assert {e.data for e in preset_nowhitelist2_baked.whitelist} == {"evilcorp.de"}
355
355
  assert "www.evilcorp.com" in preset_nowhitelist1_baked.seeds
356
356
  assert "www.evilcorp.de" in preset_nowhitelist1_baked.seeds
357
357
  assert "www.evilcorp.com" in preset_nowhitelist1_baked.target.seeds
@@ -370,10 +370,10 @@ def test_preset_scope():
370
370
  preset_nowhitelist2.merge(preset_nowhitelist1)
371
371
  preset_nowhitelist1_baked = preset_nowhitelist1.bake()
372
372
  preset_nowhitelist2_baked = preset_nowhitelist2.bake()
373
- assert set([e.data for e in preset_nowhitelist1_baked.seeds]) == {"evilcorp.com"}
374
- assert set([e.data for e in preset_nowhitelist2_baked.seeds]) == {"evilcorp.com", "evilcorp.de"}
375
- assert set([e.data for e in preset_nowhitelist1_baked.whitelist]) == {"evilcorp.com"}
376
- assert set([e.data for e in preset_nowhitelist2_baked.whitelist]) == {"evilcorp.com", "evilcorp.de"}
373
+ assert {e.data for e in preset_nowhitelist1_baked.seeds} == {"evilcorp.com"}
374
+ assert {e.data for e in preset_nowhitelist2_baked.seeds} == {"evilcorp.com", "evilcorp.de"}
375
+ assert {e.data for e in preset_nowhitelist1_baked.whitelist} == {"evilcorp.com"}
376
+ assert {e.data for e in preset_nowhitelist2_baked.whitelist} == {"evilcorp.com", "evilcorp.de"}
377
377
 
378
378
 
379
379
  @pytest.mark.asyncio
@@ -387,30 +387,30 @@ async def test_preset_logging():
387
387
 
388
388
  try:
389
389
  silent_preset = Preset(silent=True)
390
- assert silent_preset.silent == True
391
- assert silent_preset.debug == False
392
- assert silent_preset.verbose == False
390
+ assert silent_preset.silent is True
391
+ assert silent_preset.debug is False
392
+ assert silent_preset.verbose is False
393
393
  assert original_log_level == CORE.logger.log_level
394
394
  debug_preset = Preset(debug=True)
395
- assert debug_preset.silent == False
396
- assert debug_preset.debug == True
397
- assert debug_preset.verbose == False
395
+ assert debug_preset.silent is False
396
+ assert debug_preset.debug is True
397
+ assert debug_preset.verbose is False
398
398
  assert original_log_level == CORE.logger.log_level
399
399
  verbose_preset = Preset(verbose=True)
400
- assert verbose_preset.silent == False
401
- assert verbose_preset.debug == False
402
- assert verbose_preset.verbose == True
400
+ assert verbose_preset.silent is False
401
+ assert verbose_preset.debug is False
402
+ assert verbose_preset.verbose is True
403
403
  assert original_log_level == CORE.logger.log_level
404
404
 
405
405
  # test conflicting verbosity levels
406
406
  silent_and_verbose = Preset(silent=True, verbose=True)
407
- assert silent_and_verbose.silent == True
408
- assert silent_and_verbose.debug == False
409
- assert silent_and_verbose.verbose == True
407
+ assert silent_and_verbose.silent is True
408
+ assert silent_and_verbose.debug is False
409
+ assert silent_and_verbose.verbose is True
410
410
  baked = silent_and_verbose.bake()
411
- assert baked.silent == True
412
- assert baked.debug == False
413
- assert baked.verbose == False
411
+ assert baked.silent is True
412
+ assert baked.debug is False
413
+ assert baked.verbose is False
414
414
  assert baked.core.logger.log_level == original_log_level
415
415
  baked = silent_and_verbose.bake(scan=scan)
416
416
  assert baked.core.logger.log_level == logging.CRITICAL
@@ -420,13 +420,13 @@ async def test_preset_logging():
420
420
  assert CORE.logger.log_level == original_log_level
421
421
 
422
422
  silent_and_debug = Preset(silent=True, debug=True)
423
- assert silent_and_debug.silent == True
424
- assert silent_and_debug.debug == True
425
- assert silent_and_debug.verbose == False
423
+ assert silent_and_debug.silent is True
424
+ assert silent_and_debug.debug is True
425
+ assert silent_and_debug.verbose is False
426
426
  baked = silent_and_debug.bake()
427
- assert baked.silent == True
428
- assert baked.debug == False
429
- assert baked.verbose == False
427
+ assert baked.silent is True
428
+ assert baked.debug is False
429
+ assert baked.verbose is False
430
430
  assert baked.core.logger.log_level == original_log_level
431
431
  baked = silent_and_debug.bake(scan=scan)
432
432
  assert baked.core.logger.log_level == logging.CRITICAL
@@ -436,13 +436,13 @@ async def test_preset_logging():
436
436
  assert CORE.logger.log_level == original_log_level
437
437
 
438
438
  debug_and_verbose = Preset(verbose=True, debug=True)
439
- assert debug_and_verbose.silent == False
440
- assert debug_and_verbose.debug == True
441
- assert debug_and_verbose.verbose == True
439
+ assert debug_and_verbose.silent is False
440
+ assert debug_and_verbose.debug is True
441
+ assert debug_and_verbose.verbose is True
442
442
  baked = debug_and_verbose.bake()
443
- assert baked.silent == False
444
- assert baked.debug == True
445
- assert baked.verbose == False
443
+ assert baked.silent is False
444
+ assert baked.debug is True
445
+ assert baked.verbose is False
446
446
  assert baked.core.logger.log_level == original_log_level
447
447
  baked = debug_and_verbose.bake(scan=scan)
448
448
  assert baked.core.logger.log_level == logging.DEBUG
@@ -452,13 +452,13 @@ async def test_preset_logging():
452
452
  assert CORE.logger.log_level == original_log_level
453
453
 
454
454
  all_preset = Preset(verbose=True, debug=True, silent=True)
455
- assert all_preset.silent == True
456
- assert all_preset.debug == True
457
- assert all_preset.verbose == True
455
+ assert all_preset.silent is True
456
+ assert all_preset.debug is True
457
+ assert all_preset.verbose is True
458
458
  baked = all_preset.bake()
459
- assert baked.silent == True
460
- assert baked.debug == False
461
- assert baked.verbose == False
459
+ assert baked.silent is True
460
+ assert baked.debug is False
461
+ assert baked.verbose is False
462
462
  assert baked.core.logger.log_level == original_log_level
463
463
  baked = all_preset.bake(scan=scan)
464
464
  assert baked.core.logger.log_level == logging.CRITICAL
@@ -688,7 +688,7 @@ class TestModule5(BaseModule):
688
688
  )
689
689
 
690
690
  preset = Preset.from_yaml_string(
691
- f"""
691
+ """
692
692
  modules:
693
693
  - testmodule5
694
694
  """
@@ -896,9 +896,9 @@ def test_preset_require_exclude():
896
896
  dnsbrute_flags = preset.preloaded_module("dnsbrute").get("flags", [])
897
897
  assert "subdomain-enum" in dnsbrute_flags
898
898
  assert "active" in dnsbrute_flags
899
- assert not "passive" in dnsbrute_flags
899
+ assert "passive" not in dnsbrute_flags
900
900
  assert "aggressive" in dnsbrute_flags
901
- assert not "safe" in dnsbrute_flags
901
+ assert "safe" not in dnsbrute_flags
902
902
  assert "dnsbrute" in [x[0] for x in module_flags]
903
903
  assert "certspotter" in [x[0] for x in module_flags]
904
904
  assert "c99" in [x[0] for x in module_flags]
@@ -912,7 +912,7 @@ def test_preset_require_exclude():
912
912
  assert len(preset.modules) > 25
913
913
  module_flags = list(get_module_flags(preset))
914
914
  assert "chaos" in [x[0] for x in module_flags]
915
- assert not "httpx" in [x[0] for x in module_flags]
915
+ assert "httpx" not in [x[0] for x in module_flags]
916
916
  assert all("passive" in flags for module, flags in module_flags)
917
917
  assert not any("active" in flags for module, flags in module_flags)
918
918
  assert any("safe" in flags for module, flags in module_flags)
@@ -923,7 +923,7 @@ def test_preset_require_exclude():
923
923
  assert len(preset.modules) > 25
924
924
  module_flags = list(get_module_flags(preset))
925
925
  assert "chaos" in [x[0] for x in module_flags]
926
- assert not "httpx" in [x[0] for x in module_flags]
926
+ assert "httpx" not in [x[0] for x in module_flags]
927
927
  assert all("passive" in flags for module, flags in module_flags)
928
928
  assert not any("active" in flags for module, flags in module_flags)
929
929
  assert any("safe" in flags for module, flags in module_flags)
@@ -933,7 +933,7 @@ def test_preset_require_exclude():
933
933
  preset = Preset(flags=["subdomain-enum"], exclude_modules=["dnsbrute"]).bake()
934
934
  assert len(preset.modules) > 25
935
935
  module_flags = list(get_module_flags(preset))
936
- assert not "dnsbrute" in [x[0] for x in module_flags]
936
+ assert "dnsbrute" not in [x[0] for x in module_flags]
937
937
  assert "httpx" in [x[0] for x in module_flags]
938
938
  assert any("passive" in flags for module, flags in module_flags)
939
939
  assert any("active" in flags for module, flags in module_flags)
@@ -944,7 +944,7 @@ def test_preset_require_exclude():
944
944
  preset = Preset(flags=["subdomain-enum"], require_flags=["safe", "passive"]).bake()
945
945
  assert len(preset.modules) > 25
946
946
  module_flags = list(get_module_flags(preset))
947
- assert not "dnsbrute" in [x[0] for x in module_flags]
947
+ assert "dnsbrute" not in [x[0] for x in module_flags]
948
948
  assert all("passive" in flags and "safe" in flags for module, flags in module_flags)
949
949
  assert all("active" not in flags and "aggressive" not in flags for module, flags in module_flags)
950
950
  assert not any("active" in flags for module, flags in module_flags)
@@ -954,7 +954,7 @@ def test_preset_require_exclude():
954
954
  preset = Preset(flags=["subdomain-enum"], exclude_flags=["aggressive", "active"]).bake()
955
955
  assert len(preset.modules) > 25
956
956
  module_flags = list(get_module_flags(preset))
957
- assert not "dnsbrute" in [x[0] for x in module_flags]
957
+ assert "dnsbrute" not in [x[0] for x in module_flags]
958
958
  assert all("passive" in flags and "safe" in flags for module, flags in module_flags)
959
959
  assert all("active" not in flags and "aggressive" not in flags for module, flags in module_flags)
960
960
  assert not any("active" in flags for module, flags in module_flags)
@@ -964,9 +964,9 @@ def test_preset_require_exclude():
964
964
  preset = Preset(flags=["subdomain-enum"], exclude_modules=["dnsbrute", "c99"]).bake()
965
965
  assert len(preset.modules) > 25
966
966
  module_flags = list(get_module_flags(preset))
967
- assert not "dnsbrute" in [x[0] for x in module_flags]
967
+ assert "dnsbrute" not in [x[0] for x in module_flags]
968
968
  assert "certspotter" in [x[0] for x in module_flags]
969
- assert not "c99" in [x[0] for x in module_flags]
969
+ assert "c99" not in [x[0] for x in module_flags]
970
970
  assert any("passive" in flags for module, flags in module_flags)
971
971
  assert any("active" in flags for module, flags in module_flags)
972
972
  assert any("safe" in flags for module, flags in module_flags)
@@ -91,7 +91,7 @@ def test_ip_regexes():
91
91
  ip == "2001:db8::1/128" and event_type == "IP_RANGE"
92
92
  ), f"Event type for IP_ADDRESS {ip} was not properly detected"
93
93
  else:
94
- matches = list(r.match(ip) for r in ip_address_regexes)
94
+ matches = [r.match(ip) for r in ip_address_regexes]
95
95
  assert any(matches), f"Good IP ADDRESS {ip} did not match regexes"
96
96
 
97
97
 
@@ -138,7 +138,7 @@ def test_ip_range_regexes():
138
138
  pytest.fail(f"BAD IP_RANGE: {bad_ip_range} raised unknown error: {e}: {traceback.format_exc()}")
139
139
 
140
140
  for good_ip_range in good_ip_ranges:
141
- matches = list(r.match(good_ip_range) for r in ip_range_regexes)
141
+ matches = [r.match(good_ip_range) for r in ip_range_regexes]
142
142
  assert any(matches), f"Good IP_RANGE {good_ip_range} did not match regexes"
143
143
 
144
144
 
@@ -191,7 +191,7 @@ def test_dns_name_regexes():
191
191
  pytest.fail(f"BAD DNS NAME: {dns} raised unknown error: {e}")
192
192
 
193
193
  for dns in good_dns:
194
- matches = list(r.match(dns) for r in dns_name_regexes)
194
+ matches = [r.match(dns) for r in dns_name_regexes]
195
195
  assert any(matches), f"Good DNS_NAME {dns} did not match regexes"
196
196
  event_type, _ = get_event_type(dns)
197
197
  if not event_type == "DNS_NAME":
@@ -253,7 +253,7 @@ def test_open_port_regexes():
253
253
  pytest.fail(f"BAD OPEN_TCP_PORT: {open_port} raised unknown error: {e}")
254
254
 
255
255
  for open_port in good_ports:
256
- matches = list(r.match(open_port) for r in open_port_regexes)
256
+ matches = [r.match(open_port) for r in open_port_regexes]
257
257
  assert any(matches), f"Good OPEN_TCP_PORT {open_port} did not match regexes"
258
258
  event_type, _ = get_event_type(open_port)
259
259
  assert event_type == "OPEN_TCP_PORT"
@@ -318,7 +318,7 @@ def test_url_regexes():
318
318
  pytest.fail(f"BAD URL: {bad_url} raised unknown error: {e}: {traceback.format_exc()}")
319
319
 
320
320
  for good_url in good_urls:
321
- matches = list(r.match(good_url) for r in url_regexes)
321
+ matches = [r.match(good_url) for r in url_regexes]
322
322
  assert any(matches), f"Good URL {good_url} did not match regexes"
323
323
  assert (
324
324
  get_event_type(good_url)[0] == "URL_UNVERIFIED"
@@ -100,13 +100,13 @@ async def test_url_extension_handling(bbot_scanner):
100
100
  assert "blacklisted" not in bad_event.tags
101
101
  assert "httpx-only" not in httpx_event.tags
102
102
  result = await scan.ingress_module.handle_event(good_event)
103
- assert result == None
103
+ assert result is None
104
104
  result, reason = await scan.ingress_module.handle_event(bad_event)
105
- assert result == False
105
+ assert result is False
106
106
  assert reason == "event is blacklisted"
107
107
  assert "blacklisted" in bad_event.tags
108
108
  result = await scan.ingress_module.handle_event(httpx_event)
109
- assert result == None
109
+ assert result is None
110
110
  assert "httpx-only" in httpx_event.tags
111
111
 
112
112
  await scan._cleanup()
@@ -144,7 +144,7 @@ async def test_python_output_matches_json(bbot_scanner):
144
144
  assert len(events) == 5
145
145
  scan_events = [e for e in events if e["type"] == "SCAN"]
146
146
  assert len(scan_events) == 2
147
- assert all([isinstance(e["data"]["status"], str) for e in scan_events])
147
+ assert all(isinstance(e["data"]["status"], str) for e in scan_events)
148
148
  assert len([e for e in events if e["type"] == "DNS_NAME"]) == 1
149
149
  assert len([e for e in events if e["type"] == "ORG_STUB"]) == 1
150
150
  assert len([e for e in events if e["type"] == "IP_ADDRESS"]) == 1