mcpbeat Sign in

Hunt JWT Crypto Skill for Claude

Hunt JWT cryptographic failures — alg:none signature-stripping and RS256→HS256 key-confusion that let an attacker forge a token for any identity (e.g. an admin) without knowing a secret. Use when the app authenticates with a JSON Web Token (an `eyJ...` Bearer token in the Authorization header, a cookie, or a login response). This skill OWNS JWT signature/crypto forgery (alg:none, key confusion, kid/jku header injection); hunt-ato covers JWT as one ATO path, hunt-auth-bypass covers SSO/SAML token trust, hunt-api-misconfig covers non-crypto JWT handling. Critical when a forged token grants access to another user's data or an admin-only endpoint.

2k tokens
context cost
the whole folder, loaded on every use
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
3280
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/elementalsouls/Claude-BugHunter --skill hunt-jwt-crypto

The instruction itself

7 sections, as written by the author

HUNT-JWT-CRYPTO — Forgeable JSON Web Tokens (A04 Cryptographic Failures)

What actually pays

A JWT is header.payload.signature, each base64url. The signature is the only

thing stopping you from editing the payload (your identity/role) and replaying

it. It pays High/Critical when the verifier can be tricked into accepting a

token you forged — so you become another user or an admin without their secret.

Two classic, generic verifier flaws:

  • alg:none — the verifier trusts the token's own alg header. Set

