secator 0.12.0__py3-none-any.whl → 0.13.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 (44) hide show
  1. secator/cli.py +174 -65
  2. secator/configs/workflows/host_recon.yaml +11 -2
  3. secator/configs/workflows/port_scan.yaml +39 -0
  4. secator/configs/workflows/url_dirsearch.yaml +5 -0
  5. secator/definitions.py +0 -4
  6. secator/installer.py +29 -15
  7. secator/runners/_base.py +2 -1
  8. secator/runners/_helpers.py +13 -2
  9. secator/runners/command.py +2 -1
  10. secator/tasks/_categories.py +2 -2
  11. secator/tasks/arjun.py +2 -1
  12. secator/tasks/bbot.py +30 -4
  13. secator/tasks/bup.py +2 -1
  14. secator/tasks/cariddi.py +15 -3
  15. secator/tasks/dalfox.py +2 -1
  16. secator/tasks/dirsearch.py +1 -1
  17. secator/tasks/dnsx.py +2 -1
  18. secator/tasks/dnsxbrute.py +2 -1
  19. secator/tasks/feroxbuster.py +3 -2
  20. secator/tasks/ffuf.py +2 -1
  21. secator/tasks/gau.py +2 -1
  22. secator/tasks/gitleaks.py +4 -3
  23. secator/tasks/gospider.py +3 -2
  24. secator/tasks/grype.py +1 -0
  25. secator/tasks/h8mail.py +2 -1
  26. secator/tasks/httpx.py +3 -2
  27. secator/tasks/katana.py +4 -3
  28. secator/tasks/maigret.py +1 -1
  29. secator/tasks/mapcidr.py +2 -1
  30. secator/tasks/msfconsole.py +4 -3
  31. secator/tasks/naabu.py +4 -2
  32. secator/tasks/nuclei.py +15 -9
  33. secator/tasks/searchsploit.py +3 -2
  34. secator/tasks/subfinder.py +2 -1
  35. secator/tasks/testssl.py +4 -3
  36. secator/tasks/trivy.py +2 -2
  37. secator/tasks/wafw00f.py +2 -1
  38. secator/tasks/wpprobe.py +2 -1
  39. secator/tasks/wpscan.py +6 -3
  40. {secator-0.12.0.dist-info → secator-0.13.0.dist-info}/METADATA +1 -1
  41. {secator-0.12.0.dist-info → secator-0.13.0.dist-info}/RECORD +44 -43
  42. {secator-0.12.0.dist-info → secator-0.13.0.dist-info}/WHEEL +0 -0
  43. {secator-0.12.0.dist-info → secator-0.13.0.dist-info}/entry_points.txt +0 -0
  44. {secator-0.12.0.dist-info → secator-0.13.0.dist-info}/licenses/LICENSE +0 -0
secator/tasks/bbot.py CHANGED
@@ -121,6 +121,29 @@ BBOT_PRESETS = [
121
121
  'web-screenshots',
122
122
  'web-thorough'
123
123
  ]
124
+ BBOT_FLAGS = [
125
+ 'active',
126
+ 'affiliates',
127
+ 'aggressive',
128
+ 'baddns',
129
+ 'cloud-enum,'
130
+ 'code-enum,deadly',
131
+ 'email-enum',
132
+ 'iis-shortnames',
133
+ 'passive',
134
+ 'portscan',
135
+ 'report',
136
+ 'safe',
137
+ 'service-enum',
138
+ 'slow',
139
+ 'social-enum',
140
+ 'subdomain-enum',
141
+ 'subdomain-hijack',
142
+ 'web-basic',
143
+ 'web-paramminer',
144
+ 'web-screenshots',
145
+ 'web-thorough'
146
+ ]
124
147
  BBOT_MODULES_STR = ' '.join(BBOT_MODULES)
