secator 0.17.0__py3-none-any.whl → 0.18.0__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 secator might be problematic. Click here for more details.

secator/config.py CHANGED
@@ -145,7 +145,7 @@ class Wordlists(StrictModel):
145
145
  templates: Dict[str, str] = {
146
146
  'bo0m_fuzz': 'https://raw.githubusercontent.com/Bo0oM/fuzz.txt/master/fuzz.txt',
147
147
  'combined_subdomains': 'https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/DNS/combined_subdomains.txt', # noqa: E501
148
- 'directory_list_small': 'https://raw.githubusercontent.com/danielmiessler/SecLists/refs/heads/master/Discovery/Web-Content/directory-list-2.3-small.txt', # noqa: E501
148
+ 'directory_list_small': 'https://gist.githubusercontent.com/sl4v/c087e36164e74233514b/raw/c51a811c70bbdd87f4725521420cc30e7232b36d/directory-list-2.3-small.txt', # noqa: E501
149
149
  }
150
150
  lists: Dict[str, List[str]] = {}
151
151
 
@@ -6,7 +6,19 @@ tags: [user_account]
6
6
  input_types:
7
7
  - slug
8
8
  - string
9
+ - email
9
10
 
10
11
  tasks:
11
- maigret:
12
- description: Hunt user accounts
12
+ _group/hunt_users:
13
+ maigret:
14
+ description: Hunt user accounts
15
+ targets_:
16
+ - type: target
17
+ field: name
18
+ condition: target.type != 'email'
19
+ h8mail:
20
+ description: Find password leaks
21
+ targets_:
22
+ - type: target
23
+ field: name
24
+ condition: target.type == 'email'
@@ -5,15 +5,28 @@ description: Wordpress vulnerability scan
5
5
  tags: [http, wordpress, vulnerability]
6
6
  input_types:
7
7
  - url
8
+ - ip
9
+ - host
10
+ - host:port
8
11
 
9
12
  tasks:
13
+ httpx:
14
+ description: URL probe
15
+ tech_detect: True
16
+
10
17
  _group/hunt_wordpress:
11
18
  nuclei:
12
19
  description: Nuclei Wordpress scan
13
20
  tags: [wordpress]
21
+ targets_:
22
+ - url.url
14
23
 
15
24
  wpscan:
16
25
  description: WPScan
26
+ targets_:
27
+ - url.url
17
28
 
18
29
  wpprobe:
19
30
  description: WPProbe
31
+ targets_:
32
+ - url.url
secator/runners/_base.py CHANGED
@@ -179,14 +179,14 @@ class Runner:
179
179
  # Add prior results to runner results
180
180
  self.debug(f'adding {len(results)} prior results to runner', sub='init')
181
181
  if CONFIG.addons.mongodb.enabled:
182
- self.debug('adding prior results from MongoDB', sub='init')
182
+ self.debug(f'loading {len(results)} results from MongoDB', sub='init')
183
183
  from secator.hooks.mongodb import get_results
184
184
  results = get_results(results)
185
185
  for result in results:
186
186
  self.add_result(result, print=False, output=False, hooks=False, queue=not self.has_parent)
187
187
 
188
188
  # Determine inputs
189
- self.debug(f'resolving inputs with dynamic opts ({len(self.dynamic_opts)})', obj=self.dynamic_opts, sub='init')
189
+ self.debug(f'resolving inputs with {len(self.dynamic_opts)} dynamic opts', obj=self.dynamic_opts, sub='init')
190
190
  self.inputs = [inputs] if not isinstance(inputs, list) else inputs
191
191
  self.inputs = list(set(self.inputs))
192
192
  targets = [Target(name=target) for target in self.inputs]
@@ -463,12 +463,11 @@ class Runner:
463
463
  if item._uuid and item._uuid in self.uuids:
464
464
  return
465
465
 
466
- # Keep existing ancestor id in context
467
- ancestor_id = item._context.get('ancestor_id', None)
468
-
469
- # Set context
470
- item._context.update(self.context)
471
- item._context['ancestor_id'] = ancestor_id or self.ancestor_id
466
+ # Update context with runner info
467
+ ctx = item._context.copy()
468
+ item._context = self.context.copy()
469
+ item._context.update(ctx)
470
+ item._context['ancestor_id'] = ctx.get('ancestor_id') or self.ancestor_id
472
471
 
