secator 0.2.0__py2.py3-none-any.whl → 0.3.1__py2.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/celery.py +1 -1
- secator/cli.py +434 -454
- secator/decorators.py +5 -6
- secator/definitions.py +53 -28
- secator/exporters/txt.py +1 -1
- secator/installer.py +335 -0
- secator/rich.py +2 -8
- secator/runners/_base.py +47 -15
- secator/runners/command.py +2 -16
- secator/runners/task.py +4 -3
- secator/runners/workflow.py +1 -1
- secator/tasks/_categories.py +6 -11
- secator/tasks/dalfox.py +1 -0
- secator/tasks/dnsx.py +1 -0
- secator/tasks/dnsxbrute.py +1 -0
- secator/tasks/feroxbuster.py +1 -0
- secator/tasks/ffuf.py +1 -0
- secator/tasks/gau.py +1 -0
- secator/tasks/gospider.py +1 -0
- secator/tasks/grype.py +1 -0
- secator/tasks/httpx.py +1 -0
- secator/tasks/katana.py +1 -0
- secator/tasks/mapcidr.py +1 -0
- secator/tasks/naabu.py +1 -0
- secator/tasks/nuclei.py +1 -0
- secator/tasks/searchsploit.py +1 -0
- secator/tasks/subfinder.py +1 -0
- secator/utils.py +23 -1
- secator/utils_test.py +1 -0
- {secator-0.2.0.dist-info → secator-0.3.1.dist-info}/METADATA +1 -1
- {secator-0.2.0.dist-info → secator-0.3.1.dist-info}/RECORD +34 -33
- {secator-0.2.0.dist-info → secator-0.3.1.dist-info}/WHEEL +0 -0
- {secator-0.2.0.dist-info → secator-0.3.1.dist-info}/entry_points.txt +0 -0
- {secator-0.2.0.dist-info → secator-0.3.1.dist-info}/licenses/LICENSE +0 -0
secator/runners/_base.py
CHANGED
|
@@ -106,7 +106,7 @@ class Runner:
|
|
|
106
106
|
self.context = context
|
|
107
107
|
self.delay = run_opts.get('delay', False)
|
|
108
108
|
self.uuids = []
|
|
109
|
-
self.
|
|
109
|
+
self.celery_result = None
|
|
110
110
|
|
|
111
111
|
# Determine report folder
|
|
112
112
|
default_reports_folder_base = f'{REPORTS_FOLDER}/{self.workspace_name}/{self.config.type}s'
|
|
@@ -159,19 +159,19 @@ class Runner:
|
|
|
159
159
|
for key in self.hooks:
|
|
160
160
|
|
|
161
161
|
# Register class specific hooks
|
|
162
|
-
|
|
163
|
-
if
|
|
162
|
+
class_hook = getattr(self, key, None)
|
|
163
|
+
if class_hook:
|
|
164
164
|
name = f'{self.__class__.__name__}.{key}'
|
|
165
|
-
fun =
|
|
165
|
+
fun = self.get_func_path(class_hook)
|
|
166
166
|
debug('', obj={name + ' [dim yellow]->[/] ' + fun: 'registered'}, sub='hooks', level=3)
|
|
167
|
-
self.hooks[key].append(
|
|
167
|
+
self.hooks[key].append(class_hook)
|
|
168
168
|
|
|
169
169
|
# Register user hooks
|
|
170
170
|
user_hooks = hooks.get(self.__class__, {}).get(key, [])
|
|
171
171
|
user_hooks.extend(hooks.get(key, []))
|
|
172
172
|
for hook in user_hooks:
|
|
173
173
|
name = f'{self.__class__.__name__}.{key}'
|
|
174
|
-
fun =
|
|
174
|
+
fun = self.get_func_path(hook)
|
|
175
175
|
debug('', obj={name + ' [dim yellow]->[/] ' + fun: 'registered (user)'}, sub='hooks', level=3)
|
|
176
176
|
self.hooks[key].extend(user_hooks)
|
|
177
177
|
|
|
@@ -280,9 +280,9 @@ class Runner:
|
|
|
280
280
|
|
|
281
281
|
except KeyboardInterrupt:
|
|
282
282
|
self._print('Process was killed manually (CTRL+C / CTRL+X).', color='bold red', rich=True)
|
|
283
|
-
if self.
|
|
283
|
+
if self.celery_result:
|
|
284
284
|
self._print('Revoking remote Celery tasks ...', color='bold red', rich=True)
|
|
285
|
-
self.stop_live_tasks(self.
|
|
285
|
+
self.stop_live_tasks(self.celery_result)
|
|
286
286
|
|
|
287
287
|
# Filter results and log info
|
|
288
288
|
self.mark_duplicates()
|
|
@@ -291,9 +291,10 @@ class Runner:
|
|
|
291
291
|
self.run_hooks('on_end')
|
|
292
292
|
|
|
293
293
|
def mark_duplicates(self):
|
|
294
|
-
debug('duplicate check', id=self.config.name, sub='runner.mark_duplicates')
|
|
294
|
+
debug('running duplicate check', id=self.config.name, sub='runner.mark_duplicates')
|
|
295
|
+
dupe_count = 0
|
|
295
296
|
for item in self.results:
|
|
296
|
-
debug('duplicate check', obj=item.toDict(), obj_breaklines=True, sub='runner.mark_duplicates', level=
|
|
297
|
+
debug('running duplicate check', obj=item.toDict(), obj_breaklines=True, sub='runner.mark_duplicates', level=5)
|
|
297
298
|
others = [f for f in self.results if f == item and f._uuid != item._uuid]
|
|
298
299
|
if others:
|
|
299
300
|
main = max(item, *others)
|
|
@@ -313,13 +314,16 @@ class Runner:
|
|
|
313
314
|
if not dupe._duplicate:
|
|
314
315
|
debug(
|
|
315
316
|
'found new duplicate', obj=dupe.toDict(), obj_breaklines=True,
|
|
316
|
-
sub='runner.mark_duplicates', level=
|
|
317
|
+
sub='runner.mark_duplicates', level=5)
|
|
318
|
+
dupe_count += 1
|
|
317
319
|
dupe._duplicate = True
|
|
318
320
|
dupe = self.run_hooks('on_duplicate', dupe)
|
|
319
321
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
322
|
+
duplicates = [repr(i) for i in self.results if i._duplicate]
|
|
323
|
+
if duplicates:
|
|
324
|
+
duplicates_str = '\n\t'.join(duplicates)
|
|
325
|
+
debug(f'Duplicates ({dupe_count}):\n\t{duplicates_str}', sub='runner.mark_duplicates', level=5)
|
|
326
|
+
debug(f'duplicate check completed: {dupe_count} found', id=self.config.name, sub='runner.mark_duplicates')
|
|
323
327
|
|
|
324
328
|
def yielder(self):
|
|
325
329
|
raise NotImplementedError()
|
|
@@ -356,7 +360,7 @@ class Runner:
|
|
|
356
360
|
return result
|
|
357
361
|
for hook in self.hooks[hook_type]:
|
|
358
362
|
name = f'{self.__class__.__name__}.{hook_type}'
|
|
359
|
-
fun =
|
|
363
|
+
fun = self.get_func_path(hook)
|
|
360
364
|
try:
|
|
361
365
|
_id = self.context.get('task_id', '') or self.context.get('workflow_id', '') or self.context.get('scan_id', '')
|
|
362
366
|
debug('', obj={name + ' [dim yellow]->[/] ' + fun: 'started'}, id=_id, sub='hooks', level=3)
|
|
@@ -871,3 +875,31 @@ class Runner:
|
|
|
871
875
|
elif isinstance(item, OutputType):
|
|
872
876
|
item = repr(item)
|
|
873
877
|
return item
|
|
878
|
+
|
|
879
|
+
@classmethod
|
|
880
|
+
def get_func_path(cls, func):
|
|
881
|
+
"""
|
|
882
|
+
Get the full symbolic path of a function or method, including staticmethods,
|
|
883
|
+
using function and method attributes.
|
|
884
|
+
|
|
885
|
+
Args:
|
|
886
|
+
func (function, method, or staticmethod): A function or method object.
|
|
887
|
+
"""
|
|
888
|
+
if hasattr(func, '__self__'):
|
|
889
|
+
if func.__self__ is not None:
|
|
890
|
+
# It's a method bound to an instance
|
|
891
|
+
class_name = func.__self__.__class__.__name__
|
|
892
|
+
return f"{func.__module__}.{class_name}.{func.__name__}"
|
|
893
|
+
else:
|
|
894
|
+
# It's a method bound to a class (class method)
|
|
895
|
+
class_name = func.__qualname__.rsplit('.', 1)[0]
|
|
896
|
+
return f"{func.__module__}.{class_name}.{func.__name__}"
|
|
897
|
+
else:
|
|
898
|
+
# Handle static and regular functions
|
|
899
|
+
if '.' in func.__qualname__:
|
|
900
|
+
# Static method or a function defined inside a class
|
|
901
|
+
class_name, func_name = func.__qualname__.rsplit('.', 1)
|
|
902
|
+
return f"{func.__module__}.{class_name}.{func_name}"
|
|
903
|
+
else:
|
|
904
|
+
# Regular function not attached to a class
|
|
905
|
+
return f"{func.__module__}.{func.__name__}"
|
secator/runners/command.py
CHANGED
|
@@ -16,7 +16,6 @@ from secator.definitions import (DEFAULT_HTTP_PROXY,
|
|
|
16
16
|
DEFAULT_PROXYCHAINS_COMMAND,
|
|
17
17
|
DEFAULT_SOCKS5_PROXY, OPT_NOT_SUPPORTED,
|
|
18
18
|
OPT_PIPE_INPUT, DEFAULT_INPUT_CHUNK_SIZE)
|
|
19
|
-
from secator.rich import console
|
|
20
19
|
from secator.runners import Runner
|
|
21
20
|
from secator.serializers import JSONSerializer
|
|
22
21
|
from secator.utils import debug
|
|
@@ -81,8 +80,9 @@ class Command(Runner):
|
|
|
81
80
|
# Flag to show version
|
|
82
81
|
version_flag = None
|
|
83
82
|
|
|
84
|
-
# Install
|
|
83
|
+
# Install
|
|
85
84
|
install_cmd = None
|
|
85
|
+
install_github_handle = None
|
|
86
86
|
|
|
87
87
|
# Serializer
|
|
88
88
|
item_loader = None
|
|
@@ -252,20 +252,6 @@ class Command(Runner):
|
|
|
252
252
|
# Class methods #
|
|
253
253
|
#---------------#
|
|
254
254
|
|
|
255
|
-
@classmethod
|
|
256
|
-
def install(cls):
|
|
257
|
-
"""Install command by running the content of cls.install_cmd."""
|
|
258
|
-
console.print(f':heavy_check_mark: Installing {cls.__name__}...', style='bold yellow')
|
|
259
|
-
if not cls.install_cmd:
|
|
260
|
-
console.print(f'{cls.__name__} install is not supported yet. Please install it manually.', style='bold red')
|
|
261
|
-
return
|
|
262
|
-
ret = cls.execute(cls.install_cmd, name=cls.__name__, cls_attributes={'shell': True})
|
|
263
|
-
if ret.return_code != 0:
|
|
264
|
-
console.print(f':exclamation_mark: Failed to install {cls.__name__}.', style='bold red')
|
|
265
|
-
else:
|
|
266
|
-
console.print(f':tada: {cls.__name__} installed successfully !', style='bold green')
|
|
267
|
-
return ret
|
|
268
|
-
|
|
269
255
|
@classmethod
|
|
270
256
|
def execute(cls, cmd, name=None, cls_attributes={}, **kwargs):
|
|
271
257
|
"""Execute an ad-hoc command.
|
secator/runners/task.py
CHANGED
|
@@ -39,7 +39,8 @@ class Task(Runner):
|
|
|
39
39
|
'print_input_file': DEBUG > 0,
|
|
40
40
|
'print_item': True,
|
|
41
41
|
'print_item_count': not self.sync and not dry_run,
|
|
42
|
-
'print_line':
|
|
42
|
+
'print_line': True
|
|
43
|
+
# 'print_line': self.sync and not self.output_quiet,
|
|
43
44
|
}
|
|
44
45
|
# self.print_item = not self.sync # enable print_item for base Task only if running remote
|
|
45
46
|
run_opts.update(fmt_opts)
|
|
@@ -59,9 +60,9 @@ class Task(Runner):
|
|
|
59
60
|
if dry_run: # don't run
|
|
60
61
|
return
|
|
61
62
|
else:
|
|
62
|
-
|
|
63
|
+
self.celery_result = task_cls.delay(self.targets, **run_opts)
|
|
63
64
|
task = self.process_live_tasks(
|
|
64
|
-
|
|
65
|
+
self.celery_result,
|
|
65
66
|
description=False,
|
|
66
67
|
results_only=True,
|
|
67
68
|
print_remote_status=self.print_remote_status)
|
secator/runners/workflow.py
CHANGED
|
@@ -58,7 +58,7 @@ class Workflow(Runner):
|
|
|
58
58
|
results = workflow.apply().get()
|
|
59
59
|
else:
|
|
60
60
|
result = workflow()
|
|
61
|
-
self.
|
|
61
|
+
self.celery_result = result
|
|
62
62
|
results = self.process_live_tasks(result, results_only=True, print_remote_status=self.print_remote_status)
|
|
63
63
|
|
|
64
64
|
# Get workflow results
|
secator/tasks/_categories.py
CHANGED
|
@@ -6,17 +6,12 @@ import requests
|
|
|
6
6
|
from bs4 import BeautifulSoup
|
|
7
7
|
from cpe import CPE
|
|
8
8
|
|
|
9
|
-
from secator.definitions import (CIDR_RANGE, CONFIDENCE, CVSS_SCORE,
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
PROXY, RATE_LIMIT, REFERENCES, RETRIES,
|
|
16
|
-
SEVERITY, TAGS, DATA_FOLDER, THREADS, TIMEOUT,
|
|
17
|
-
URL, USER_AGENT, USERNAME, WORDLIST)
|
|
18
|
-
from secator.output_types import (Ip, Port, Subdomain, Tag, Url, UserAccount,
|
|
19
|
-
Vulnerability)
|
|
9
|
+
from secator.definitions import (CIDR_RANGE, CONFIDENCE, CVSS_SCORE, DATA_FOLDER, DEFAULT_HTTP_WORDLIST,
|
|
10
|
+
DEFAULT_SKIP_CVE_SEARCH, DELAY, DEPTH, DESCRIPTION, FILTER_CODES, FILTER_REGEX,
|
|
11
|
+
FILTER_SIZE, FILTER_WORDS, FOLLOW_REDIRECT, HEADER, HOST, ID, MATCH_CODES, MATCH_REGEX,
|
|
12
|
+
MATCH_SIZE, MATCH_WORDS, METHOD, NAME, PATH, PROVIDER, PROXY, RATE_LIMIT, REFERENCES,
|
|
13
|
+
RETRIES, SEVERITY, TAGS, THREADS, TIMEOUT, URL, USER_AGENT, USERNAME, WORDLIST)
|
|
14
|
+
from secator.output_types import Ip, Port, Subdomain, Tag, Url, UserAccount, Vulnerability
|
|
20
15
|
from secator.rich import console
|
|
21
16
|
from secator.runners import Command
|
|
22
17
|
|
secator/tasks/dalfox.py
CHANGED
secator/tasks/dnsx.py
CHANGED
secator/tasks/dnsxbrute.py
CHANGED
secator/tasks/feroxbuster.py
CHANGED
|
@@ -64,6 +64,7 @@ class feroxbuster(HttpFuzzer):
|
|
|
64
64
|
'curl -sL https://raw.githubusercontent.com/epi052/feroxbuster/master/install-nix.sh | '
|
|
65
65
|
'bash && sudo mv feroxbuster /usr/local/bin'
|
|
66
66
|
)
|
|
67
|
+
install_github_handle = 'epi052/feroxbuster'
|
|
67
68
|
proxychains = False
|
|
68
69
|
proxy_socks5 = True
|
|
69
70
|
proxy_http = True
|
secator/tasks/ffuf.py
CHANGED
|
@@ -71,6 +71,7 @@ class ffuf(HttpFuzzer):
|
|
|
71
71
|
}
|
|
72
72
|
encoding = 'ansi'
|
|
73
73
|
install_cmd = f'go install -v github.com/ffuf/ffuf@latest && sudo git clone https://github.com/danielmiessler/SecLists {WORDLISTS_FOLDER}/seclists || true' # noqa: E501
|
|
74
|
+
install_github_handle = 'ffuf/ffuf'
|
|
74
75
|
proxychains = False
|
|
75
76
|
proxy_socks5 = True
|
|
76
77
|
proxy_http = True
|
secator/tasks/gau.py
CHANGED
secator/tasks/gospider.py
CHANGED
|
@@ -52,6 +52,7 @@ class gospider(HttpCrawler):
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
install_cmd = 'go install -v github.com/jaeles-project/gospider@latest'
|
|
55
|
+
install_github_handle = 'jaeles-project/gospider'
|
|
55
56
|
ignore_return_code = True
|
|
56
57
|
proxychains = False
|
|
57
58
|
proxy_socks5 = True # with leaks... https://github.com/jaeles-project/gospider/issues/61
|
secator/tasks/grype.py
CHANGED
secator/tasks/httpx.py
CHANGED
|
@@ -60,6 +60,7 @@ class httpx(Http):
|
|
|
60
60
|
DELAY: lambda x: str(x) + 's' if x else None,
|
|
61
61
|
}
|
|
62
62
|
install_cmd = 'go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest'
|
|
63
|
+
install_github_handle = 'projectdiscovery/httpx'
|
|
63
64
|
proxychains = False
|
|
64
65
|
proxy_socks5 = True
|
|
65
66
|
proxy_http = True
|
secator/tasks/katana.py
CHANGED
|
@@ -71,6 +71,7 @@ class katana(HttpCrawler):
|
|
|
71
71
|
}
|
|
72
72
|
item_loaders = []
|
|
73
73
|
install_cmd = 'sudo apt install build-essential && go install -v github.com/projectdiscovery/katana/cmd/katana@latest'
|
|
74
|
+
install_github_handle = 'projectdiscovery/katana'
|
|
74
75
|
proxychains = False
|
|
75
76
|
proxy_socks5 = True
|
|
76
77
|
proxy_http = True
|
secator/tasks/mapcidr.py
CHANGED
|
@@ -14,6 +14,7 @@ class mapcidr(ReconIp):
|
|
|
14
14
|
input_flag = '-cidr'
|
|
15
15
|
file_flag = '-cl'
|
|
16
16
|
install_cmd = 'go install -v github.com/projectdiscovery/mapcidr/cmd/mapcidr@latest'
|
|
17
|
+
install_github_handle = 'projectdiscovery/mapcidr'
|
|
17
18
|
input_type = CIDR_RANGE
|
|
18
19
|
output_types = [Ip]
|
|
19
20
|
opt_key_map = {
|
secator/tasks/naabu.py
CHANGED
|
@@ -46,6 +46,7 @@ class naabu(ReconPort):
|
|
|
46
46
|
}
|
|
47
47
|
output_types = [Port]
|
|
48
48
|
install_cmd = 'sudo apt install -y build-essential libpcap-dev && go install -v github.com/projectdiscovery/naabu/v2/cmd/naabu@latest' # noqa: E501
|
|
49
|
+
install_github_handle = 'projectdiscovery/naabu'
|
|
49
50
|
proxychains = False
|
|
50
51
|
proxy_socks5 = True
|
|
51
52
|
proxy_http = False
|
secator/tasks/nuclei.py
CHANGED
|
@@ -68,6 +68,7 @@ class nuclei(VulnMulti):
|
|
|
68
68
|
}
|
|
69
69
|
ignore_return_code = True
|
|
70
70
|
install_cmd = 'go install -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei@latest && nuclei update-templates'
|
|
71
|
+
install_github_handle = 'projectdiscovery/nuclei'
|
|
71
72
|
proxychains = False
|
|
72
73
|
proxy_socks5 = True # kind of, leaks data when running network / dns templates
|
|
73
74
|
proxy_http = True # same
|
secator/tasks/searchsploit.py
CHANGED
|
@@ -28,6 +28,7 @@ class searchsploit(Command):
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
install_cmd = 'sudo git clone https://gitlab.com/exploit-database/exploitdb.git /opt/exploitdb || true && sudo ln -sf /opt/exploitdb/searchsploit /usr/local/bin/searchsploit' # noqa: E501
|
|
31
|
+
install_github_handle = 'rad10/SearchSploit.py'
|
|
31
32
|
proxychains = False
|
|
32
33
|
proxy_socks5 = False
|
|
33
34
|
proxy_http = False
|
secator/tasks/subfinder.py
CHANGED
|
@@ -30,6 +30,7 @@ class subfinder(ReconDns):
|
|
|
30
30
|
}
|
|
31
31
|
output_types = [Subdomain]
|
|
32
32
|
install_cmd = 'go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest'
|
|
33
|
+
install_github_handle = 'projectdiscovery/subfinder'
|
|
33
34
|
proxychains = False
|
|
34
35
|
proxy_http = True
|
|
35
36
|
proxy_socks5 = False
|
secator/utils.py
CHANGED
|
@@ -15,11 +15,13 @@ from pathlib import Path
|
|
|
15
15
|
from pkgutil import iter_modules
|
|
16
16
|
from urllib.parse import urlparse, quote
|
|
17
17
|
|
|
18
|
+
|
|
18
19
|
import ifaddr
|
|
19
20
|
import yaml
|
|
20
21
|
from rich.markdown import Markdown
|
|
21
22
|
|
|
22
|
-
from secator.definitions import DEBUG, DEBUG_COMPONENT, DEFAULT_STDIN_TIMEOUT
|
|
23
|
+
from secator.definitions import (DEBUG, DEBUG_COMPONENT, DEFAULT_STDIN_TIMEOUT, VERSION, DEV_PACKAGE, ROOT_FOLDER,
|
|
24
|
+
LIB_FOLDER)
|
|
23
25
|
from secator.rich import console
|
|
24
26
|
|
|
25
27
|
logger = logging.getLogger(__name__)
|
|
@@ -402,3 +404,23 @@ def escape_mongodb_url(url):
|
|
|
402
404
|
user, password = quote(user), quote(password)
|
|
403
405
|
return f'mongodb://{user}:{password}@{url}'
|
|
404
406
|
return url
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def print_version():
|
|
410
|
+
"""Print secator version information."""
|
|
411
|
+
from secator.installer import get_version_info
|
|
412
|
+
console.print(f'[bold gold3]Current version[/]: {VERSION}', highlight=False, end='')
|
|
413
|
+
info = get_version_info('secator', github_handle='freelabz/secator', version=VERSION)
|
|
414
|
+
latest_version = info['latest_version']
|
|
415
|
+
status = info['status']
|
|
416
|
+
location = info['location']
|
|
417
|
+
if status == 'outdated':
|
|
418
|
+
console.print('[bold red] (outdated)[/]')
|
|
419
|
+
console.print(f'[bold gold3]Latest version[/]: {latest_version}', highlight=False)
|
|
420
|
+
console.print(f'[bold gold3]Location[/]: {location}')
|
|
421
|
+
console.print(f'[bold gold3]Python binary[/]: {sys.executable}')
|
|
422
|
+
if DEV_PACKAGE:
|
|
423
|
+
console.print(f'[bold gold3]Root folder[/]: {ROOT_FOLDER}')
|
|
424
|
+
console.print(f'[bold gold3]Lib folder[/]: {LIB_FOLDER}')
|
|
425
|
+
if status == 'outdated':
|
|
426
|
+
console.print('[bold red]secator is outdated, run "secator update" to install the latest version.')
|
secator/utils_test.py
CHANGED
|
@@ -92,6 +92,7 @@ META_OPTS = {
|
|
|
92
92
|
'msfconsole.resource': load_fixture('msfconsole_input', FIXTURES_DIR, only_path=True),
|
|
93
93
|
'dirsearch.output_path': load_fixture('dirsearch_output', FIXTURES_DIR, only_path=True),
|
|
94
94
|
'maigret.output_path': load_fixture('maigret_output', FIXTURES_DIR, only_path=True),
|
|
95
|
+
'nuclei.template_id': 'prometheus-metrics',
|
|
95
96
|
'wpscan.output_path': load_fixture('wpscan_output', FIXTURES_DIR, only_path=True),
|
|
96
97
|
'h8mail.output_path': load_fixture('h8mail_output', FIXTURES_DIR, only_path=True),
|
|
97
98
|
'h8mail.local_breach': load_fixture('h8mail_breach', FIXTURES_DIR, only_path=True)
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
secator/.gitignore,sha256=da8MUc3hdb6Mo0WjZu2upn5uZMbXcBGvhdhTQ1L89HI,3093
|
|
2
2
|
secator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
secator/celery.py,sha256=
|
|
4
|
-
secator/cli.py,sha256=
|
|
3
|
+
secator/celery.py,sha256=QQlDblcCMfs7r2l0DhB2X8miLCtHE5MdC-XiGMK8IcA,12226
|
|
4
|
+
secator/cli.py,sha256=ipkIGc5NBY-SLWENhdeueYmpOnDP2eGURX4xBIcSNic,31531
|
|
5
5
|
secator/config.py,sha256=iOeRzq7u1rvR1-Oq5v9wGxQYB613X0xKGLIcrfhEGc4,3693
|
|
6
|
-
secator/decorators.py,sha256=
|
|
7
|
-
secator/definitions.py,sha256=
|
|
6
|
+
secator/decorators.py,sha256=ZlrdUQ5kpisaNRI4-csQWwbrB4oXs6SXijramNMVqfE,10490
|
|
7
|
+
secator/definitions.py,sha256=JxoqbhkFH6jj5UwaMnrueimZOb6Zi3qksWuLC5O15oI,7636
|
|
8
|
+
secator/installer.py,sha256=pvyTVoG3prZm9V48CFCnIPjJQF7SdV9yU3sARnI12sI,9321
|
|
8
9
|
secator/report.py,sha256=g0stVCcx9klbUS01uKvWcxNE9MJfNFMexYA2SoDIWJU,2596
|
|
9
|
-
secator/rich.py,sha256=
|
|
10
|
-
secator/utils.py,sha256=
|
|
11
|
-
secator/utils_test.py,sha256=
|
|
10
|
+
secator/rich.py,sha256=W4PipeZfIVnERfW3ySeWSvnZ90jhCFiABBoERYy_6kM,3177
|
|
11
|
+
secator/utils.py,sha256=i9nnkOuRQIZbWRfyOS1dsT4wfJ7vvaJeZ3IZPwX3vKM,10945
|
|
12
|
+
secator/utils_test.py,sha256=xVF9RH1-p3X0TdmODJi4k62H7Xth96Ib7qnUZ4vAJs8,5043
|
|
12
13
|
secator/configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
14
|
secator/configs/profiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
15
|
secator/configs/profiles/aggressive.yaml,sha256=JilVySABlSCYEFMjH7V0Oc3dAVlkfHOh1odTGhtm7BQ,108
|
|
@@ -39,7 +40,7 @@ secator/exporters/csv.py,sha256=xsPMljzJhoTc8lcfxWBIKH2niK6KeYL7Bx2NzpdsYw0,982
|
|
|
39
40
|
secator/exporters/gdrive.py,sha256=VI6r1vlChz39myaN4sFvOlHO32SAhZS5_mI5EwGUdq8,4056
|
|
40
41
|
secator/exporters/json.py,sha256=cWkDugUdy-lbcPFKNgBrRFxHspiFhjVbJfdDABjJ9uk,431
|
|
41
42
|
secator/exporters/table.py,sha256=RHQoaFeeyeoBGNucJgrlk2KtmVqe9BGNtAAYee7xJ8Y,210
|
|
42
|
-
secator/exporters/txt.py,sha256=
|
|
43
|
+
secator/exporters/txt.py,sha256=QbiwWYGgHpITGw1sL2TX-S3AfmBdJ-VOWkPJzuBvOu4,785
|
|
43
44
|
secator/hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
45
|
secator/hooks/mongodb.py,sha256=GTd6BeiGtWUPWjmXKmalZYNoeGNZfNqEJ6BxRJh1Mr8,7149
|
|
45
46
|
secator/output_types/__init__.py,sha256=uj6AXDeorECPwhwekNVGjQbGv41jHG_8udkuoc4XzW0,854
|
|
@@ -56,44 +57,44 @@ secator/output_types/url.py,sha256=yDozBXCuPfuybH1iX_xGmbCJPXO6Ei14C8Hp5CnzNbE,2
|
|
|
56
57
|
secator/output_types/user_account.py,sha256=EiT2BFl2LTCdqHF1meoMEKVhjKGroyf8-JoWHPuBOTc,1378
|
|
57
58
|
secator/output_types/vulnerability.py,sha256=p0DTbr5w7Vv5D3dgbdnvsG5qXzqVVk4YPOPWYS1lxmM,2843
|
|
58
59
|
secator/runners/__init__.py,sha256=EBbOk37vkBy9p8Hhrbi-2VtM_rTwQ3b-0ggTyiD22cE,290
|
|
59
|
-
secator/runners/_base.py,sha256=
|
|
60
|
+
secator/runners/_base.py,sha256=wPCGBNEbTLSeFhYgQvTglo7gLA9ptM5Qa_vQSfe23Xk,28372
|
|
60
61
|
secator/runners/_helpers.py,sha256=7UUboSsr4b6srIOOHtSSYhJ9Jxq_qaMVbbF2gVEBnR4,3703
|
|
61
|
-
secator/runners/command.py,sha256=
|
|
62
|
+
secator/runners/command.py,sha256=JzdwhbvsDujOyE-i_XgBGH-g6jaEoDNwL7CU2BIZ-Ng,18737
|
|
62
63
|
secator/runners/scan.py,sha256=FjmlL_zkraqhS3rBwy5jHnGsKt2n7Hb2gi4qhgeGenw,1727
|
|
63
|
-
secator/runners/task.py,sha256=
|
|
64
|
-
secator/runners/workflow.py,sha256=
|
|
64
|
+
secator/runners/task.py,sha256=PWFRFaI_GdKtgyNx9f7iiCUUUtl0XiinHD7rurspTvc,2823
|
|
65
|
+
secator/runners/workflow.py,sha256=90QvSJXNXTIS3_RecCnzMWYplG6gT-wc82b214XIivE,3773
|
|
65
66
|
secator/serializers/__init__.py,sha256=OP5cmFl77ovgSCW_IDcZ21St2mUt5UK4QHfrsK2KvH8,248
|
|
66
67
|
secator/serializers/dataclass.py,sha256=g5gMT4NwndjhGcGbFuYEs07AZW_Q_m9orov_edVEGlI,792
|
|
67
68
|
secator/serializers/json.py,sha256=XwuSQOBwrOAs16F5HtY-Q-rAGAxfNvlq3z-Nb2gwigE,304
|
|
68
69
|
secator/serializers/regex.py,sha256=hGJ_1JSOv9xPtfn_umHlsjnR_alnsDFv-UmjYCC3vwU,314
|
|
69
70
|
secator/tasks/__init__.py,sha256=Wp2QF5QS2e_BlVygsIEFbmYPTfTg7v_Vd3LQJeXTC7I,344
|
|
70
|
-
secator/tasks/_categories.py,sha256=
|
|
71
|
+
secator/tasks/_categories.py,sha256=w4vxKffTQFJEHNzi6BV5DslGpnSAlKEN0K7H6slG3Vg,9015
|
|
71
72
|
secator/tasks/cariddi.py,sha256=Np9QPMpuqGtsLGHANfcbNaYjoQaqjkFXX9Dbtbtcgu4,3109
|
|
72
|
-
secator/tasks/dalfox.py,sha256=
|
|
73
|
+
secator/tasks/dalfox.py,sha256=nrLkIbTNz_J7LgUy_3kBgzhTUbQi3RmiSJhc9HWa05c,1744
|
|
73
74
|
secator/tasks/dirsearch.py,sha256=2hJeJZJwaAl3-UAjBwlmjW1w9bxjVWxxwfcaTTxqClc,2387
|
|
74
|
-
secator/tasks/dnsx.py,sha256=
|
|
75
|
-
secator/tasks/dnsxbrute.py,sha256=
|
|
76
|
-
secator/tasks/feroxbuster.py,sha256=
|
|
77
|
-
secator/tasks/ffuf.py,sha256=
|
|
75
|
+
secator/tasks/dnsx.py,sha256=H_3z87KAK-ndAQgCwS8TRWaUX_Hh54qEeuKQCS4rjBw,1771
|
|
76
|
+
secator/tasks/dnsxbrute.py,sha256=obr2SsxIJlO2KckxrCOPHvvzyfequFW6-D4ZAUq4Egk,1224
|
|
77
|
+
secator/tasks/feroxbuster.py,sha256=9QQpd8T0CSMfXf_BMmCX4LeIogyvsc_ccXFJnEocxVo,3011
|
|
78
|
+
secator/tasks/ffuf.py,sha256=ocmFfJJoV4zF8zkhUxHqUyDuJe9flmuijHCq_xk2pa4,2558
|
|
78
79
|
secator/tasks/fping.py,sha256=P2EAPUGgwEC4Geh2zUbBPKF9bdqrlrdDg-R_TYLTFng,1127
|
|
79
|
-
secator/tasks/gau.py,sha256=
|
|
80
|
+
secator/tasks/gau.py,sha256=Sq5l277cGxpT2bB5s1RqrggP804RKbC6xxgLDZZzLFs,1391
|
|
80
81
|
secator/tasks/gf.py,sha256=WlhoEyL6xE79w6nE5XNSXHs-jVeO10njqJxBF8w20sA,945
|
|
81
|
-
secator/tasks/gospider.py,sha256
|
|
82
|
-
secator/tasks/grype.py,sha256=
|
|
82
|
+
secator/tasks/gospider.py,sha256=_UlTb9G5Ss8D68NT53s0_rI6TnG00Ph0yxWyHic7cKs,2172
|
|
83
|
+
secator/tasks/grype.py,sha256=n60Zs9d1NWJFHQ0DwIZib5wu3xH-tV2RzgLYwuQSTo4,2413
|
|
83
84
|
secator/tasks/h8mail.py,sha256=hZBpfV6M1mbpD_PbDHxLI5HMvqAvTeY_W0lbkq3Hugo,2037
|
|
84
|
-
secator/tasks/httpx.py,sha256=
|
|
85
|
-
secator/tasks/katana.py,sha256=
|
|
85
|
+
secator/tasks/httpx.py,sha256=NuycnbPejEZoUdFYFXyahYiZnzhz1cPJarHdP7WyP6c,3979
|
|
86
|
+
secator/tasks/katana.py,sha256=Xa03zP2-78Ns59unUPrR_MHSd1DugTQlThxl8cL6pX4,4370
|
|
86
87
|
secator/tasks/maigret.py,sha256=PZDTICJ4LZF3joKe-dXu2alffakD_1sxBuNEUBtJDm4,2098
|
|
87
|
-
secator/tasks/mapcidr.py,sha256=
|
|
88
|
+
secator/tasks/mapcidr.py,sha256=7aa2WXQATWgIQo5oA12URjAg80L6MFMGdxScxls8DuA,980
|
|
88
89
|
secator/tasks/msfconsole.py,sha256=VlhEzsdYMHb6eJy4HBRdXMtRKhdzf5KtQGh7qZqO9Rs,6073
|
|
89
|
-
secator/tasks/naabu.py,sha256=
|
|
90
|
+
secator/tasks/naabu.py,sha256=RNs4NCZXgKhPqzR78l6l61tau0mGHuj6C3If7fimpgs,1594
|
|
90
91
|
secator/tasks/nmap.py,sha256=LS5FBo-vFxbHVK4DxF5x-O2cAvAK3zL1pROT1GddX9E,9459
|
|
91
|
-
secator/tasks/nuclei.py,sha256=
|
|
92
|
-
secator/tasks/searchsploit.py,sha256=
|
|
93
|
-
secator/tasks/subfinder.py,sha256=
|
|
92
|
+
secator/tasks/nuclei.py,sha256=7MlTygHd4EVz81ndrVwP5y6PZ-4j-Y8Oxuk3G3ayHPI,3343
|
|
93
|
+
secator/tasks/searchsploit.py,sha256=l0uNj5Jzax3lVMiMDxC8V3-bQ05y-FPaOhVdro1ibV4,1713
|
|
94
|
+
secator/tasks/subfinder.py,sha256=cpFyFCpVaDZ3QAjNId26ezOwntn3CA5Uk-AC2l0mo0E,1087
|
|
94
95
|
secator/tasks/wpscan.py,sha256=OgFCWEPOjOVdFreBXZDLBRc-PrFmTUv97UaXmaAS9yc,5413
|
|
95
|
-
secator-0.
|
|
96
|
-
secator-0.
|
|
97
|
-
secator-0.
|
|
98
|
-
secator-0.
|
|
99
|
-
secator-0.
|
|
96
|
+
secator-0.3.1.dist-info/METADATA,sha256=-y1zHhBhLVGECVIisVgjr7FEJQ_nIlrRGGJ0XxKZQ4s,13553
|
|
97
|
+
secator-0.3.1.dist-info/WHEEL,sha256=wpsUbWzR9la66_V7_eWTdyvs6WD26tazKT2BBEAC-EM,105
|
|
98
|
+
secator-0.3.1.dist-info/entry_points.txt,sha256=lPgsqqUXWgiuGSfKy-se5gHdQlAXIwS_A46NYq7Acic,44
|
|
99
|
+
secator-0.3.1.dist-info/licenses/LICENSE,sha256=19W5Jsy4WTctNkqmZIqLRV1gTDOp01S3LDj9iSgWaJ0,2867
|
|
100
|
+
secator-0.3.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|