SSRF - Server-Side Request Forgery

Server-Side Request Forgery (SSRF) nos permite abusar de funcionalidades da aplicação para interagir com serviços internos ou externos. Quando um atacante explora essa vulnerabilidade, ele pode executar algumas das seguintes ações:

  • Interagir com sistemas internos
  • Discobrir serviços internos através de port scan
  • Descobrir dados internos
  • Incluir um arquivo na aplicação
  • Vazar NetNTLM hashes usando UNC Paths (Windows)
  • Realizar execução remota de código 

Geralmente, a vulnerabilidade SSRF é encontrada em aplicações que buscam recursos remotos. Ao buscar por essa vulnerabilidade, devemos olhar os seguintes pontos:

  • Partes da requisição HTTP, incluíndo URLs
  • Permissão para upload/importação de arquivos com formato HTML, PDF, images, etc
  • Conexão com servidores remotos
  • Importação de dados através de API
  • Checagem de status da aplicação como ping, por exemplo

OWASP Definição

A falha SSRF ocorre quando a aplicação web busca por recursos remotos sem validar o input do usuário. Isso permite que um atacante faça a manipulação de uma requisição para um destino desconhecido, mesmo quando protegida por firewall, VPN, ou outro controle de acesso a rede (ACL).

Prova de Conceito - POC 

Primeiro passo é observar o comportamento da aplicação web enviando uma requisição com o comando cURL, conforme mostrado abaixo:

curl -i -s http://10.129.201.238


Logo é descoberto o redirecionamento para o recurso /load?q=index.html Onde o parâmetro q= busca pelo arquivo index.html A próxima etapa é testar o parâmetro q= para identificar se é vulnerável a SSRF.

Na máquina "atacante" a porta 9191 ficará em modo listening com o comando netcat, conforme mostrado na figura:



Na aplicação, usando o parâmetro q= será feita uma requisição http para a porta 9191 do atacante, confirmando que a aplicação é vulnerável a SSRF. 



Usando o módulo Twisted do python3, na máquina "atacante" abrimos a porta 21/tcp e no mesmo diretório adicionamos o arquivo de teste page.html

No teste mostrado abaixo, a aplicação retorna o arquivo page.html confirmando a vulnerabilidade SSRF



Outro teste que pode ser feito é ler arquivos internos do servidor da aplicação, conforme mostrado abaixo. 



Como enumerar serviços internos explorando o SSRF?

Uma vez confirmada a vulnerabilidade SSRF, a próxima etapa é enumerar serviços internos explorando o SSRF. 

Usando uma wordlist com portas tcp 1-65535, iniciamos o scan com a ferramenta ffuf 

A wordlist pode ser gerada com o comando: for port in {1..65535};do echo $port >> ports.txt;done

Para otimizar o scan, toda conexão recusada será descartada do resultado. No exemplo, o tamanho do pacote para connection refused é 30, adicionado no filtro como -fs 30


A porta 5000 é descoberta pelo scan e na figura abaixo a conexão com essa porta é realizada com sucesso através do parâmetro q= vulnerável. 


RCE com SSRF 

A execução remota de código é a etapa final de exploração do SSRF. Nos exemplos a seguir, a exploração será feita na aplicação internal.app.local

Quando nos deparamos com uma aplicação interna e ficamos em dúvida por onde começar para explorar a execução remota de código, podemos começar lendo o arquivo /proc/self/environ 


No comando cURL o parâmetro -o - (single dash) forçando o output aparecer na saída stdout, conforme é descrito na documentação oficial do comando AQUI

O arquivo environ retorna as variáveis do ambiente onde identificamos o diretório da aplicação PWD=/app e para ler os arquivos nesse diretório, a porta 5000 descoberta no scan será usada. 


O script internal.py possui uma funcionalidade que permite a execução remota de código através de uma requisição GET para /runme?x=<CMD>


Essa foi a POC para demostrar como descobrir, explorar e executar remotamente comandos em um servidor/aplicação vulnerável. 


Referências:

[+] OWASP SSRF 

https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/

[+] cURL documentação

https://curl.se/docs/manpage.html#:~:text=curl%20is%20a%20tool%20for,to%20work%20without%20user%20interaction.


Comentários

Postagens mais visitadas