Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-75431_PowerJob_jwt_key_predictable — Demonstra uma vulnerabilidade crítica de previsibilidade da chave de assinatura JWT no PowerJob Server, permitindo a derivação offline da chave e a falsificação de tokens para assumir o controle de administrador e contornar a autenticação da OpenAPI. | Kitploit
Ferramentas/GitHubGitHub/unpredictable21/cve-2026-75431_powerjob_jwt_key_predictable
Análise de VulnerabilidadesExploraçãoSegurança WebTestes de PenetraçãoAutenticação
GitHubunpredictable21/cve-2026-75431_powerjob_jwt_key_predictable

CVE-2026-75431_PowerJob_jwt_key_predictable

Demonstra uma vulnerabilidade crítica de previsibilidade da chave de assinatura JWT no PowerJob Server, permitindo a derivação offline da chave e a falsificação de tokens para assumir o controle de administrador e contornar a autenticação da OpenAPI.

Ver Repositório
há 24 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Chave de Assinatura JWT do PowerJob Previsível (Chave Derivada da URL JDBC Padrão) → Falsificação de Token

1. Resumo

A chave de assinatura JWT (HS256) do servidor PowerJob é derivada pela decodificação BASE64 de uma constante codificada concatenada com o MD5 da URL JDBC padrão (DefaultSecretProvider / JwtServiceImpl). A URL JDBC é pública na implantação padrão (docker-compose / application-daily.properties), portanto um atacante pode derivar a chave totalmente offline e forjar um JWT válido para qualquer usuário (incluindo o administrador); o Token do App OpenAPI também pode ser forjado para contornar a autenticação OpenAPI.

2. Produto Afetado

  • Produto: Servidor PowerJob (console web 7700 + OpenAPI)
  • Versões afetadas: 5.1.2
  • Implantação padrão: application-daily.properties expõe em texto simples
jdbc:mysql://powerjob-mysql:3306/powerjob-daily?...

3. Localização da Vulnerabilidade

  • powerjob-server-auth/.../jwt/impl/DefaultSecretProvider.java:31-45: return md5(environment.getProperty("spring.datasource.core.jdbc-url"));
  • powerjob-server-auth/.../jwt/impl/JwtServiceImpl.java:44-102: constante BASE_SECURITY codificada; genSecretKey(secret) = Decoders.BASE64.decode(BASE_SECURITY.concat(secret)) → Keys.hmacShaKeyFor
  • A chave compartilha o repositório/banco de dados com os dados de negócio; a URL JDBC está em texto simples na configuração/docker-compose.

4. Causa Raiz

  • Uma chave previsível / derivável é usada em vez de uma aleatória e persistida: a chave depende apenas de uma constante pública + o MD5 da URL padrão pública.
  • A carga útil do JWT (username/encryptedToken) possui uma verificação secundária para contas PWJB (DigestUtils.rePassword(password, username)), mas:
    • com a senha padrão, esse valor é computável offline → comprometimento total do administrador;
    • o Token do App OpenAPI (claims appId/password/encryptType) pode ser forjado diretamente para contornar a autenticação (OpenApiSecurityServiceImpl:87-105);
    • outras contas de login de terceiros podem não ter verificação secundária.

5. Reprodução (verificada — completa de ponta a ponta)

Ambiente: servidor PowerJob local (127.0.0.1:7700, URL JDBC jdbc:mysql://127.0.0.1:3307/powerjob_daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true). O atacante deriva tudo offline apenas a partir de informações públicas:

root@kitploit:~
# ① Derivar encryptedToken (= rePassword(password, username)); computável com a senha padrão
rePassword("powerjob_admin", "ADMIN")
   = ADMIN_b82a450701f6a71723fb99931fe35e18_b      # byte a byte igual ao user_info.token_login_verify_info do banco ✅

# ② Derivar a chave de assinatura HS256 = BASE64(BASE_SECURITY + MD5(JDBC_URL))
secret = BASE_SECURITY + md5(jdbc_url)             # chave de 101 bytes

# ③ Forjar um JWT web de ADMIN (claims: username=PWJB_ADMIN, encryptedToken=resultado de ①, sub=PowerJob)

Resultado real (token forjado passa na autenticação):

root@kitploit:~
[*] /namespace/list sem token :
{"success":false,"data":null,"message":"PowerJobAuthException: UserNotLoggedIn","code":"-100"}

[*] /namespace/list JWT forjado :
{"success":true,"data":{"index":0,"pageSize":10,"totalPages":1,"totalItems":1,"data":[{"id":1,"code":"default_namespace","name":"default_namespace","dept":null,"tags":null,"extra":null,"status":1,"statusStr":"ENABLE","gmtCreate":"2026-08-07T13:07:32.000+00:00","gmtCreateStr":"2026-08-07 21:07:32","gmtModified":"2026-08-07T13:07:32.000+00:00","gmtModifiedStr":"2026-08-07 21:07:32","showName":"default_namespace(default_namespace)","token":"14e4ebff-9a79-4845-ac66-8b20c4dff2ee","componentUserRoleInfo":{"observer":[],"qa":[],"developer":[],"admin":[]},"creatorShowName":null,"modifierShowName":null}]},"message":null}

→ o token forjado autentica como administrador e retorna dados reais (a linha de base é rejeitada com UserNotLoggedIn).

Pontos-chave:

  • O encryptedToken derivado offline corresponde ao valor armazenado no banco byte a byte (ADMIN_b82a450701f6a71723fb99931fe35e18_b).
  • A chave é determinada inteiramente pela constante pública BASE_SECURITY + MD5 da URL JDBC padrão pública → derivável offline sem credenciais.
  • O encryptedToken PWJB é recomputável offline com a senha padrão (powerjob_admin, achado PJ-02) → comprometimento total do administrador.
  • Se o administrador alterar a senha, a falsificação de um token web é bloqueada pela incompatibilidade do encryptedToken, mas o caminho do Token do App OpenAPI (claims appId/password/encryptType, OpenApiSecurityServiceImpl:87-105) ainda pode ser forjado de forma independente para contornar a autenticação OpenAPI.

Mesmo que a senha padrão seja alterada, a vulnerabilidade persiste por outros vetores de ataque:

  • Um atacante que obtenha o encryptedToken de qualquer usuário válido por outros meios (por exemplo, injeção de SQL, exposição de backup do banco de dados, vazamento de logs ou divulgação de informações de outros endpoints) pode combinar esse token com a chave de assinatura previsível para forjar um JWT para esse usuário específico.
  • Isso contorna completamente o problema da incompatibilidade do encryptedToken, porque o token forjado agora contém um encryptedToken legítimo derivado do registro real do banco de dados.
  • Como resultado, o atacante não precisa conhecer a senha em texto simples do usuário, e o JWT forjado permanece válido mesmo após o usuário alterar sua senha (até o token expirar).

PoC: powerjob_jwt_key.py 192.168.49.128:7700

image
image

6. Impacto

  • Bypass de autenticação / falsificação de token de usuário arbitrário → superfícies de administração do console web / OpenAPI.

7. Correção Sugerida

  • Gere a chave aleatoriamente e persista-a (arquivo/ambiente), nunca a derive da URL JDBC ou de uma constante.
  • Use uma chave separada para Tokens do App OpenAPI vs. JWTs web.
  • Aplique a verificação secundária do encryptedToken para todas as contas.

8. CWE / CVSS

  • CWE: CWE-321 (Uso de Chave Criptográfica Codificada) / CWE-798
  • CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N = 9.1 Crítico (combinado com a senha padrão / OpenAPI)
Baixar ferramenta