125
148
  BBOT_MAP_TYPES = {
126
149
  'IP_ADDRESS': Ip,
@@ -159,12 +182,14 @@ class bbot(Command):
159
182
  file_flag = None
160
183
  version_flag = '--help'
161
184
  opts = {
162
- 'modules': {'type': str, 'short': 'm', 'default': '', 'help': ','.join(BBOT_MODULES)},
163
- 'presets': {'type': str, 'short': 'ps', 'default': 'kitchen-sink', 'help': ','.join(BBOT_PRESETS), 'shlex': False},
185
+ 'modules': {'type': str, 'short': 'm', 'help': ','.join(BBOT_MODULES)},
186
+ 'presets': {'type': str, 'short': 'ps', 'help': ','.join(BBOT_PRESETS), 'shlex': False},
187
+ 'flags': {'type': str, 'short': 'fl', 'help': ','.join(BBOT_FLAGS)}
164
188
  }
165
189
  opt_key_map = {
166
190
  'modules': 'm',
167
- 'presets': 'p'
191
+ 'presets': 'p',
192
+ 'flags': 'f'
168
193
  }
169
194
  opt_value_map = {
170
195
  'presets': lambda x: ' '.join(x.split(','))
@@ -222,7 +247,8 @@ class bbot(Command):
222
247
  'apk': ['python3-dev', 'linux-headers', 'musl-dev', 'gcc', 'git', 'openssl', 'unzip', 'tar', 'chromium'],
223
248
  '*': ['gcc', 'git', 'openssl', 'unzip', 'tar', 'chromium']
224
249
  }
225
- install_cmd = 'pipx install bbot && pipx upgrade bbot'
250
+ install_version = '2.4.2'
251
+ install_cmd = 'pipx install bbot==[install_version] --force'
226
252
  install_post = {
227
253
  '*': f'rm -fr {CONFIG.dirs.share}/pipx/venvs/bbot/lib/python3.12/site-packages/ansible_collections/*'
228
254
  }
secator/tasks/bup.py CHANGED
@@ -63,7 +63,8 @@ class bup(Http):
63
63
  'stored_response_path': 'response_html_filename',
64
64
  }
65
65
  }
66
- install_cmd = 'pipx install bypass-url-parser && pipx upgrade bypass-url-parser'
66
+ install_version = '0.4.4'
67
+ install_cmd = 'pipx install bypass-url-parser==[install_version] --force'
67
68
 
68
69
  @staticmethod
69
70
  def on_init(self):
secator/tasks/cariddi.py CHANGED
@@ -13,12 +13,19 @@ from secator.tasks._categories import HttpCrawler
13
13
  @task()
14
14
  class cariddi(HttpCrawler):
15
15
  """Crawl endpoints, secrets, api keys, extensions, tokens..."""
16
- cmd = 'cariddi -info -s -err -e -ext 1'
16
+ cmd = 'cariddi'
17
17
  input_type = URL
18
18
  input_flag = OPT_PIPE_INPUT
19
19
  output_types = [Url, Tag]
20
20
  file_flag = OPT_PIPE_INPUT
21
21
  json_flag = '-json'
22
+ opts = {
23
+ 'info': {'is_flag': True, 'short': 'info', 'help': 'Hunt for useful informations in websites.'},
24
+ 'secrets': {'is_flag': True, 'short': 'secrets', 'help': 'Hunt for secrets.'},
25
+ 'errors': {'is_flag': True, 'short': 'err', 'help': 'Hunt for errors in websites.'},
26
+ 'juicy_extensions': {'type': int, 'short': 'jext', 'help': 'Hunt for juicy file extensions. Integer from 1(juicy) to 7(not juicy)'}, # noqa: E501
27
+ 'juicy_endpoints': {'is_flag': True, 'short': 'jep', 'help': 'Hunt for juicy endpoints.'}
28
+ }
22
29
  opt_key_map = {
23
30
  HEADER: 'headers',
24
31
  DELAY: 'd',
@@ -38,10 +45,15 @@ class cariddi(HttpCrawler):
38
45
  RETRIES: OPT_NOT_SUPPORTED,
39
46
  THREADS: 'c',
40
47
  TIMEOUT: 't',
41
- USER_AGENT: 'ua'
48
+ USER_AGENT: 'ua',
49
+ 'secrets': 's',
50
+ 'errors': 'err',
51
+ 'juicy_endpoints': 'e',
52
+ 'juicy_extensions': 'ext'
42
53
  }
43
54
  item_loaders = [JSONSerializer()]
44
- install_cmd = 'go install -v github.com/edoardottt/cariddi/cmd/cariddi@latest'
55
+ install_version = 'v1.3.6'
56
+ install_cmd = 'go install -v github.com/edoardottt/cariddi/cmd/cariddi@[install_version]'
45
57
  install_github_handle = 'edoardottt/cariddi'
46
58
  encoding = 'ansi'
47
59
  proxychains = False
secator/tasks/dalfox.py CHANGED
@@ -55,7 +55,8 @@ class dalfox(VulnHttp):
55
55
  SEVERITY: lambda x: x['severity'].lower()
56
56
  }
57
57
  }
58
- install_cmd = 'go install -v github.com/hahwul/dalfox/v2@v2.9.3'
58
+ install_version = 'v2.11.0'
59
+ install_cmd = 'go install -v github.com/hahwul/dalfox/v2@latest'
59
60
  install_github_handle = 'hahwul/dalfox'
