Се­год­ня я покажу про­цесс зах­вата оче­ред­ного веб‑сай­та — на этот раз работа­юще­го на CMS под наз­вани­ем Wonder. Мы пос­каниру­ем сайт на пред­мет инте­рес­ных арте­фак­тов, а затем про­экс­плу­ати­руем XSS, что­бы уста­новить модуль и получить RCE. При повыше­нии при­виле­гий заюзаем OS Command Injection в сер­висе для кон­тро­ля логов.

На­ша цель — получе­ние прав супер­поль­зовате­ля на машине Sea с учеб­ной пло­щад­ки Hack The Box. Уро­вень задания — лег­кий.

warning

Под­клю­чать­ся к машинам с HTB рекомен­дует­ся с при­мене­нием средств ано­ними­зации и вир­туали­зации. Не делай это­го с компь­юте­ров, где есть важ­ные для тебя дан­ные, так как ты ока­жешь­ся в общей сети с дру­гими учас­тни­ками.

Разведка

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

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

10.10.11.28 sea.htb

И запус­каем ска­ниро­вание пор­тов.

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

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

На­ибо­лее извес­тный инс­тру­мент для ска­ниро­вания — это Nmap. Улуч­шить резуль­таты его работы ты можешь при помощи сле­дующе­го скрип­та:

#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1

Он дей­ству­ет в два эта­па. На пер­вом про­изво­дит­ся обыч­ное быс­трое ска­ниро­вание, на вто­ром — более тща­тель­ное ска­ниро­вание, с исполь­зовани­ем име­ющих­ся скрип­тов (опция -A).

Результат работы скрипта
Ре­зуль­тат работы скрип­та

Ска­нер нашел два откры­тых пор­та:

Главная страница сайта
Глав­ная стра­ница сай­та

Точка входа

Идем смот­реть сайт и на стра­нице How to participate находим ссыл­ку на contact.php.

Содержимое страницы How to participate
Со­дер­жимое стра­ницы How to participate
Содержимое страницы contact.php
Со­дер­жимое стра­ницы contact.php

На стра­нице contact.php есть фор­ма свя­зи, где мож­но отпра­вить ссыл­ку на сайт. Пока оста­вим фор­му и поп­робу­ем узнать боль­ше о сай­те, поис­кав стра­ницы, на которые нет ссы­лок.

Справка: сканирование веба c feroxbuster

Од­но из пер­вых дей­ствий при тес­тирова­нии безопас­ности веб‑при­ложе­ния — это ска­ниро­вание методом перебо­ра катало­гов, что­бы най­ти скры­тую информа­цию и недос­тупные обыч­ным посети­телям фун­кции. Для это­го мож­но исполь­зовать прог­раммы вро­де dirsearch, DIRB или ffuf. Я пред­почитаю feroxbuster.

При запус­ке ука­зыва­ем сле­дующие парамет­ры:

  • -u — URL;
  • -w — сло­варь (я исполь­зую сло­вари из набора SecLists);
  • -t — количес­тво потоков;
  • -d — глу­бина ска­ниро­вания.

За­пус­каем feroxbuster:

feroxbuster -u http://10.10.11.28/ -w files_interesting.txt -d 1 -t 128

Но ничего инте­рес­ного най­ти не уда­лось.

Поп­робу­ем еще опре­делить, какие исполь­зуют­ся тех­нологии. Прос­матри­вая ответ сер­вера в Burp History, я нашел ссыл­ку на файл style.css.

Burp History
Burp History

Обыч­но каталог /css рас­положен в кор­не сай­та, поэто­му прос­каниру­ем фай­лы и дирек­тории в катало­ге /themes/bike/. В нем и находим файл README.md.

feroxbuster -u http://10.10.11.28/themes/bike/ -w files_interesting.txt -d 1 -t 128
Результат сканирования файлов
Ре­зуль­тат ска­ниро­вания фай­лов

Из содер­жимого README.md узна­ём об исполь­зовании WonderCMS.

Содержимое файла README.md
Со­дер­жимое фай­ла README.md

Это опен­сор­сная сис­тема управле­ния кон­тентом, можем сра­зу же заг­лянуть в ее ре­пози­торий на GitHub.

Репозиторий на GitHub
Ре­пози­торий на GitHub

Пер­вым делом най­дем, где в коде мож­но пос­мотреть вер­сию, а затем прос­мотрим ее в том же фай­ле на сер­вере. Текущая вер­сия записа­на в фай­ле version в кор­невом катало­ге CMS.

Последняя версия CMS
Пос­ледняя вер­сия CMS
Используемая версия CMS
Ис­поль­зуемая вер­сия CMS

Мы име­ем дело с доволь­но ста­рой вер­сией — WonderCMS 3.2.0. Поэто­му пер­вым шагом поищем информа­цию об извес­тных уяз­вимос­тях в ней и готовые экс­пло­иты.

Поиск эксплоитов в Google
По­иск экс­пло­итов в Google

Из Google сра­зу же узна­ём об уяз­вимос­ти CVE-2023-41425 и получа­ем для нее готовые экс­пло­иты.

Точка опоры

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

Запуск эксплоита
За­пуск экс­пло­ита

В выводе при­сутс­тву­ет XSS-наг­рузка, которую необ­ходимо отпра­вить в фор­ме свя­зи на сай­те. Но пред­варитель­но запус­тим лис­тенер:

pwncat-cs -lvp 4321
Форма связи
Фор­ма свя­зи

В логах веб‑сер­вера, который запус­тил наш экс­пло­ит, отоб­ража­ется заг­рузка с уда­лен­ного хос­та основной XSS-наг­рузки.

