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.
- bbot/__init__.py +1 -1
- bbot/cli.py +2 -2
- bbot/core/config/logger.py +1 -1
- bbot/core/core.py +1 -1
- bbot/core/event/base.py +13 -13
- bbot/core/helpers/command.py +4 -4
- bbot/core/helpers/depsinstaller/installer.py +5 -5
- bbot/core/helpers/diff.py +7 -7
- bbot/core/helpers/dns/brute.py +1 -1
- bbot/core/helpers/dns/dns.py +1 -1
- bbot/core/helpers/dns/engine.py +4 -4
- bbot/core/helpers/files.py +1 -1
- bbot/core/helpers/helper.py +3 -1
- bbot/core/helpers/interactsh.py +3 -3
- bbot/core/helpers/misc.py +11 -11
- bbot/core/helpers/regex.py +1 -1
- bbot/core/helpers/regexes.py +3 -3
- bbot/core/helpers/validators.py +1 -1
- bbot/core/helpers/web/client.py +1 -1
- bbot/core/helpers/web/engine.py +1 -1
- bbot/core/helpers/web/web.py +2 -2
- bbot/core/helpers/wordcloud.py +5 -5
- bbot/core/modules.py +21 -21
- bbot/modules/azure_tenant.py +2 -2
- bbot/modules/base.py +16 -16
- bbot/modules/bypass403.py +5 -5
- bbot/modules/c99.py +1 -1
- bbot/modules/columbus.py +1 -1
- bbot/modules/deadly/ffuf.py +8 -8
- bbot/modules/deadly/nuclei.py +1 -1
- bbot/modules/deadly/vhost.py +3 -3
- bbot/modules/dnsbimi.py +1 -1
- bbot/modules/dnsdumpster.py +2 -2
- bbot/modules/dockerhub.py +1 -1
- bbot/modules/extractous.py +1 -1
- bbot/modules/filedownload.py +1 -1
- bbot/modules/generic_ssrf.py +3 -3
- bbot/modules/github_workflows.py +1 -1
- bbot/modules/gowitness.py +7 -7
- bbot/modules/host_header.py +5 -5
- bbot/modules/httpx.py +1 -1
- bbot/modules/iis_shortnames.py +6 -6
- bbot/modules/internal/cloudcheck.py +5 -5
- bbot/modules/internal/dnsresolve.py +7 -7
- bbot/modules/internal/excavate.py +5 -5
- bbot/modules/internal/speculate.py +4 -4
- bbot/modules/ipneighbor.py +1 -1
- bbot/modules/jadx.py +1 -1
- bbot/modules/newsletters.py +2 -2
- bbot/modules/output/asset_inventory.py +6 -6
- bbot/modules/output/base.py +1 -1
- bbot/modules/output/csv.py +1 -1
- bbot/modules/output/stdout.py +2 -2
- bbot/modules/paramminer_headers.py +3 -3
- bbot/modules/portscan.py +3 -3
- bbot/modules/report/asn.py +11 -11
- bbot/modules/robots.py +3 -3
- bbot/modules/securitytxt.py +1 -1
- bbot/modules/sitedossier.py +1 -1
- bbot/modules/social.py +1 -1
- bbot/modules/subdomainradar.py +1 -1
- bbot/modules/telerik.py +7 -7
- bbot/modules/templates/bucket.py +1 -1
- bbot/modules/templates/github.py +1 -1
- bbot/modules/templates/shodan.py +1 -1
- bbot/modules/templates/subdomain_enum.py +1 -1
- bbot/modules/templates/webhook.py +1 -1
- bbot/modules/trufflehog.py +1 -1
- bbot/modules/url_manipulation.py +3 -3
- bbot/modules/urlscan.py +1 -1
- bbot/modules/viewdns.py +1 -1
- bbot/modules/wafw00f.py +1 -1
- bbot/scanner/preset/args.py +10 -10
- bbot/scanner/preset/preset.py +9 -9
- bbot/scanner/scanner.py +17 -17
- bbot/scanner/target.py +1 -1
- bbot/scripts/docs.py +1 -1
- bbot/test/bbot_fixtures.py +1 -1
- bbot/test/conftest.py +1 -1
- bbot/test/run_tests.sh +4 -4
- bbot/test/test_step_1/test_bbot_fastapi.py +2 -2
- bbot/test/test_step_1/test_cli.py +56 -56
- bbot/test/test_step_1/test_dns.py +15 -15
- bbot/test/test_step_1/test_engine.py +17 -17
- bbot/test/test_step_1/test_events.py +22 -22
- bbot/test/test_step_1/test_helpers.py +26 -26
- bbot/test/test_step_1/test_manager_scope_accuracy.py +306 -306
- bbot/test/test_step_1/test_modules_basic.py +52 -53
- bbot/test/test_step_1/test_presets.py +81 -81
- bbot/test/test_step_1/test_regexes.py +5 -5
- bbot/test/test_step_1/test_scan.py +4 -4
- bbot/test/test_step_1/test_target.py +25 -25
- bbot/test/test_step_1/test_web.py +5 -5
- bbot/test/test_step_2/module_tests/base.py +6 -6
- bbot/test/test_step_2/module_tests/test_module_anubisdb.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_azure_realm.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_baddns.py +6 -6
- bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +2 -4
- bbot/test/test_step_2/module_tests/test_module_bevigil.py +4 -4
- bbot/test/test_step_2/module_tests/test_module_binaryedge.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_builtwith.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_c99.py +9 -9
- bbot/test/test_step_2/module_tests/test_module_columbus.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_credshed.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_dehashed.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_digitorus.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +8 -8
- bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_excavate.py +10 -10
- bbot/test/test_step_2/module_tests/test_module_extractous.py +9 -9
- bbot/test/test_step_2/module_tests/test_module_filedownload.py +14 -14
- bbot/test/test_step_2/module_tests/test_module_git_clone.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_gowitness.py +4 -4
- bbot/test/test_step_2/module_tests/test_module_host_header.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_http.py +4 -4
- bbot/test/test_step_2/module_tests/test_module_httpx.py +7 -7
- bbot/test/test_step_2/module_tests/test_module_leakix.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_myssl.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_neo4j.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_newsletters.py +6 -6
- bbot/test/test_step_2/module_tests/test_module_ntlm.py +7 -7
- bbot/test/test_step_2/module_tests/test_module_oauth.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_otx.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_portscan.py +3 -3
- bbot/test/test_step_2/module_tests/test_module_postgres.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_rapiddns.py +9 -9
- bbot/test/test_step_2/module_tests/test_module_sitedossier.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_smuggler.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_speculate.py +2 -6
- bbot/test/test_step_2/module_tests/test_module_splunk.py +4 -4
- bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_subdomains.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_trufflehog.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_wayback.py +1 -1
- {bbot-2.3.0.5376rc0.dist-info → bbot-2.3.0.5382rc0.dist-info}/METADATA +2 -2
- {bbot-2.3.0.5376rc0.dist-info → bbot-2.3.0.5382rc0.dist-info}/RECORD +143 -143
- {bbot-2.3.0.5376rc0.dist-info → bbot-2.3.0.5382rc0.dist-info}/LICENSE +0 -0
- {bbot-2.3.0.5376rc0.dist-info → bbot-2.3.0.5382rc0.dist-info}/WHEEL +0 -0
- {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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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]
|
|
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]
|
|
104
|
-
assert base_module._event_precheck(events.domain)[0]
|
|
105
|
-
assert base_module._event_precheck(events.localhost)[0]
|
|
106
|
-
assert base_module._event_precheck(localhost2)[0]
|
|
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]
|
|
109
|
+
assert base_module._event_precheck(localhost2)[0] is False
|
|
110
110
|
localhost2.add_tag("target")
|
|
111
|
-
assert base_module._event_precheck(localhost2)[0]
|
|
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
|
|
151
|
-
|
|
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
|
|
154
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
272
|
-
assert valid_2
|
|
273
|
-
assert valid_3
|
|
274
|
-
assert valid_4
|
|
275
|
-
assert valid_5
|
|
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
|
|
278
|
-
assert valid_2
|
|
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
|
|
280
|
+
assert valid_3 is False
|
|
281
281
|
assert "per_host_only=True" in reason_3
|
|
282
|
-
assert valid_4
|
|
283
|
-
assert valid_5
|
|
282
|
+
assert valid_4 is True
|
|
283
|
+
assert valid_5 is True
|
|
284
284
|
elif mod_name == "mod_hostport_only":
|
|
285
|
-
assert valid_1
|
|
286
|
-
assert valid_2
|
|
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
|
|
289
|
-
assert valid_4
|
|
290
|
-
assert valid_5
|
|
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
|
|
293
|
-
assert valid_2
|
|
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
|
|
295
|
+
assert valid_3 is False
|
|
296
296
|
assert "per_domain_only=True" in reason_3
|
|
297
|
-
assert valid_4
|
|
297
|
+
assert valid_4 is False
|
|
298
298
|
assert "per_domain_only=True" in reason_4
|
|
299
|
-
assert valid_5
|
|
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
|
|
335
|
-
assert valid_1
|
|
336
|
-
assert valid_2
|
|
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
|
|
342
|
-
assert valid_2
|
|
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
|
|
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
|
|
178
|
-
assert
|
|
179
|
-
assert
|
|
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
|
|
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
|
|
197
|
+
assert "evilcorp.com" not in preset1_baked.target.whitelist
|
|
198
198
|
assert "asdf.evilcorp.com" in preset1_baked.target.seeds
|
|
199
|
-
assert
|
|
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
|
|
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
|
|
232
|
-
assert
|
|
233
|
-
assert
|
|
234
|
-
assert
|
|
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
|
|
238
|
-
assert
|
|
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
|
|
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
|
|
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
|
|
307
|
-
assert
|
|
308
|
-
assert
|
|
309
|
-
assert
|
|
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
|
|
314
|
-
assert
|
|
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
|
|
329
|
-
assert
|
|
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
|
|
333
|
-
assert
|
|
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
|
|
346
|
-
assert
|
|
347
|
-
assert
|
|
348
|
-
assert
|
|
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
|
|
352
|
-
assert
|
|
353
|
-
assert
|
|
354
|
-
assert
|
|
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
|
|
374
|
-
assert
|
|
375
|
-
assert
|
|
376
|
-
assert
|
|
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
|
|
391
|
-
assert silent_preset.debug
|
|
392
|
-
assert silent_preset.verbose
|
|
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
|
|
396
|
-
assert debug_preset.debug
|
|
397
|
-
assert debug_preset.verbose
|
|
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
|
|
401
|
-
assert verbose_preset.debug
|
|
402
|
-
assert verbose_preset.verbose
|
|
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
|
|
408
|
-
assert silent_and_verbose.debug
|
|
409
|
-
assert silent_and_verbose.verbose
|
|
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
|
|
412
|
-
assert baked.debug
|
|
413
|
-
assert baked.verbose
|
|
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
|
|
424
|
-
assert silent_and_debug.debug
|
|
425
|
-
assert silent_and_debug.verbose
|
|
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
|
|
428
|
-
assert baked.debug
|
|
429
|
-
assert baked.verbose
|
|
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
|
|
440
|
-
assert debug_and_verbose.debug
|
|
441
|
-
assert debug_and_verbose.verbose
|
|
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
|
|
444
|
-
assert baked.debug
|
|
445
|
-
assert baked.verbose
|
|
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
|
|
456
|
-
assert all_preset.debug
|
|
457
|
-
assert all_preset.verbose
|
|
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
|
|
460
|
-
assert baked.debug
|
|
461
|
-
assert baked.verbose
|
|
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
|
-
|
|
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
|
|
899
|
+
assert "passive" not in dnsbrute_flags
|
|
900
900
|
assert "aggressive" in dnsbrute_flags
|
|
901
|
-
assert
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
103
|
+
assert result is None
|
|
104
104
|
result, reason = await scan.ingress_module.handle_event(bad_event)
|
|
105
|
-
assert result
|
|
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
|
|
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(
|
|
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
|