SSRF-атака на примере прохождения HTB Health

SSRF атака HTB Health

Мы уже рассказывали про взлом веб-сервера на Windows и Apache через SSRF. В этой статье продолжим тему SSRF и на примере прохождения средней по сложности уязвимой машины Hack The Box Health, рассмотрим атаку SSRF. Я покажу, как находить и экс­плу­ати­ровать уяз­вимость SSRF и использовать SQL-инъ­екцию в GoGits.

Еще по теме: Взлом удаленного хоста через Git

SSRF-атака на примере прохождения HTB Health

Лучше подключаться к машине HTB с помощью VPN. И желательно не делать это со своего личного компа, на котором хранится чувствительная информация.

Сканирование портов

Для начала до­бав­им IP-адрес машины в /etc/hosts:

Начнем со сканирования портов. Это стан­дар­тная операция при любом пентесте. Сканирование портов позволит определить, какие служ­бы на машине при­нима­ют соеди­нение.

Для этого отлично подходит популярный сканер Nmap. Следующий скрипт улучшит резуль­таты сканирования:

Ре­зуль­тат сканирования скрипта Nmap
Ре­зуль­тат сканирования скрипта Nmap

Сканирование выявило два отрытых порта:

  • 22 — служ­ба OpenSSH 7.6p1
  • 80 — веб‑сер­вер Apache 2.4.29.

Сра­зу заходим на веб‑сер­вер.

Главная http://health.htb
Главная http://health.htb

Попробуем заполнить необ­ходимые поля и отпра­вим дан­ные. В полях URL можете ука­зать адрес вашего веб‑сер­вера. Пред­варитель­но запус­тите его:

Фор­ма отправ­ки дан­ных
Фор­ма отправ­ки дан­ных
Ло­ги веб‑сер­вера
Ло­ги веб‑сер­вера

В логах веб‑сер­вера мы можем увидеть два зап­роса. Пер­вый запрос — это GET на ука­зан­ный Monitored URL, а вто­рой запрос — POST на Payload URL. Так как http.server не отображает пол­ные дан­ные, немного покодим. Мы напишем приложение, которое будет выводить HTTP-заголов­ки, а в слу­чае с запросом POST — еще и передан­ные дан­ные.

За­пус­каем и дела­ем пов­торный зап­рос.

SSRF атака. Работа сер­вера
Работа сер­вера

Видим, что в дан­ных POST-зап­роса переда­ется информа­ция об ука­зан­ных URL с помет­кой down. Дадим какой‑нибудь ответ на запрос GET. Для это­го попробуем изме­нить метод do_GET:

Атака SSRF. Ло­ги веб‑сер­вера
Ло­ги веб‑сер­вера

И теперь видно, что в дан­ных запроса POST нам переда­ют наш же ответ на запрос GET. Это наводит на мысль, о возможности реализации атаки SSRF — то есть под­делки зап­росов.

Атака SSRF

В начале я решил поп­робовать доб­рать­ся до фай­ла /etc/passwd, для этого ука­зал в качес­тве URL file:///etc/passwd/id_rsa, но вот что я получил:

Пре­дуп­режде­ние при зап­росе фай­ла
Пре­дуп­режде­ние при зап­росе фай­ла

Зап­росить дан­ные с адре­са 127.0.0.1 тоже не получилось, но я вспом­нил ста­рый трюк с редирек­том. Так как про­водит­ся филь­тра­ция имен­но вве­ден­ных в поле URL дан­ных, мы можем обра­тить­ся к 127.0.0.1 в обход это­го поля. Для это­го нуж­но отпра­вить чекер на свою стра­ницу, которая переш­лет кли­ента на 127.0.0.1. Изме­ним метод do_GET для выпол­нения редирек­та.

Пов­торя­ем ата­ку и получа­ем уже зна­комую стра­ницу самого же сер­вера, что под­твержда­ет наличие уяз­вимос­ти SSRF.

Эк­сфиль­тра­ция дан­ных
Эк­сфиль­тра­ция дан­ных

Для поис­ка пор­тов, которые могут быть откры­ты для под­клю­чения с локаль­ного хос­та, мож­но вос­поль­зовать­ся SYN-ска­ниро­вани­ем.

Ре­зуль­тат ска­ниро­вания пор­тов
Ре­зуль­тат ска­ниро­вания пор­тов

На­ходим порт 3000, который как раз филь­тру­ется. Поп­робу­ем вытянуть дан­ные с него. Ука­зыва­ем дру­гой URL в обра­бот­чике GET:

Для удобс­тва я нем­ного изме­нил обра­бот­чик POST, что­бы из отве­та сер­вера авто­мати­чес­ки извле­кал­ся код HTML, сох­ранял­ся в файл и откры­вал­ся в бра­узе­ре.

Де­лаем новый зап­рос и в открыв­шемся бра­узе­ре видим стра­ницу авто­риза­ции Gogs.

По­лучен­ные дан­ные
По­лучен­ные дан­ные

Эта стра­ница рас­кры­вает нам вер­сию плат­формы, что поможет при поис­ке уяз­вимос­тей. Один зап­рос к Google, и пер­вая же ссыл­ка дает нам опи­сание готово­го экс­пло­ита.