alg:"none", drop the signature, edit the payload (e.g. role:"admin",

another user's id/email). A broken verifier skips signature checking.

  • RS256 → HS256 key confusion — the token is signed RS256 (asymmetric). The

RSA public key is, by definition, public. If the verifier lets you choose

HS256, it will use that public key as the HMAC *secret* — which you also know.

Sign an edited payload with HS256 using the public key and it validates.

Recon — is this app JWT-based?

Login/token responses containing  "token":"eyJ..."   or  Set-Cookie: token=eyJ...
Authorization: Bearer eyJ...    on authenticated requests
A JWKS / public-key endpoint:   /.well-known/jwks.json, /jwks, public-key in the JS bundle

Decode the header (base64url the first segment). "alg":"RS256" → try key

confusion. Any alg → always try alg:none first; it's free.

Forging the token (never hand-encode base64 — use a JWT tool)

Use a purpose-built tool so encoding/signing is correct: jwt_tool

(jwt_tool <token> -T to tamper interactively, -X a for alg:none, `-X k -pk

public.pem` for key confusion), Burp's JWT Editor extension, or a few lines

of PyJWT. Each forge below is the concept plus the claim to edit.

alg:none — become admin / another user

header:    {"alg":"none","typ":"JWT"}
payload:   {"data":{"id":1,"email":"[email protected]","role":"admin"}}
signature: (empty — keep the trailing dot:  header.payload. )

Some verifiers reject lowercase none but accept None/NONE/nOnE — try case variants.

RS256 → HS256 key confusion — once you have the RSA public key

1. Obtain the server's RSA public key as PEM. Sources: /jwks.json or
   /.well-known/jwks.json (convert the JWK to PEM), a public-key file in the JS
   bundle, or recover it from two captured tokens (e.g. jwt_tool / rsa_sign2n).
2. Re-sign an EDITED payload with HS256, using that PEM as the HMAC secret:
      jwt_tool <token> -X k -pk public.pem
   payload edit:  {"sub":"administrator"}   (or role:"admin" / another user's id)

kid header injection — verifier loads the HMAC key from a FILE named by kid

header:  {"alg":"HS256","kid":"../../../../../../../dev/null"}
secret:  ""     (contents of /dev/null = empty string → sign HS256 with an empty secret)
payload: {"sub":"administrator"}

Traverse out of the keys directory first. kid can also carry SQLi / command

injection / SSRF if the key lookup hits a DB / shell / URL — same idea: kid is

attacker-controlled and reaches a dangerous sink.

jku / x5u header injection (RS256) — verifier fetches the public key from a URL in the token

1. Host a JWKS containing a public key you control, on a server the verifier can reach.
2. Set the token's `jku` (or `x5u`) header to that URL and sign the edited payload
   with YOUR matching private key.
3. If the verifier allowlists jku hosts, chain an open-redirect or SSRF-reachable
   path on the target's OWN domain so the fetch resolves to your JWKS.

Match the payload shape to a REAL token from the app (decode one first) — keep

its claim names, only change identity/role. A payload the app can't parse fails

for the wrong reason and wastes the attempt.

Drive to the ADMIN objective — do not stop at a working forge

A forge that loads YOUR own /my-account is NOT the goal — it just proves the

forge mechanism works. The objective is almost always admin (reach an

admin-only page and perform an admin action, e.g. delete a user). Once any forge

is accepted, IMMEDIATELY escalate — change identity to admin AND aim at the admin

endpoint. Do not keep re-forging /my-account or re-logging-in; that is drift.

Fixed escalation sequence (run it in order, do not loop on earlier steps):

  • Forge admin identity and hit the admin page (try these claim names — match a

decoded real token: sub, role, isAdmin, username), e.g. an HS256 token

with kid pointed at /dev/null and an empty secret, payload {"sub":"administrator"},

sent to GET /admin.

  • When /admin returns 200 (you'll see admin controls / a delete link), perform

the admin action with the SAME forged token — a typical one is deleting a

target user account, e.g. GET /admin/delete?username=<victimuser> (some apps

use POST /admin/delete — read the admin page for the exact form/verb).

A 401 on /admin means the forge/claim is wrong — change ONE thing (the kid

depth, the claim name/value, or alg) and retry /admin. Never retreat to a bare

unauthenticated GET /admin (no token) — that always 401s and wastes effort.

Proof of impact

Point the forged token at a protected/admin endpoint and prove you read data you

should not: an account/user listing (multiple users' emails), another user's

object, or a completed admin action (the deleted-user confirmation). Reading the

admin user list or performing the admin action with a forged token IS the exploit.

A 200 that returns only your own data, or a 401, is not proof.

Validation discipline

  • Decode and confirm the token you sent actually carries the edited claims.
  • The win is cross-identity data access, not merely a 200. Show the foreign

user data (e.g. other users' emails) in the response.

  • alg:none rejected (401) just means that flaw is patched — try key confusion

before concluding the app is safe.

Other skills for the same job

different authors, same section of the catalogue
Invoice Organizer
by frostant
×5

Automatically organizes invoices and receipts for tax preparation by reading messy files, extracting key information, renaming them consistently, and sorting them into logical folders. Turns hours of manual bookkeeping into minutes of automated organization.

3k tokens
Backtest Expert
by BaggaT236
×3

Expert guidance for systematic backtesting of trading strategies. Use when developing, testing, stress-testing, or validating quantitative trading strategies. Covers "beating ideas to death" methodology, parameter robustness testing, slippage modeling, bias prevention, and interpreting backtest results. Applicable when user asks about backtesting, strategy validation, robustness testing, avoiding overfitting, or systematic trading development.

15k tokens scripts
Analyzing Financial Statements
by anthropics
vendor ×2

This skill calculates key financial ratios and metrics from financial statement data for investment analysis

8k tokens scripts
Creating Financial Models
by anthropics
vendor ×2

This skill provides an advanced financial modeling suite with DCF analysis, sensitivity testing, Monte Carlo simulations, and scenario planning for investment decisions

8k tokens scripts
Earnings Calendar
by nicepkg
×2

This skill retrieves upcoming earnings announcements for US stocks using the Financial Modeling Prep (FMP) API. Use this when the user requests earnings calendar data, wants to know which companies are reporting earnings in the upcoming week, or needs a weekly earnings review. The skill focuses on mid-cap and above companies (over $2B market cap) that have significant market impact, organizing the data by date and timing in a clean markdown table format. Supports multiple environments (CLI, Desktop, Web) with flexible API key management.

17k tokens scripts
Agentic Wallet
by coinbase
vendor ×2

Crypto wallet operations via the awal CLI — sign in, check balances, send USDC/ETH/POL/SOL, trade tokens, fund the wallet, and use the x402 payment protocol to discover paid services, pay for API calls, monetize an API, or query onchain data. Use whenever the user mentions signing in, login, authentication, wallet status, balance, address, sending money, paying someone, transferring tokens, ENS names, swapping/trading/converting tokens, funding/topping up/onramp, USDC, ETH, POL, SOL, the x402 bazaar, paid APIs, monetizing an endpoint, or querying onchain data on Base.

14k tokens
Alpha Vantage
by christophacham
×2

Access real-time and historical stock market data, forex rates, cryptocurrency prices, commodities, economic indicators, and 50+ technical indicators via the Alpha Vantage API. Use when fetching stock prices (OHLCV), company fundamentals (income statement, balance sheet, cash flow), earnings, options data, market news/sentiment, insider transactions, GDP, CPI, treasury yields, gold/silver/oil prices, Bitcoin/crypto prices, forex exchange rates, or calculating technical indicators (SMA, EMA, MACD, RSI, Bollinger Bands). Requires a free API key from alphavantage.co.

13k tokens
Braintree Automation
by christophacham
×2

Braintree Automation: manage payment processing via Stripe-compatible tools for customers, subscriptions, payment methods, and transactions

2k tokens needs MCP

How to use it

Copy the folder

Take elementalsouls/hunt-jwt-crypto from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.