jaeles_vulnerability_scan
Execute advanced vulnerability scanning with custom signatures to identify security weaknesses in web applications during security assessments.
Instructions
Execute Jaeles for advanced vulnerability scanning with custom signatures.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| additional_args | No | ||
| config | No | ||
| signatures | No | ||
| threads | No | ||
| timeout | No | ||
| url | Yes |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/mcp_server/app.py:1293-1321 (handler)MCP tool handler: proxies requests to REST API /api/jaeles-vulnerability-scan with logging
@mcp.tool() def jaeles_vulnerability_scan( url: str, signatures: str = "", config: str = "", threads: int = 20, timeout: int = 20, additional_args: str = "", ) -> dict[str, Any]: """Execute Jaeles for advanced vulnerability scanning with custom signatures.""" data = { "url": url, "signatures": signatures, "config": config, "threads": threads, "timeout": timeout, "additional_args": additional_args, } logger.info(f"🎯 Starting Jaeles vulnerability scan on {url}") result = api_client.safe_post("api/jaeles-vulnerability-scan", data) if result.get("success"): logger.info(f"✅ Jaeles scan completed on {url}") else: logger.error("❌ Jaeles scan failed") return result - REST API core handler: executes jaeles command and parses output
@tool(required_fields=["url"]) def execute_jaeles(): """Execute Jaeles for advanced vulnerability scanning with custom signatures.""" data = request.get_json() params = extract_jaeles_params(data) started_at = datetime.now() command = build_jaeles_command(params) execution_result = execute_command(command, timeout=params["timeout"] + 30) ended_at = datetime.now() return parse_jaeles_output(execution_result, params, command, started_at, ended_at) - Helper: Builds the jaeles CLI command based on input parameters
def build_jaeles_command(params: dict) -> list[str]: """Build the jaeles command from parameters.""" args = ["jaeles", "scan", "-u", params["url"]] # Add concurrency/threads parameter args.extend(["-c", str(params["threads"])]) # Add timeout parameter args.extend(["--timeout", str(params["timeout"])]) # Add signatures parameter if provided if params["signatures"]: args.extend(["-s", params["signatures"]]) # Add config parameter if provided if params["config"]: args.extend(["--config", params["config"]]) # Add level parameter if provided if params["level"]: args.extend(["--level", params["level"]]) # Add passive scanning option if params["passive"]: args.append("--passive") # Add output file if provided if params["output_file"]: args.extend(["-o", params["output_file"]]) # Add proxy if provided if params["proxy"]: args.extend(["--proxy", params["proxy"]]) # Add headers if provided if params["headers"]: args.extend(["-H", params["headers"]]) # Add verbose flag if params["verbose"]: args.append("-v") # Add debug flag if params["debug"]: args.append("--debug") # Add any additional arguments if params["additional_args"]: args.extend(params["additional_args"].split()) return args - Helper: Extracts and normalizes parameters for jaeles from request data
def extract_jaeles_params(data: dict) -> dict: """Extract and organize jaeles parameters from request data.""" url = data["url"] if not url.startswith(("http://", "https://")): url = "https://" + url return { "url": url, "signatures": data.get("signatures", ""), "config": data.get("config", ""), "threads": data.get("threads", 20), "timeout": data.get("timeout", 20), "level": data.get("level", ""), "passive": data.get("passive", False), "output_file": data.get("output_file", ""), "proxy": data.get("proxy", ""), "headers": data.get("headers", ""), "verbose": data.get("verbose", False), "debug": data.get("debug", False), "additional_args": data.get("additional_args", ""), } - Helper: Parses Jaeles stdout output into structured vulnerability findings
def parse_jaeles_output( execution_result: dict[str, Any], params: dict, command: list[str], started_at: datetime, ended_at: datetime, ) -> dict[str, Any]: """Parse jaeles execution results into structured findings.""" duration_ms = int((ended_at - started_at).total_seconds() * 1000) if not execution_result["success"]: return { "success": False, "tool": "jaeles", "params": params, "command": command, "started_at": started_at.isoformat(), "ended_at": ended_at.isoformat(), "duration_ms": duration_ms, "error": execution_result.get("error", "Command execution failed"), "findings": [], "stats": {"findings": 0, "dupes": 0, "payload_bytes": 0}, } # Parse successful output stdout = execution_result.get("stdout", "") findings = [] # Extract vulnerabilities from jaeles output for line in stdout.strip().split("\n"): line = line.strip() if not line: continue # Parse vulnerability findings vuln_info = _extract_vulnerability_from_line(line, params) if vuln_info: finding = { "type": "vulnerability", "target": vuln_info.get("target", params["url"]), "evidence": { "raw_output": line, "signature": vuln_info.get("signature"), "severity": vuln_info.get("severity", "medium"), }, "severity": vuln_info.get("severity", "medium"), "confidence": vuln_info.get("confidence", "medium"), "tags": ["jaeles", "vulnerability-scan"], "raw_ref": line, } findings.append(finding) payload_bytes = len(stdout.encode("utf-8")) return { "success": True, "tool": "jaeles", "params": params, "command": command, "started_at": started_at.isoformat(), "ended_at": ended_at.isoformat(), "duration_ms": duration_ms, "findings": findings, "stats": { "findings": len(findings), "dupes": 0, "payload_bytes": payload_bytes, }, } def _extract_vulnerability_from_line(line: str, params: dict) -> dict[str, Any] | None: """Extract vulnerability information from a single output line.""" # Pattern for jaeles vulnerability output patterns = [ r"\[([^\]]+)\]\s*\[([^\]]+)\]\s*(.+)", r"([A-Za-z]+)\s*:\s*(.+)", r"Found\s+([A-Za-z\s]+)\s+at\s+(.+)", ] for pattern in patterns: match = re.search(pattern, line, re.IGNORECASE) if match: groups = match.groups() if len(groups) >= 2: return { "signature": groups[0], "target": groups[1] if len(groups) > 1 else params.get("url"), "severity": "medium", "confidence": "medium", "raw_line": line, } return None