--- title: "Security Penetration Testing — Agent Skill & Codex Plugin" description: "Use when the user asks to perform security audits, penetration testing, vulnerability scanning, OWASP Top 10 checks, or offensive security. Agent skill for Claude Code, Codex CLI, Gemini CLI, OpenClaw." --- # Security Penetration Testing
Hands-on offensive security testing skill for finding vulnerabilities before attackers do. This is NOT compliance checking (see senior-secops) or security policy writing (see senior-security) — this is about systematic vulnerability discovery through authorized testing. --- ## Table of Contents - [Overview](#overview) - [OWASP Top 10 Systematic Audit](#owasp-top-10-systematic-audit) - [Static Analysis](#static-analysis) - [Dependency Vulnerability Scanning](#dependency-vulnerability-scanning) - [Secret Scanning](#secret-scanning) - [API Security Testing](#api-security-testing) - [Web Vulnerability Testing](#web-vulnerability-testing) - [Infrastructure Security](#infrastructure-security) - [Pen Test Report Generation](#pen-test-report-generation) - [Responsible Disclosure Workflow](#responsible-disclosure-workflow) - [Workflows](#workflows) - [Anti-Patterns](#anti-patterns) - [Cross-References](#cross-references) --- ## Overview ### What This Skill Does This skill provides the methodology, checklists, and automation for **offensive security testing** — actively probing systems to discover exploitable vulnerabilities. It covers web applications, APIs, infrastructure, and supply chain security. ### Distinction from Other Security Skills | Skill | Focus | Approach | |-------|-------|----------| | **security-pen-testing** (this) | Finding vulnerabilities | Offensive — simulate attacker techniques | | senior-secops | Security operations | Defensive — monitoring, incident response, SIEM | | senior-security | Security policy | Governance — policies, frameworks, risk registers | | skill-security-auditor | CI/CD gates | Automated — pre-merge security checks | ### Prerequisites All testing described here assumes **written authorization** from the system owner. Unauthorized testing is illegal under the CFAA and equivalent laws worldwide. Always obtain a signed scope-of-work or rules-of-engagement document before starting. --- ## OWASP Top 10 Systematic Audit Use the vulnerability scanner tool for automated checklist generation: ```bash # Generate OWASP checklist for a web application python scripts/vulnerability_scanner.py --target web --scope full # Quick API-focused scan python scripts/vulnerability_scanner.py --target api --scope quick --json ``` ### A01:2021 — Broken Access Control **Test Procedures:** 1. Attempt horizontal privilege escalation: access another user's resources by changing IDs 2. Test vertical escalation: access admin endpoints with regular user tokens 3. Verify CORS configuration — check `Access-Control-Allow-Origin` for wildcards 4. Test forced browsing to admin pages (`/admin`, `/api/admin`, `/debug`) 5. Modify JWT claims (`role`, `is_admin`) and replay tokens **What to Look For:** - Missing authorization checks on API endpoints - Predictable resource IDs (sequential integers vs. UUIDs) - Client-side only access controls (hidden UI elements without server checks) - CORS misconfigurations allowing arbitrary origins ### A02:2021 — Cryptographic Failures **Test Procedures:** 1. Check TLS version — reject anything below TLS 1.2 2. Verify password hashing: bcrypt/scrypt/argon2 with adequate cost factor 3. Look for sensitive data in URLs (tokens in query params get logged) 4. Check for hardcoded encryption keys in source code 5. Test for weak random number generation (Math.random() for tokens) **What to Look For:** - MD5/SHA1 used for password hashing - Secrets in environment variables without encryption at rest - Missing `Strict-Transport-Security` header - Self-signed certificates in production ### A03:2021 — Injection **Test Procedures:** 1. SQL injection: test all input fields with `' OR 1=1--` and time-based payloads 2. NoSQL injection: test with `{"$gt": ""}` and `{"$ne": null}` in JSON bodies 3. Command injection: test inputs with `; whoami` and backtick substitution 4. LDAP injection: test with `*)(uid=*))(|(uid=*` 5. Template injection: test with `{{7*7}}` and `${7*7}` **What to Look For:** - String concatenation in SQL queries - User input passed to `eval()`, `exec()`, `os.system()` - Unparameterized ORM queries - Template engines rendering user input without sandboxing ### A04:2021 — Insecure Design **Test Procedures:** 1. Review business logic flows for abuse scenarios (e.g., negative quantities in carts) 2. Check rate limiting on sensitive operations (login, password reset, OTP) 3. Test multi-step flows for state manipulation (skip payment step) 4. Verify security questions aren't guessable **What to Look For:** - Missing rate limits on authentication endpoints - Business logic that trusts client-side calculations - Lack of account lockout after failed attempts - Missing CAPTCHA on public-facing forms ### A05:2021 — Security Misconfiguration **Test Procedures:** 1. Check for default credentials on admin panels 2. Verify unnecessary HTTP methods are disabled (TRACE, DELETE on public endpoints) 3. Check error handling — stack traces should never leak to users 4. Review HTTP security headers (CSP, X-Frame-Options, X-Content-Type-Options) 5. Check directory listing is disabled **What to Look For:** - Debug mode enabled in production - Default admin:admin credentials - Verbose error messages with stack traces - Missing security headers ### A06:2021 — Vulnerable and Outdated Components **Test Procedures:** 1. Run dependency audit against known CVE databases 2. Check for end-of-life frameworks and libraries 3. Verify transitive dependency versions 4. Check for known vulnerable versions (e.g., Log4j 2.0-2.14.1) ```bash # Audit a package manifest python scripts/dependency_auditor.py --file package.json --severity high python scripts/dependency_auditor.py --file requirements.txt --json ``` ### A07:2021 — Identification and Authentication Failures **Test Procedures:** 1. Test brute force protection on login endpoints 2. Check password policy enforcement (minimum length, complexity) 3. Verify session invalidation on logout and password change 4. Test "remember me" token security (HttpOnly, Secure, SameSite flags) 5. Check multi-factor authentication bypass paths **What to Look For:** - Sessions that persist after logout - Missing `HttpOnly` and `Secure` flags on session cookies - Password reset tokens that don't expire - Username enumeration via different error messages ### A08:2021 — Software and Data Integrity Failures **Test Procedures:** 1. Check for unsigned updates or deployment artifacts 2. Verify CI/CD pipeline integrity (signed commits, protected branches) 3. Test deserialization endpoints with crafted payloads 4. Check for SRI (Subresource Integrity) on CDN-loaded scripts **What to Look For:** - Unsafe deserialization of user input (pickle, Java serialization) - Missing integrity checks on downloaded artifacts - CI/CD pipelines running untrusted code - CDN scripts without SRI hashes ### A09:2021 — Security Logging and Monitoring Failures **Test Procedures:** 1. Verify authentication events are logged (success and failure) 2. Check that logs don't contain sensitive data (passwords, tokens, PII) 3. Test alerting thresholds (do 50 failed logins trigger an alert?) 4. Verify log integrity — can an attacker tamper with logs? **What to Look For:** - Missing audit trail for admin actions - Passwords or tokens appearing in logs - No alerting on suspicious patterns - Logs stored without integrity protection ### A10:2021 — Server-Side Request Forgery (SSRF) **Test Procedures:** 1. Test URL input fields with internal addresses (`http://169.254.169.254/` for cloud metadata) 2. Check for open redirect chains that reach internal services 3. Test with DNS rebinding payloads 4. Verify allowlist validation on outbound requests **What to Look For:** - User-controlled URLs passed to `fetch()`, `requests.get()`, `curl` - Missing allowlist on outbound HTTP requests - Ability to reach cloud metadata endpoints (AWS, GCP, Azure) - PDF generators or screenshot services that fetch arbitrary URLs --- ## Static Analysis ### CodeQL Custom Rules Write custom CodeQL queries for project-specific vulnerability patterns: ```ql /** * Detect SQL injection via string concatenation */ import python import semmle.python.dataflow.new.DataFlow from Call call, StringFormatting fmt where call.getFunc().getName() = "execute" and fmt = call.getArg(0) and exists(DataFlow::Node source | source.asExpr() instanceof Name and DataFlow::localFlow(source, DataFlow::exprNode(fmt.getAnOperand())) ) select call, "Potential SQL injection: user input flows into execute()" ``` ### Semgrep Custom Rules Create project-specific Semgrep rules: ```yaml rules: - id: hardcoded-jwt-secret pattern: | jwt.encode($PAYLOAD, "...", ...) message: "JWT signed with hardcoded secret" severity: ERROR languages: [python] - id: unsafe-yaml-load pattern: yaml.load($DATA) fix: yaml.safe_load($DATA) message: "Use yaml.safe_load() to prevent arbitrary code execution" severity: WARNING languages: [python] - id: express-no-helmet pattern: | const app = express(); ... app.listen(...) pattern-not: | const app = express(); ... app.use(helmet(...)); ... app.listen(...) message: "Express app missing helmet middleware for security headers" severity: WARNING languages: [javascript, typescript] ``` ### ESLint Security Plugins Recommended configuration: ```json { "plugins": ["security", "no-unsanitized"], "extends": ["plugin:security/recommended"], "rules": { "security/detect-object-injection": "error", "security/detect-non-literal-regexp": "warn", "security/detect-unsafe-regex": "error", "security/detect-buffer-noassert": "error", "security/detect-eval-with-expression": "error", "no-unsanitized/method": "error", "no-unsanitized/property": "error" } } ``` --- ## Dependency Vulnerability Scanning ### Ecosystem-Specific Commands ```bash # Node.js npm audit --json | jq '.vulnerabilities | to_entries[] | select(.value.severity == "critical")' # Python pip audit --format json --desc safety check --json # Go govulncheck ./... # Ruby bundle audit check --update ``` ### CVE Triage Workflow 1. **Collect**: Run ecosystem audit tools, aggregate findings 2. **Deduplicate**: Group by CVE ID across direct and transitive deps 3. **Score**: Use CVSS base score + environmental adjustments 4. **Prioritize**: Critical + exploitable + reachable = fix immediately 5. **Remediate**: Upgrade, patch, or mitigate with compensating controls 6. **Verify**: Rerun audit to confirm fix, update lock files ```bash # Use the dependency auditor for automated triage python scripts/dependency_auditor.py --file package.json --severity critical --json ``` ### Known Vulnerable Patterns | Package | Vulnerable Versions | CVE | Impact | |---------|-------------------|-----|--------| | log4j-core | 2.0 - 2.14.1 | CVE-2021-44228 | RCE via JNDI injection | | lodash | < 4.17.21 | CVE-2021-23337 | Prototype pollution | | axios | < 1.6.0 | CVE-2023-45857 | CSRF token exposure | | pillow | < 9.3.0 | CVE-2022-45198 | DoS via crafted image | | express | < 4.19.2 | CVE-2024-29041 | Open redirect | --- ## Secret Scanning ### TruffleHog Patterns ```bash # Scan git history for secrets trufflehog git file://. --only-verified --json # Scan filesystem (no git history) trufflehog filesystem . --json ``` ### Gitleaks Configuration ```toml # .gitleaks.toml title = "Custom Gitleaks Config" [[rules]] id = "aws-access-key" description = "AWS Access Key ID" regex = '''AKIA[0-9A-Z]{16}''' tags = ["aws", "credentials"] [[rules]] id = "generic-api-key" description = "Generic API Key" regex = '''(?i)(api[_-]?key|apikey)\s*[:=]\s*['\"][a-zA-Z0-9]{20,}['\"]''' tags = ["api", "key"] [[rules]] id = "private-key" description = "Private Key Header" regex = '''-----BEGIN (RSA|EC|DSA|OPENSSH) PRIVATE KEY-----''' tags = ["private-key"] [allowlist] paths = ['''\.test\.''', '''_test\.go''', '''mock''', '''fixture'''] ``` ### Pre-commit Hook Integration ```yaml # .pre-commit-config.yaml repos: - repo: https://github.com/gitleaks/gitleaks rev: v8.18.0 hooks: - id: gitleaks - repo: https://github.com/trufflesecurity/trufflehog rev: v3.63.0 hooks: - id: trufflehog args: ["git", "file://.", "--since-commit", "HEAD", "--only-verified"] ``` ### CI Integration (GitHub Actions) ```yaml name: Secret Scan on: [push, pull_request] jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: trufflesecurity/trufflehog@main with: extra_args: --only-verified ``` --- ## API Security Testing ### Authentication Bypass **JWT Manipulation:** 1. Decode token at jwt.io — inspect claims without verification 2. Change `alg` to `none` and remove signature: `eyJ...payload.` 3. Change `alg` from RS256 to HS256 and sign with the public key 4. Modify claims (`role: "admin"`, `exp: 9999999999`) and re-sign with weak secrets 5. Test key confusion: HMAC signed with RSA public key bytes **Session Fixation:** 1. Obtain a session token before authentication 2. Authenticate — check if the session ID changes 3. If the same session ID persists, the app is vulnerable to session fixation ### Authorization Flaws **IDOR (Insecure Direct Object Reference):** ``` GET /api/users/123/profile → 200 (your profile) GET /api/users/124/profile → 200 (someone else's profile — IDOR!) GET /api/users/124/profile → 403 (properly protected) ``` Test pattern: Change numeric IDs, UUIDs, slugs in every endpoint. Use Burp Intruder or a simple script to iterate. **BOLA (Broken Object Level Authorization):** Same as IDOR but specifically in REST APIs. Test every CRUD operation: - Can user A read user B's resource? - Can user A update user B's resource? - Can user A delete user B's resource? **BFLA (Broken Function Level Authorization):** ``` # Regular user tries admin endpoints POST /api/admin/users → Should be 403 DELETE /api/admin/users/123 → Should be 403 PUT /api/settings/global → Should be 403 ``` ### Rate Limiting Validation Test rate limits on critical endpoints: ```bash # Rapid-fire login attempts for i in $(seq 1 100); do curl -s -o /dev/null -w "%{http_code}" \ -X POST https://target.com/api/login \ -d '{"email":"test@test.com","password":"wrong"}'; done # Expect: 429 after threshold (typically 5-10 attempts) ``` ### Mass Assignment Detection ```bash # Try adding admin fields to a regular update request PUT /api/users/profile { "name": "Normal User", "email": "user@test.com", "role": "admin", # mass assignment attempt "is_verified": true, # mass assignment attempt "subscription": "enterprise" # mass assignment attempt } ``` ### GraphQL-Specific Testing **Introspection Query:** ```graphql { __schema { types { name fields { name type { name } } } } } ``` Introspection should be **disabled in production**. **Query Depth Attack:** ```graphql { user(id: 1) { friends { friends { friends { friends { # Keep nesting until server crashes name } } } } } } ``` **Batching Attack:** ```json [ {"query": "mutation { login(user:\"admin\", pass:\"password1\") { token } }"}, {"query": "mutation { login(user:\"admin\", pass:\"password2\") { token } }"}, {"query": "mutation { login(user:\"admin\", pass:\"password3\") { token } }"} ] ``` Batch mutations can bypass rate limiting if counted as a single request. --- ## Web Vulnerability Testing ### XSS (Cross-Site Scripting) **Reflected XSS Test Payloads** (non-destructive): ``` ">