Muitas vezes, ao encontrar um SSRF (Server-Side Request Forgery), o atacante fica limitado a ler arquivos locais ou fazer requisições HTTP internas. Mas o que acontece quando o alvo interno não fala HTTP? É aqui que o protocolo Gopher entra como o "canivete suíço" do Red Team.
O Conceito Chave
O Gopher não é algo que você ativa no servidor alvo (como o Redis). Ele é um veículo de transporte. Ele permite encapsular tráfego TCP raw (texto puro) dentro de uma URL. O segredo é que ele precisa estar habilitado no cliente HTTP (geralmente via biblioteca cURL) do servidor web vulnerável.
Cenário de Exploração Real
- Recon & Vetor de Entrada: Você encontra um portal corporativo com uma função de "Importar foto de perfil via URL".
- Descoberta de SSRF: Ao testar
http://localhost:80, o servidor retorna o HTML da página interna. SSRF confirmado. - Port Scan Interno: Você mapeia a rede interna através do servidor vulnerável e descobre um Redis (6379) rodando no IP
10.0.0.5. - O Obstáculo: O Redis é um serviço de texto simples, ele não entende os cabeçalhos do protocolo HTTP. Tentar um
http://10.0.0.5:6379resultará em erro. - A Solução (Gopher Attack): Se a libcurl do backend suportar o esquema
gopher://, você pode forjar uma sessão TCP completa.
- Você envia:
gopher://10.0.0.5:6379/_<PAYLOAD_REDIS_ENCODADO> - O servidor web "desembrulha" o payload e entrega os comandos puros diretamente ao Redis.
O Impacto: Através desse túnel, você injeta uma SSH Key ou uma Cron Job maliciosa.
Exemplo de Requisição HTTP Vulnerável e payload do Gopher
POST /api/fetch_profile_picture HTTP/1.1
Host: alvo-corporativo.com.br
Content-Type: application/json
Content-Length: 385
{
"url": "gopher://10.0.0.5:6379/_%2A1%...<snip>..%0A"
}Decomposição da URL Gopher (O que o Redis recebe): O Redis utiliza o protocolo RESP (Redis Serialization Protocol) para "desembrulhar" o Gopher acima, e executar os comandos.
Resultado: Shell Remoto (RCE) em um servidor de banco de dados que nem sequer possui IP público.
Lição para Defensores
Não basta filtrar o protocolo HTTP. Se a sua aplicação faz requisições externas, desabilite wrappers de protocolos desnecessários como gopher://, file:// e ftp:// no seu cliente cURL.