skills/pt-nuclei-template-creation/SKILL.md
Creates Nuclei YAML templates for vulnerability detection across HTTP, DNS, TCP, SSL, and other protocols. Use when converting a confirmed vulnerability, misconfiguration, or exposure into a reusable automated check — for example, turning a manual finding into a detection rule, writing a CVE check, or codifying a technology fingerprint.
npx skillsauth add santosomar/ethical-hacking-agent-skills pt-nuclei-template-creationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Run generated templates only against targets explicitly in scope. Templates that send payloads (SSRF callbacks, command injection probes, authentication attempts) must respect the same rules of engagement as manual testing. Validate on an approved test host before scanning production.
nuclei -validate.http: with method + path for simple GET/POST checkshttp: with raw: for precise control (custom headers, malformed requests, multi-step auth)dns:, ssl:, tcp:, javascript: for non-HTTP targetsrequests: key — always http:matchers-condition: and combining status + body/header evidencetype: word for literal strings, type: regex only when patterns varytype: dsl for cross-field logic (e.g. status_code == 200 && contains(body, "x"))part: explicitly (body, header, all) — do not rely on defaults when precision mattersnegative: true matchers to exclude known false-positive pagesregex with group: for version numbers or tokenskval for response headersinternal: true if the value feeds a later request rather than report outputUse this as the starting structure. Remove unused blocks — do not leave empty keys.
id: vendor-product-issue-type
info:
name: Vendor Product — Issue Summary
author: your-handle
severity: info|low|medium|high|critical
description: |
One or two sentences describing what is detected and why it matters.
remediation: |
Specific fix action (patch version, config change, etc.).
reference:
- https://vendor.example/advisory
- https://nvd.nist.gov/vuln/detail/CVE-XXXX-YYYYY
classification:
cve-id: CVE-XXXX-YYYYY
cwe-id: CWE-NN
metadata:
verified: true
max-request: 1
vendor: vendor-name
product: product-name
tags: cve,cve2025,rce,vendor-name
http:
- method: GET
path:
- "{{BaseURL}}/path/to/check"
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
part: body
words:
- "unique-string-confirming-vuln"
condition: and
extractors:
- type: regex
part: body
group: 1
regex:
- 'version["\s:]+([0-9.]+)'
Use when you need exact wire-level control (multi-step, auth chains, non-standard formatting):
http:
- raw:
- |
POST /api/login HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{"user":"{{username}}","pass":"{{password}}"}
- |
GET /api/admin HTTP/1.1
Host: {{Hostname}}
Cookie: {{session}}
cookie-reuse: true
extractors:
- type: regex
name: session
part: header
internal: true
regex:
- 'Set-Cookie: (session=[a-f0-9]+)'
matchers:
- type: word
part: body_2
words:
- "admin_dashboard"
Suffix response parts with _N (1-indexed) to match against a specific request in a multi-request chain.
dns:
- name: "{{FQDN}}"
type: CNAME
matchers:
- type: word
words:
- "s3.amazonaws.com"
part: answer
tcp:
- address:
- "{{Host}}:{{Port}}"
inputs:
- data: "\r\n"
read-size: 2048
matchers:
- type: word
part: body
words:
- "OpenSSH"
ssl:
- address: "{{Host}}:{{Port}}"
matchers:
- type: dsl
dsl:
- 'contains(subject_cn, "internal.corp")'
- 'not_after < unix_time()' # expired cert
condition: or
headless:
- steps:
- action: navigate
args:
url: "{{BaseURL}}/login"
- action: waitload
matchers:
- type: word
part: body
words:
- "admin panel"
Use headless: only when JavaScript rendering is required; it is much slower than http:.
Use a variables: block to precompute values:
variables:
encoded: "{{base64('admin:admin')}}"
http:
- method: GET
path:
- "{{BaseURL}}/api/v1/secret"
headers:
Authorization: "Basic {{encoded}}"
Use payloads: with an attack type for fuzzing checks:
http:
- method: POST
path:
- "{{BaseURL}}/search"
body: "q={{payload}}"
payloads:
payload:
- "' OR 1=1--"
- "\" OR 1=1--"
attack: batteringram # one payload at a time; use clusterbomb for combos
matchers:
- type: word
words:
- "SQL syntax"
part: body
Attack types: batteringram (single list, same value per position), pitchfork (parallel lists), clusterbomb (cartesian product).
Use flow: to orchestrate multi-protocol or conditional request chains. Requests only run when the preceding gate returns true.
flow: http(1) && http(2)
http:
- method: GET
path:
- "{{BaseURL}}/wp-content/plugins/vuln-plugin/readme.txt"
matchers:
- type: word
words: ["Vuln Plugin"]
internal: true # gate check — suppresses output
- method: POST
path:
- "{{BaseURL}}/wp-admin/admin-ajax.php"
body: "action=exploit"
matchers:
- type: word
words: ["success"]
# Nuclei Template: {{id}}
## Template summary
- File: `{{id}}.yaml`
- Protocol: http | dns | tcp | ssl | headless
- Severity: info | low | medium | high | critical
- Request count: N
## Detection logic
- Trigger path/condition:
- Matcher signals:
1.
2.
- Extractors (if any):
## Validation results
- `nuclei -validate`: pass | fail (list errors)
- True-positive host tested: yes | no
- True-negative host tested: yes | no
- False-positive risk notes:
## Handoff to pt-scanning
- Template path for inclusion in scan runs:
- Recommended tags/filters: `-tags`
- Any prerequisites (auth creds, interactsh server, etc.):
Use the bundled script for combined schema + lint checking:
# Validate a single template (schema + lint)
bash scripts/validate.sh ./template.yaml
# Validate + dry-run against an approved host
bash scripts/validate.sh ./template.yaml -u https://approved-test-host
# Validate all templates in a directory
bash scripts/validate.sh ./templates/
Or run nuclei directly:
nuclei -t ./template.yaml -validate
nuclei -t ./template.yaml -u https://approved-test-host -debug
Load these files on demand when more depth is needed:
Upstream reference (authoritative):
github.com/projectdiscovery/nuclei/blob/dev/SYNTAX-REFERENCE.mdgithub.com/projectdiscovery/nuclei/blob/dev/nuclei-jsonschema.jsongithub.com/projectdiscovery/nuclei-templatesid is lowercase, hyphen-separated, and describes vendor + issue (no spaces, no generic names like test or vuln).info.severity is justified — critical/high only for confirmed RCE, auth bypass, or direct data exposure.metadata.max-request matches the actual number of requests the template sends.requests: key (deprecated) — uses http: instead.nuclei -validate with no warnings.description.development
Performs authorized web application and API penetration testing with focus on OWASP-style risks and business logic flaws. Use when assessing websites, web APIs, authentication flows, session handling, and input validation.
testing
Performs authorized security scanning using static, dynamic, and vulnerability-focused methods. Use when mapping exposed services, profiling application behavior, and identifying known weaknesses for validation.
testing
Creates penetration test deliverables for executive and technical audiences, including prioritized findings and remediation plans. Use when drafting, structuring, or finalizing pen test reports from collected evidence.
testing
Performs authorized post-exploitation activities to assess impact, lateral movement paths, credential exposure, and detection gaps after initial compromise. Use when a foothold has been validated and the test requires controlled impact expansion analysis.