Эксплуатация уязвимости XXE

Поиск уязвимостей сайта

В предыдущей статье, в рамках прохождения задания Hack The Box RedPanda, мы эксплуатировали уязвимость SSTI с шаб­лониза­тором Spring, сегодня продолжим взламывать уязвимую машину RedPanda и будем эксплуатировать уязвимость XXE.

Еще по теме: Лучшие гаджеты хакера

Эксплуатация уязвимости XXE

Нем­ного погуляв по фай­ловой сис­теме, доходим до катало­га /opt/, где есть нес­коль­ко про­ектов.

Со­дер­жимое катало­га /opt/
Со­дер­жимое катало­га /opt/

Прос­матри­вая катало­ги и исходные коды, все же добира­емся и до кода panda_search.

Со­дер­жимое катало­га про­екта
Со­дер­жимое катало­га про­екта

В основном фай­ле MainController.java находим код для под­клю­чения базы дан­ных. В подоб­ных фун­кци­ях всег­да ука­зыва­ются учет­ные дан­ные для работы с БД.

Ис­ходный код MainController.java
Ис­ходный код MainController.java

Имя поль­зовате­ля мы уже зна­ем, поэто­му поп­робу­ем исполь­зовать най­ден­ный пароль и авто­ризо­вать­ся по SSH.

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

Локальное повышение привилегий

С помощью авто­мати­зиро­ван­ных средств сбо­ра информа­ции вро­де скрип­тов LinPEASS ничего инте­рес­ного най­ти не уда­лось. Поэто­му отсле­дим запус­каемые про­цес­сы с помощью pspy64.

Ло­ги pspy64
Ло­ги pspy64

Сер­вер пери­оди­чес­ки запус­кает скрипт LogParser, к исходно­му коду которо­го мы име­ем дос­туп. Каталог сле­дующий:

Что инте­рес­но, пос­ле нес­коль­ких про­верок про­исхо­дит пар­синг XML-фай­ла, а это намек на уяз­вимость XXE. Вник­нем в код нем­ного глуб­же.

Со­дер­жимое фай­ла App.java
Со­дер­жимое фай­ла App.java

Пер­вое усло­вие — наличие фай­ла XML, а он соз­дает­ся при­ложе­нием panda_search. В исходном коде фун­кции afterCompletion получа­ем фор­мат дан­ных внут­ри фай­ла логов: responseCode||address||UserAgent||Uri.

Ис­ходный код клас­са RequestInterceptor
Ис­ходный код клас­са RequestInterceptor

Итак, файл и его содер­жимое мы уже можем кон­тро­лиро­вать. Вер­немся к новому про­екту и раз­берем его по фун­кци­ям. Пос­ле чте­ния фай­ла фун­кция isImage про­веря­ет, есть ли в име­ни фай­ла подс­тро­ка .jpg.

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

За­тем фун­кция parseLog раз­бира­ет лог на парамет­ры status_code, ip, user_agent и uri.

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

Ку­да инте­рес­нее сле­дующая фун­кция getArtist, в которую переда­ется путь. Эта фун­кция получа­ет параметр метадан­ных Artist из кар­тинки, которая находит­ся по передан­ному пути.

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

И наконец, рас­смот­рим фун­кцию addViewTo. В нее переда­ется путь к XML-фай­лу. Этот путь сос­тавля­ется из зна­чения, которое вер­нет getArtist, а его мы можем кон­тро­лиро­вать. Сама фун­кция пар­сит XML и перепи­сыва­ет его поля.

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

Та­ким обра­зом мы можем манипу­лиро­вать метапа­рамет­ром Artist, что­бы ука­зать на собс­твен­ный XML-файл и выпол­нить ата­ку типа XXE. С ее помощью мы смо­жем получить содер­жимое любого фай­ла. Пер­вым делом соз­дадим файл:

Со следующим содержимым:

Так мы попыта­емся получить файл /root/.ssh/id_rsa в качес­тве парамет­ра r.

А теперь вста­вим метапа­раметр в изоб­ражение и тоже заг­рузим его в домаш­ний каталог поль­зовате­ля.

За­пись метадан­ных
За­пись метадан­ных

Де­ло за малым: сде­лать так, что­бы файл логов содер­жал в качес­тве URL путь к фай­лу изоб­ражения. Так как исполь­зуют­ся раз­делите­ли ||, мы можем выпол­нить инъ­екцию через User-Agent.

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

Со­дер­жимое ralf_creds.xml
Со­дер­жимое ralf_creds.xml

С получен­ным при­ват­ным клю­чом под­клю­чаем­ся к уда­лен­ному сер­веру.

Флаг рута Hack The Box RedPanda
Флаг рута

Ма­шина Hack The Box RedPanda зах­вачена!

РЕКОМЕНДУЕМ:

Дима (Kozhuh)

Эксперт в кибербезопасности. Работал в ведущих компаниях занимающихся защитой и аналитикой компьютерных угроз.

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