Pentest Script Generator
Generate professional Python pentest scripts from Strix vuln reports or raw vulnerability descriptions.
Language rule: All skill instructions and generated script code use English.
Final summary presented to the user must be in Vietnamese.
🔧 Runtime Scripts
| Script | Purpose | Usage |
|---|
scripts/generate.py | Generate scripts from vuln-XXXX.md | python scripts/generate.py vuln-0001.md |
📋 Reference Files
| File | Purpose |
|---|
references/pentest_template.py | Full pentest script template |
references/verify_template.py | Verify script template |
references/vuln_types.md | Vulnerability type → test pattern mapping |
1. Strix vuln-XXXX.md Schema
Parse these fields from the report:
| Field | Required | Notes |
|---|
**ID:** | ✅ | vuln-XXXX → script filename |
**Severity:** | ✅ | CRITICAL/HIGH/MEDIUM/LOW |
**Target:** | ✅ | Base URL → DEFAULT_BASE_URL |
**Endpoint:** | Optional | Extract from Technical Analysis if missing |
**Method:** | Optional | Extract from PoC if missing |
**CWE:** | Optional | Add to script header |
**CVSS:** | ✅ | Add to script header |
PoC poc_script_code | ✅ | Always present — primary source for test logic |
2. Vulnerability Type Detection
Authorization / Access Control
| Type | Trigger Keywords | TC Pattern |
|---|
| BFLA | admin endpoint, non-admin, BFLA | Low-priv token → admin route |
| IDOR/BOLA | cross-user, user_id param, order id | Swap resource ID |
| Unauth API | unauthenticated, no auth required | Request without token |
| Supabase RLS | anon apikey, PostgREST, RLS bypass | REST with anon key |
Business Logic
| Type | Trigger Keywords | TC Pattern |
|---|
| Price Tampering | price tampering, client-side price | POST price=1 |
| Payment Bypass | payment bypass, free license | Skip payment step |
| Negative Total | negative total, wallet credit | Send negative amount |
| Rate Limit Bypass | X-Forwarded-For, IP spoofing | Rotate header IPs |
Injection / XSS
| Type | Trigger Keywords | TC Pattern |
|---|
| Stored XSS | stored xss, innerHTML | Upload + fetch + verify |
| DOM XSS | DOM-based, url param | Playwright verify |
| Reflected XSS | reflected xss, POST body | Param with payload |
| SQLi | SQL injection, remember_token | SQLi payload in cookie/param |
SSRF
| Type | Trigger Keywords | TC Pattern |
|---|
| Blind SSRF | blind SSRF, OAST, webhook | OAST domain callback |
| SSRF IMDS | cloud metadata, 169.254 | http://169.254.169.254/ |
| SSRF Internal | internal network | 127.0.0.1 variants |
Account Takeover
| Type | Trigger Keywords | TC Pattern |
|---|
| Password Reset Leak | plaintext password in response | POST forgot → check field |
| Token Not Revoked | token valid after logout | Logout → replay old token |
| Session Fixation | PHPSESSID not rotated | Pre/post login session compare |
| OTP Disclosed | OTP in response | POST forgot → check OTP field |
Information Disclosure
| Type | Trigger Keywords | TC Pattern |
|---|
| Source Map | sourcemap, sourcesContent | GET .js.map |
| Laravel Debug | Laravel debug, Ignition | GET with Accept: text/html |
| Vite Dev Server | Vite, /@fs | GET /@vite/client |
| Backup Archive | .zip, .sql dump | GET /backup.zip |
CORS / Session
| Type | Trigger Keywords | TC Pattern |
|---|
| CORS Arbitrary Origin | arbitrary origin, CORS | Origin: evil.com → check ACAO |
| Cookie Missing Secure | missing Secure flag | HTTP request → check Set-Cookie |
3. Auth Detection
| PoC Signal | Auth Type | Script Pattern |
|---|
Bearer eyJ... | JWT | POST /login → access_token |
apikey= or x-api-key | API Key | From config/env |
Supabase anon key | Supabase | From JS bundle |
PHPSESSID cookie | PHP session | Login form → cookie |
recaptchaToken: "" | reCAPTCHA bypass | Empty string |
| No token needed | Unauthenticated | No header |
4. Test Case Structure
Every pentest script must follow this TC structure:
TC-01: Setup / Get auth token (if needed)
TC-02: Baseline — confirm endpoint works normally
TC-03: Core exploit attempt
TC-04: (Optional) Variation / escalation
TC-05: Control — confirm protected endpoint still enforces
TC-NN: Cleanup — delete/cancel created test data
Verdict Logic
| HTTP Response | Verdict |
|---|
| Expected protected (401/403) → got 200 with data | VULNERABLE |
| Got 401/403 as expected | SAFE |
| Network/parsing error | ERROR |
| Test skipped (dry-run) | SKIPPED |
5. Evidence Saving
Every script must save evidence when vulnerabilities are found:
def _save_evidence(data: list[dict], vuln_id: str, label: str, output_dir: str = "."):
from pathlib import Path
import csv
ev_dir = Path(output_dir) / "evidence"
ev_dir.mkdir(parents=True, exist_ok=True)
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
# JSON
json_path = ev_dir / f"{vuln_id}_{label}_{ts}.json"
with open(json_path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False, default=str)
# CSV (if list of dicts)
if data and isinstance(data[0], dict):
csv_path = ev_dir / f"{vuln_id}_{label}_{ts}.csv"
with open(csv_path, "w", newline="", encoding="utf-8") as f:
w = csv.DictWriter(f, fieldnames=data[0].keys())
w.writeheader(); w.writerows(data)
print(f" 💾 Evidence: {json_path}")
6. File Naming Convention
| Vuln Type | Prefix | Output Files |
|---|
| BFLA | bfla | pentest_bfla_vuln0001.py |
| IDOR | idor | pentest_idor_vuln0001.py |
| Unauth API | unauth | pentest_unauth_vuln0001.py |
| Stored XSS | xss_stored | pentest_xss_stored_vuln0001.py |
| DOM XSS | xss_dom | |
| Reflected XSS | xss_reflected | |
| SSRF | ssrf | |
| Business Logic | bizlogic | |
| Account Takeover | ato | |
| CORS | cors | |
| SQL Injection | sqli | |
| Info Disclosure | infodisclosure | |
| Rate Limit | ratelimit | |
| Session/Cookie | session | |
| Supabase | supabase | |
| Infrastructure | infra | |
Save to: vulnerabilities/ subfolder of the project.
7. Verify Script Rules
verify_vulnXXXX.py must be:
- Minimal: 1–3 HTTP requests max
- Fast: Complete in < 10 seconds
- Exit codes:
0 = SAFE, 1 = VULNERABLE, 2 = ERROR
- No dependencies beyond
requests
8. Workflow
1. READ → Parse vuln-XXXX.md (or description/HTTP request)
2. DETECT → Identify vuln type from keywords
3. AUTH → Identify auth mechanism from PoC
4. WRITE → Generate pentest_TYPE_vulnXXXX.py
- Header with metadata
- Verdict/TestResult classes
- TC-01..TC-N methods
- _save_evidence() helper
- _summary() and _export() helpers
- main() with argparse (--base-url, --dry-run, --output-dir)
5. WRITE → Generate verify_vulnXXXX.py (minimal, exit 0/1/2)
6. REPORT → Present final summary to user IN VIETNAMESE
9. Output Summary (always in Vietnamese)
After generating both files, present to user in Vietnamese:
✅ Đã tạo xong cho vuln-XXXX (<tiêu đề>):
📄 vulnerabilities/vuln-XXXX.md (Severity: X, CVSS: Y)
🐍 vulnerabilities/pentest_TYPE_vulnXXXX.py (N test cases)
⚡ vulnerabilities/verify_vulnXXXX.py (quick verify, exit 0/1/2)
▶ Cách chạy:
python vulnerabilities/pentest_TYPE_vulnXXXX.py --base-url https://target.com
python vulnerabilities/verify_vulnXXXX.py --base-url https://target.com
📋 Tóm tắt:
- Loại lỗ hổng : <TYPE>
- Auth mechanism: <auth type>
- Số test cases : N
- Cleanup : ✅ included
Anti-Patterns
| ❌ Don't | ✅ Do |
|---|
| Hardcode credentials in script | Use argparse + env vars |
| Skip cleanup TC | Always add cleanup as last TC |
| Claim vuln without HTTP evidence | Log status_code + response preview |
Use requests.get without timeout | Always timeout=15 |
| Skip dry-run mode | Always support --dry-run flag |
| Generate script without verify script | Always generate both |