60
61
  encoding = 'ansi'
61
62
  proxychains = False
@@ -52,7 +52,7 @@ class dirsearch(HttpFuzzer):
52
52
  STATUS_CODE: 'status'
53
53
  }
54
54
  }
55
- install_cmd = 'pipx install --force git+https://github.com/maurosoria/dirsearch'
55
+ install_cmd = 'pipx install git+https://github.com/maurosoria/dirsearch.git --force'
56
56
  proxychains = True
57
57
  proxy_socks5 = True
58
58
  proxy_http = True
secator/tasks/dnsx.py CHANGED
@@ -26,7 +26,8 @@ class dnsx(ReconDns):
26
26
  'wildcard_domain': {'type': str, 'short': 'wd', 'help': 'Domain name for wildcard filtering'},
27
27
  }
28
28
  item_loaders = [JSONSerializer()]
29
- install_cmd = 'go install -v github.com/projectdiscovery/dnsx/cmd/dnsx@latest'
29
+ install_version = 'v1.2.2'
30
+ install_cmd = 'go install -v github.com/projectdiscovery/dnsx/cmd/dnsx@[install_version]'
30
31
  install_github_handle = 'projectdiscovery/dnsx'
31
32
  profile = 'io'
32
33
 
@@ -34,6 +34,7 @@ class dnsxbrute(ReconDns):
34
34
  }
35
35
  }
36
36
  }
37
- install_cmd = 'go install -v github.com/projectdiscovery/dnsx/cmd/dnsx@latest'
37
+ install_version = 'v1.2.2'
38
+ install_cmd = 'go install -v github.com/projectdiscovery/dnsx/cmd/dnsx@[install_version]'
38
39
  install_github_handle = 'projectdiscovery/dnsx'
39
40
  profile = 'io'
@@ -6,7 +6,7 @@ from secator.definitions import (CONTENT_TYPE, DELAY, DEPTH, FILTER_CODES,
6
6
  MATCH_REGEX, MATCH_SIZE, MATCH_WORDS, METHOD,
7
7
  OPT_NOT_SUPPORTED, OPT_PIPE_INPUT, PROXY,
8
8
  RATE_LIMIT, RETRIES, STATUS_CODE,
9
- THREADS, TIMEOUT, USER_AGENT, WORDLIST, WORDS, DEFAULT_FEROXBUSTER_FLAGS)
9
+ THREADS, TIMEOUT, USER_AGENT, WORDLIST, WORDS)
10
10
  from secator.output_types import Url
11
11
  from secator.serializers import JSONSerializer
12
12
  from secator.tasks._categories import HttpFuzzer
@@ -15,7 +15,7 @@ from secator.tasks._categories import HttpFuzzer
15
15
  @task()
16
16
  class feroxbuster(HttpFuzzer):
17
17
  """Simple, fast, recursive content discovery tool written in Rust"""
18
- cmd = f'feroxbuster {DEFAULT_FEROXBUSTER_FLAGS}'
18
+ cmd = 'feroxbuster --auto-bail --no-state'
19
19
  input_flag = '--url'
20
20
  input_chunk_size = 1
21
21
  file_flag = OPT_PIPE_INPUT
@@ -62,6 +62,7 @@ class feroxbuster(HttpFuzzer):
62
62
  install_pre = {
63
63
  '*': ['curl', 'bash']
64
64
  }
65
+ install_version = 'v2.11.0'
65
66
  install_cmd = (
66
67
  f'cd /tmp && curl -sL https://raw.githubusercontent.com/epi052/feroxbuster/master/install-nix.sh | bash -s {CONFIG.dirs.bin}' # noqa: E501
67
68
  )
secator/tasks/ffuf.py CHANGED
@@ -71,7 +71,8 @@ class ffuf(HttpFuzzer):
71
71
  },
72
72
  }
73
73
  encoding = 'ansi'
74
- install_cmd = 'go install -v github.com/ffuf/ffuf@latest'
74
+ install_version = 'v2.1.0'
75
+ install_cmd = 'go install -v github.com/ffuf/ffuf/v2@[install_version]'
75
76
  install_github_handle = 'ffuf/ffuf'
76
77
  proxychains = False
77
78
  proxy_socks5 = True
secator/tasks/gau.py CHANGED
@@ -44,7 +44,8 @@ class gau(HttpCrawler):
44
44
  install_pre = {
45
45
  'apk': ['libc6-compat']
46
46
  }
