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-43512-poc — PoC de Exploração para CVE-2026-43512 (Desvio de Autenticação Digest do Apache Tomcat) | Kitploit
Ferramentas/GitHubGitHub/covepseng/cve-2026-43512-poc
Análise de VulnerabilidadesExploraçãoSegurança WebTestes de PenetraçãoAutenticaçãoPapers e PesquisaAprendizado e Educação
GitHubcovepseng/cve-2026-43512-poc

cve-2026-43512-poc

PoC de Exploração para CVE-2026-43512 (Desvio de Autenticação Digest do Apache Tomcat)

Ver Repositório
115há 2 mesesAinda 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

CVE-2026-43512 — Bypass de Autenticação DIGEST do Apache Tomcat

Resultado da análise de explorabilidade: a causa raiz está confirmada. A exploração de ponta a ponta não é reproduzível contra uma implantação padrão do UserDatabaseRealm. Veja Análise para detalhes.


Índice

  • Visão Geral
  • Versões Afetadas
  • Causa Raiz
  • Análise
  • Estrutura do Repositório
  • Requisitos
  • Uso
  • Saída Esperada
  • Referências
  • Aviso Legal

Visão Geral

CVE-2026-43512 é uma vulnerabilidade no mecanismo de autenticação HTTP DIGEST do Apache Tomcat. O método RealmBase.getDigest() não valida o valor de retorno de getPassword(username) antes de construir a entrada do hash A1. Quando um nome de usuário não existe no Realm configurado, retorna , que o operador de concatenação de strings do Java converte silenciosamente para o literal de quatro caracteres .

getPassword()
null
"null"

O servidor, portanto, calcula:

root@kitploit:~
A1 = MD5("<username>:<realm>:null")

Um cliente que envia uma resposta DIGEST calculada com a string literal "null" como senha produz um hash idêntico. De acordo com o aviso, isso constitui um bypass de autenticação.

Este repositório contém um ambiente mínimo reproduzível e uma prova de conceito baseada em Go para verificar essa afirmação contra uma instância real do Tomcat.


Versões Afetadas

Intervalo AfetadoCorrigido em
7.0.0 – 7.0.1097.0.110
8.5.0 – 8.5.1008.5.101
9.0.0.M1 – 9.0.1179.0.118
10.1.0.M1 – 10.1.5410.1.55
11.0.0.M1 – 11.0.2111.0.22

Causa Raiz

O caminho de código vulnerável em RealmBase.java (todos os branches afetados):

root@kitploit:~
// RealmBase.java — vulnerable
protected String getDigest(String username, String realmName, String algorithm) {
    if (hasMessageDigest(algorithm)) {
        return getPassword(username);  // returns null for unknown users
    }

    // null is concatenated as the literal "null" by Java
    String a1 = username + ":" + realmName + ":" + getPassword(username);
    return HexUtils.toHexString(
        ConcurrentMessageDigest.digest(algorithm, a1.getBytes(...))
    );
}

