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.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2023-25690_lab — Laboratório de contrabando de requisições HTTP: injeção CRLF no Apache 2.4.55 | Kitploit
Ferramentas/GitHubGitHub/giordy0424/cve-2023-25690_lab
Análise de VulnerabilidadesExploração de Aplicações WebCTFTestes de PenetraçãoAprendizado e EducaçãoLabs e Prática
GitHubgiordy0424/cve-2023-25690_lab

CVE-2023-25690_lab

Laboratório de contrabando de requisições HTTP: injeção CRLF no Apache 2.4.55

Ver Repositório
7há 1 mêsAinda 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

HTTP Request Smuggling via Apache proxy

Configuração do ambiente

Infraestrutura

ComponenteFunçãoVersão
Apache HTTP ServerReverse Proxy2.4.55 (vulnerável)
Spring Boot (Tomcat embarcado)Backend API4.x (Java 21)
SQLiteBanco de dados—
Usuário ──► Apache :80 (Proxy) ──► Spring Boot :8080 (Backend) ──► SQLite
            │
            ├─ mod_rewrite + mod_proxy
            ├─ CVE-2023-25690: CRLF não sanitizados
            ├─ RewriteRule "^/public/?(.*)" "http://spring-backend:8080/public/$1" [P]
            ├─ RewriteRule "^/service/(.*)" "http://spring-backend:8080/api/status?name=$1" [P]
            └─ ACL: <Location "/admin"> bloqueado

Endpoints Públicos do Backend

POST /public/register: permite o registro de usuários no banco de dados
POST /public/login: permite o login através da verificação das credenciais inseridas e libera um token de sessão
GET /public/dashboard: área restrita dos usuários
GET /api/status: aceita o parâmetro "name", é um endpoint de exemplo para verificação do estado dos serviços
GET /public/logout

Endpoints Privados do Backend

POST /admin/edit/{id}/{newName}/{newPass}: é uma rota teoricamente inacessível ao público que permite aos administradores modificar os dados dos usuários

Metodologia de Referência para o Teste de Penetração

  1. Planejamento — Definição do escopo
  2. Descoberta — Coleta de Informações, Footprinting, Scanning & Enumeração, Análise de Vulnerabilidades
  3. Ataque — Exploit, Escalação de Privilégios
  4. Relatório — Resumo Executivo, Relatório Técnico

Resumo Executivo

Durante a atividade de teste de penetração foi identificada uma vulnerabilidade crítica na infraestrutura de reverse proxy que expõe o backend Spring Boot. O proxy Apache HTTP Server versão 2.4.55 é afetado pela vulnerabilidade CVE-2023-25690 (HTTP Request Smuggling), que permite a um atacante contornar os filtros de segurança impostos no proxy e alcançar diretamente endpoints administrativos internos não protegidos.

O ataque explora a ausência de sanitização dos caracteres de controle (CRLF) nas RewriteRule do Apache, permitindo a injeção de uma segunda requisição HTTP entre os parâmetros de uma requisição legítima direcionada ao backend. A prova de conceito demonstrou a modificação não autorizada das credenciais de usuário no banco de dados através do endpoint /admin/edit/{id}/{newName}/{newPass}, teoricamente protegido pelas ACLs do proxy.

Recomendações: Atualizar imediatamente o Apache HTTP Server para a versão ≥ 2.4.56, reforçar os filtros de segurança no proxy e implementar uma camada de segurança no backend (Spring Security) para todos os endpoints sensíveis.


1 Planejamento

1.1 Modalidade

  • Vetor de ataque: Internet
  • Ambiente a ser atacado: Produção

1.2 Gray Box - Informações conhecidas:

  • Hostname do Front-end
  • Hostname do Backend (ou endereço IP na rede local da empresa) e porta
  • Endpoint privado

1.3 Objetivos do Teste

  • Contornar as ACLs do Apache para alcançar o endpoint privado
  • Demonstrar a modificação não autorizada dos dados de usuário no banco de dados
  • Avaliar o impacto concreto do CVE-2023-25690 em cenário real

2 Avaliação de Vulnerabilidades — Fase de Descoberta

2.1 Coleta de Informações & Footprinting

2.1.1 Banner Grabbing

Identificação da versão do Apache através da análise dos cabeçalhos HTTP da resposta.

$ curl -I http://localhost/service/

