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
Na máquina "atacante" a porta 9191 ficará em modo listening com o comando netcat, conforme mostrado na figura:
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
Postar um comentário