secator 0.6.0__py3-none-any.whl → 0.8.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.

Files changed (90) hide show
  1. secator/celery.py +160 -185
  2. secator/celery_utils.py +268 -0
  3. secator/cli.py +427 -176
  4. secator/config.py +114 -68
  5. secator/configs/workflows/host_recon.yaml +5 -3
  6. secator/configs/workflows/port_scan.yaml +7 -3
  7. secator/configs/workflows/subdomain_recon.yaml +2 -2
  8. secator/configs/workflows/url_bypass.yaml +10 -0
  9. secator/configs/workflows/url_dirsearch.yaml +1 -1
  10. secator/configs/workflows/url_vuln.yaml +1 -1
  11. secator/decorators.py +170 -92
  12. secator/definitions.py +11 -4
  13. secator/exporters/__init__.py +7 -5
  14. secator/exporters/console.py +10 -0
  15. secator/exporters/csv.py +27 -19
  16. secator/exporters/gdrive.py +16 -11
  17. secator/exporters/json.py +3 -1
  18. secator/exporters/table.py +30 -2
  19. secator/exporters/txt.py +20 -16
  20. secator/hooks/gcs.py +53 -0
  21. secator/hooks/mongodb.py +53 -27
  22. secator/installer.py +277 -60
  23. secator/output_types/__init__.py +29 -11
  24. secator/output_types/_base.py +11 -1
  25. secator/output_types/error.py +36 -0
  26. secator/output_types/exploit.py +12 -8
  27. secator/output_types/info.py +24 -0
  28. secator/output_types/ip.py +8 -1
  29. secator/output_types/port.py +9 -2
  30. secator/output_types/progress.py +5 -0
  31. secator/output_types/record.py +5 -3
  32. secator/output_types/stat.py +33 -0
  33. secator/output_types/subdomain.py +1 -1
  34. secator/output_types/tag.py +8 -6
  35. secator/output_types/target.py +2 -2
  36. secator/output_types/url.py +14 -11
  37. secator/output_types/user_account.py +6 -6
  38. secator/output_types/vulnerability.py +8 -6
  39. secator/output_types/warning.py +24 -0
  40. secator/report.py +56 -23
  41. secator/rich.py +44 -39
  42. secator/runners/_base.py +629 -638
  43. secator/runners/_helpers.py +5 -91
  44. secator/runners/celery.py +18 -0
  45. secator/runners/command.py +404 -214
  46. secator/runners/scan.py +8 -24
  47. secator/runners/task.py +21 -55
  48. secator/runners/workflow.py +41 -40
  49. secator/scans/__init__.py +28 -0
  50. secator/serializers/dataclass.py +6 -0
  51. secator/serializers/json.py +10 -5
  52. secator/serializers/regex.py +12 -4
  53. secator/tasks/_categories.py +147 -42
  54. secator/tasks/bbot.py +295 -0
  55. secator/tasks/bup.py +99 -0
  56. secator/tasks/cariddi.py +38 -49
  57. secator/tasks/dalfox.py +3 -0
  58. secator/tasks/dirsearch.py +14 -25
  59. secator/tasks/dnsx.py +49 -30
  60. secator/tasks/dnsxbrute.py +4 -1
  61. secator/tasks/feroxbuster.py +10 -20
  62. secator/tasks/ffuf.py +3 -2
  63. secator/tasks/fping.py +4 -4
  64. secator/tasks/gau.py +5 -0
  65. secator/tasks/gf.py +2 -2
  66. secator/tasks/gospider.py +4 -0
  67. secator/tasks/grype.py +11 -13
  68. secator/tasks/h8mail.py +32 -42
  69. secator/tasks/httpx.py +58 -21
  70. secator/tasks/katana.py +19 -23
  71. secator/tasks/maigret.py +27 -25
  72. secator/tasks/mapcidr.py +2 -3
  73. secator/tasks/msfconsole.py +22 -19
  74. secator/tasks/naabu.py +18 -2
  75. secator/tasks/nmap.py +82 -55
  76. secator/tasks/nuclei.py +13 -3
  77. secator/tasks/searchsploit.py +26 -11
  78. secator/tasks/subfinder.py +5 -1
  79. secator/tasks/wpscan.py +91 -94
  80. secator/template.py +61 -45
  81. secator/thread.py +24 -0
  82. secator/utils.py +417 -78
  83. secator/utils_test.py +48 -23
  84. secator/workflows/__init__.py +28 -0
  85. {secator-0.6.0.dist-info → secator-0.8.0.dist-info}/METADATA +59 -48
  86. secator-0.8.0.dist-info/RECORD +115 -0
  87. {secator-0.6.0.dist-info → secator-0.8.0.dist-info}/WHEEL +1 -1
  88. secator-0.6.0.dist-info/RECORD +0 -101
  89. {secator-0.6.0.dist-info → secator-0.8.0.dist-info}/entry_points.txt +0 -0
  90. {secator-0.6.0.dist-info → secator-0.8.0.dist-info}/licenses/LICENSE +0 -0
secator/utils_test.py CHANGED
@@ -6,12 +6,13 @@ import unittest.mock
6
6
 
7
7
  from fp.fp import FreeProxy
8
8
 
