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

  1. Recon & Vetor de Entrada: Você encontra um portal corporativo com uma função de "Importar foto de perfil via URL".
  2. Descoberta de SSRF: Ao testar http://localhost:80, o servidor retorna o HTML da página interna. SSRF confirmado.
  3. 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.
  4. 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:6379 resultará em erro.
  5. 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.