SSRF Protocol Smuggling
Nesse artigo, você vai aprender como comunicamos com alguns serviços através do SSRF utilizando a técnica conhecida como Protocol Smuggling.
O que é o SSRF?
SSRF é uma vulnerabilidade que permite com que o atacante faça requisições para a rede interna através de uma aplicação web. Para conhecer melhor essa vulnerabilidade, leia o artigo: Explorando o Server-side Request Forgery
O que é Protocol Smuggling?
Protocol Smuggling é uma técnica que utilizamos para acessar serviços internos através do SSRF. Geralmente, quando encontramos um SSRF em uma aplicação, ele realiza uma requisição utilizando o protocolo HTTP para a URL informada pelo usuário. O protocolo HTTP contém diversos headers, segue o exemplo abaixo:
Como vamos acessar serviços internos que comunicam via socket através do SSRF? Para isso podemos utilizar o protocolo Gopher, que se comunica com raw sockets. Se abrirmos um socket na porta 8000 e fazermos uma requisição utilizando o protocolo gopher, conseguiremos interagir com o socket. Veja no exemplo abaixo:
O netcat recebeu o dado "HELLO" e enviou "HELLO GOPHER '-' " e "TEST123". Perceba que a conexão é mantida, e recebemos os dados em tempo real até cancelarmos a conexão utilizando cntrl+C. Para enviarmos dados utilizando o protocolo gopher, precisamos montar a seguinte url:
No imagem anterior, vemos que a URL especificada no curl foi: gopher://localhost:8000/_HELLO, ou seja, enviamos "HELLO" como dado para o socket.
Conhecendo o Gopherus
O Gopherus é uma ferramenta que gera payloads para explorarmos serviços internos como mysql, redis, fastcgi (php-fpm), zabbix, memcached utilizando o protocolo gopher. Para obter essa ferramenta, faça o clone do repositório.
Obtendo RCE utilizando Protocol Smuggling
Na máquina Ship do hackingclub, conseguimos explorar SSRF na aplicação web. Fazendo uma enumeração, vemos que a aplicação utiliza fastcgi, pois ao enviar uma requisição utilizando o gopher para localhost:9000 a aplicação leva 5 segundos para responder:
Podemos utilizar a payload gerada pelo gopherus para obtermos RCE. Gerando a payload:
A payload para explorar o fastcgi requer que especifiquemos um arquivo php existente dentro do servidor e o comando que executaremos no sistema. Ao enviar a payload gerada, vemos que a aplicação nos retorna erro 500:
Na maioria das vezes, vamos precisar fazer o double-encode (fazer dois urlencode) na payload (a payload é tudo que vem depois de /_) gerada pelo gopherus. O gopherus por padrão faz apenas 1 urlencode na payload, então precisamos fazer mais 1. Utilizei o urlencode do Burp para isso:
Ao enviar a requisição:
E finalmente obtemos RCE!
Referências:
Onde praticar Hacking ?
O Hacking Club é uma plataforma de treinamento em cybersecurity, que permite você aprender hacking de forma totalmente prática.
Temos mais de 50 ambientes com vulnerabilidades reais com write-ups para você treinar e aprender hacking. Semanalmente lançamos máquinas gratuitas para você praticar e se desafiar no hacking!