В этом рай­тапе я покажу, как мож­но получить сес­сию в сис­теме через заг­рузку сво­его модуля в сис­тему управле­ния кон­тентом Pluck. При повыше­нии при­виле­гий решим задачу в духе CTF по вос­ста­нов­лению раз­мытых на кар­тинке при­ват­ных дан­ных из PDF.

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

warning

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

Разведка

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

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

10.10.11.25 greenhorn.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).

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

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

Су­дя по логам, на пор­те 80 раз­вернут сер­вис Pluck 4.7.18.

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

Точка входа

Пер­вым делом сто­ит про­верить, есть ли для обна­ружен­ной CMS готовые экс­пло­иты. Про­ще все­го для начала поис­кать в Google.

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

Уз­наём, что встре­чен­ная нами вер­сия Pluck содер­жит уяз­вимость CVE-2023-50564 — в ком­понен­те /inc/modules_install.php, поз­воля­ющем заг­рузить ZIP-архив с про­изволь­ным фай­лом на PHP.

Для экс­плу­ата­ции спер­ва нуж­но авто­ризо­вать­ся, поэто­му прос­мотрим репози­тории в Gitea — вдруг удас­тся най­ти учет­ные дан­ные?

Доступные репозитории в Gitea
Дос­тупные репози­тории в Gitea

На­ходим репози­торий с исходны­ми кодами сис­темы Pluck.

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

В фай­ле login.php находим под­клю­чение фай­ла data/settings/pass.php (стро­ка 40). Видимо, в этом фай­ле и опре­делен хеш пароля. Этот хеш потом срав­нива­ется с поль­зователь­ски­ми дан­ными (стро­ка 79).

Содержимое файла login.php
Со­дер­жимое фай­ла login.php
Содержимое файла pass.php
Со­дер­жимое фай­ла pass.php

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

hashcat 'd5443aef1b64544f3685bf112f6c405218c573c7279a831b1fe9612e3a4d770486743c5580556c0d838b51749de15530f87fb793afdcc689b6b39024d7790163' rockyou.txt
Справка hashcat
Справ­ка hashcat

Ука­зыва­ем режим бру­та 1700 (параметр -m) и спус­тя пару секунд получа­ем пароль от Pluck.

hashcat -m 1700 'd5443aef1b64544f3685bf112f6c405218c573c7279a831b1fe9612e3a4d770486743c5580556c0d838b51749de15530f87fb793afdcc689b6b39024d7790163' rockyou.txt
Результат подбора пароля
Ре­зуль­тат под­бора пароля

Точка опоры

По­лучив дос­туп к панели адми­нис­тра­тора, про­буем заг­рузить веб‑шелл. Для это­го в глав­ном меню перехо­дим к стра­нице управле­ния модуля­ми: options → manage modules.

Страница администратора
Стра­ница адми­нис­тра­тора

На стра­нице управле­ния модуля­ми выбира­ем пункт Install a module и получа­ем фор­му заг­рузки фай­ла.

Страница управления модулями
Стра­ница управле­ния модуля­ми

Те­перь под­готовим архив с веб‑шел­лом. Будем заг­ружать реверс‑шелл PentestMonkey PHP. Пос­коль­ку в качес­тве лис­тенера мы будем исполь­зовать pwncat-cs, реверс‑шелл нуж­но нем­ного под­пра­вить. В перемен­ной $shell уби­раем всё, кро­ме коман­дной обо­лоч­ки /bin/sh.

Исходный код реверс-шелла
Ис­ходный код реверс‑шел­ла

За­пус­каем лис­тенер:

pwncat-cs -lp 4321

Упа­ковы­ваем PHP-файл и заг­ружа­ем архив в фор­ме уста­нов­ки нового модуля.

mv php-reverse-shell.php sh.php
zip sh.zip sh.php
Страница установки нового модуля
Стра­ница уста­нов­ки нового модуля

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

Сессия www-data
Сес­сия www-data

Продвижение

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

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

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

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

На сер­вере есть три поль­зовате­ля с кон­солью.

Пользователи с консолью
Поль­зовате­ли с кон­солью

По спис­ку фай­лов рута в поль­зователь­ских катало­гах понима­ем, что нам нужен поль­зователь junior.

Файлы рута в пользовательских каталогах
Фай­лы рута в поль­зователь­ских катало­гах

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

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

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

В домаш­нем катало­ге поль­зовате­ля есть документ Using OpenVAS.pdf, который нам нуж­но заг­рузить на свою машину для прос­мотра. Запус­тим на уда­лен­ном хос­те веб‑сер­вер:

python3 -m http.server 5432

А теперь ска­чаем документ:

wget http://greenhorn.htb:5432/Using%20OpenVAS.pdf
Логи веб-сервера
Ло­ги веб‑сер­вера

В докумен­те ска­зано, что запус­тить OpenVAS мож­но толь­ко от име­ни при­виле­гиро­ван­ного поль­зовате­ля, а так­же дана коман­да sudo и пароль. Одна­ко пароль скрыт пик­селиза­цией.

Содержимое скачанного PDF-документа
Со­дер­жимое ска­чан­ного PDF-докумен­та

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

python3 depix.py -p ../pix.png -s images/searchimages/debruinseq_notepad_Windows10_closeAndSpaced.png -o ../depix.png

Это ни к чему не при­вело, поэто­му поп­робу­ем более слож­ный вари­ант — извлечь кар­тинку из PDF, а затем передать ее в Depix.

pdfimages './Using OpenVAS.pdf' red
python3 depix.py -p ../red-000.ppm -s images/searchimages/debruinseq_notepad_Windows10_closeAndSpaced.png -o ../depix.png
Вывод приложения Depix
Вы­вод при­ложе­ния Depix

В ито­ге получа­ем новую кар­тинку depix.png, в которой воз­можно разоб­рать чита­емый текст:

sidefromsidetheothersidesidefromsidetheotherside
Результат депикселизации изображения
Ре­зуль­тат депик­селиза­ции изоб­ражения

Ис­поль­зуем най­ден­ный пароль для сме­ны поль­зовате­ля на root.

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

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