47
- install_cmd = 'go install -v github.com/lc/gau/v2/cmd/gau@latest'
47
+ install_version = 'v2.2.4'
48
+ install_cmd = 'go install -v github.com/lc/gau/v2/cmd/gau@[install_version]'
48
49
  install_github_handle = 'lc/gau'
49
50
  proxychains = False
50
51
  proxy_socks5 = True
secator/tasks/gitleaks.py CHANGED
@@ -35,10 +35,11 @@ class gitleaks(Command):
35
35
  }
36
36
  }
37
37
  install_pre = {'*': ['git', 'make']}
38
+ install_version = 'v8.24.3'
38
39
  install_cmd = (
39
- f'git clone https://github.com/gitleaks/gitleaks.git {CONFIG.dirs.share}/gitleaks || true &&'
40
- f'cd {CONFIG.dirs.share}/gitleaks && make build &&'
41
- f'mv {CONFIG.dirs.share}/gitleaks/gitleaks {CONFIG.dirs.bin}'
40
+ f'git clone https://github.com/gitleaks/gitleaks.git {CONFIG.dirs.share}/gitleaks_[install_version] || true &&'
41
+ f'cd {CONFIG.dirs.share}/gitleaks_[install_version] && make build &&'
42
+ f'mv {CONFIG.dirs.share}/gitleaks_[install_version]/gitleaks {CONFIG.dirs.bin}'
42
43
  )
43
44
  install_github_handle = 'gitleaks/gitleaks'
44
45
 
secator/tasks/gospider.py CHANGED
@@ -15,7 +15,7 @@ from secator.tasks._categories import HttpCrawler
15
15
  @task()
16
16
  class gospider(HttpCrawler):
17
17
  """Fast web spider written in Go."""
18
- cmd = 'gospider --js'
18
+ cmd = 'gospider'
19
19
  file_flag = '-S'
20
20
  input_flag = '-s'
21
21
  json_flag = '--json'
@@ -53,7 +53,8 @@ class gospider(HttpCrawler):
53
53
  CONTENT_LENGTH: 'length',
54
54
  }
55
55
  }
56
- install_cmd = 'go install -v github.com/jaeles-project/gospider@latest'
56
+ install_version = 'v1.1.6'
57
+ install_cmd = 'go install -v github.com/jaeles-project/gospider@[install_version]'
57
58
  install_github_handle = 'jaeles-project/gospider'
58
59
  proxychains = False
59
60
  proxy_socks5 = True # with leaks... https://github.com/jaeles-project/gospider/issues/61
secator/tasks/grype.py CHANGED
@@ -30,6 +30,7 @@ class grype(VulnCode):
30
30
  install_pre = {
31
31
  '*': ['curl']
32
32
  }
33
+ install_version = 'v0.91.2'
33
34
  install_cmd = (
34
35
  f'curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b {CONFIG.dirs.bin}'
35
36
  )
secator/tasks/h8mail.py CHANGED
@@ -21,7 +21,8 @@ class h8mail(OSInt):
21
21
  'config': {'type': str, 'help': 'Configuration file for API keys'},
22
22
  'local_breach': {'type': str, 'short': 'lb', 'help': 'Local breach file'}
23
23
  }
24
- install_cmd = 'pipx install h8mail && pipx upgrade h8mail'
24
+ install_version = '2.5.6'
25
+ install_cmd = 'pipx install h8mail==[install_version] --force'
25
26
 
26
27
  @staticmethod
27
28
  def on_start(self):
secator/tasks/httpx.py CHANGED
@@ -33,7 +33,7 @@ class httpx(Http):
33
33
  'system_chrome': {'is_flag': True, 'default': False, 'help': 'Use local installed Chrome for screenshot'},
34
34
  'headless_options': {'is_flag': False, 'short': 'ho', 'default': None, 'help': 'Headless Chrome additional options'},
35
35
  'follow_host_redirects': {'is_flag': True, 'short': 'fhr', 'default': None, 'help': 'Follow redirects on the same host'}, # noqa: E501
36
- 'tech_detect': {'is_flag': True, 'short': 'td', 'default': True, 'help': 'Tech detection'},
36
+ 'tech_detect': {'is_flag': True, 'short': 'td', 'default': False, 'help': 'Tech detection'},
37
37
  'tls_grab': {'is_flag': True, 'short': 'tlsg', 'default': False, 'help': 'Grab some informations from the tls certificate'}, # noqa: E501
38
38
  'rstr': {'type': int, 'default': CONFIG.http.response_max_size_bytes, 'help': 'Max body size to read (bytes)'},
39
39
  'rsts': {'type': int, 'default': CONFIG.http.response_max_size_bytes, 'help': 'Max body size to save (bytes)'}