Ре­зуль­тат поис­ка в Google
Ре­зуль­тат поис­ка в Google

Та­ким обра­зом мы узна­ем, что в этой вер­сии Gogs есть воз­можность про­вес­ти SQL-инъ­екцию на стра­нице search через параметр q.

Опи­сание спо­соба экс­плу­ата­ции
Опи­сание спо­соба экс­плу­ата­ции

Для экс­плу­ата­ции нам нуж­но толь­ко менять URL в коде нашего обра­бот­чика GET-зап­росов. При­веден­ный в PoC при­мер у меня не сра­ботал, поэто­му приш­лось нем­ного перера­ботать зап­рос. Вытянуть вер­сию не получи­лось, но зато добива­емся выпол­нения вло­жен­ного SQL-зап­роса select '123’.

По­лучен­ные дан­ные
По­лучен­ные дан­ные

Gogs SQL Injection

Итак, мы можем выпол­нять зап­росы, но получить информа­цию о струк­туре таб­лицы у меня не выш­ло. Поэто­му я ска­чал ис­ходни­ки Gogs и порыл­ся в них. Там находим струк­туру User.

Струк­тура User
Струк­тура User

Нас здесь инте­ресу­ют поля name, passwd и  salt.

По­луче­ние име­ни поль­зовате­ля
По­луче­ние име­ни поль­зовате­ля

По­луче­ние хеша пароля поль­зовате­ля
По­луче­ние хеша пароля поль­зовате­ля

По­луче­ния соли для хеширо­вания
По­луче­ния соли для хеширо­вания

 

Те­перь надо разоб­рать­ся с алго­рит­мом хеширо­вания. Так, в issue на GitHub находим упо­мина­ние самого алго­рит­ма.

Ин­форма­ция об алго­рит­ме хеширо­вания
Ин­форма­ция об алго­рит­ме хеширо­вания

И уже по клю­чево­му сло­ву находим сам код в исходни­ках.

Ис­ходный код фун­кции EncodePassword
Ис­ходный код фун­кции EncodePassword

У нас есть все парамет­ры для перебо­ра хеша. При­водим его к фор­мату hashcat:

Пре­обра­зова­ние к фор­мату hashcat
Пре­обра­зова­ние к фор­мату hashcat

А теперь бру­тим хеш, для чего ука­зыва­ем режим 10900:

Ре­зуль­тат перебо­ра
Ре­зуль­тат перебо­ра

 

С получен­ным паролем под­клю­чаем­ся по SSH и забира­ем пер­вый флаг.

Флаг поль­зовате­ля
Флаг поль­зовате­ля

Повышение привилегий

Те­перь, ког­да мы получи­ли дос­туп к хос­ту, нам нуж­но соб­рать информа­цию, которая поможет в повыше­нии при­виле­гий. Источни­ков очень мно­го, и для авто­мати­зации поис­ков я обыч­но исполь­зую скрип­ты PEASS. С их помощью обна­ружи­ваем учет­ные дан­ные для под­клю­чения к базе дан­ных.

Пе­ремен­ные окру­жения
Пе­ремен­ные окру­жения

Боль­ше ничего най­ти не уда­лось, да и сама база ничего нам не дала. Тог­да отсле­дим запус­каемые на хос­те про­цес­сы с помощью pspy64. Прос­тое ожи­дание ничего не дало — все спо­кой­но. Тог­да поп­робу­ем прой­ти по всем фун­кци­ям сай­та и пос­мотреть, при­ведет ли это к выпол­нению каких‑либо прог­рамм в сис­теме. Пос­ле соз­дания веб‑хука в кон­соли посыпа­лись логи.

Соз­дание веб‑хука
Соз­дание веб‑хука

 

Ло­ги pspy
Ло­ги pspy

Под­клю­чим­ся к базе дан­ных и пос­мотрим содер­жимое таб­лицы tasks.

Со­дер­жимое таб­лицы tasks
Со­дер­жимое таб­лицы tasks

И получа­ем ука­зан­ный нами URL, дан­ные по которо­му будут отправ­лены на наш сер­вер! В самом начале про­хож­дения я пытал­ся получить содер­жимое фай­ла, но помешал филь­тр. Теперь же мы можем, минуя филь­тры, прос­то под­менить запись в базе дан­ных. Эксфиль­тро­вать поп­робу­ем при­ват­ный SSH-ключ рута.

Из­менение дан­ных в таб­лице tasks
Из­менение дан­ных в таб­лице tasks
Ло­ги лис­тенера
Ло­ги лис­тенера

И на откры­тый лис­тенер при­лета­ет зап­рос, где мы можем най­ти SSH-ключ поль­зовате­ля root. С этим клю­чом под­клю­чаем­ся к сис­теме и забира­ем вто­рой флаг.

Флаг рута
Флаг рута

Заключение

Статья подошла к концу. Надеюсь вам было интересно и материал поможет в понимании атаки SSRF.

ПОЛЕЗНЫЕ ССЫЛКИ:

ВКонтакте
OK
Telegram
WhatsApp
Viber

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *