secator 0.8.2a0__py3-none-any.whl → 0.9.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/cli.py CHANGED
@@ -1047,7 +1047,8 @@ def install_ruby():
1047
1047
 
1048
1048
  @install.command('tools')
1049
1049
  @click.argument('cmds', required=False)
1050
- def install_tools(cmds):
1050
+ @click.option('--cleanup', is_flag=True, default=False)
1051
+ def install_tools(cmds, cleanup):
1051
1052
  """Install supported tools."""
1052
1053
  if CONFIG.offline_mode:
1053
1054
  console.print(Error(message='Cannot run this command in offline mode.'))
@@ -1069,18 +1070,19 @@ def install_tools(cmds):
1069
1070
  if not status.is_ok():
1070
1071
  return_code = 1
1071
1072
  console.print()
1072
- distro = get_distro_config()
1073
- cleanup_cmds = [
1074
- 'go clean -cache',
1075
- 'go clean -modcache',
1076
- 'pip cache purge',
1077
- 'gem cleanup --user-install',
1078
- 'gem clean --user-install',
1079
- ]
1080
- if distro.pm_finalizer:
1081
- cleanup_cmds.append(f'sudo {distro.pm_finalizer}')
1082
- cmd = ' && '.join(cleanup_cmds)
1083
- Command.execute(cmd, cls_attributes={'shell': True}, quiet=False)
1073
+ if cleanup:
1074
+ distro = get_distro_config()
1075
+ cleanup_cmds = [
1076
+ 'go clean -cache',
1077
+ 'go clean -modcache',
1078
+ 'pip cache purge',
1079
+ 'gem cleanup --user-install',
1080
+ 'gem clean --user-install',
1081
+ ]
1082
+ if distro.pm_finalizer:
1083
+ cleanup_cmds.append(f'sudo {distro.pm_finalizer}')
1084
+ cmd = ' && '.join(cleanup_cmds)
1085
+ Command.execute(cmd, cls_attributes={'shell': True}, quiet=False)
1084
1086
  sys.exit(return_code)
1085
1087
 
1086
1088
 
@@ -1097,7 +1099,7 @@ def update(all):
1097
1099
  sys.exit(1)
1098
1100
 
1099
1101
  # Check current and latest version
1100
- info = get_version_info('secator', github_handle='freelabz/secator', version=VERSION)
1102
+ info = get_version_info('secator', '-version', 'freelabz/secator', version=VERSION)
1101
1103
  latest_version = info['latest_version']
1102
1104
  do_update = True
1103
1105
 
secator/installer.py CHANGED
@@ -66,6 +66,12 @@ class ToolInstaller:
66
66
  tool_cls.install_post]):
67
67
  return InstallerStatus.INSTALL_NOT_SUPPORTED
68
68
 
69
+ # Check PATH
70
+ path_var = os.environ.get('PATH', '')
71
+ if not str(CONFIG.dirs.bin) in path_var:
72
+ console.print(Warning(message=f'Bin directory {CONFIG.dirs.bin} not found in PATH ! Binaries installed by secator will not work')) # noqa: E501
73
+ console.print(Warning(message=f'Run "export PATH=$PATH:{CONFIG.dirs.bin}" to add the binaries to your PATH'))
74
+
69
75
  # Install pre-required packages
70
76
  if tool_cls.install_pre:
71
77
  status = PackageInstaller.install(tool_cls.install_pre)
@@ -8,6 +8,7 @@ from secator.utils import rich_to_ansi, traceback_as_string, rich_escape as _s
8
8
  class Error(OutputType):
9
9
  message: str
10
10
  traceback: str = field(default='', compare=False)
11
+ traceback_title: str = field(default='', compare=False)
11
12
  _source: str = field(default='', repr=True)
12
13
  _type: str = field(default='error', repr=True)
13
14
  _timestamp: int = field(default_factory=lambda: time.time(), compare=False)
@@ -31,6 +32,9 @@ class Error(OutputType):
31
32
  def __repr__(self):
32
33
  s = rf"\[[bold red]ERR[/]] {_s(self.message)}"
33
34
  if self.traceback:
34
- traceback_pretty = ' ' + self.traceback.replace('\n', '\n ')
35
+ s += ':'
36
+ traceback_pretty = ' ' + _s(self.traceback).replace('\n', '\n ')
37
+ if self.traceback_title:
38
+ traceback_pretty = f' {self.traceback_title}:\n{traceback_pretty}'
35
39
  s += f'\n[dim]{_s(traceback_pretty)}[/]'
36
40
  return rich_to_ansi(s)
secator/rich.py CHANGED
@@ -4,7 +4,7 @@ import yaml
4
4
  from rich.console import Console
5
5
  from rich.table import Table
6
6
 
7
- console = Console(stderr=True, color_system='truecolor')
7
+ console = Console(stderr=True)
8
8
  console_stdout = Console(record=True)
9
9
  # handler = RichHandler(rich_tracebacks=True) # TODO: add logging handler
10
10
 
@@ -301,7 +301,7 @@ class Command(Runner):
301
301
  proxy = CONFIG.http.socks5_proxy
302
302
  elif self.proxy in ['auto', 'http'] and self.proxy_http and CONFIG.http.http_proxy:
303
303
  proxy = CONFIG.http.http_proxy
304
- elif self.proxy == 'random':
304
+ elif self.proxy == 'random' and self.proxy_http:
305
305
  proxy = FreeProxy(timeout=CONFIG.http.freeproxy_timeout, rand=True, anonym=True).get()
306
306
  elif self.proxy.startswith(('http://', 'socks5://')):
307
307
  proxy = self.proxy
@@ -344,7 +344,7 @@ class Command(Runner):
344
344
 
345
345
  # Abort if no inputs
346
346
  if len(self.inputs) == 0 and self.skip_if_no_inputs:
347
- yield Info(message=f'{self.unique_name} skipped (no inputs)', _source=self.unique_name, _uuid=str(uuid.uuid4()))
347
+ yield Warning(message=f'{self.unique_name} skipped (no inputs)', _source=self.unique_name, _uuid=str(uuid.uuid4()))
348
348
  return
349
349
 
350
350
  # Yield targets
@@ -507,7 +507,7 @@ class Command(Runner):
507
507
  if self.config.name in str(exc):
508
508
  message = 'Executable not found.'
509
509
  if self.install_cmd:
510
- message += f' Install it with [bold green4]secator install tools {self.config.name}[/].'
510
+ message += f' Install it with "secator install tools {self.config.name}".'
511
511
  error = Error(message=message)
512
512
  else:
513
513
  error = Error.from_exception(exc)
@@ -652,12 +652,14 @@ class Command(Runner):
652
652
  )
653
653
 
654
654
  elif self.return_code != 0:
655
- error = f'Command failed with return code {self.return_code}.'
655
+ error = f'Command failed with return code {self.return_code}'
656
656
  last_lines = self.output.split('\n')
657
657
  last_lines = last_lines[max(0, len(last_lines) - 2):]
658
+ last_lines = [line for line in last_lines if line != '']
658
659
  yield Error(
659
660
  message=error,
660
661
  traceback='\n'.join(last_lines),
662
+ traceback_title='Last stdout lines',
661
663
  _source=self.unique_name,
662
664
  _uuid=str(uuid.uuid4())
663
665
  )
secator/tasks/bbot.py CHANGED
@@ -4,7 +4,7 @@ from secator.config import CONFIG
4
4
  from secator.decorators import task
5
5
  from secator.runners import Command
6
6
  from secator.serializers import RegexSerializer
7
- from secator.output_types import Vulnerability, Port, Url, Record, Ip, Tag, Error
7
+ from secator.output_types import Vulnerability, Port, Url, Record, Ip, Tag, Info, Error
8
8
  from secator.serializers import JSONSerializer
9
9
 
10
10
 
@@ -219,7 +219,8 @@ class bbot(Command):
219
219
  }
220
220
  }
221
221
  install_pre = {
222
- '*': ['git', 'openssl', 'unzip', 'tar', 'chromium']
222
+ 'apk': ['python3-dev', 'linux-headers', 'musl-dev', 'gcc', 'git', 'openssl', 'unzip', 'tar', 'chromium'],
223
+ '*': ['gcc', 'git', 'openssl', 'unzip', 'tar', 'chromium']
223
224
  }
224
225
  install_cmd = 'pipx install bbot && pipx upgrade bbot'
225
226
  install_post = {
@@ -234,6 +235,11 @@ class bbot(Command):
234
235
  yield item
235
236
  return
236
237
 
238
+ # Set scan name and base path for output
239
+ if _type == 'SCAN':
240
+ self.scan_config = item['data']
241
+ return
242
+
237
243
  if _type not in BBOT_MAP_TYPES:
238
244
  self._print(f'[bold orange3]Found unsupported bbot type: {_type}.[/] [bold green]Skipping.[/]', rich=True)
239
245
  return
@@ -278,9 +284,11 @@ class bbot(Command):
278
284
 
279
285
  # If a screenshot was saved, move it to secator output folder
280
286
  if item['type'] == 'WEBSCREENSHOT':
281
- path = item['data']['path']
282
- name = path.split('/')[-1]
287
+ from pathlib import Path
288
+ path = Path.home() / '.bbot' / 'scans' / self.scan_config['name'] / item['data']['path']
289
+ name = path.as_posix().split('/')[-1]
283
290
  secator_path = f'{self.reports_folder}/.outputs/{name}'
291
+ yield Info(f'Copying screenshot {path} to {secator_path}')
284
292
  shutil.copy(path, secator_path)
285
293
  item['data']['path'] = secator_path
286
294
 
secator/tasks/httpx.py CHANGED
@@ -65,6 +65,9 @@ class httpx(Http):
65
65
  }
66
66
  item_loaders = [JSONSerializer()]
67
67
  output_types = [Url, Subdomain]
68
+ install_pre = {
69
+ 'apk': ['chromium']
70
+ }
68
71
  install_cmd = 'go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest'
69
72
  install_github_handle = 'projectdiscovery/httpx'
70
73
  proxychains = False
secator/tasks/naabu.py CHANGED
@@ -34,7 +34,7 @@ class naabu(ReconPort):
34
34
  # 'health_check': 'hc'
35
35
  }
36
36
  opt_value_map = {
37
- TIMEOUT: lambda x: x*1000 if x and x > 0 else None, # convert to milliseconds
37
+ TIMEOUT: lambda x: int(x*1000) if x and x > 0 else None, # convert to milliseconds
38
38
  RETRIES: lambda x: 1 if x == 0 else x,
39
39
  PROXY: lambda x: x.replace('socks5://', '')
40
40
  }
secator/utils.py CHANGED
@@ -373,7 +373,7 @@ def rich_to_ansi(text):
373
373
  str: Converted text (ANSI).
374
374
  """
375
375
  from rich.console import Console
376
- tmp_console = Console(file=None, highlight=False, color_system='truecolor')
376
+ tmp_console = Console(file=None, highlight=False)
377
377
  with tmp_console.capture() as capture:
378
378
  tmp_console.print(text, end='', soft_wrap=True)
379
379
  return capture.get()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: secator
3
- Version: 0.8.2a0
3
+ Version: 0.9.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
@@ -66,7 +66,6 @@ Requires-Dist: pyinstrument<5; extra == 'trace'
66
66
  Provides-Extra: worker
67
67
  Requires-Dist: eventlet<1; extra == 'worker'
68
68
  Requires-Dist: flower<3; extra == 'worker'
69
- Requires-Dist: gevent<25; extra == 'worker'
70
69
  Description-Content-Type: text/markdown
71
70
 
72
71
  <h1 align="center">
@@ -165,6 +164,7 @@ check that the tool complies with our selection criterias before doing so. If it
165
164
  ```sh
166
165
  pipx install secator
167
166
  ```
167
+ ***Note:** Make sure to have [pipx](https://pipx.pypa.io/stable/installation/) installed.*
168
168
 
169
169
  </details>
170
170
 
@@ -178,7 +178,7 @@ pip install secator
178
178
  </details>
179
179
 
180
180
  <details>
181
- <summary>Bash</summary>
181
+ <summary>Bash (uses apt)</summary>
182
182
 
183
183
  ```sh
184
184
  wget -O - https://raw.githubusercontent.com/freelabz/secator/main/scripts/install.sh | sh
@@ -2,16 +2,16 @@ secator/.gitignore,sha256=da8MUc3hdb6Mo0WjZu2upn5uZMbXcBGvhdhTQ1L89HI,3093
2
2
  secator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  secator/celery.py,sha256=Ry-JYJzN9F4LFHOn4IXpSFgCzpM99esKiQRJh_TkHp8,9578
4
4
  secator/celery_utils.py,sha256=iIuCn_3YkPXCtpnbaYqpppU2TARzSDyTIYHkrRyt54s,7725
5
- secator/cli.py,sha256=rBExC1Lfzkgepwbhvad3XAlY8L_X5s_2uDw-w0kl1_0,43782
5
+ secator/cli.py,sha256=K6TB619bk8stXHUR_OeNSkD03djWYbvlalRRJvg9R0M,43870
6
6
  secator/config.py,sha256=6wm2EErW1DuhrdKSuIEUvc2b3yBxJWyZKnocr7lIeZw,19267
7
7
  secator/decorators.py,sha256=tjH7WodxJEBIf2CCbegmvOe8H9DKSFh4iPLEhDNGPCA,13784
8
8
  secator/definitions.py,sha256=gFtLT9fjNtX_1qkiCjNfQyCvYq07IhScsQzX4o20_SE,3084
9
- secator/installer.py,sha256=3Ay9BTxdpOFOBxZud6bv7ozrTJi5ckZra4S0Qv0dLjo,17611
9
+ secator/installer.py,sha256=Q5qmGbxGmuhysEA9YovTpy-YY2TxxFskhrzSX44c42E,17971
10
10
  secator/report.py,sha256=qJkEdCFttDBXIwUNUzZqFU_sG8l0PvyTSTogZVBv1Rs,3628
11
- secator/rich.py,sha256=3ugCkgai7UNylQGUuOVAd7ghYWDSc73aSomrfKgKVxo,3290
11
+ secator/rich.py,sha256=owmuLcTTUt8xYBTE3_SqWTkPeAomcU_8bPdW_V-U8VM,3264
12
12
  secator/template.py,sha256=Qy4RjcmlifeSA8CleWUBb9fluxuYHzxgEH0H-8qs8R4,4323
13
13
  secator/thread.py,sha256=rgRgEtcMgs2wyfLWVlCTUCLWeg6jsMo5iKpyyrON5rY,655
14
- secator/utils.py,sha256=mwRZWSoYDskleNvDBHjRIGoygK2DsBMeIdllABvD4vw,21237
14
+ secator/utils.py,sha256=HMw0Q4omL-a5VcbvUhATC30oOSEKxTVLANgVRfWKnkc,21211
15
15
  secator/utils_test.py,sha256=ArHwkWW89t0IDqxO4HjJWd_tm7tp1illP4pu3nLq5yo,6559
16
16
  secator/configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  secator/configs/profiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -51,7 +51,7 @@ secator/hooks/gcs.py,sha256=MIhntyWYz9BZdTXhWl5JznaczSq1_7fl3TVqPufuTSo,1490
51
51
  secator/hooks/mongodb.py,sha256=HyjtpJSoxvSZ6aG8uBf1RFLNKGXCBDQL5eEh4xzDonA,7545
52
52
  secator/output_types/__init__.py,sha256=LxCW0K1f2vdgUapc4pIEsUpBfC0TQVvqo7T57rGuZGk,1159
53
53
  secator/output_types/_base.py,sha256=OgS6ICt66TzPsqo1JZwRIIwbng2HRX1i_u5qbUECgNk,2820
54
- secator/output_types/error.py,sha256=A2m4YUAAf8z42MMew9XtM24OOZYoYKJzcfB2RWsQmlc,1231
54
+ secator/output_types/error.py,sha256=QjiJ5RoN3-utHqAyvgL2jlmZp7-u7emgUQpvLpYammU,1405
55
55
  secator/output_types/exploit.py,sha256=-BKTqPBg94rVgjw8YSmcYuBCI2x-73WwMd9ITP9qr3Y,1750
56
56
  secator/output_types/info.py,sha256=R8xeiD3ocNOsvkJPhrQgsx6q-Ea1G0eTAqyuh5JrAR0,843
57
57
  secator/output_types/ip.py,sha256=CyE3qkp55Kmj5YRl0CZGS4XrHX8N5apWrLN3OMzaK0U,1127
@@ -70,7 +70,7 @@ secator/runners/__init__.py,sha256=EBbOk37vkBy9p8Hhrbi-2VtM_rTwQ3b-0ggTyiD22cE,2
70
70
  secator/runners/_base.py,sha256=tcTsL35dAHsIMfgcclTtvDk2kQM4Hhu-8IZTyHJgqTs,28973
71
71
  secator/runners/_helpers.py,sha256=FGogmmdHfCWmIyq7wRprwU1oOSxesOu3Y0N4GyAgiGw,2000
72
72
  secator/runners/celery.py,sha256=bqvDTTdoHiGRCt0FRvlgFHQ_nsjKMP5P0PzGbwfCj_0,425
73
- secator/runners/command.py,sha256=w-N7weWh5FYeUNHMZAk9jT7_4x4D0KSKhJGUzm1GxBo,24972
73
+ secator/runners/command.py,sha256=fk5JzdrZ_2T2X8BqU7d0MeVfjmteUYtaRM9MJE5HHPw,25081
74
74
  secator/runners/scan.py,sha256=tuPuqwL6fIS4UbCoy5WPKthYWm_LL-vCPRD2qK58HZE,1232
75
75
  secator/runners/task.py,sha256=JXlwo3DyQnu69RbQ8xvJnXu6y0rDYN-3iT4q4gy39tI,2004
76
76
  secator/runners/workflow.py,sha256=vry_MZFx6dRrorTrdsUqvhMZGOLPCdzpxkvN6fnt62w,3783
@@ -81,7 +81,7 @@ secator/serializers/json.py,sha256=UJwAymRzjF-yBKOgz1MTOyBhQcdQg7fOKRXgmHIu8fo,4
81
81
  secator/serializers/regex.py,sha256=fh-fE0RGvKSGKByFtwmKsWriRpZR9PXZQsY9JybHBWI,489
82
82
  secator/tasks/__init__.py,sha256=yRIZf9E47aS7o6rpgAJLgJUpX2cug1ofZeq8QsxgyjU,192
83
83
  secator/tasks/_categories.py,sha256=IWyBprIUBZxflh7QfvK27Ix18M_bnquzlERqfTZohVs,13821
84
- secator/tasks/bbot.py,sha256=EBLOsI79nRxOdqL57OKJUTY9QXKKHOeqWA3gbQsMyWA,7128
84
+ secator/tasks/bbot.py,sha256=PXRf3KJBTRhkVirfZQ1BDeEyg33kY9zKk-iXWn3zo3k,7522
85
85
  secator/tasks/bup.py,sha256=4PM123Km3uOkMUwfdLY6J7pyCqIsbwMvOLYx7XYCAZc,3030
86
86
  secator/tasks/cariddi.py,sha256=7S92pp7tvihoz9fAiMpmcfPzEvxEJKMlk-IqAvVDISA,2906
87
87
  secator/tasks/dalfox.py,sha256=hHQgYuZ7AGQCQtcN8hSM9uPnzeq1DSr_cpOxnn7-660,1850
@@ -96,20 +96,20 @@ secator/tasks/gf.py,sha256=y8Fc0sRLGqNuwUjTBgLk3HEw3ZOnh09nB_GTufGErNA,962
96
96
  secator/tasks/gospider.py,sha256=KGINm9kxrq546xi1yN8_OwNCNDxSW9vVRYDAlvNajBs,2303
97
97
  secator/tasks/grype.py,sha256=xoOuldnHCrS0O1Y4IzjbSVvoX5eX-fLSZ74THdRC2so,2447
98
98
  secator/tasks/h8mail.py,sha256=wNukV-aB-bXPZNq7WL8n1nFgH5b5tGh6vOF80Yna33I,1934
99
- secator/tasks/httpx.py,sha256=5oI8vK7w94nsQlKs9Ve4yZsCmogbsiB5PqGarR3eIIM,5854
99
+ secator/tasks/httpx.py,sha256=SyJFjMwl8Z9BpG60wk27-X5nI13cp5BJumYWjb0Sefc,5896
100
100
  secator/tasks/katana.py,sha256=A0nnjKKT-A34LBtEuG25lWh5Ria4nwgo4Ti31403E-Q,5256
101
101
  secator/tasks/maigret.py,sha256=6anhBzB4lEM90Lk23cAD_ku7I_ghTpj0W0i3h6HARD8,2088
102
102
  secator/tasks/mapcidr.py,sha256=56ocbaDmB5_C_ns-773CgZXGOKOtkI9q9xJs2Rlfqio,990
103
103
  secator/tasks/msfconsole.py,sha256=TXVrvzSWw9Ncv2h9QJtaEinTMbps_z0zX1PFirERVho,6430
104
- secator/tasks/naabu.py,sha256=29qFob5NOmoFC9gedG03Ogi7uc0dAXgl3azmcWlMbcI,2084
104
+ secator/tasks/naabu.py,sha256=aAEkQ10ma3Log8OVj8wHY1zUWmjpVQ5pehAMQLJQEV0,2089
105
105
  secator/tasks/nmap.py,sha256=Zu24sJHnlOf3NXLj3Ohi07-x7m-5Ajr5ULpNsUF-QT0,12546
106
106
  secator/tasks/nuclei.py,sha256=o677F5yv3mfIlYEpKY5_W6CT2Dlt315DuFOsCjHLE5c,4270
107
107
  secator/tasks/searchsploit.py,sha256=gvtLZbL2hzAZ07Cf0cSj2Qs0GvWK94XyHvoPFsetXu8,3321
108
108
  secator/tasks/subfinder.py,sha256=C6W5NnXT92OUB1aSS9IYseqdI3wDMAz70TOEl8X-o3U,1213
109
109
  secator/tasks/wpscan.py,sha256=dF6_dw-Qezd8DmpftGc9KpgrvIk3zDdVJW4mKUa7fe0,5527
110
110
  secator/workflows/__init__.py,sha256=ivpZHiYYlj4JqlXLRmB9cmAPUGdk8QcUrCRL34hIqEA,665
111
- secator-0.8.2a0.dist-info/METADATA,sha256=LrPzsi4I2g9aLRQVUco3ewBuhFrgzUjFRFcHvLHvero,14793
112
- secator-0.8.2a0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
113
- secator-0.8.2a0.dist-info/entry_points.txt,sha256=lPgsqqUXWgiuGSfKy-se5gHdQlAXIwS_A46NYq7Acic,44
114
- secator-0.8.2a0.dist-info/licenses/LICENSE,sha256=19W5Jsy4WTctNkqmZIqLRV1gTDOp01S3LDj9iSgWaJ0,2867
115
- secator-0.8.2a0.dist-info/RECORD,,
111
+ secator-0.9.0.dist-info/METADATA,sha256=xW3FIft1SHj0C1_tfH0StwEqCBVplqlAu1ZeXuJ12kU,14849
112
+ secator-0.9.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
113
+ secator-0.9.0.dist-info/entry_points.txt,sha256=lPgsqqUXWgiuGSfKy-se5gHdQlAXIwS_A46NYq7Acic,44
114
+ secator-0.9.0.dist-info/licenses/LICENSE,sha256=19W5Jsy4WTctNkqmZIqLRV1gTDOp01S3LDj9iSgWaJ0,2867
115
+ secator-0.9.0.dist-info/RECORD,,