@@ -68,7 +68,8 @@ class httpx(Http):
68
68
  install_pre = {
69
69
  'apk': ['chromium']
70
70
  }
71
- install_cmd = 'go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest'
71
+ install_version = 'v1.7.0'
72
+ install_cmd = 'go install -v github.com/projectdiscovery/httpx/cmd/httpx@[install_version]'
72
73
  install_github_handle = 'projectdiscovery/httpx'
73
74
  proxychains = False
74
75
  proxy_socks5 = True
secator/tasks/katana.py CHANGED
@@ -26,8 +26,8 @@ class katana(HttpCrawler):
26
26
  'form_extraction': {'is_flag': True, 'short': 'fx', 'help': 'Detect forms'},
27
27
  'store_responses': {'is_flag': True, 'short': 'sr', 'default': CONFIG.http.store_responses, 'help': 'Store responses'}, # noqa: E501
28
28
  'form_fill': {'is_flag': True, 'short': 'ff', 'help': 'Enable form filling'},
29
- 'js_crawl': {'is_flag': True, 'short': 'jc', 'default': True, 'help': 'Enable endpoint parsing / crawling in javascript file'}, # noqa: E501
30
- 'jsluice': {'is_flag': True, 'short': 'jsl', 'default': True, 'help': 'Enable jsluice parsing in javascript file (memory intensive)'}, # noqa: E501
29
+ 'js_crawl': {'is_flag': True, 'short': 'jc', 'default': False, 'help': 'Enable endpoint parsing / crawling in javascript file'}, # noqa: E501
30
+ 'jsluice': {'is_flag': True, 'short': 'jsl', 'default': False, 'help': 'Enable jsluice parsing in javascript file (memory intensive)'}, # noqa: E501
31
31
  'known_files': {'type': str, 'short': 'kf', 'default': 'all', 'help': 'Enable crawling of known files (all, robotstxt, sitemapxml)'}, # noqa: E501
32
32
  'omit_raw': {'is_flag': True, 'short': 'or', 'default': True, 'help': 'Omit raw requests/responses from jsonl output'}, # noqa: E501
33
33
  'omit_body': {'is_flag': True, 'short': 'ob', 'default': True, 'help': 'Omit response body from jsonl output'},
@@ -78,7 +78,8 @@ class katana(HttpCrawler):
78
78
  install_pre = {
79
79
  'apk': ['libc6-compat']
80
80
  }
81
- install_cmd = 'go install -v github.com/projectdiscovery/katana/cmd/katana@latest'
81
+ install_version = 'v1.1.3'
82
+ install_cmd = 'go install -v github.com/projectdiscovery/katana/cmd/katana@[install_version]'
82
83
  install_github_handle = 'projectdiscovery/katana'
83
84
  proxychains = False
84
85
  proxy_socks5 = True
secator/tasks/maigret.py CHANGED
@@ -41,7 +41,7 @@ class maigret(ReconUser):
41
41
  EXTRA_DATA: lambda x: x['status'].get('ids', {})
42
42
  }
43
43
  }
44
- install_cmd = 'pipx install git+https://github.com/soxoj/maigret'
44
+ install_cmd = 'pipx install git+https://github.com/soxoj/maigret --force'
45
45
  socks5_proxy = True
46
46
  profile = 'io'
47
47
 
secator/tasks/mapcidr.py CHANGED
@@ -16,7 +16,8 @@ class mapcidr(ReconIp):
16
16
  install_pre = {
17
17
  'apk': ['libc6-compat']
18
18
  }
19
- install_cmd = 'go install -v github.com/projectdiscovery/mapcidr/cmd/mapcidr@latest'
19
+ install_version = 'v1.1.34'
20
+ install_cmd = 'go install -v github.com/projectdiscovery/mapcidr/cmd/mapcidr@[install_version]'
20
21
  install_github_handle = 'projectdiscovery/mapcidr'
21
22
  input_type = CIDR_RANGE
22
23
  output_types = [Ip]
@@ -48,14 +48,15 @@ class msfconsole(VulnMulti):
48
48
  'pacman': ['ruby-erb', 'postgresql-libs', 'make'],
49
49
  'yum|zypper': ['postgresql-devel', 'make'],
50
50
  }
51
+ install_version = '6.4.59'
51
52
  install_cmd = (
52
- f'git clone --depth 1 --single-branch https://github.com/rapid7/metasploit-framework.git {CONFIG.dirs.share}/metasploit-framework || true && ' # noqa: E501
53
- f'cd {CONFIG.dirs.share}/metasploit-framework && '
53
+ f'git clone --depth 1 --single-branch -b [install_version] https://github.com/rapid7/metasploit-framework.git {CONFIG.dirs.share}/metasploit-framework_[install_version] || true && ' # noqa: E501
54
+ f'cd {CONFIG.dirs.share}/metasploit-framework_[install_version] && '
54
55
  f'gem install bundler --user-install -n {CONFIG.dirs.bin} && '
55
56
  f'bundle config set --local path "{CONFIG.dirs.share}" && '
56
57
  'bundle lock --normalize-platforms &&'
57
58
  'bundle install && '
58
- f'ln -sf $HOME/.local/share/metasploit-framework/msfconsole {CONFIG.dirs.bin}/msfconsole'
59
+ f'ln -sf $HOME/.local/share/metasploit-framework_[install_version]/msfconsole {CONFIG.dirs.bin}/msfconsole'
59
60
  )
60
61
 
61
62
  @staticmethod
secator/tasks/naabu.py CHANGED
@@ -10,7 +10,7 @@ from secator.tasks._categories import ReconPort
10
10
  @task()
11
11
  class naabu(ReconPort):
12
12
  """Port scanning tool written in Go."""
13
- cmd = 'naabu -Pn'
13
+ cmd = 'naabu'
14
14
  input_flag = '-host'
15
15
  file_flag = '-list'
16
16
  json_flag = '-json'
@@ -18,6 +18,7 @@ class naabu(ReconPort):
18
18
  PORTS: {'type': str, 'short': 'p', 'help': 'Ports'},
19
19
  TOP_PORTS: {'type': str, 'short': 'tp', 'help': 'Top ports'},
20
20
  'scan_type': {'type': str, 'short': 'st', 'help': 'Scan type (SYN (s)/CONNECT(c))'},
21
+ 'skip_host_discovery': {'is_flag': True, 'short': 'Pn', 'default': False, 'help': 'Skip host discovery'},
21
22
  # 'health_check': {'is_flag': True, 'short': 'hc', 'help': 'Health check'}
22
23
  }
23
24
  opt_key_map = {
@@ -47,7 +48,8 @@ class naabu(ReconPort):
47
48
  }
48
49
  }
49
50
  output_types = [Port]
50
- install_cmd = 'go install -v github.com/projectdiscovery/naabu/v2/cmd/naabu@v2.3.3'
51
+ install_version = 'v2.3.3'
52
+ install_cmd = 'go install -v github.com/projectdiscovery/naabu/v2/cmd/naabu@[install_version]'
51
53
  install_github_handle = 'projectdiscovery/naabu'
52
54
  install_pre = {'apt': ['libpcap-dev'], 'apk': ['libpcap-dev', 'libc6-compat'], 'pacman|brew': ['libpcap']}
53
55
  install_post = {'arch|alpine': 'sudo ln -sf /usr/lib/libpcap.so /usr/lib/libpcap.so.0.8'}
secator/tasks/nuclei.py CHANGED
@@ -18,17 +18,22 @@ class nuclei(VulnMulti):
18
18
  input_flag = '-u'
19
19
  json_flag = '-jsonl'
