bbot 2.2.0.5279rc0__py3-none-any.whl → 2.2.0.5311rc0__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 +1 -1
- bbot/core/engine.py +2 -2
- bbot/core/event/base.py +23 -2
- bbot/core/helpers/bloom.py +8 -1
- bbot/core/helpers/dns/helpers.py +2 -2
- bbot/core/helpers/helper.py +4 -3
- bbot/core/helpers/misc.py +11 -5
- bbot/core/helpers/regexes.py +2 -1
- bbot/core/helpers/web/web.py +1 -1
- bbot/modules/anubisdb.py +1 -1
- bbot/modules/baddns.py +1 -1
- bbot/modules/bevigil.py +2 -2
- bbot/modules/binaryedge.py +1 -1
- bbot/modules/bufferoverrun.py +2 -3
- bbot/modules/builtwith.py +2 -2
- bbot/modules/c99.py +4 -2
- bbot/modules/certspotter.py +4 -2
- bbot/modules/chaos.py +4 -2
- bbot/modules/columbus.py +1 -1
- bbot/modules/crt.py +4 -2
- bbot/modules/digitorus.py +1 -1
- bbot/modules/dnscaa.py +3 -3
- bbot/modules/fullhunt.py +1 -1
- bbot/modules/hackertarget.py +4 -2
- bbot/modules/internal/excavate.py +2 -3
- bbot/modules/internal/speculate.py +1 -1
- bbot/modules/leakix.py +4 -2
- bbot/modules/myssl.py +1 -1
- bbot/modules/otx.py +4 -2
- bbot/modules/passivetotal.py +4 -2
- bbot/modules/rapiddns.py +2 -7
- bbot/modules/securitytrails.py +4 -2
- bbot/modules/shodan_dns.py +1 -1
- bbot/modules/subdomaincenter.py +1 -1
- bbot/modules/templates/subdomain_enum.py +3 -3
- bbot/modules/trickest.py +1 -1
- bbot/modules/virustotal.py +2 -7
- bbot/modules/zoomeye.py +5 -3
- bbot/presets/spider.yml +4 -0
- bbot/scanner/manager.py +1 -2
- bbot/scanner/preset/args.py +3 -3
- bbot/scanner/preset/path.py +3 -1
- bbot/scanner/preset/preset.py +10 -4
- bbot/scanner/scanner.py +7 -2
- bbot/scanner/target.py +236 -434
- bbot/test/test_step_1/test_bloom_filter.py +2 -0
- bbot/test/test_step_1/test_cli.py +7 -0
- bbot/test/test_step_1/test_dns.py +2 -1
- bbot/test/test_step_1/test_events.py +16 -2
- bbot/test/test_step_1/test_helpers.py +17 -0
- bbot/test/test_step_1/test_presets.py +50 -36
- bbot/test/test_step_1/test_python_api.py +4 -0
- bbot/test/test_step_1/test_scan.py +8 -2
- bbot/test/test_step_1/test_target.py +227 -129
- bbot/test/test_step_2/module_tests/test_module_dastardly.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +1 -1
- {bbot-2.2.0.5279rc0.dist-info → bbot-2.2.0.5311rc0.dist-info}/METADATA +4 -4
- {bbot-2.2.0.5279rc0.dist-info → bbot-2.2.0.5311rc0.dist-info}/RECORD +62 -62
- {bbot-2.2.0.5279rc0.dist-info → bbot-2.2.0.5311rc0.dist-info}/LICENSE +0 -0
- {bbot-2.2.0.5279rc0.dist-info → bbot-2.2.0.5311rc0.dist-info}/WHEEL +0 -0
- {bbot-2.2.0.5279rc0.dist-info → bbot-2.2.0.5311rc0.dist-info}/entry_points.txt +0 -0
|
@@ -535,6 +535,13 @@ def test_cli_module_validation(monkeypatch, caplog):
|
|
|
535
535
|
]
|
|
536
536
|
)
|
|
537
537
|
|
|
538
|
+
# bad target
|
|
539
|
+
caplog.clear()
|
|
540
|
+
assert not caplog.text
|
|
541
|
+
monkeypatch.setattr("sys.argv", ["bbot", "-t", "asdf:::sdf"])
|
|
542
|
+
cli.main()
|
|
543
|
+
assert 'Unable to autodetect event type from "asdf:::sdf"' in caplog.text
|
|
544
|
+
|
|
538
545
|
# incorrect flag
|
|
539
546
|
caplog.clear()
|
|
540
547
|
assert not caplog.text
|
|
@@ -106,7 +106,8 @@ async def test_dns_resolution(bbot_scanner):
|
|
|
106
106
|
assert "2606:4700:4700::1111" in await dnsengine.resolve("one.one.one.one", type="AAAA")
|
|
107
107
|
assert "one.one.one.one" in await dnsengine.resolve("1.1.1.1")
|
|
108
108
|
for rdtype in ("NS", "SOA", "MX", "TXT"):
|
|
109
|
-
|
|
109
|
+
results = await dnsengine.resolve("google.com", type=rdtype)
|
|
110
|
+
assert len(results) > 0
|
|
110
111
|
|
|
111
112
|
# batch resolution
|
|
112
113
|
batch_results = [r async for r in dnsengine.resolve_batch(["1.1.1.1", "one.one.one.one"])]
|
|
@@ -42,6 +42,7 @@ async def test_events(events, helpers):
|
|
|
42
42
|
# ip tests
|
|
43
43
|
assert events.ipv4 == scan.make_event("8.8.8.8", dummy=True)
|
|
44
44
|
assert "8.8.8.8" in events.ipv4
|
|
45
|
+
assert events.ipv4.host_filterable == "8.8.8.8"
|
|
45
46
|
assert "8.8.8.8" == events.ipv4
|
|
46
47
|
assert "8.8.8.8" in events.netv4
|
|
47
48
|
assert "8.8.8.9" not in events.ipv4
|
|
@@ -59,11 +60,19 @@ async def test_events(events, helpers):
|
|
|
59
60
|
assert events.emoji not in events.ipv4
|
|
60
61
|
assert events.emoji not in events.netv6
|
|
61
62
|
assert events.netv6 not in events.emoji
|
|
62
|
-
|
|
63
|
+
ipv6_event = scan.make_event(" [DEaD::c0De]:88", "DNS_NAME", dummy=True)
|
|
64
|
+
assert "dead::c0de" == ipv6_event
|
|
65
|
+
assert ipv6_event.host_filterable == "dead::c0de"
|
|
66
|
+
range_to_ip = scan.make_event("1.2.3.4/32", dummy=True)
|
|
67
|
+
assert range_to_ip.type == "IP_ADDRESS"
|
|
68
|
+
range_to_ip = scan.make_event("dead::beef/128", dummy=True)
|
|
69
|
+
assert range_to_ip.type == "IP_ADDRESS"
|
|
63
70
|
|
|
64
71
|
# hostname tests
|
|
65
72
|
assert events.domain.host == "publicapis.org"
|
|
73
|
+
assert events.domain.host_filterable == "publicapis.org"
|
|
66
74
|
assert events.subdomain.host == "api.publicapis.org"
|
|
75
|
+
assert events.subdomain.host_filterable == "api.publicapis.org"
|
|
67
76
|
assert events.domain.host_stem == "publicapis"
|
|
68
77
|
assert events.subdomain.host_stem == "api.publicapis"
|
|
69
78
|
assert "api.publicapis.org" in events.domain
|
|
@@ -86,7 +95,11 @@ async def test_events(events, helpers):
|
|
|
86
95
|
assert "port" not in e.json()
|
|
87
96
|
|
|
88
97
|
# url tests
|
|
89
|
-
|
|
98
|
+
url_no_trailing_slash = scan.make_event("http://evilcorp.com", dummy=True)
|
|
99
|
+
url_trailing_slash = scan.make_event("http://evilcorp.com/", dummy=True)
|
|
100
|
+
assert url_no_trailing_slash == url_trailing_slash
|
|
101
|
+
assert url_no_trailing_slash.host_filterable == "http://evilcorp.com/"
|
|
102
|
+
assert url_trailing_slash.host_filterable == "http://evilcorp.com/"
|
|
90
103
|
assert events.url_unverified.host == "api.publicapis.org"
|
|
91
104
|
assert events.url_unverified in events.domain
|
|
92
105
|
assert events.url_unverified in events.subdomain
|
|
@@ -129,6 +142,7 @@ async def test_events(events, helpers):
|
|
|
129
142
|
assert events.http_response.port == 80
|
|
130
143
|
assert events.http_response.parsed_url.scheme == "http"
|
|
131
144
|
assert events.http_response.with_port().geturl() == "http://example.com:80/"
|
|
145
|
+
assert events.http_response.host_filterable == "http://example.com/"
|
|
132
146
|
|
|
133
147
|
http_response = scan.make_event(
|
|
134
148
|
{
|
|
@@ -93,8 +93,23 @@ async def test_helpers_misc(helpers, scan, bbot_scanner, bbot_httpserver):
|
|
|
93
93
|
ipaddress.ip_network("0.0.0.0/0"),
|
|
94
94
|
]
|
|
95
95
|
assert helpers.is_ip("127.0.0.1")
|
|
96
|
+
assert helpers.is_ip("127.0.0.1", include_network=True)
|
|
97
|
+
assert helpers.is_ip("127.0.0.1", version=4)
|
|
98
|
+
assert not helpers.is_ip("127.0.0.1", version=6)
|
|
96
99
|
assert not helpers.is_ip("127.0.0.0.1")
|
|
97
100
|
|
|
101
|
+
assert helpers.is_ip("dead::beef")
|
|
102
|
+
assert helpers.is_ip("dead::beef", include_network=True)
|
|
103
|
+
assert not helpers.is_ip("dead::beef", version=4)
|
|
104
|
+
assert helpers.is_ip("dead::beef", version=6)
|
|
105
|
+
assert not helpers.is_ip("dead:::beef")
|
|
106
|
+
|
|
107
|
+
assert not helpers.is_ip("1.2.3.4/24")
|
|
108
|
+
assert helpers.is_ip("1.2.3.4/24", include_network=True)
|
|
109
|
+
assert not helpers.is_ip("1.2.3.4/24", version=4)
|
|
110
|
+
assert helpers.is_ip("1.2.3.4/24", include_network=True, version=4)
|
|
111
|
+
assert not helpers.is_ip("1.2.3.4/24", include_network=True, version=6)
|
|
112
|
+
|
|
98
113
|
assert not helpers.is_ip_type("127.0.0.1")
|
|
99
114
|
assert helpers.is_ip_type(ipaddress.ip_address("127.0.0.1"))
|
|
100
115
|
assert not helpers.is_ip_type(ipaddress.ip_address("127.0.0.1"), network=True)
|
|
@@ -104,6 +119,8 @@ async def test_helpers_misc(helpers, scan, bbot_scanner, bbot_httpserver):
|
|
|
104
119
|
assert not helpers.is_ip_type(ipaddress.ip_network("127.0.0.0/8"), network=False)
|
|
105
120
|
|
|
106
121
|
assert helpers.is_dns_name("evilcorp.com")
|
|
122
|
+
assert not helpers.is_dns_name("evilcorp.com:80")
|
|
123
|
+
assert not helpers.is_dns_name("http://evilcorp.com:80")
|
|
107
124
|
assert helpers.is_dns_name("evilcorp")
|
|
108
125
|
assert not helpers.is_dns_name("evilcorp", include_local=False)
|
|
109
126
|
assert helpers.is_dns_name("ドメイン.テスト")
|
|
@@ -88,9 +88,13 @@ def test_preset_yaml(clean_default_config):
|
|
|
88
88
|
config={"preset_test_asdf": 1},
|
|
89
89
|
)
|
|
90
90
|
preset1 = preset1.bake()
|
|
91
|
-
assert "evilcorp.com" in preset1.target
|
|
91
|
+
assert "evilcorp.com" in preset1.target.seeds
|
|
92
|
+
assert "evilcorp.ce" not in preset1.target.seeds
|
|
93
|
+
assert "asdf.www.evilcorp.ce" in preset1.target.seeds
|
|
92
94
|
assert "evilcorp.ce" in preset1.whitelist
|
|
95
|
+
assert "asdf.evilcorp.ce" in preset1.whitelist
|
|
93
96
|
assert "test.www.evilcorp.ce" in preset1.blacklist
|
|
97
|
+
assert "asdf.test.www.evilcorp.ce" in preset1.blacklist
|
|
94
98
|
assert "sslcert" in preset1.scan_modules
|
|
95
99
|
assert preset1.whitelisted("evilcorp.ce")
|
|
96
100
|
assert preset1.whitelisted("www.evilcorp.ce")
|
|
@@ -170,12 +174,14 @@ def test_preset_scope():
|
|
|
170
174
|
|
|
171
175
|
# test target merging
|
|
172
176
|
scan = Scanner("1.2.3.4", preset=Preset.from_dict({"target": ["evilcorp.com"]}))
|
|
173
|
-
assert set([str(h) for h in scan.preset.target.seeds.hosts]) == {"1.2.3.4", "evilcorp.com"}
|
|
174
|
-
assert set([e.data for e in scan.target]) == {"1.2.3.4", "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"}
|
|
175
180
|
|
|
176
181
|
blank_preset = Preset()
|
|
177
182
|
blank_preset = blank_preset.bake()
|
|
178
|
-
assert not blank_preset.target
|
|
183
|
+
assert not blank_preset.target.seeds
|
|
184
|
+
assert not blank_preset.target.whitelist
|
|
179
185
|
assert blank_preset.strict_scope == False
|
|
180
186
|
|
|
181
187
|
preset1 = Preset(
|
|
@@ -187,10 +193,11 @@ def test_preset_scope():
|
|
|
187
193
|
preset1_baked = preset1.bake()
|
|
188
194
|
|
|
189
195
|
# make sure target logic works as expected
|
|
190
|
-
assert "evilcorp.com" in preset1_baked.target
|
|
191
|
-
assert "
|
|
192
|
-
assert "asdf.
|
|
193
|
-
assert not "evilcorp.
|
|
196
|
+
assert "evilcorp.com" in preset1_baked.target.seeds
|
|
197
|
+
assert not "evilcorp.com" in preset1_baked.target.whitelist
|
|
198
|
+
assert "asdf.evilcorp.com" in preset1_baked.target.seeds
|
|
199
|
+
assert not "asdf.evilcorp.com" in preset1_baked.target.whitelist
|
|
200
|
+
assert "asdf.evilcorp.ce" in preset1_baked.whitelist
|
|
194
201
|
assert "evilcorp.ce" in preset1_baked.whitelist
|
|
195
202
|
assert "test.www.evilcorp.ce" in preset1_baked.blacklist
|
|
196
203
|
assert not "evilcorp.ce" in preset1_baked.blacklist
|
|
@@ -217,17 +224,21 @@ def test_preset_scope():
|
|
|
217
224
|
preset1_baked = preset1.bake()
|
|
218
225
|
|
|
219
226
|
# targets should be merged
|
|
220
|
-
assert "evilcorp.com" in preset1_baked.target
|
|
221
|
-
assert "www.evilcorp.ce" in preset1_baked.target
|
|
222
|
-
assert "evilcorp.org" in preset1_baked.target
|
|
227
|
+
assert "evilcorp.com" in preset1_baked.target.seeds
|
|
228
|
+
assert "www.evilcorp.ce" in preset1_baked.target.seeds
|
|
229
|
+
assert "evilcorp.org" in preset1_baked.target.seeds
|
|
223
230
|
# strict scope is enabled
|
|
224
|
-
assert not "asdf.evilcorp.
|
|
225
|
-
assert not "asdf.
|
|
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
|
|
226
235
|
assert "evilcorp.ce" in preset1_baked.whitelist
|
|
227
236
|
assert "evilcorp.de" in preset1_baked.whitelist
|
|
228
237
|
assert not "asdf.evilcorp.de" in preset1_baked.whitelist
|
|
229
238
|
assert not "asdf.evilcorp.ce" in preset1_baked.whitelist
|
|
230
239
|
# blacklist should be merged, strict scope does not apply
|
|
240
|
+
assert "test.www.evilcorp.ce" in preset1_baked.blacklist
|
|
241
|
+
assert "test.www.evilcorp.de" in preset1_baked.blacklist
|
|
231
242
|
assert "asdf.test.www.evilcorp.ce" in preset1_baked.blacklist
|
|
232
243
|
assert "asdf.test.www.evilcorp.de" in preset1_baked.blacklist
|
|
233
244
|
assert not "asdf.test.www.evilcorp.org" in preset1_baked.blacklist
|
|
@@ -263,14 +274,14 @@ def test_preset_scope():
|
|
|
263
274
|
}
|
|
264
275
|
assert preset_whitelist_baked.to_dict(include_target=True) == {
|
|
265
276
|
"target": ["evilcorp.org"],
|
|
266
|
-
"whitelist": ["1.2.3.0/24", "evilcorp.net"],
|
|
267
|
-
"blacklist": ["evilcorp.co.uk"],
|
|
277
|
+
"whitelist": ["1.2.3.0/24", "http://evilcorp.net/"],
|
|
278
|
+
"blacklist": ["bob@evilcorp.co.uk", "evilcorp.co.uk:443"],
|
|
268
279
|
"config": {"modules": {"secretsdb": {"api_key": "deadbeef", "otherthing": "asdf"}}},
|
|
269
280
|
}
|
|
270
281
|
assert preset_whitelist_baked.to_dict(include_target=True, redact_secrets=True) == {
|
|
271
282
|
"target": ["evilcorp.org"],
|
|
272
|
-
"whitelist": ["1.2.3.0/24", "evilcorp.net"],
|
|
273
|
-
"blacklist": ["evilcorp.co.uk"],
|
|
283
|
+
"whitelist": ["1.2.3.0/24", "http://evilcorp.net/"],
|
|
284
|
+
"blacklist": ["bob@evilcorp.co.uk", "evilcorp.co.uk:443"],
|
|
274
285
|
"config": {"modules": {"secretsdb": {"otherthing": "asdf"}}},
|
|
275
286
|
}
|
|
276
287
|
|
|
@@ -278,7 +289,8 @@ def test_preset_scope():
|
|
|
278
289
|
assert not preset_nowhitelist_baked.in_scope("www.evilcorp.de")
|
|
279
290
|
assert not preset_nowhitelist_baked.in_scope("1.2.3.4/24")
|
|
280
291
|
|
|
281
|
-
assert "www.evilcorp.org" in preset_whitelist_baked.target
|
|
292
|
+
assert "www.evilcorp.org" in preset_whitelist_baked.target.seeds
|
|
293
|
+
assert not "www.evilcorp.org" in preset_whitelist_baked.target.whitelist
|
|
282
294
|
assert "1.2.3.4" in preset_whitelist_baked.whitelist
|
|
283
295
|
assert not preset_whitelist_baked.in_scope("www.evilcorp.org")
|
|
284
296
|
assert not preset_whitelist_baked.in_scope("www.evilcorp.de")
|
|
@@ -291,17 +303,17 @@ def test_preset_scope():
|
|
|
291
303
|
assert preset_whitelist_baked.whitelisted("1.2.3.4/28")
|
|
292
304
|
assert preset_whitelist_baked.whitelisted("1.2.3.4/24")
|
|
293
305
|
|
|
294
|
-
assert set([e.data for e in preset_nowhitelist_baked.
|
|
295
|
-
assert set([e.data for e in preset_whitelist_baked.target]) == {"evilcorp.org"}
|
|
306
|
+
assert set([e.data for e in preset_nowhitelist_baked.seeds]) == {"evilcorp.com"}
|
|
296
307
|
assert set([e.data for e in preset_nowhitelist_baked.whitelist]) == {"evilcorp.com"}
|
|
297
|
-
assert set([e.data for e in preset_whitelist_baked.
|
|
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/"}
|
|
298
310
|
|
|
299
311
|
preset_nowhitelist.merge(preset_whitelist)
|
|
300
312
|
preset_nowhitelist_baked = preset_nowhitelist.bake()
|
|
301
|
-
assert set([e.data for e in preset_nowhitelist_baked.
|
|
302
|
-
assert set([e.data for e in preset_nowhitelist_baked.whitelist]) == {"1.2.3.0/24", "evilcorp.net"}
|
|
303
|
-
assert "www.evilcorp.org" in preset_nowhitelist_baked.
|
|
304
|
-
assert "www.evilcorp.com" in preset_nowhitelist_baked.
|
|
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/"}
|
|
315
|
+
assert "www.evilcorp.org" in preset_nowhitelist_baked.seeds
|
|
316
|
+
assert "www.evilcorp.com" in preset_nowhitelist_baked.seeds
|
|
305
317
|
assert "1.2.3.4" in preset_nowhitelist_baked.whitelist
|
|
306
318
|
assert not preset_nowhitelist_baked.in_scope("www.evilcorp.org")
|
|
307
319
|
assert not preset_nowhitelist_baked.in_scope("www.evilcorp.com")
|
|
@@ -313,10 +325,12 @@ def test_preset_scope():
|
|
|
313
325
|
preset_whitelist = Preset("evilcorp.org", whitelist=["1.2.3.4/24"])
|
|
314
326
|
preset_whitelist.merge(preset_nowhitelist)
|
|
315
327
|
preset_whitelist_baked = preset_whitelist.bake()
|
|
316
|
-
assert set([e.data for e in preset_whitelist_baked.
|
|
328
|
+
assert set([e.data for e in preset_whitelist_baked.seeds]) == {"evilcorp.com", "evilcorp.org"}
|
|
317
329
|
assert set([e.data for e in preset_whitelist_baked.whitelist]) == {"1.2.3.0/24"}
|
|
318
|
-
assert "www.evilcorp.org" in preset_whitelist_baked.
|
|
319
|
-
assert "www.evilcorp.com" in preset_whitelist_baked.
|
|
330
|
+
assert "www.evilcorp.org" in preset_whitelist_baked.seeds
|
|
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
|
|
320
334
|
assert "1.2.3.4" in preset_whitelist_baked.whitelist
|
|
321
335
|
assert not preset_whitelist_baked.in_scope("www.evilcorp.org")
|
|
322
336
|
assert not preset_whitelist_baked.in_scope("www.evilcorp.com")
|
|
@@ -328,18 +342,18 @@ def test_preset_scope():
|
|
|
328
342
|
preset_nowhitelist2 = Preset("evilcorp.de")
|
|
329
343
|
preset_nowhitelist1_baked = preset_nowhitelist1.bake()
|
|
330
344
|
preset_nowhitelist2_baked = preset_nowhitelist2.bake()
|
|
331
|
-
assert set([e.data for e in preset_nowhitelist1_baked.
|
|
332
|
-
assert set([e.data for e in preset_nowhitelist2_baked.
|
|
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"}
|
|
333
347
|
assert set([e.data for e in preset_nowhitelist1_baked.whitelist]) == {"evilcorp.com"}
|
|
334
348
|
assert set([e.data for e in preset_nowhitelist2_baked.whitelist]) == {"evilcorp.de"}
|
|
335
349
|
preset_nowhitelist1.merge(preset_nowhitelist2)
|
|
336
350
|
preset_nowhitelist1_baked = preset_nowhitelist1.bake()
|
|
337
|
-
assert set([e.data for e in preset_nowhitelist1_baked.
|
|
338
|
-
assert set([e.data for e in preset_nowhitelist2_baked.
|
|
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"}
|
|
339
353
|
assert set([e.data for e in preset_nowhitelist1_baked.whitelist]) == {"evilcorp.com", "evilcorp.de"}
|
|
340
354
|
assert set([e.data for e in preset_nowhitelist2_baked.whitelist]) == {"evilcorp.de"}
|
|
341
|
-
assert "www.evilcorp.com" in preset_nowhitelist1_baked.
|
|
342
|
-
assert "www.evilcorp.de" in preset_nowhitelist1_baked.
|
|
355
|
+
assert "www.evilcorp.com" in preset_nowhitelist1_baked.seeds
|
|
356
|
+
assert "www.evilcorp.de" in preset_nowhitelist1_baked.seeds
|
|
343
357
|
assert "www.evilcorp.com" in preset_nowhitelist1_baked.target.seeds
|
|
344
358
|
assert "www.evilcorp.de" in preset_nowhitelist1_baked.target.seeds
|
|
345
359
|
assert "www.evilcorp.com" in preset_nowhitelist1_baked.whitelist
|
|
@@ -356,8 +370,8 @@ def test_preset_scope():
|
|
|
356
370
|
preset_nowhitelist2.merge(preset_nowhitelist1)
|
|
357
371
|
preset_nowhitelist1_baked = preset_nowhitelist1.bake()
|
|
358
372
|
preset_nowhitelist2_baked = preset_nowhitelist2.bake()
|
|
359
|
-
assert set([e.data for e in preset_nowhitelist1_baked.
|
|
360
|
-
assert set([e.data for e in preset_nowhitelist2_baked.
|
|
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"}
|
|
361
375
|
assert set([e.data for e in preset_nowhitelist1_baked.whitelist]) == {"evilcorp.com"}
|
|
362
376
|
assert set([e.data for e in preset_nowhitelist2_baked.whitelist]) == {"evilcorp.com", "evilcorp.de"}
|
|
363
377
|
|
|
@@ -84,6 +84,10 @@ def test_python_api_sync():
|
|
|
84
84
|
def test_python_api_validation():
|
|
85
85
|
from bbot.scanner import Scanner, Preset
|
|
86
86
|
|
|
87
|
+
# invalid target
|
|
88
|
+
with pytest.raises(ValidationError) as error:
|
|
89
|
+
Scanner("asdf:::asdf")
|
|
90
|
+
assert str(error.value) == 'Unable to autodetect event type from "asdf:::asdf"'
|
|
87
91
|
# invalid module
|
|
88
92
|
with pytest.raises(ValidationError) as error:
|
|
89
93
|
Scanner(modules=["asdf"])
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from ipaddress import ip_network
|
|
2
|
+
|
|
1
3
|
from ..bbot_fixtures import *
|
|
2
4
|
|
|
3
5
|
|
|
@@ -12,6 +14,7 @@ async def test_scan(
|
|
|
12
14
|
"1.1.1.0",
|
|
13
15
|
"1.1.1.1/31",
|
|
14
16
|
"evilcorp.com",
|
|
17
|
+
"test.evilcorp.com",
|
|
15
18
|
blacklist=["1.1.1.1/28", "www.evilcorp.com"],
|
|
16
19
|
modules=["ipneighbor"],
|
|
17
20
|
)
|
|
@@ -31,8 +34,11 @@ async def test_scan(
|
|
|
31
34
|
assert not scan0.in_scope("test.www.evilcorp.com")
|
|
32
35
|
assert not scan0.in_scope("www.evilcorp.co.uk")
|
|
33
36
|
j = scan0.json
|
|
34
|
-
assert set(j["target"]["seeds"]) == {"1.1.1.0", "1.1.1.0/31", "evilcorp.com"}
|
|
35
|
-
|
|
37
|
+
assert set(j["target"]["seeds"]) == {"1.1.1.0", "1.1.1.0/31", "evilcorp.com", "test.evilcorp.com"}
|
|
38
|
+
# we preserve the original whitelist inputs
|
|
39
|
+
assert set(j["target"]["whitelist"]) == {"1.1.1.0", "1.1.1.0/31", "evilcorp.com", "test.evilcorp.com"}
|
|
40
|
+
# but in the background they are collapsed
|
|
41
|
+
assert scan0.target.whitelist.hosts == {ip_network("1.1.1.0/31"), "evilcorp.com"}
|
|
36
42
|
assert set(j["target"]["blacklist"]) == {"1.1.1.0/28", "www.evilcorp.com"}
|
|
37
43
|
assert "ipneighbor" in j["preset"]["modules"]
|
|
38
44
|
|