HTTP/1.1 200
Date: Sun, 21 Jun 2026 08:54:00 GMT
Server: Apache/2.4.55 (Unix)
Content-Type: text/plain;charset=UTF-8
Content-Length: 42

Resultado: O cabeçalho do servidor revela Apache/2.4.55. Consulta ao banco de dados de CVEs → correspondência com CVE-2023-25690.

De acordo com a CVE, nesta versão do Apache, se houver uma RewriteRule que copie caracteres genéricos provenientes da requisição ao proxy no URL de destino do backend, o texto transcrito não é sanitizado, portanto caracteres de controle (como retornos de linha) também passam.

Por exemplo: RewriteRule "^/here/(.*)" "http://backend.com:8080/elsewhere?$1" [P] // a letra P indica o modo proxy

Portanto, agora nosso objetivo é descobrir um possível endpoint que realize essa transcrição no nível do proxy

2.1.2 Identificação das Tecnologias do Backend

A partir da análise das respostas e do comportamento da aplicação, observa-se que a sessão é gerenciada através de JSESSIONID, o que confirma o uso de um Servlet Container Java (como Apache Tomcat, Jetty ou WildFly). Além disso, a requisição a endpoints inexistentes retorna uma "Whitelabel Error Page", o que indica que há Spring Boot no backend.

2.2 Scanning & Enumeração

2.2.1 Descoberta de Endpoints (Fuzzing)

Através de um script bash para automação de fuzzing com dicionário, foram mapeados os endpoints expostos na rede (presumivelmente todos).

Resultado:

EndpointCódigo HTTPMétodoParâmetros
admin403GET(sem parâmetros)
public/register200POSTuser=test&pass=test
public/login200POSTuser=test&pass=test
public/dashboard200GET(sem parâmetros)
public/logout200GET(sem parâmetros)
api/status200GET(sem parâmetros)
service/*200GET(sem parâmetros)

2.2.2 Mapeamento da Configuração do Proxy (Dedução)

Dado que

  • /service/x
  • /api/status?name=x

retornam ambas a mesma resposta, entende-se que apontam para o mesmo endpoint do backend. Além disso, como requisições como /service/x/y/z (que muito provavelmente não existem) não retornam 404, pode-se deduzir que o endpoint original aceita um parâmetro e não uma path variable. Portanto, em conclusão, pode-se deduzir que as requisições para /service/<serviço> são traduzidas com uma RewriteRule para o backend Spring Boot (exatamente o que procurávamos). Agora é preciso entender se essa RewriteRule é genérica, ou seja, usa uma regex do tipo .* ou se é bem estruturada.

Tento inserir caracteres de controle na requisição para dividir o conteúdo legítimo do oculto:

curl -v --path-as-is 'localhost/service/x%20HTTP/1.1%0d%0aHost:%20spring-backend%0d%0a%0d%0aprova:%20ok%0d%0atrash_header:%20'

>> ... HTTP/1.1 200 ... O serviço 'x' está operacional e estável.

Inseri um parâmetro customizado para verificar se os CRLFs são interpretados corretamente

trash_header tem a função de encapsular os cabeçalhos que o Apache inserirá na requisição ao backend (dessa forma, eles serão interpretados como simples texto de X-Header e não terão valor para a requisição HTTP)


Fora do escopo do atacante

Com tcpdump no container do backend, tive a oportunidade de interceptar a requisição HTTP proveniente do Apache:

docker exec -it apache_vuln-spring-backend-1 sh
apk add tcpdump
tcpdump -i any -A port 8080

O backend vê esta requisição:

GET /api/status?name=x HTTP/1.1
Host: spring-backend

prova: ok
trash_header:  HTTP/1.1
Host: spring-backend:8080
User-Agent: curl/7.81.0
Accept: */*
X-Forwarded-For: 172.19.0.1
X-Forwarded-Host: localhost
X-Forwarded-Server: localhost
Connection: Keep-Alive

"Os caracteres de controle controlaram"

A resposta me indica que a parte com os caracteres de controle passou incólume como estrutura da própria requisição HTTP e não simplesmente como parâmetro (pois o nome interceptado pelo backend é apenas 'x'). Portanto, impusemos o formato da requisição HTTP direcionada ao backend e o proxy a aceitou. Isso abre caminho para o payload real de smuggling.

2.3 Mapeamento da Superfície de Ataque

Baixar ferramenta