diff --git a/secator/tasks/httpx.py b/secator/tasks/httpx.py index 7a3e071d..0ab1f569 100644 --- a/secator/tasks/httpx.py +++ b/secator/tasks/httpx.py @@ -122,9 +122,9 @@ class httpx(Http): self.cmd = self.cmd.replace('-silent', '') screenshot = self.get_opt_value('screenshot') store_responses = self.get_opt_value('store_responses') + output_folder = shlex.quote(f'{self.reports_folder}/.outputs') if store_responses or screenshot: - reports_folder_outputs = f'{self.reports_folder}/.outputs' - self.cmd += f' -srd {shlex.quote(reports_folder_outputs)}' + self.cmd += f' -srd {output_folder}' if screenshot: self.cmd += ' -esb -ehb' self.domains = [] diff --git a/secator/tasks/katana.py b/secator/tasks/katana.py index 779fdd43..f06d72ea 100644 --- a/secator/tasks/katana.py +++ b/secator/tasks/katana.py @@ -89,9 +89,9 @@ class katana(HttpCrawler): form_fill = self.get_opt_value('form_fill') form_extraction = self.get_opt_value('form_extraction') store_responses = self.get_opt_value('store_responses') + output_folder = shelx.quote(f'{self.reports_folder}/.outputs') if form_fill or form_extraction or store_responses: - reports_folder_outputs = f'{self.reports_folder}/.outputs' - self.cmd += f' -srd {shlex.quote(reports_folder_outputs)}' + self.cmd += f' -srd {output_folder}' self._techs = {} @staticmethod diff --git a/secator/tasks/nuclei.py b/secator/tasks/nuclei.py index 2affd686..7ba835a6 100644 --- a/secator/tasks/nuclei.py +++ b/secator/tasks/nuclei.py @@ -1,3 +1,5 @@ +import shlex + from secator.config import CONFIG from secator.cve import extract_software_and_version from secator.decorators import task @@ -37,21 +39,22 @@ class nuclei(VulnMulti): json_flag = '-jsonl' input_chunk_size = 20 opts = { + 'automatic_scan': {'is_flag': True, 'short': 'as', 'help': 'Automatic web scan using wappalyzer technology detection to tags mapping'}, # noqa: E501 'bulk_size': {'type': int, 'short': 'bs', 'help': 'Maximum number of hosts to be analyzed in parallel per template'}, # noqa: E501 'debug': {'type': str, 'help': 'Debug mode'}, 'exclude_severity': {'type': str, 'short': 'es', 'help': 'Exclude severity'}, - 'severity': {'type': str, 'short': 's', 'help': 'Templates to run based on severity. Possible values: info, low, medium, high, critical, unknown'}, # noqa: E501 'exclude_tags': {'type': str, 'short': 'etags', 'help': 'Exclude tags'}, - 'input_mode': {'type': str, 'short': 'im', 'help': 'Mode of input file (list, burp, jsonl, yaml, openapi, swagger)'}, 'hang_monitor': {'is_flag': True, 'short': 'hm', 'default': True, 'help': 'Enable nuclei hang monitoring'}, 'headless_bulk_size': {'type': int, 'short': 'hbs', 'help': 'Maximum number of headless hosts to be analzyed in parallel per template'}, # noqa: E501 + 'input_mode': {'type': str, 'short': 'im', 'help': 'Mode of input file (list, burp, jsonl, yaml, openapi, swagger)'}, 'new_templates': {'type': str, 'short': 'nt', 'help': 'Run only new templates added in latest nuclei-templates release'}, # noqa: E501 - 'automatic_scan': {'is_flag': True, 'short': 'as', 'help': 'Automatic web scan using wappalyzer technology detection to tags mapping'}, # noqa: E501 '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 'response_size_read': {'type': int, 'default': CONFIG.http.response_max_size_bytes, 'help': 'Max body size to read (bytes)'}, # noqa: E501 + 'severity': {'type': str, 'short': 's', 'help': 'Templates to run based on severity. Possible values: info, low, medium, high, critical, unknown'}, # noqa: E501 'stats': {'is_flag': True, 'short': 'stats', 'default': True, 'help': 'Display statistics about the running scan'}, 'stats_json': {'is_flag': True, 'short': 'sj', 'default': True, 'help': 'Display statistics in JSONL(ines) format'}, 'stats_interval': {'type': str, 'short': 'si', 'help': 'Number of seconds to wait between showing a statistics update'}, # noqa: E501 + 'store_responses': {'is_flag': True, 'short': 'sr', 'default': CONFIG.http.store_responses, 'help': 'Store reponses'}, 'tags': {'type': str, 'help': 'Tags'}, 'templates': {'type': str, 'short': 't', 'help': 'Templates'}, 'template_id': {'type': str, 'short': 'tid', 'help': 'Template id'}, @@ -72,6 +75,7 @@ class nuclei(VulnMulti): 'exclude_severity': 'exclude-severity', 'templates': 't', 'response_size_read': 'rsr', + 'store_responses': 'sr', 'template_condition': 'tc', } opt_value_map = { @@ -126,6 +130,18 @@ class nuclei(VulnMulti): proxy_http = True # same profile = 'extra_large' + @staticmethod + def on_init(self): + store_responses = self.get_opt_value('store_responses') + output_folder = shlex.quote(f'{self.reports_folder}/.outputs') + if store_responses: + self.cmd += f' -srd {output_folder}' + logs = self.get_opt_value('logs') + if logs: + self.cmd += ' -ts' + self.cmd += f' -elog {output_dir}/{self.fqn}_error.json' + self.cmd += f' -tlog {output_dir}/{self.fqn}_trace.json' + @staticmethod def id_extractor(item): cve_ids = item['info'].get('classification', {}).get('cve-id') or []