bbot 2.2.0.5279rc0__py3-none-any.whl → 2.2.0.5309rc0__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 (62) hide show
  1. bbot/__init__.py +1 -1
  2. bbot/cli.py +1 -1
  3. bbot/core/engine.py +2 -2
  4. bbot/core/event/base.py +23 -2
  5. bbot/core/helpers/bloom.py +8 -1
  6. bbot/core/helpers/dns/helpers.py +2 -2
  7. bbot/core/helpers/helper.py +4 -3
  8. bbot/core/helpers/misc.py +11 -5
  9. bbot/core/helpers/regexes.py +2 -1
  10. bbot/core/helpers/web/web.py +1 -1
  11. bbot/modules/anubisdb.py +1 -1
  12. bbot/modules/baddns.py +1 -1
  13. bbot/modules/bevigil.py +2 -2
  14. bbot/modules/binaryedge.py +1 -1
  15. bbot/modules/bufferoverrun.py +2 -3
  16. bbot/modules/builtwith.py +2 -2
  17. bbot/modules/c99.py +4 -2
  18. bbot/modules/certspotter.py +4 -2
  19. bbot/modules/chaos.py +4 -2
  20. bbot/modules/columbus.py +1 -1
  21. bbot/modules/crt.py +4 -2
  22. bbot/modules/digitorus.py +1 -1
  23. bbot/modules/dnscaa.py +3 -3
  24. bbot/modules/fullhunt.py +1 -1
  25. bbot/modules/hackertarget.py +4 -2
  26. bbot/modules/internal/excavate.py +2 -3
  27. bbot/modules/internal/speculate.py +1 -1
  28. bbot/modules/leakix.py +4 -2
  29. bbot/modules/myssl.py +1 -1
  30. bbot/modules/otx.py +4 -2
  31. bbot/modules/passivetotal.py +4 -2
  32. bbot/modules/rapiddns.py +2 -7
  33. bbot/modules/securitytrails.py +4 -2
  34. bbot/modules/shodan_dns.py +1 -1
  35. bbot/modules/subdomaincenter.py +1 -1
  36. bbot/modules/templates/subdomain_enum.py +3 -3
  37. bbot/modules/trickest.py +1 -1
  38. bbot/modules/virustotal.py +2 -7
  39. bbot/modules/zoomeye.py +5 -3
  40. bbot/presets/spider.yml +4 -0
  41. bbot/scanner/manager.py +1 -2
  42. bbot/scanner/preset/args.py +3 -3
  43. bbot/scanner/preset/path.py +3 -1
  44. bbot/scanner/preset/preset.py +10 -4
  45. bbot/scanner/scanner.py +7 -2
  46. bbot/scanner/target.py +236 -434
  47. bbot/test/test_step_1/test_bloom_filter.py +2 -0
  48. bbot/test/test_step_1/test_cli.py +7 -0
  49. bbot/test/test_step_1/test_dns.py +2 -1
  50. bbot/test/test_step_1/test_events.py +16 -2
  51. bbot/test/test_step_1/test_helpers.py +17 -0
  52. bbot/test/test_step_1/test_presets.py +50 -36
  53. bbot/test/test_step_1/test_python_api.py +4 -0
  54. bbot/test/test_step_1/test_scan.py +8 -2
  55. bbot/test/test_step_1/test_target.py +227 -129
  56. bbot/test/test_step_2/module_tests/test_module_dastardly.py +1 -1
  57. bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +1 -1
  58. {bbot-2.2.0.5279rc0.dist-info → bbot-2.2.0.5309rc0.dist-info}/METADATA +4 -4
  59. {bbot-2.2.0.5279rc0.dist-info → bbot-2.2.0.5309rc0.dist-info}/RECORD +62 -62
  60. {bbot-2.2.0.5279rc0.dist-info → bbot-2.2.0.5309rc0.dist-info}/LICENSE +0 -0
  61. {bbot-2.2.0.5279rc0.dist-info → bbot-2.2.0.5309rc0.dist-info}/WHEEL +0 -0
  62. {bbot-2.2.0.5279rc0.dist-info → bbot-2.2.0.5309rc0.dist-info}/entry_points.txt +0 -0
@@ -66,4 +66,6 @@ async def test_bloom_filter():
66
66
  # ensure false positives are less than .02 percent
67
67
  assert false_positive_percent < 0.02
68
68
 
69
+ bloom_filter.close()
70
+
69
71
  await scan._cleanup()
@@ -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
- assert len(await dnsengine.resolve("google.com", type=rdtype)) > 0
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
- assert "dead::c0de" == scan.make_event(" [DEaD::c0De]:88", "DNS_NAME", dummy=True)
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
- assert scan.make_event("http://evilcorp.com", dummy=True) == scan.make_event("http://evilcorp.com/", dummy=True)
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 "asdf.evilcorp.com" in preset1_baked.target
192
- assert "asdf.www.evilcorp.ce" in preset1_baked.target
193
- assert not "evilcorp.ce" in preset1_baked.target
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.com" in preset1_baked.target
225
- assert not "asdf.www.evilcorp.ce" in preset1_baked.target
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.target]) == {"evilcorp.com"}
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.whitelist]) == {"1.2.3.0/24", "evilcorp.net"}
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.target]) == {"evilcorp.com", "evilcorp.org"}
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.target
304
- assert "www.evilcorp.com" in preset_nowhitelist_baked.target
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.target]) == {"evilcorp.com", "evilcorp.org"}
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.target
319
- assert "www.evilcorp.com" in preset_whitelist_baked.target
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.target]) == {"evilcorp.com"}
332
- assert set([e.data for e in preset_nowhitelist2_baked.target]) == {"evilcorp.de"}
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.target]) == {"evilcorp.com", "evilcorp.de"}
338
- assert set([e.data for e in preset_nowhitelist2_baked.target]) == {"evilcorp.de"}
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.target
342
- assert "www.evilcorp.de" in preset_nowhitelist1_baked.target
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.target]) == {"evilcorp.com"}
360
- assert set([e.data for e in preset_nowhitelist2_baked.target]) == {"evilcorp.com", "evilcorp.de"}
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
- assert set(j["target"]["whitelist"]) == {"1.1.1.0/31", "evilcorp.com"}
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