473
472
  # Set uuid
474
473
  if not item._uuid:
@@ -756,6 +755,7 @@ class Runner:
756
755
  'last_updated_db': self.last_updated_db,
757
756
  'context': self.context,
758
757
  'errors': [e.toDict() for e in self.errors],
758
+ 'warnings': [w.toDict() for w in self.warnings],
759
759
  })
760
760
  return data
761
761
 
@@ -419,10 +419,13 @@ class Command(Runner):
419
419
  self.print_command()
420
420
 
421
421
  # Check for sudo requirements and prepare the password if needed
422
- sudo_password, error = self._prompt_sudo(self.cmd)
423
- if error:
424
- yield Error(message=error)
425
- return
422
+ sudo_required = re.search(r'\bsudo\b', self.cmd)
423
+ sudo_password = None
424
+ if sudo_required:
425
+ sudo_password, error = self._prompt_sudo(self.cmd)
426
+ if error:
427
+ yield Error(message=error)
428
+ return
426
429
 
427
430
  # Prepare cmds
428
431
  command = self.cmd if self.shell else shlex.split(self.cmd)
@@ -450,7 +453,7 @@ class Command(Runner):
450
453
  stdout=subprocess.PIPE,
451
454
  stderr=subprocess.STDOUT,
452
455
  universal_newlines=True,
453
- preexec_fn=os.setsid,
456
+ preexec_fn=os.setsid if not sudo_required else None,
454
457
  shell=self.shell,
455
458
  env=env,
456
459
  cwd=self.cwd)
@@ -688,7 +691,7 @@ class Command(Runner):
688
691
  ['sudo', '-S', '-p', '', 'true'],
689
692
  input=sudo_password + "\n",
690
693
  text=True,
691
- capture_output=True
694
+ capture_output=True,
692
695
  )
693
696
  if result.returncode == 0:
694
697
  return sudo_password, None # Password is correct
secator/tasks/bup.py CHANGED
@@ -20,7 +20,7 @@ class bup(Http):
20
20
  output_types = [Url, Progress]
21
21
  tags = ['url', 'bypass']
22
22
  input_flag = '-u'
23
- file_flag = '-R'
23
+ file_flag = '-u'
24
24
  json_flag = '--jsonl'
25
25
  opt_prefix = '--'
26
26
  opts = {
secator/tasks/fping.py CHANGED
@@ -17,7 +17,10 @@ class fping(ReconIp):
17
17
  file_flag = '-f'
18
18
  input_flag = None
19
19
  opts = {
20
- 'reverse_dns': {'is_flag': True, 'default': False, 'short': 'r', 'help': 'Reverse DNS lookup (slower)'}
20
+ 'count': {'type': int, 'default': None, 'help': 'Number of request packets to send to each target'},
21
+ 'show_name': {'is_flag': True, 'default': False, 'help': 'Show network addresses as well as hostnames'},
22
+ 'use_dns': {'is_flag': True, 'default': False, 'help': 'Use DNS to lookup address of return packet (same as -n but will force reverse-DNS lookup for hostnames)'}, # noqa: E501
23
+ 'summary': {'is_flag': True, 'default': False, 'help': 'Print cumulative statistics upon exit'},
21
24
  }
22
25
  opt_prefix = '--'
23
26
  opt_key_map = {
@@ -27,11 +30,14 @@ class fping(ReconIp):
27
30
  RETRIES: 'retry',
28
31
  TIMEOUT: 'timeout',
29
32
  THREADS: OPT_NOT_SUPPORTED,
30
- 'reverse_dns': 'r'
33
+ 'count': '-c',
34
+ 'show_name': '-n',
35
+ 'use_dns': '-d',
36
+ 'summary': '-s',
31
37
  }
32
38
  opt_value_map = {
33
- DELAY: lambda x: x * 1000, # convert s to ms
34
- TIMEOUT: lambda x: x * 1000 # convert s to ms
39
+ DELAY: lambda x: int(x) * 1000, # convert s to ms
40
+ TIMEOUT: lambda x: int(x) * 1000 # convert s to ms
35
41
  }
36
42
  install_github_handle = 'schweikert/fping'
37
43
  install_version = 'v5.1'
@@ -41,9 +47,20 @@ class fping(ReconIp):
41
47
  @staticmethod
42
48
  def item_loader(self, line):
43
49
  if '(' in line:
44
- host, ip = tuple(t.strip() for t in line.rstrip(')').split('('))
45
- if (validators.ipv4(host) or validators.ipv6(host)):
46
- host = ''
50
+
51
+ line_part = line.split(' : ')[0] if ' : ' in line else line # Removing the stat parts that appears when using -c
52
+
53
+ start_paren = line_part.find('(')
54
+ end_paren = line_part.find(')', start_paren)
55
+
56
+ if start_paren != -1 and end_paren != -1:
57
+ host = line_part[:start_paren].strip()
58
+ ip = line_part[start_paren+1:end_paren].strip()
59
+
60
+ if (validators.ipv4(host) or validators.ipv6(host)):
61
+ host = ''
62
+ else:
63
+ return
47
64
  else:
48
65
  ip = line.strip()
49
66
  host = ''
secator/tasks/maigret.py CHANGED
@@ -42,8 +42,13 @@ class maigret(ReconUser):
42
42
  EXTRA_DATA: lambda x: x['status'].get('ids', {})
43
43
  }