A correção (commit 6565a6c adiciona uma guarda explícita para null:

root@kitploit:~
// RealmBase.java — patched
protected String getDigest(String username, String realmName, String algorithm) {
    String password = getPassword(username);
    if (password == null) {
        return null; 
    }
    ...
}

Análise

Executando o PoC contra o Tomcat 11.0.0-M1 com registro em nível FINE habilitado revela o seguinte:

root@kitploit:~
Digest:        2388e2c78407def640f37f092a8d3a84   ← client
Server digest: 2388e2c78407def640f37f092a8d3a84   ← server
Failed to authenticate user [ghost]

Os hashes do digest coincidem. O bug em getDigest() é real e confirmado. No entanto, a autenticação ainda falha porque RealmBase.authenticate() possui uma segunda verificação independente:

root@kitploit:~
// RealmBase.authenticate()
if (serverDigest.equals(clientDigest)) {
    return getPrincipal(username);  // returns null for non-existent users
}
return null;

Em um UserDatabaseRealm padrão apoiado por tomcat-users.xml, getPrincipal() realiza uma consulta no banco de dados de usuários em memória. Para um nome de usuário que não existe nesse banco de dados, ele retorna null. O chamador trata um Principal null como uma falha de autenticação e emite um 401.


Estrutura do Repositório

root@kitploit:~
cve-2026-43512-poc/
├── Dockerfile                          # Tomcat 11.0.0-M1 (affected version)
├── tomcat-users.xml                    # Minimal Realm config — no user "ghost"
├── web.xml
├── exploit/
│   ├── exploit.go                      # PoC — Go, stdlib only
│   └── go.mod
└── README.md

Requisitos

FerramentaVersãoNotas
Podman≥ 4.0Docker também funciona
Go≥ 1.22Apenas para executar o exploit localmente

Uso

1. Construir e iniciar o container

root@kitploit:~
podman build -t tomcat-cve-2026-43512 .
podman run -d --name tomcat-vuln -p 8080:8080 tomcat-cve-2026-43512

Aguarde alguns segundos para o Tomcat terminar de iniciar, então verifique se está no ar:

root@kitploit:~
curl -si http://localhost:8080/protected/secret.html | head -1
# Expected: HTTP/1.1 401

2. Executar o exploit

root@kitploit:~
cd exploit
go run exploit.go \
  -target   http://localhost:8080 \
  -path     /protected/secret.html \
  -username ghost

Flags disponíveis:

FlagPadrãoDescrição
-targethttp://localhost:8080URL base do Tomcat
-path/protected/Caminho do recurso protegido
-usernameghostNome de usuário a usar — não deve existir em tomcat-users.xml

3. Habilitar registro detalhado do Tomcat (opcional)

Para observar o estado interno de autenticação, adicione um arquivo logging.properties e monte-o:

root@kitploit:~
org.apache.catalina.authenticator.level = FINE
org.apache.catalina.realm.level = FINE
root@kitploit:~
podman run -d --name tomcat-vuln -p 8080:8080 \
  -v ./logging.properties:/usr/local/tomcat/conf/logging.properties:ro \
  tomcat-cve-2026-43512

O log mostrará o resultado da comparação do digest diretamente, confirmando se os hashes coincidem.

4. Limpeza

root@kitploit:~
podman stop tomcat-vuln && podman rm tomcat-vuln

Saída Esperada

root@kitploit:~
============================================================
 CVE-2026-43512 — Tomcat DIGEST Auth Bypass PoC
============================================================
 Target   : http://localhost:8080/protected/secret.html
 Username : "ghost"  (must NOT exist in tomcat-users.xml)
 Password : "null"   (literal string)
------------------------------------------------------------
[1] Sending unauthenticated request to obtain DIGEST challenge...
[+] HTTP 401 received — DIGEST challenge:
    Digest realm="UserDatabase", qop="auth", nonce="...", opaque="..."

[*] realm="UserDatabase"  nonce="..."  qop="auth"  algorithm="MD5"

[2] Computing DIGEST response with password="null"...
    Digest username="ghost", realm="UserDatabase", ...

[3] Sending request with crafted DIGEST credentials...
------------------------------------------------------------
[✗] HTTP 401 — exploit failed.
    The UserDatabaseRealm provides a second line of defence:
    getPrincipal("ghost") returned null after the digest matched.
============================================================

Referências

RecursoLink
Aviso de Segurança do Apache Tomcathttps://tomcat.apache.org/security-9.html
Commit da correçãohttps://github.com/apache/tomcat/commit/6565a6cb6499e56fe2f34457cec99f9d1c4f39e9
RealmBase.java (principal)https://github.com/apache/tomcat/blob/main/java/org/apache/catalina/realm/RealmBase.java
RFC 2617 — Autenticação DIGEST HTTPhttps://datatracker.ietf.org/doc/html/rfc2617
Análise completa — post no bloghttps://return-zero.dev/posts/cve-2026-43512

Aviso Legal

Este repositório é destinado apenas para fins educacionais e análise de explorabilidade local. Todos os testes foram realizados em um ambiente de container auto-hospedado. Não execute este PoC contra sistemas que você não possui ou para os quais não tem autorização explícita por escrito para testar.

Baixar ferramenta