Логи веб-сервера
Ло­ги веб‑сер­вера

Од­нако боль­ше ничего не про­изош­ло, а зна­чит, нуж­но раз­бирать­ся в коде экс­пло­ита и дораба­тывать его. Пер­вым делом обра­щаем вни­мание на адрес репози­тория, с которо­го дол­жен заг­ружать­ся модуль (стро­ка 20).

Исходный код эксплоита
Ис­ходный код экс­пло­ита

Так как в лабора­тор­ной сре­де нет выхода в интернет, ска­чива­ем модуль и кла­дем рядом с фай­лом экс­пло­ита. В коде меня­ем адрес на свой. Пос­коль­ку путь, ука­зан­ный в модуле (стро­ки 29 и 37), может быть занят, меня­ем его на любой дру­гой.

Содержимое исходного модуля
Со­дер­жимое исходно­го модуля
Содержимое измененного модуля
Со­дер­жимое изме­нен­ного модуля

Еще нуж­но под­коррек­тировать адрес в перемен­ной urlWithoutLogBase.

Новый код эксплоита
Но­вый код экс­пло­ита

Ког­да все готово, пов­торно запус­каем экс­пло­ит и отправ­ляем ссыл­ку через фор­му на сай­те. В этот раз, кро­ме апло­ада основной XSS-наг­рузки, видим так­же и заг­рузку архи­ва.

Логи веб-сервера
Ло­ги веб‑сер­вера

Спус­тя нес­коль­ко секунд в лис­тенере появ­ляет­ся сес­сия поль­зовате­ля www-data.

Сессия пользователя www-data
Сес­сия поль­зовате­ля www-data

Продвижение

Пер­вым делом поищем учет­ные дан­ные в веб‑при­ложе­нии. Обыч­но мож­но най­ти логин и пароль от базы дан­ных.

Так и есть: в фай­ле /data/database.js находим хеш bcrypt.

Содержимое файла database.js
Со­дер­жимое фай­ла database.js

Ес­ли прос­то запус­тить hashcat без ука­зания режима, то ути­лита пред­ложит воз­можные режимы под­бора сама.

hashcat '$2y$10$iOrk210RQSAzNCx6Vyq2X.aJ/D.GuE4jRIikYiWrD3TM/PjDnXm4q' rockyou.txt
Режимы подбора пароля hashcat
Ре­жимы под­бора пароля hashcat

Нам нужен самый обыч­ный bcrypt — это режим 3200.

hashcat -m 3200 '$2y$10$iOrk210RQSAzNCx6Vyq2X.aJ/D.GuE4jRIikYiWrD3TM/PjDnXm4q' rockyou.txt
Результат подбора пароля
Ре­зуль­тат под­бора пароля

У нас есть пароль, а спи­сок воз­можных поль­зовате­лей мож­но пос­мотреть в фай­ле /etc/passwd.

Пользователи в системе
Поль­зовате­ли в сис­теме

Под­клю­чаем­ся от име­ни поль­зовате­ля amay и забира­ем пер­вый флаг.

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

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

Те­перь нам необ­ходимо соб­рать информа­цию. Я буду исполь­зовать для это­го скрип­ты PEASS.

Справка: скрипты PEASS

Что делать пос­ле того, как мы получи­ли дос­туп в сис­тему от име­ни поль­зовате­ля? Вари­антов даль­нейшей экс­плу­ата­ции и повыше­ния при­виле­гий может быть очень мно­го, как в Linux, так и в Windows. Что­бы соб­рать информа­цию и наметить цели, мож­но исполь­зовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скрип­тов, которые про­веря­ют сис­тему на авто­мате и выда­ют под­робный отчет о потен­циаль­но инте­рес­ных фай­лах, про­цес­сах и нас­трой­ках.

Заг­рузим на уда­лен­ный хост скрипт для Linux, дадим пра­во на выпол­нение и запус­тим ска­ниро­вание. В выводе будет мно­го информа­ции, но из инте­рес­ного — толь­ко сайт на пор­те 8080.

Список прослушиваемых портов
Спи­сок прос­лушива­емых пор­тов

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

Вот как это мож­но сде­лать:

ssh amay@10.10.11.28 -L 8000:127.0.0.1:8080

Те­перь весь тра­фик, который мы пош­лем на локаль­ный порт 8000, будет тун­нелиро­ван на порт 8080 ука­зан­ного хос­та (в дан­ном слу­чае 127.0.0.1) через SSH-хост.

Смот­рим сайт через бра­узер, где нас встре­чает HTTP-авто­риза­ция.

Авторизация на сайте
Ав­ториза­ция на сай­те

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

Главная страница сайта
Глав­ная стра­ница сай­та

Вы­водим лог и пред­полага­ем, что ско­рее на сер­вере чита­ется файл, а затем нам отоб­ража­ется его содер­жимое.

Содержимое файла access.log
Со­дер­жимое фай­ла access.log

Пе­рей­дем в Burp Repeater и поп­робу­ем про­читать файл /etc/shadow.

Результат чтения файла
Ре­зуль­тат чте­ния фай­ла

Файл выводит­ся не пол­ностью, воз­можно, что‑то филь­тру­ется. Поп­робу­ем выпол­нить инъ­екцию коман­ды id.

Результат выполнения команды
Ре­зуль­тат выпол­нения коман­ды

По­луча­ем резуль­тат выпол­нения коман­ды, а зна­чит, сер­вер ском­про­мети­рован. Напос­ледок прос­то про­чита­ем флаг рута.

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

Ма­шина зах­вачена!