44
44
  }
45
- install_version = '0.5.0a'
46
- install_cmd = 'pipx install git+https://github.com/soxoj/maigret --force'
45
+ install_version = '0.5.0'
46
+ # install_pre = {
47
+ # 'apt': ['libcairo2-dev'],
48
+ # 'yum|zypper': ['cairo-devel'],
49
+ # '*': ['cairo']
50
+ # }
51
+ install_cmd = 'pipx install maigret==[install_version] --force'
47
52
  socks5_proxy = True
48
53
  profile = 'io'
49
54
 
secator/tasks/wpscan.py CHANGED
@@ -11,6 +11,7 @@ from secator.definitions import (CONFIDENCE, CVSS_SCORE, DELAY, DESCRIPTION,
11
11
  URL, USER_AGENT)
12
12
  from secator.output_types import Tag, Vulnerability, Info, Error
13
13
  from secator.tasks._categories import VulnHttp
14
+ from secator.installer import parse_version
14
15
 
15
16
 
16
17
  @task()
@@ -110,6 +111,12 @@ class wpscan(VulnHttp):
110
111
  # Get URL
111
112
  target = data.get('target_url', self.inputs[0])
112
113
 
114
+ # Get errors
115
+ scan_aborted = data.get('scan_aborted', False)
116
+ if scan_aborted:
117
+ yield Error(message=scan_aborted, traceback='\n'.join(data.get('trace', [])))
118
+ return
119
+
113
120
  # Wordpress version
114
121
  version = data.get('version', {})
115
122
  if version:
@@ -133,7 +140,7 @@ class wpscan(VulnHttp):
133
140
  location = main_theme['location']
134
141
  if version:
135
142
  number = version['number']
136
- latest_version = main_theme.get('latest_version')
143
+ latest_version = main_theme.get('latest_version') or 'unknown'
137
144
  yield Tag(
138
145
  name=f'Wordpress theme - {slug} {number}',
139
146
  match=target,
@@ -142,10 +149,12 @@ class wpscan(VulnHttp):
142
149
  'latest_version': latest_version
143
150
  }
144
151
  )
145
- if (latest_version and number < latest_version):
152
+ outdated = latest_version and parse_version(number) < parse_version(latest_version)
153
+ if outdated:
146
154
  yield Vulnerability(
147
155
  matched_at=target,
148
156
  name=f'Wordpress theme - {slug} {number} outdated',
157
+ description=f'The wordpress theme {slug} is outdated, consider updating to the latest version {latest_version}',
149
158
  confidence='high',
150
159
  severity='info'
151
160
  )
@@ -163,7 +172,7 @@ class wpscan(VulnHttp):
163
172
  location = data['location']
164
173
  if version:
165
174
  number = version['number']
166
- latest_version = data.get('latest_version')
175
+ latest_version = data.get('latest_version') or 'unknown'
167
176
  yield Tag(
168
177
  name=f'Wordpress plugin - {slug} {number}',
169
178
  match=target,
@@ -172,10 +181,12 @@ class wpscan(VulnHttp):
172
181
  'latest_version': latest_version
173
182
  }
174
183
  )