20
20
  opts = {
21
- 'templates': {'type': str, 'short': 't', 'help': 'Templates'},
22
- 'tags': {'type': str, 'help': 'Tags'},
23
- 'exclude_tags': {'type': str, 'short': 'etags', 'help': 'Exclude tags'},
24
- 'exclude_severity': {'type': str, 'short': 'es', 'help': 'Exclude severity'},
25
- 'template_id': {'type': str, 'short': 'tid', 'help': 'Template id'},
21
+ 'bulk_size': {'type': int, 'short': 'bs', 'help': 'Maximum number of hosts to be analyzed in parallel per template'}, # noqa: E501
26
22
  'debug': {'type': str, 'help': 'Debug mode'},
23
+ 'exclude_severity': {'type': str, 'short': 'es', 'help': 'Exclude severity'},
24
+ 'exclude_tags': {'type': str, 'short': 'etags', 'help': 'Exclude tags'},
25
+ 'input_mode': {'type': str, 'short': 'im', 'help': 'Mode of input file (list, burp, jsonl, yaml, openapi, swagger)'},
26
+ 'hang_monitor': {'is_flag': True, 'short': 'hm', 'default': True, 'help': 'Enable nuclei hang monitoring'},
27
+ 'headless_bulk_size': {'type': int, 'short': 'hbs', 'help': 'Maximum number of headless hosts to be analzyed in parallel per template'}, # noqa: E501
28
+ 'new_templates': {'type': str, 'short': 'nt', 'help': 'Run only new templates added in latest nuclei-templates release'}, # noqa: E501
29
+ 'automatic_scan': {'is_flag': True, 'short': 'as', 'help': 'Automatic web scan using wappalyzer technology detection to tags mapping'}, # noqa: E501
30
+ 'omit_raw': {'is_flag': True, 'short': 'or', 'default': True, 'help': 'Omit requests/response pairs in the JSON, JSONL, and Markdown outputs (for findings only)'}, # noqa: E501
27
31
  'stats': {'is_flag': True, 'short': 'stats', 'default': True, 'help': 'Display statistics about the running scan'},
28
32
  'stats_json': {'is_flag': True, 'short': 'sj', 'default': True, 'help': 'Display statistics in JSONL(ines) format'},
29
- 'stats_interval': {'type': str, 'short': 'si', 'default': 20, 'help': 'Number of seconds to wait between showing a statistics update'}, # noqa: E501
30
- 'hang_monitor': {'is_flag': True, 'short': 'hm', 'default': True, 'help': 'Enable nuclei hang monitoring'},
31
- 'omit_raw': {'is_flag': True, 'short': 'or', 'default': True, 'help': 'Omit requests/response pairs in the JSON, JSONL, and Markdown outputs (for findings only)'} # noqa: E501
33
+ 'stats_interval': {'type': str, 'short': 'si', 'help': 'Number of seconds to wait between showing a statistics update'}, # noqa: E501
34
+ 'tags': {'type': str, 'help': 'Tags'},
35
+ 'templates': {'type': str, 'short': 't', 'help': 'Templates'},
36
+ 'template_id': {'type': str, 'short': 'tid', 'help': 'Template id'},
32
37
  }
33
38
  opt_key_map = {
34
39
  HEADER: 'header',
@@ -76,7 +81,8 @@ class nuclei(VulnMulti):
76
81
  install_pre = {
77
82
  '*': ['git']
78
83
  }
79
- install_cmd = 'go install -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei@latest'
84
+ install_version = 'v3.4.2'
85
+ install_cmd = 'go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@[install_version]'
80
86
  install_github_handle = 'projectdiscovery/nuclei'
81
87
  install_post = {
82
88
  '*': 'nuclei -ut'
@@ -41,9 +41,10 @@ class searchsploit(Command):
41
41
  install_pre = {
42
42
  'apk': ['ncurses']
43
43
  }
44
+ install_version = '2025-04-23'
44
45
  install_cmd = (
45
- f'git clone --depth 1 --single-branch https://gitlab.com/exploit-database/exploitdb.git {CONFIG.dirs.share}/exploitdb || true && ' # noqa: E501
46
- f'ln -sf $HOME/.local/share/exploitdb/searchsploit {CONFIG.dirs.bin}/searchsploit'
46
+ f'git clone --depth 1 --single-branch -b [install_version] https://gitlab.com/exploit-database/exploitdb.git {CONFIG.dirs.share}/exploitdb_[install_version] || true && ' # noqa: E501
47
+ f'ln -sf $HOME/.local/share/exploitdb_[install_version]/searchsploit {CONFIG.dirs.bin}/searchsploit'
47
48
  )
48
49
  proxychains = False
49
50
  proxy_socks5 = False
@@ -31,7 +31,8 @@ class subfinder(ReconDns):
31
31
  }
32
32
  }
33
33
  output_types = [Subdomain]
34
- install_cmd = 'go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest'
34
+ install_version = 'v2.7.0'
35
+ install_cmd = 'go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@[install_version]'
35
36
  install_github_handle = 'projectdiscovery/subfinder'
36
37
  proxychains = False
37
38
  proxy_http = True
secator/tasks/testssl.py CHANGED
@@ -48,13 +48,14 @@ class testssl(Command):
48
48
  proxy_socks5 = False
49
49
  profile = 'io'
50
50
  install_pre = {
51
- 'apk': ['hexdump'],
51
+ 'apk': ['hexdump', 'coreutils', 'procps'],
52
52
  'pacman': ['util-linux'],
53
53
  '*': ['bsdmainutils']
54
54
  }
55
+ install_version = 'v3.2.0'
55
56
  install_cmd = (
56
- f'git clone --depth 1 https://github.com/drwetter/testssl.sh.git {CONFIG.dirs.share}/testssl.sh || true && '
57
- f'ln -sf {CONFIG.dirs.share}/testssl.sh/testssl.sh {CONFIG.dirs.bin}'
57
+ f'git clone --depth 1 --single-branch -b [install_version] https://github.com/drwetter/testssl.sh.git {CONFIG.dirs.share}/testssl.sh_[install_version] || true && ' # noqa: E501
58
+ f'ln -sf {CONFIG.dirs.share}/testssl.sh_[install_version]/testssl.sh {CONFIG.dirs.bin}'
58
59
  )