9
- from secator.definitions import (CIDR_RANGE, DEBUG, DELAY, DEPTH, EMAIL,
9
+ from secator.definitions import (CIDR_RANGE, DELAY, DEPTH, EMAIL,
10
10
  FOLLOW_REDIRECT, HEADER, HOST, IP, MATCH_CODES,
11
11
  METHOD, PROXY, RATE_LIMIT, RETRIES,
12
12
  THREADS, TIMEOUT, URL, USER_AGENT, USERNAME)
13
13
  from secator.cli import ALL_WORKFLOWS, ALL_TASKS, ALL_SCANS
14
- from secator.output_types import OutputType
14
+ from secator.output_types import EXECUTION_TYPES, STAT_TYPES
15
+ from secator.runners import Command
15
16
  from secator.rich import console
16
17
  from secator.utils import load_fixture
17
18
 
@@ -88,8 +89,12 @@ META_OPTS = {
88
89
  USER_AGENT: 'Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1',
89
90
 
90
91
  # Individual tasks options
92
+ 'bup.mode': 'http_methods',
91
93
  'gf.pattern': 'xss',
92
94
  'nmap.output_path': load_fixture('nmap_output', FIXTURES_DIR, only_path=True, ext='.xml'), # nmap XML fixture
95
+ 'nmap.tcp_connect': True,
96
+ 'nmap.version_detection': True,
97
+ 'nmap.skip_host_discovery': True,
93
98
  'msfconsole.resource': load_fixture('msfconsole_input', FIXTURES_DIR, only_path=True),
94
99
  'dirsearch.output_path': load_fixture('dirsearch_output', FIXTURES_DIR, only_path=True),
95
100
  'maigret.output_path': load_fixture('maigret_output', FIXTURES_DIR, only_path=True),
@@ -104,6 +109,7 @@ def mock_subprocess_popen(output_list):
104
109
  mock_process = unittest.mock.MagicMock()
105
110
  mock_process.wait.return_value = 0
106
111
  mock_process.stdout.readline.side_effect = output_list
112
+ mock_process.pid = None
107
113
  mock_process.returncode = 0
108
114
 
109
115
  def mock_popen(*args, **kwargs):
@@ -113,7 +119,7 @@ def mock_subprocess_popen(output_list):
113
119
 
114
120
 
115
121
  @contextlib.contextmanager
116
- def mock_command(cls, targets=[], opts={}, fixture=None, method=''):
122
+ def mock_command(cls, inputs=[], opts={}, fixture=None, method=''):
117
123
  mocks = []
118
124
  if isinstance(fixture, dict):
119
125
  fixture = [fixture]
@@ -129,60 +135,79 @@ def mock_command(cls, targets=[], opts={}, fixture=None, method=''):
129
135
  mocks.append(fixture)
130
136
 
131
137
  with mock_subprocess_popen(mocks):
132
- command = cls(targets, **opts)
138
+ command = cls(inputs, **opts)
133
139
  if method == 'run':
134
- yield cls(targets, **opts).run()
140
+ yield cls(inputs, **opts).run()
135
141
  elif method == 'si':
136
- yield cls.si([], targets, **opts)
142
+ yield cls.si([], inputs, **opts)
137
143
  elif method in ['s', 'delay']:
138
- yield getattr(cls, method)(targets, **opts)
144
+ yield getattr(cls, method)(inputs, **opts)
139
145
  else:
140
146
  yield command
141
147
 
142
148
 
143
149
  class CommandOutputTester: # Mixin for unittest.TestCase
144
150
 
145
- def _test_task_output(
151
+ def _test_runner_output(
146
152
  self,
147
- results,
153
+ runner,
148
154
  expected_output_keys=[],
149
155
  expected_output_types=[],
150
156
  expected_results=[],
157
+ expected_status='SUCCESS',
151
158
  empty_results_allowed=False):
152
159
 
153
- if not isinstance(results, list):
154
- results = [results]
160
+ console.print(f'[dim]Testing {runner.config.type} {runner.name} ...[/]', end='')
161
+
162
+ if not runner.inputs:
163
+ console.print('[dim gold3] skipped (no inputs defined).[/]')
164
+ return
165
+
166
+ if not expected_results and not expected_output_keys:
167
+ console.print('[dim gold3] (no outputs defined).[/]', end='')
155
168
 
156
169
  try:
157
- if not empty_results_allowed:
158
- self.assertGreater(len(results), 0)
170
+ # Run runner
171
+ results = runner.run()
159
172
 
160
- for item in results:
173
+ # Add execution types to allowed output types
174
+ expected_output_types.extend(EXECUTION_TYPES + STAT_TYPES)
161
175
 
162
- if DEBUG > 2:
163
- console.log('\n', log_locals=True)
176
+ # Check return code
177
+ if isinstance(runner, Command):
178
+ if not runner.ignore_return_code:
179
+ self.assertEqual(runner.return_code, 0, f'{runner.name} should have a 0 return code')
164
180
 
165
- if DEBUG > 0 and isinstance(item, OutputType):
166
- print(repr(item))
181
+ # Check results not empty
182
+ if not empty_results_allowed:
183
+ self.assertGreater(len(results), 0, f'{runner.name} should return at least 1 result')
184
+
185
+ # Check status
186
+ self.assertEqual(runner.status, expected_status, f'{runner.name} should have the status {expected_status}')
187
+
188
+ # Check results
189
+ for item in results:
167
190
 
168
191
  if expected_output_types:
169
- self.assertIn(type(item), expected_output_types)
192
+ self.assertIn(type(item), expected_output_types, f'{runner.name}: item has an unexpected output type "{type(item)}"') # noqa: E501
170
193
 
171
194
  if expected_output_keys:
172
195
  keys = [k for k in list(item.keys()) if not k.startswith('_')]
173
196
  self.assertEqual(
174
197
  set(keys).difference(set(expected_output_keys)),
175
- set())
198
+ set(),
199
+ f'{runner.name}: item is missing expected keys {set(expected_output_keys)}')
176
200
 
201
+ # Check if runner results in expected results
177
202
  if expected_results:
178
203
  for result in expected_results:
179
- self.assertIn(result, results)
204
+ self.assertIn(result, results, f'{runner.name}: {result} should be in runner results')
180
205
 
181
206
  except Exception:
182
- console.print('[bold red] failed[/]')
207
+ console.print('[dim red] failed[/]')
183
208
  raise
184
209
 
185
- console.print('[bold green] ok[/]')
210
+ console.print('[dim green] ok[/]')
186
211
 
187
212
 
188
213
  def clear_modules():
@@ -0,0 +1,28 @@
1
+ from secator.cli import ALL_WORKFLOWS
2
+
3
+
4
+ def generate_class(config):
5
+ from secator.runners import Workflow
6
+
7
+ class workflow(Workflow):
8
+ def __init__(self, inputs=[], **run_opts):
9
+ hooks = run_opts.pop('hooks', {})
10
+ results = run_opts.pop('results', [])
11
+ context = run_opts.pop('context', {})
12
+ super().__init__(
13
+ config=config,
14
+ inputs=inputs,
15
+ results=results,
16
+ run_opts=run_opts,
17
+ hooks=hooks,
18
+ context=context)
19
+ return workflow, config.name
20
+
21
+
22
+ DYNAMIC_WORKFLOWS = {}
23
+ for workflow in ALL_WORKFLOWS:
24
+ cls, name = generate_class(workflow)
25
+ DYNAMIC_WORKFLOWS[name] = cls
26
+
27
+ globals().update(DYNAMIC_WORKFLOWS)
28
+ __all__ = list(DYNAMIC_WORKFLOWS)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: secator
3
- Version: 0.6.0
3
+ Version: 0.8.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
@@ -22,19 +22,24 @@ Requires-Python: >=3.8
22
22
  Requires-Dist: beautifulsoup4<=5
23
23
  Requires-Dist: celery<6
24
24
  Requires-Dist: cpe<2
25
+ Requires-Dist: distro<2
25
26
  Requires-Dist: dotmap<2
26
27
  Requires-Dist: free-proxy<2
27
28
  Requires-Dist: furl<3
29
+ Requires-Dist: greenlet<4
28
30
  Requires-Dist: humanize<5
29
31
  Requires-Dist: ifaddr<1
30
32
  Requires-Dist: jinja2<4
31
33
  Requires-Dist: packaging<25
34
+ Requires-Dist: psutil<7
32
35
  Requires-Dist: pydantic<3
33
36
  Requires-Dist: python-dotenv<2
34
37
  Requires-Dist: pyyaml<7
35
38
  Requires-Dist: requests<3
39
+ Requires-Dist: retry<1
36
40
  Requires-Dist: rich-click<1.7
37
41
  Requires-Dist: rich<14
42
+ Requires-Dist: tldextract<6
38
43
  Requires-Dist: typing-extensions<5
39
44
  Requires-Dist: validators<1
40
45
  Requires-Dist: xmltodict<1
@@ -44,10 +49,13 @@ Provides-Extra: dev
44
49
  Requires-Dist: asciinema-automation<1; extra == 'dev'
45
50
  Requires-Dist: coverage<8; extra == 'dev'
46
51
  Requires-Dist: flake8<8; extra == 'dev'
52
+ Requires-Dist: pytest<9; extra == 'dev'
47
53
  Requires-Dist: watchdog<3; extra == 'dev'
48
- Provides-Extra: google
49
- Requires-Dist: google-api-python-client<3; extra == 'google'
50
- Requires-Dist: gspread<7; extra == 'google'
54
+ Provides-Extra: gcs
55
+ Requires-Dist: google-cloud-storage<3; extra == 'gcs'
56
+ Provides-Extra: gdrive
57
+ Requires-Dist: google-api-python-client<3; extra == 'gdrive'
58
+ Requires-Dist: gspread<7; extra == 'gdrive'
51
59
  Provides-Extra: mongodb
52
60
  Requires-Dist: pymongo<5; extra == 'mongodb'
53
61
  Provides-Extra: redis
@@ -62,7 +70,7 @@ Requires-Dist: gevent<25; extra == 'worker'
62
70
  Description-Content-Type: text/markdown
63
71
 
64
72
  <h1 align="center">
65
- <img src="https://github.com/freelabz/secator/assets/9629314/ee203af4-e853-439a-af01-edeabfc4bf07/" width="400">
73
+ <img src="https://github.com/freelabz/secator/assets/9629314/ee203af4-e853-439a-af01-edeabfc4bf07/" width="400">
66
74
  </h1>
67
75
 
68
76
  <h4 align="center">The pentester's swiss knife.</h4>
@@ -113,32 +121,35 @@ and it is designed to improve productivity for pentesters and security researche
113
121
 
114
122
  `secator` integrates the following tools:
115
123
 
116
- | Name | Description | Category |
117
- |---------------------------------------------------------------|--------------------------------------------------------------------------------|----------------|
118
- | [httpx](https://github.com/projectdiscovery/httpx) | Fast HTTP prober. | `http` |
119
- | [cariddi](https://github.com/edoardottt/cariddi) | Fast crawler and endpoint secrets / api keys / tokens matcher. | `http/crawler` |
120
- | [gau](https://github.com/lc/gau) | Offline URL crawler (Alien Vault, The Wayback Machine, Common Crawl, URLScan). | `http/crawler` |
121
- | [gospider](https://github.com/jaeles-project/gospider) | Fast web spider written in Go. | `http/crawler` |
122
- | [katana](https://github.com/projectdiscovery/katana) | Next-generation crawling and spidering framework. | `http/crawler` |
123
- | [dirsearch](https://github.com/maurosoria/dirsearch) | Web path discovery. | `http/fuzzer` |
124
- | [feroxbuster](https://github.com/epi052/feroxbuster) | Simple, fast, recursive content discovery tool written in Rust. | `http/fuzzer` |
125
- | [ffuf](https://github.com/ffuf/ffuf) | Fast web fuzzer written in Go. | `http/fuzzer` |
126
- | [h8mail](https://github.com/khast3x/h8mail) | Email OSINT and breach hunting tool. | `osint` |
127
- | [dnsx](https://github.com/projectdiscovery/dnsx) | Fast and multi-purpose DNS toolkit designed for running DNS queries. | `recon/dns` |
128
- | [dnsxbrute](https://github.com/projectdiscovery/dnsx) | Fast and multi-purpose DNS toolkit designed for running DNS queries (bruteforce mode). | `recon/dns` |
129
- | [subfinder](https://github.com/projectdiscovery/subfinder) | Fast subdomain finder. | `recon/dns` |
130
- | [fping](https://fping.org/) | Find alive hosts on local networks. | `recon/ip` |
131
- | [mapcidr](https://github.com/projectdiscovery/mapcidr) | Expand CIDR ranges into IPs. | `recon/ip` |
132
- | [naabu](https://github.com/projectdiscovery/naabu) | Fast port discovery tool. | `recon/port` |
133
- | [maigret](https://github.com/soxoj/maigret) | Hunt for user accounts across many websites. | `recon/user` |
134
- | [gf](https://github.com/tomnomnom/gf) | A wrapper around grep to avoid typing common patterns. | `tagger` |
135
- | [grype](https://github.com/anchore/grype) | A vulnerability scanner for container images and filesystems. | `vuln/code` |
136
- | [dalfox](https://github.com/hahwul/dalfox) | Powerful XSS scanning tool and parameter analyzer. | `vuln/http` |
137
- | [msfconsole](https://docs.rapid7.com/metasploit/msf-overview) | CLI to access and work with the Metasploit Framework. | `vuln/http` |
138
- | [wpscan](https://github.com/wpscanteam/wpscan) | WordPress Security Scanner | `vuln/multi` |
139
- | [nmap](https://github.com/nmap/nmap) | Vulnerability scanner using NSE scripts. | `vuln/multi` |
140
- | [nuclei](https://github.com/projectdiscovery/nuclei) | Fast and customisable vulnerability scanner based on simple YAML based DSL. | `vuln/multi` |
141
- | [searchsploit](https://gitlab.com/exploit-database/exploitdb) | Exploit searcher. | `exploit/search` |
124
+ | Name | Description | Category |
125
+ |---------------------------------------------------------------|--------------------------------------------------------------------------------|-----------------|
126
+ | [httpx](https://github.com/projectdiscovery/httpx) | Fast HTTP prober. | `http` |
127
+ | [cariddi](https://github.com/edoardottt/cariddi) | Fast crawler and endpoint secrets / api keys / tokens matcher. | `http/crawler` |
128
+ | [gau](https://github.com/lc/gau) | Offline URL crawler (Alien Vault, The Wayback Machine, Common Crawl, URLScan). | `http/crawler` |
129
+ | [gospider](https://github.com/jaeles-project/gospider) | Fast web spider written in Go. | `http/crawler` |
130
+ | [katana](https://github.com/projectdiscovery/katana) | Next-generation crawling and spidering framework. | `http/crawler` |
131
+ | [dirsearch](https://github.com/maurosoria/dirsearch) | Web path discovery. | `http/fuzzer` |
132
+ | [feroxbuster](https://github.com/epi052/feroxbuster) | Simple, fast, recursive content discovery tool written in Rust. | `http/fuzzer` |
133
+ | [ffuf](https://github.com/ffuf/ffuf) | Fast web fuzzer written in Go. | `http/fuzzer` |
134
+ | [h8mail](https://github.com/khast3x/h8mail) | Email OSINT and breach hunting tool. | `osint` |
135
+ | [dnsx](https://github.com/projectdiscovery/dnsx) | Fast and multi-purpose DNS toolkit. | `recon/dns` |
136
+ | [dnsxbrute](https://github.com/projectdiscovery/dnsx) | Fast and multi-purpose DNS toolkit (bruteforce mode). | `recon/dns` |
137
+ | [subfinder](https://github.com/projectdiscovery/subfinder) | Fast subdomain finder. | `recon/dns` |
138
+ | [fping](https://fping.org/) | Find alive hosts on local networks. | `recon/ip` |
139
+ | [mapcidr](https://github.com/projectdiscovery/mapcidr) | Expand CIDR ranges into IPs. | `recon/ip` |
140
+ | [naabu](https://github.com/projectdiscovery/naabu) | Fast port discovery tool. | `recon/port` |
141
+ | [maigret](https://github.com/soxoj/maigret) | Hunt for user accounts across many websites. | `recon/user` |
142
+ | [gf](https://github.com/tomnomnom/gf) | A wrapper around grep to avoid typing common patterns. | `tagger` |
143
+ | [grype](https://github.com/anchore/grype) | A vulnerability scanner for container images and filesystems. | `vuln/code` |
144
+ | [dalfox](https://github.com/hahwul/dalfox) | Powerful XSS scanning tool and parameter analyzer. | `vuln/http` |
145
+ | [msfconsole](https://docs.rapid7.com/metasploit/msf-overview) | CLI to access and work with the Metasploit Framework. | `vuln/http` |
146
+ | [wpscan](https://github.com/wpscanteam/wpscan) | WordPress Security Scanner | `vuln/multi` |
147
+ | [nmap](https://github.com/nmap/nmap) | Vulnerability scanner using NSE scripts. | `vuln/multi` |
148
+ | [nuclei](https://github.com/projectdiscovery/nuclei) | Fast and customisable vulnerability scanner based on simple YAML based DSL. | `vuln/multi` |
149
+ | [bbot](https://github.com/blacklanternsecurity/bbot) | Multipurpose scanner. | `multi` |
150
+ | [searchsploit](https://gitlab.com/exploit-database/exploitdb) | Exploit searcher based on ExploitDB. | `exploit/search`|
151
+ | [bup](https://github.com/laluka/bypass-url-parser) | 40X bypasser. | `http` |
152
+
142
153
 
143
154
  Feel free to request new tools to be added by opening an issue, but please
144
155
  check that the tool complies with our selection criterias before doing so. If it doesn't but you still want to integrate it into `secator`, you can plug it in (see the [dev guide](https://docs.freelabz.com/for-developers/writing-custom-tasks)).
@@ -149,7 +160,7 @@ check that the tool complies with our selection criterias before doing so. If it
149
160
  ### Installing secator
150
161
 
151
162
  <details>
152
- <summary>Pipx</summary>
163
+ <summary>Pipx</summary>
153
164
 
154
165
  ```sh
155
166
  pipx install secator
@@ -158,7 +169,7 @@ pipx install secator
158
169
  </details>
159
170
 
160
171
  <details>
161
- <summary>Pip</summary>
172
+ <summary>Pip</summary>
162
173
 
163
174
  ```sh
164
175
  pip install secator
@@ -176,7 +187,7 @@ wget -O - https://raw.githubusercontent.com/freelabz/secator/main/scripts/instal
176
187
  </details>
177
188
 
178
189
  <details>
179
- <summary>Docker</summary>
190
+ <summary>Docker</summary>
180
191
 
181
192
  ```sh
182
193
  docker run -it --rm --net=host -v ~/.secator:/root/.secator freelabz/secator --help
@@ -197,13 +208,13 @@ secator --help
197
208
  </details>
198
209
 
199
210
  <details>
200
- <summary>Docker Compose</summary>
211
+ <summary>Docker Compose</summary>
201
212
 
202
213
  ```sh
203
214
  git clone https://github.com/freelabz/secator
204
215
  cd secator
205
216
  docker-compose up -d
206
- docker-compose exec secator secator --help
217
+ docker-compose exec secator-client secator --help
207
218
  ```
208
219
 
209
220
  </details>
@@ -217,7 +228,7 @@ docker-compose exec secator secator --help
217
228
  We provide utilities to install required languages if you don't manage them externally:
218
229
 
219
230
  <details>
220
- <summary>Go</summary>
231
+ <summary>Go</summary>
221
232
 
222
233
  ```sh
223
234
  secator install langs go
@@ -226,7 +237,7 @@ secator install langs go
226
237
  </details>
227
238
 
228
239
  <details>
229
- <summary>Ruby</summary>
240
+ <summary>Ruby</summary>
230
241
 
231
242
  ```sh
232
243
  secator install langs ruby
@@ -241,7 +252,7 @@ secator install langs ruby
241
252
  We provide utilities to install or update each supported tool which should work on all systems supporting `apt`:
242
253
 
243
254
  <details>
244
- <summary>All tools</summary>
255
+ <summary>All tools</summary>
245
256
 
246
257
  ```sh
247
258
  secator install tools
@@ -250,7 +261,7 @@ secator install tools
250
261
  </details>
251
262
 
252
263
  <details>
253
- <summary>Specific tools</summary>
264
+ <summary>Specific tools</summary>
254
265
 
255
266
  ```sh
256
267
  secator install tools <TOOL_NAME>
@@ -273,7 +284,7 @@ Please make sure you are using the latest available versions for each tool befor
273
284
  There are several addons available for `secator`:
274
285
 
275
286
  <details>
276
- <summary>worker</summary>
287
+ <summary>worker</summary>
277
288
 
278
289
  Add support for Celery workers (see [Distributed runs with Celery](https://docs.freelabz.com/in-depth/distributed-runs-with-celery)).
279
290
  ```sh
@@ -284,7 +295,7 @@ secator install addons worker
284
295
 
285
296
 
286
297
  <details>
287
- <summary>google</summary>
298
+ <summary>google</summary>
288
299
 
289
300
  Add support for Google Drive exporter (`-o gdrive`).
290
301
 
@@ -295,7 +306,7 @@ secator install addons google
295
306
  </details>
296
307
 
297
308
  <details>
298
- <summary>mongodb</summary>
309
+ <summary>mongodb</summary>
299
310
 
300
311
  Add support for MongoDB driver (`-driver mongodb`).
301
312
  ```sh
@@ -305,7 +316,7 @@ secator install addons mongodb
305
316
  </details>
306
317
 
307
318
  <details>
308
- <summary>redis</summary>
319
+ <summary>redis</summary>
309
320
 
310
321
  Add support for Redis backend (Celery).
311
322
 
@@ -316,7 +327,7 @@ secator install addons redis
316
327
  </details>
317
328
 
318
329
  <details>
319
- <summary>dev</summary>
330
+ <summary>dev</summary>
320
331
 
321
332
  Add development tools like `coverage` and `flake8` required for running tests.
322
333
 
@@ -327,7 +338,7 @@ secator install addons dev
327
338
  </details>
328
339
 
329
340
  <details>
330
- <summary>trace</summary>
341
+ <summary>trace</summary>
331
342
 
332
343
  Add tracing tools like `memray` and `pyinstrument` required for tracing functions.
333
344
 
@@ -338,7 +349,7 @@ secator install addons trace
338
349
  </details>
339
350
 
340
351
  <details>
341
- <summary>build</summary>
352
+ <summary>build</summary>
342
353
 
343
354
  Add `hatch` for building and publishing the PyPI package.
344
355
 
@@ -0,0 +1,115 @@
1
+ secator/.gitignore,sha256=da8MUc3hdb6Mo0WjZu2upn5uZMbXcBGvhdhTQ1L89HI,3093
2
+ secator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ secator/celery.py,sha256=Ry-JYJzN9F4LFHOn4IXpSFgCzpM99esKiQRJh_TkHp8,9578
4
+ secator/celery_utils.py,sha256=iIuCn_3YkPXCtpnbaYqpppU2TARzSDyTIYHkrRyt54s,7725
5
+ secator/cli.py,sha256=gIob9JjQJLtBhYYBErUpWucNqcd_LMEdMHMCurbITic,44012
6
+ secator/config.py,sha256=6wm2EErW1DuhrdKSuIEUvc2b3yBxJWyZKnocr7lIeZw,19267
7
+ secator/decorators.py,sha256=tjH7WodxJEBIf2CCbegmvOe8H9DKSFh4iPLEhDNGPCA,13784
8
+ secator/definitions.py,sha256=gFtLT9fjNtX_1qkiCjNfQyCvYq07IhScsQzX4o20_SE,3084
9
+ secator/installer.py,sha256=ZK6iEc7cjaYn2lSpbSUkcLWwuu8cpGzhpnlgP-dGYiI,16272
10
+ secator/report.py,sha256=qJkEdCFttDBXIwUNUzZqFU_sG8l0PvyTSTogZVBv1Rs,3628
11
+ secator/rich.py,sha256=3ugCkgai7UNylQGUuOVAd7ghYWDSc73aSomrfKgKVxo,3290
12
+ secator/template.py,sha256=Qy4RjcmlifeSA8CleWUBb9fluxuYHzxgEH0H-8qs8R4,4323
13
+ secator/thread.py,sha256=rgRgEtcMgs2wyfLWVlCTUCLWeg6jsMo5iKpyyrON5rY,655
14
+ secator/utils.py,sha256=mwRZWSoYDskleNvDBHjRIGoygK2DsBMeIdllABvD4vw,21237
15
+ secator/utils_test.py,sha256=ArHwkWW89t0IDqxO4HjJWd_tm7tp1illP4pu3nLq5yo,6559
16
+ secator/configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ secator/configs/profiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ secator/configs/profiles/aggressive.yaml,sha256=JilVySABlSCYEFMjH7V0Oc3dAVlkfHOh1odTGhtm7BQ,108
19
+ secator/configs/profiles/default.yaml,sha256=kDuOF1Qkpv4oz1GZ-OwDxbi5pptAqShsCqdzkBOxXfw,149
20
+ secator/configs/profiles/stealth.yaml,sha256=Ud3EMZ2yRj0AT6w-AfV7fWUBYib9VAFp46GPpof9YaU,107
21
+ secator/configs/scans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ secator/configs/scans/domain.yaml,sha256=Dkm5dU2NdUTInkWD5cmVczvhUH0soaKPtoESeg8BVsQ,265
23
+ secator/configs/scans/host.yaml,sha256=tobz6yGeYlVnGwLVI9RLJT6MDLnGmQVVj8EOwAdksfw,189
24
+ secator/configs/scans/network.yaml,sha256=ghlgIwkWhJKQeT6V5TE51dFL-VRszWJtm4qx4ImjEEY,252
25
+ secator/configs/scans/subdomain.yaml,sha256=I007b1V5Rmm_4R9mODp6jxonHNIjXkQT9sU-AOxLSIo,123
26
+ secator/configs/scans/url.yaml,sha256=zhRiqyHq7BZHtKsmjpMvp3vmt5DRNtmfqW44sZm1tWw,158
27
+ secator/configs/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ secator/configs/workflows/cidr_recon.yaml,sha256=u1QKDKGbpJEez5QqC20Yd_nBLZd_z4nA-XFRQV7pVI4,558
29
+ secator/configs/workflows/code_scan.yaml,sha256=3H8H55NVskiDbBwNueVF8FUYkquEQn2C6evnid9zhB4,207
30
+ secator/configs/workflows/host_recon.yaml,sha256=9ypKWRbcGRmMgzuyrCjQ2EAbJO9q8HN_A-hlTKkypVg,1095
31
+ secator/configs/workflows/port_scan.yaml,sha256=JKbT01_q4CaOKZYjVspl8PjMefUtsiJmDbUlHcGc8vw,921
32
+ secator/configs/workflows/subdomain_recon.yaml,sha256=GFhAyatzWRVx3a2kphNWNoTB13wY3GZTSZ2tusFgo8E,722
33
+ secator/configs/workflows/url_bypass.yaml,sha256=_uBzDhevJ2DOD9UkE25n7ZrmnjjfdU3lV3mnUudgdU0,180
34
+ secator/configs/workflows/url_crawl.yaml,sha256=h74dvDBNLuY1EHc9FMby3ydr34VH1qFJHQKUaIIYpcw,573
35
+ secator/configs/workflows/url_dirsearch.yaml,sha256=wiiVY3RK0s8DYxg7UWcxLjkxMdIIINWefG1mhps2E-0,627
36
+ secator/configs/workflows/url_fuzz.yaml,sha256=K1RkplXrgc7q2YJVv5A6B5MMkAzIIv31HInhRCKMpyI,774
37
+ secator/configs/workflows/url_nuclei.yaml,sha256=Qigz-hJzM7GeNA_UD46dThVIoqbWlBgiYb_i5fSyJiI,265
38
+ secator/configs/workflows/url_vuln.yaml,sha256=_nX_D96NbD8fHU4wXov7ZHD1cmiFgKc86Mh0enWGS7s,1354
39
+ secator/configs/workflows/user_hunt.yaml,sha256=e5b-CkkjhOPE8Yh5LUh0K60GKmxTgn4s-Joo7m9jKrk,180
40
+ secator/configs/workflows/wordpress.yaml,sha256=QgBUNi8Gav_efbmczUGfzlByWsmogTmGtu1MwAlvQts,279
41
+ secator/exporters/__init__.py,sha256=PnT9Ra4ArHt9VQTK5Cpc4CPY89XRwLLUGtZ8nUcknm0,415
42
+ secator/exporters/_base.py,sha256=-RrrwO_qp0ETLLHSta4T-zKtMbWdiEmz1Cw5mNo6USU,77
43
+ secator/exporters/console.py,sha256=idVotf9B0LnYZ4JQJHrgMtVfE26XkRDuvbCyJvCY2hU,249
44
+ secator/exporters/csv.py,sha256=gvwS0dgYhUKjjyNX-jal8SvKQrkjiUEwzDzC4zN8UO4,1068
45
+ secator/exporters/gdrive.py,sha256=6Nj9RTOhraBOalm2H8Fp1tItD2ZrSfgtY4SiXViefcQ,4201
46
+ secator/exporters/json.py,sha256=1ZtDf8RksPO_V0zIvnwDUxMUb630DCElAMM8_RQvyAo,474
47
+ secator/exporters/table.py,sha256=RY7Tct5kowEx8Oza8QMXFx6fKBARYfLxEbbvjKiE3eQ,1113
48
+ secator/exporters/txt.py,sha256=oMtr22di6cqyE_5yJoiWP-KElrI5QgvK1cOUrj7H7js,730
49
+ secator/hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ secator/hooks/gcs.py,sha256=MIhntyWYz9BZdTXhWl5JznaczSq1_7fl3TVqPufuTSo,1490
51
+ secator/hooks/mongodb.py,sha256=HyjtpJSoxvSZ6aG8uBf1RFLNKGXCBDQL5eEh4xzDonA,7545
52
+ secator/output_types/__init__.py,sha256=LxCW0K1f2vdgUapc4pIEsUpBfC0TQVvqo7T57rGuZGk,1159
53
+ secator/output_types/_base.py,sha256=OgS6ICt66TzPsqo1JZwRIIwbng2HRX1i_u5qbUECgNk,2820
54
+ secator/output_types/error.py,sha256=A2m4YUAAf8z42MMew9XtM24OOZYoYKJzcfB2RWsQmlc,1231
55
+ secator/output_types/exploit.py,sha256=-BKTqPBg94rVgjw8YSmcYuBCI2x-73WwMd9ITP9qr3Y,1750
56
+ secator/output_types/info.py,sha256=R8xeiD3ocNOsvkJPhrQgsx6q-Ea1G0eTAqyuh5JrAR0,843
57
+ secator/output_types/ip.py,sha256=CyE3qkp55Kmj5YRl0CZGS4XrHX8N5apWrLN3OMzaK0U,1127
58
+ secator/output_types/port.py,sha256=JdqXnEF8XuwaWFMT8Vghj7fKLwtsImuUdRfMmITgmWM,1879
59
+ secator/output_types/progress.py,sha256=MIbmnrLHNodLL42UgiaqLHL0OG5-w6mtUrhn0ZhksjA,1343
60
+ secator/output_types/record.py,sha256=HnsKxlIhkgswA_Yjz7BZ1vDjP53l6OJ0BCOtCSDwCSY,1250
61
+ secator/output_types/stat.py,sha256=90oN2Ghc4k0B0FOdp6MOWiNgmXMmLHYknjunDeEKKRE,1129
62
+ secator/output_types/subdomain.py,sha256=ivJ_2kmrJ8hdB8wmvRJYlKV1BcE3Cds_vAI_5wL7ES4,1344
63
+ secator/output_types/tag.py,sha256=_XEqWAvAvmi7nd2ldfEE71zQx97jTSph2iDHkeqGTyk,1470
64
+ secator/output_types/target.py,sha256=lmPw2aFOGIOFG4XXo6vNVZBBAZlnApJjyDVepDY54TU,871
65
+ secator/output_types/url.py,sha256=gTGShwXIA2mA9cBLP7_I4qA5XUP-EYB1xnPRLtUDAi8,2912
66
+ secator/output_types/user_account.py,sha256=rm10somxyu30JHjj629IkR15Nhahylud_fVO8j2pdR0,1417
67
+ secator/output_types/vulnerability.py,sha256=nF7OT9zGez8sZvLrkhjBOORjVi8hCqfCYUFq3eZ_ywo,2870
68
+ secator/output_types/warning.py,sha256=47GtmG083GqGPb_R5JDFmARJ9Mqrme58UxwJhgdGPuI,853
69
+ secator/runners/__init__.py,sha256=EBbOk37vkBy9p8Hhrbi-2VtM_rTwQ3b-0ggTyiD22cE,290
70
+ secator/runners/_base.py,sha256=loCWdCiiP9CUUZlNu1hwropTCud7DwSGcnpgoS3drz8,28990
71
+ secator/runners/_helpers.py,sha256=FGogmmdHfCWmIyq7wRprwU1oOSxesOu3Y0N4GyAgiGw,2000
72
+ secator/runners/celery.py,sha256=bqvDTTdoHiGRCt0FRvlgFHQ_nsjKMP5P0PzGbwfCj_0,425
73
+ secator/runners/command.py,sha256=-2rqSfbPz2Q12otzshm3SIb4BVosIDpbvwh2KScoJ_M,24922
74
+ secator/runners/scan.py,sha256=tuPuqwL6fIS4UbCoy5WPKthYWm_LL-vCPRD2qK58HZE,1232
75
+ secator/runners/task.py,sha256=JXlwo3DyQnu69RbQ8xvJnXu6y0rDYN-3iT4q4gy39tI,2004
76
+ secator/runners/workflow.py,sha256=vry_MZFx6dRrorTrdsUqvhMZGOLPCdzpxkvN6fnt62w,3783
77
+ secator/scans/__init__.py,sha256=nlNLiRl7Vu--c_iXClFFcagMd_b_OWKitq8tX1-1krQ,641
78
+ secator/serializers/__init__.py,sha256=OP5cmFl77ovgSCW_IDcZ21St2mUt5UK4QHfrsK2KvH8,248
79
+ secator/serializers/dataclass.py,sha256=RqICpfsYWGjHAACAA2h2jZ_69CFHim4VZwcBqowGMcQ,1010
80
+ secator/serializers/json.py,sha256=UJwAymRzjF-yBKOgz1MTOyBhQcdQg7fOKRXgmHIu8fo,411
81
+ secator/serializers/regex.py,sha256=fh-fE0RGvKSGKByFtwmKsWriRpZR9PXZQsY9JybHBWI,489
82
+ secator/tasks/__init__.py,sha256=yRIZf9E47aS7o6rpgAJLgJUpX2cug1ofZeq8QsxgyjU,192
83
+ secator/tasks/_categories.py,sha256=IWyBprIUBZxflh7QfvK27Ix18M_bnquzlERqfTZohVs,13821
84
+ secator/tasks/bbot.py,sha256=RLI7fh8t16vxD0fwDY5HFDa5oneitrWH9ZkoN107bAQ,6884
85
+ secator/tasks/bup.py,sha256=4PM123Km3uOkMUwfdLY6J7pyCqIsbwMvOLYx7XYCAZc,3030
86
+ secator/tasks/cariddi.py,sha256=7S92pp7tvihoz9fAiMpmcfPzEvxEJKMlk-IqAvVDISA,2906
87
+ secator/tasks/dalfox.py,sha256=hHQgYuZ7AGQCQtcN8hSM9uPnzeq1DSr_cpOxnn7-660,1850
88
+ secator/tasks/dirsearch.py,sha256=DF-yXHANHb3ARgMOUbqpRuHc8-mE3bteHwTkFpXQtKc,2205
89
+ secator/tasks/dnsx.py,sha256=nK14_DeyX0QTpAMdIP0LSSEOEu5_tQemyFW0XPjA2f8,2266
90
+ secator/tasks/dnsxbrute.py,sha256=R2Fkc_OkO7vc-EyyvgRqvPCf9s11lHJE1TPEplsh_Pw,1423
91
+ secator/tasks/feroxbuster.py,sha256=B1zbMGhanyziSWk5PonR7jDSP8oLKvJ-_DJFhj08xnM,2730
92
+ secator/tasks/ffuf.py,sha256=VGrtjFgSX6Q1I8h1wjPO5XwBFCfZXmn0DQsn9gxEUXc,2468
93
+ secator/tasks/fping.py,sha256=m7eSXFU5yIeDD_kWh-h208ufSZAm4SpQzD34Ko0yCu8,1116
94
+ secator/tasks/gau.py,sha256=MzgnImbkRjB_wI-7YPUnTgyMYbyKcderLagTO_20gPw,1602
95
+ secator/tasks/gf.py,sha256=y8Fc0sRLGqNuwUjTBgLk3HEw3ZOnh09nB_GTufGErNA,962
96
+ secator/tasks/gospider.py,sha256=KGINm9kxrq546xi1yN8_OwNCNDxSW9vVRYDAlvNajBs,2303
97
+ secator/tasks/grype.py,sha256=8iTjI1ZTj-DQgozg-UoBfL-45Lt3Sz4wS4s9jBI-tE0,2411
98
+ secator/tasks/h8mail.py,sha256=wNukV-aB-bXPZNq7WL8n1nFgH5b5tGh6vOF80Yna33I,1934
99
+ secator/tasks/httpx.py,sha256=5oI8vK7w94nsQlKs9Ve4yZsCmogbsiB5PqGarR3eIIM,5854
100
+ secator/tasks/katana.py,sha256=yy07wReBubmjbvpmsx1nmAuKij7M8As8JovQU7_cSrM,5210
101
+ secator/tasks/maigret.py,sha256=6anhBzB4lEM90Lk23cAD_ku7I_ghTpj0W0i3h6HARD8,2088
102
+ secator/tasks/mapcidr.py,sha256=zYIlbjJadQY_g2X8hS5vK_789O_XfI2mkIH-Cs8y6hk,944
103
+ secator/tasks/msfconsole.py,sha256=t3fo_Q47YEQE116j_2MNWqcHsxw4afZxxs_ThinjzGc,6414
104
+ secator/tasks/naabu.py,sha256=zbaLY4CHcmCjOmRnB8c5unMv4_wyLLyCbas-vRm44DU,2047
105
+ secator/tasks/nmap.py,sha256=r4TsWNF6mDT6Dni94hzDwZ_TPh3s-1VOV61W8NASvVs,12520
106
+ secator/tasks/nuclei.py,sha256=8VRl3C7_wTHr3n3zA2E9rDJTMWXFeU6fRM71txiGQHo,4235
107
+ secator/tasks/searchsploit.py,sha256=OrODcBdRcbGmA9qSMJjsWTXwAcCt0nwQYXKqEBdcPbY,3280
108
+ secator/tasks/subfinder.py,sha256=C6W5NnXT92OUB1aSS9IYseqdI3wDMAz70TOEl8X-o3U,1213
109
+ secator/tasks/wpscan.py,sha256=LGw1DmomP4U83n3V6nyuPhXTd4t99dgrym7oL54JqHE,5495
110
+ secator/workflows/__init__.py,sha256=ivpZHiYYlj4JqlXLRmB9cmAPUGdk8QcUrCRL34hIqEA,665
111
+ secator-0.8.0.dist-info/METADATA,sha256=eZbs-L8h3DFG-A0iRlMl9WX2RIBz9u6THDukf0KuRCY,14791
112
+ secator-0.8.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
113
+ secator-0.8.0.dist-info/entry_points.txt,sha256=lPgsqqUXWgiuGSfKy-se5gHdQlAXIwS_A46NYq7Acic,44
114
+ secator-0.8.0.dist-info/licenses/LICENSE,sha256=19W5Jsy4WTctNkqmZIqLRV1gTDOp01S3LDj9iSgWaJ0,2867
115
+ secator-0.8.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.25.0
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any