175
- if (latest_version and number < latest_version):
184
+ outdated = latest_version and parse_version(number) < parse_version(latest_version)
185
+ if outdated:
176
186
  yield Vulnerability(
177
187
  matched_at=target,
178
188
  name=f'Wordpress plugin - {slug} {number} outdated',
189
+ description=f'The wordpress plugin {slug} is outdated, consider updating to the latest version {latest_version}.',
179
190
  confidence='high',
180
191
  severity='info'
181
192
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: secator
3
- Version: 0.17.0
3
+ Version: 0.18.0
4
4
  Summary: The pentester's swiss knife.
5
5
  Project-URL: Homepage, https://github.com/freelabz/secator
6
6
  Project-URL: Issues, https://github.com/freelabz/secator/issues
@@ -6,7 +6,7 @@ secator/celery_utils.py,sha256=vhL5ZxXDn3ODvyVxMijKyUTJ1dOisMDjF_PhFUyOVSA,9451
6
6
  secator/cli.py,sha256=zmaMa-RhN3ENAPcfltTwUEE3Dobg9kKeVGTxsMN1v1g,61267
7
7
  secator/cli_helper.py,sha256=EJFl80fd1HcgMYbmiddMZssCD32YDiFLnr-UbLp61aQ,13720
8
8
  secator/click.py,sha256=pg7XPI7-wAhhEhd4aeAC8vHSqKi-H0zeFRlh0T-ayYg,2662
9
- secator/config.py,sha256=6CjGLMNNFWg1PAvW16v8SGceyngFs2SCEKjJhV2NtOU,20805
9
+ secator/config.py,sha256=9YO8HB4qrpYkvxob-CSRVY67py-rQZA1VB8BM4hc4Xc,20813
10
10
  secator/cve.py,sha256=j47VOGyZjOvCY_xwVYS9fiXQPKHL5bPRtCnVAmbQthE,21356
11
11
  secator/decorators.py,sha256=uygU8MguxEO0BKXRvF4Nn2QEDnjqdIer8ReBj_j9ALg,88
12
12
  secator/definitions.py,sha256=sJaR9e_4aEgAo7cVzYQcD2lotXQPN_3lze_qWhKvo1M,3275
@@ -46,8 +46,8 @@ secator/configs/workflows/url_dirsearch.yaml,sha256=_4TdMSVLt2lIbx8ucn0R04tkMUqh
46
46
  secator/configs/workflows/url_fuzz.yaml,sha256=a-ZvZrcPBaeVhRrxox8fq25SKMJflyAkKWLqJeC3xD4,911
47
47
  secator/configs/workflows/url_params_fuzz.yaml,sha256=ufGbW4GUtEZee0M1WPVo0w6ZCEH6xmuDO6VCjPaw8AQ,796
48
48
  secator/configs/workflows/url_vuln.yaml,sha256=35uY0SpQGgaPulkBkQUcy0AdVwjslEJfVGhM9DQAXkk,1817
49
- secator/configs/workflows/user_hunt.yaml,sha256=WX3bpsPWexLXs5bF-OkniPwm8T6fXws7f284Zrybi8I,189
50
- secator/configs/workflows/wordpress.yaml,sha256=n-I1uNZEPS6oVmF7Rn996K85csSenTtoVycJt0PWnzk,340
49
+ secator/configs/workflows/user_hunt.yaml,sha256=6XyiG-MnAdYmQsLe6qSqvT_8zFVisZAp-zJAu9ASv1U,485
50
+ secator/configs/workflows/wordpress.yaml,sha256=1Lv23G3jcnkbfHzTMBEcyWG2baQ0Pdo3-pYXiwl82nY,525
51
51
  secator/exporters/__init__.py,sha256=PnT9Ra4ArHt9VQTK5Cpc4CPY89XRwLLUGtZ8nUcknm0,415
52
52
  secator/exporters/_base.py,sha256=wM1UT1PsSP1gX4gylvpQjBeAsk59F2Q2eFrt7AFU7jM,68
53
53
  secator/exporters/console.py,sha256=vbmSln4UrIpzjCQCs6JdZ2VRxjX8qQ1gznCPx89xbX0,263
@@ -79,10 +79,10 @@ secator/output_types/user_account.py,sha256=IqPg0nfKzSsxA5DerLA3PEWIN9HscV_D7PRK
79
79
  secator/output_types/vulnerability.py,sha256=cuS5r_BKFuO-DQlrSEiN7elmunwlu2sdC4Rt9WDa10g,2864
80
80
  secator/output_types/warning.py,sha256=iy949Aj5OXJLWif7HFB5EvjcYrgKHAzIP9ffyLTV7LA,830
81
81
  secator/runners/__init__.py,sha256=EBbOk37vkBy9p8Hhrbi-2VtM_rTwQ3b-0ggTyiD22cE,290
82
- secator/runners/_base.py,sha256=IkAQfPzz_kou5Pa82y-2Wmtp_lIudKMc9ix8_NP4370,40663
82
+ secator/runners/_base.py,sha256=sJswPMqbmwBTOo_d_KM2dw2dSr1-2X8-mwvwRepa6zg,40716
83
83
  secator/runners/_helpers.py,sha256=TeebZnpo4cp-9tpgPlDoFm_gmr00_CERAC1aOYhTzA4,6281
84
84
  secator/runners/celery.py,sha256=bqvDTTdoHiGRCt0FRvlgFHQ_nsjKMP5P0PzGbwfCj_0,425
85
- secator/runners/command.py,sha256=A--1cFpzHAxvzO0xvpMSyY0Tb0OZxkJc8HsJaTNsfB0,31096
85
+ secator/runners/command.py,sha256=cSyp-LqGRhQzxfC4cCK1zsYFPd-y8AQiF1a5YJFHgYo,31229
86
86
  secator/runners/scan.py,sha256=axT_OmGhixogCPMUS1OUeMLnFtk8PxY7zL9NYCugFVU,2578
87
87
  secator/runners/task.py,sha256=PrkVns8UAGht2JbCmCUWycA6B39Z5oeMmAMq69KtXKI,2199
88
88
  secator/runners/workflow.py,sha256=YnpTSdmp54d55vORe4khWLSx2J7gtDFNryKfZXYAWnY,6076
@@ -95,14 +95,14 @@ secator/tasks/__init__.py,sha256=Op0O0Aa8c124AfDG-cEB9VLRsXZ1wXTpVrT3g-wxMNg,184
95
95
  secator/tasks/_categories.py,sha256=ZmUNzeFIZ9-_er9sLJw66PTYIL5nO799JQU3EoW-6nE,15394
96
96
  secator/tasks/arjun.py,sha256=WdRZtTCd2Ejbv5HlLS_FoWVKgGpMsR6RCDekV2kR788,3061
97
97
  secator/tasks/bbot.py,sha256=moIkwd52jCKaeg1v6Nv4Gfmd4GPObo9c9nwOzQvf-2M,9236
98
- secator/tasks/bup.py,sha256=9IXsCqMdhOeZcCsQB2L4IJ3Kzm2oQKDE7mflGljm0lM,3867
98
+ secator/tasks/bup.py,sha256=DXfOvtGJMe17RN9t764X0eZ__lKKz7evlI4Bl91IKGA,3867
99
99
  secator/tasks/cariddi.py,sha256=pc1z6FWFV4dauSJxWL9BKD-MXjCo14sgcNtAkGuKy5I,5194
100
100
  secator/tasks/dalfox.py,sha256=dllEP9A8-7YaX12fGRmLMltfNjm_9Us6wYoS86C_VO0,2507
101
101
  secator/tasks/dirsearch.py,sha256=-oa2P2Pq8LjF61PguUEtjgr9rgvVpGLzRZRDXIJMswY,2453
102
102
  secator/tasks/dnsx.py,sha256=2qNC-wSjS33geuHMOwuBapLwKEvWTlDgnmvM67ZSJVA,4220
103
103
  secator/tasks/feroxbuster.py,sha256=H7_WT8B0cPIBeq7FOownpQlrZ468R07zRLqrDLNCkg8,3006
104
104
  secator/tasks/ffuf.py,sha256=L2Rb34YIH30CFJacvaY8QVF1gDah9E0nNCdgAHWL9jo,4103
105
- secator/tasks/fping.py,sha256=uTOq24DcNQpNgpXQlFV4xxBdn8P9gJWM5mmhkobqW-Y,1575
105
+ secator/tasks/fping.py,sha256=8OMb5UxjLErkRW5G_kie9cS0mVtIKCKi1o8asZ_UUjs,2324
106
106
  secator/tasks/gau.py,sha256=SJaza2yQoMeJeE6TOCRrRv0udbwRIoiXX4gRE64GXoU,1804
107
107
  secator/tasks/gf.py,sha256=svNRzaBr_DYW3QGFoPmUBWZh0Xm07XDS2bbNH-tfcA4,1028
108
108
  secator/tasks/gitleaks.py,sha256=cajL0NDm7dRFpcq4fJOCSkQMpquUiOy9HODq93h36Xg,2638
@@ -111,7 +111,7 @@ secator/tasks/grype.py,sha256=OasQs5WQwgt--o6M2_uh3RYZZaA3-difweCS46Uc5-w,2573
111
111
  secator/tasks/h8mail.py,sha256=XsDnL8LPk_jIHfJhqeYMj2423epk0NADorjd_JhBa9o,2033
112
112
  secator/tasks/httpx.py,sha256=0Umt2ouL36TELxmoaZ4dKSGXgipN3ve__IQFgUKrWZQ,6498
113
113
  secator/tasks/katana.py,sha256=10Sml1d0bO_UDwT1y_4TDQ_a0ihWKAW6L6-n8M9ArUw,6220
114
- secator/tasks/maigret.py,sha256=jjuyR8lAZYUybmN8SwEj3hrRB25p9xm4X_361auZK_Q,2173
114
+ secator/tasks/maigret.py,sha256=4QSAn3ccHTvM5DMe6IlMQLi3-AV81X_XSEcrdxkbXc0,2270
115
115
  secator/tasks/mapcidr.py,sha256=tMTHQspHSs92F4R-9HVYjFBpiu9ZhxoJSNvpd8KwKKc,1057
116
116
  secator/tasks/msfconsole.py,sha256=3VjAEpwEAFDcGxyYMhKyDLHRObXELYFx_H306fzmtMw,6566
117
117
  secator/tasks/naabu.py,sha256=Z8kYvAMeeSLrhnojLRx8GzxvwhFhDCfDj9a7r9Wbr1A,2407
@@ -123,10 +123,10 @@ secator/tasks/testssl.py,sha256=rrpKerOYcNA4NJr9RQ_uAtAbl3W50FRp3bPo3yD8EEg,8787
123
123
  secator/tasks/trivy.py,sha256=loIVQeHlYzz-_mVI6-HrL1O3H-22LA0vl4J9Ja_fy2I,3307
124
124
  secator/tasks/wafw00f.py,sha256=9CnV9F7ZrykO27F3PAb5HtwULDMYEKGSTbz-jh0kc2g,3189
125
125
  secator/tasks/wpprobe.py,sha256=1QPJ-7JvhL7LFvjUTAmqpH2Krp-Qmi079lonso16YPQ,3229
126
- secator/tasks/wpscan.py,sha256=dBkbG9EODHDUBAA8uNVULX4SdVgTCAi_F1T1oCfRbsI,5852
126
+ secator/tasks/wpscan.py,sha256=vRhtNfU6nSlKIZ8_kWFyDjrUnjSmkfGeTMkKYwN0CXU,6441
127
127
  secator/workflows/__init__.py,sha256=XOviyjSylZ4cuVmmQ76yuqZRdmvOEghqAnuw_4cLmfk,702
128
- secator-0.17.0.dist-info/METADATA,sha256=FPBlaaLaBXMP4i2-bz5q39-Z2i_LVn3ezeu-xNuC0Ro,17253
129
- secator-0.17.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
130
- secator-0.17.0.dist-info/entry_points.txt,sha256=lPgsqqUXWgiuGSfKy-se5gHdQlAXIwS_A46NYq7Acic,44
131
- secator-0.17.0.dist-info/licenses/LICENSE,sha256=19W5Jsy4WTctNkqmZIqLRV1gTDOp01S3LDj9iSgWaJ0,2867
132
- secator-0.17.0.dist-info/RECORD,,
128
+ secator-0.18.0.dist-info/METADATA,sha256=q5_y81JOJ3bps7hr_9xlC47nJTE6CFfIVmNxVFqUy1g,17253
129
+ secator-0.18.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
130
+ secator-0.18.0.dist-info/entry_points.txt,sha256=lPgsqqUXWgiuGSfKy-se5gHdQlAXIwS_A46NYq7Acic,44
131
+ secator-0.18.0.dist-info/licenses/LICENSE,sha256=19W5Jsy4WTctNkqmZIqLRV1gTDOp01S3LDj9iSgWaJ0,2867
132
+ secator-0.18.0.dist-info/RECORD,,