59
60
 
60
61
  @staticmethod
secator/tasks/trivy.py CHANGED
@@ -31,12 +31,12 @@ class trivy(Vuln):
31
31
  USER_AGENT: OPT_NOT_SUPPORTED
32
32
  }
33
33
  output_types = [Tag, Vulnerability]
34
+ install_version = 'v0.61.1'
34
35
  install_cmd = (
35
36
  'curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh |'
36
- f'sudo sh -s -- -b {CONFIG.dirs.bin} v0.61.1'
37
+ f'sudo sh -s -- -b {CONFIG.dirs.bin} [install_version]'
37
38
  )
38
39
  install_github_handle = 'aquasecurity/trivy'
39
- install_github_handle = 'aquasecurity/trivy'
40
40
 
41
41
  @staticmethod
42
42
  def on_cmd(self):
secator/tasks/wafw00f.py CHANGED
@@ -37,7 +37,8 @@ class wafw00f(Command):
37
37
  'no_follow_redirects': 'noredirect',
38
38
  }
39
39
  output_types = [Tag]
40
- install_cmd = 'pipx install git+https://github.com/EnableSecurity/wafw00f.git && pipx upgrade wafw00f'
40
+ install_version = 'v2.3.1'
41
+ install_cmd = 'pipx install git+https://github.com/EnableSecurity/wafw00f.git@[install_version] --force'
41
42
  install_github_handle = 'EnableSecurity/wafw00f'
42
43
  proxy_http = True
43
44
 
secator/tasks/wpprobe.py CHANGED
@@ -27,7 +27,8 @@ class wpprobe(Command):
27
27
  THREADS: 't'
28
28
  }
29
29
  output_types = [Vulnerability, Tag]
30
- install_cmd = 'go install github.com/Chocapikk/wpprobe@latest'
30
+ install_version = 'v0.5.6'
31
+ install_cmd = 'go install github.com/Chocapikk/wpprobe@[install_version]'
31
32
  install_github_handle = 'Chocapikk/wpprobe'
32
33
  install_post = {
33
34
  '*': 'wpprobe update && wpprobe update-db'
secator/tasks/wpscan.py CHANGED
@@ -16,7 +16,7 @@ from secator.tasks._categories import VulnHttp
16
16
  @task()
17
17
  class wpscan(VulnHttp):
18
18
  """Wordpress security scanner."""
19
- cmd = 'wpscan --random-user-agent --force --verbose --disable-tls-checks --ignore-main-redirect'
19
+ cmd = 'wpscan --force --verbose'
20
20
  file_flag = None
21
21
  input_flag = '--url'
22
22
  input_type = URL
@@ -30,7 +30,9 @@ class wpscan(VulnHttp):
30
30
  'passwords': {'type': str, 'help': 'List of passwords to use during the password attack.'},
31
31
  'usernames': {'type': str, 'help': 'List of usernames to use during the password attack.'},
32
32
  'login_uri': {'type': str, 'short': 'lu', 'help': 'URI of the login page if different from /wp-login.php'},
33
- 'detection_mode': {'type': str, 'short': 'dm', 'help': 'Detection mode between mixed, passive, and aggressive'}
33
+ 'detection_mode': {'type': str, 'short': 'dm', 'help': 'Detection mode between mixed, passive, and aggressive'},
34
+ 'random_user_agent': {'is_flag': True, 'short': 'rua', 'help': 'Random user agent'},
35
+ 'disable_tls_checks': {'is_flag': True, 'short': 'dtc', 'help': 'Disable TLS checks'}
34
36
  }
35
37
  opt_key_map = {
36
38
  HEADER: OPT_NOT_SUPPORTED,
@@ -72,7 +74,8 @@ class wpscan(VulnHttp):
72
74
  'pacman': ['make', 'ruby-erb'],
73
75
  '*': ['make']
74
76
  }
75
- install_cmd = f'gem install wpscan --user-install -n {CONFIG.dirs.bin}'
77
+ install_version = '3.8.28'
78
+ install_cmd = f'gem install wpscan -v [install_version] --user-install -n {CONFIG.dirs.bin}'
76
79
  install_post = {
77
80
  'kali': (
78
81
  f'gem uninstall nokogiri --user-install -n {CONFIG.dirs.bin} --force --executables && '
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: secator
3
- Version: 0.12.0
3
+ Version: 0.13.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