Хакер - HTB Faculty. Атакуем веб-сервер через mPDF и повышаем привилегии с помощью Linux capabilities
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Сканирование веб контента
- Точка входа
- Точка опоры
- Продвижение
- Локальное повышение привилегий
В этом райтапе я покажу, как использовать обход авторизации через SQL-инъекцию, затем мы проэксплуатируем mPDF и повысим привилегии на сервере через систему Linux capabilities, а конкретно — через возможность cap_sys_ptrace.
Полировать свои навыки мы будем при помощи тренировочного стенда Faculty с площадки Hack The Box. Уровень сложности заявлен как средний.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.169 faculty.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Сканирование веб контента
Попробуем поискать скрытые каталоги и файлы при помощи ffuf.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-u— URL;-w— словарь (я использую словари из набора SecLists);-t— количество потоков;-r— выполнять редиректы;-fs— фильтровать страницы по размеру.
Запускаем с нужными параметрами:
ffuf -u 'http://faculty.htb/FUZZ' -r -w php_files_common.txt -t 256

Ничего интересного не находим, поэтому пройдемся по доступным каталогам.
ffuf -u 'http://faculty.htb/FUZZ' -r -w directory_2.3_medium.txt -t 256

Находим каталог admin и повторяем сканирование файлов в нем.

ffuf -u 'http://faculty.htb/admin/FUZZ' -r -w php_files_common.txt -t 256
Самая интересная из найденных страниц — авторизация для админов.

ТОЧКА ВХОДА
Работать с вебом я рекомендую через Burp Proxy. Посмотрим запрос и ответ при авторизации. Узнаем, что в случае неверной пары из логина и пароля в ответе просто получим цифру 3.

Если есть форма авторизации, значит, нужно попробовать все варианты ее обхода. Я это делаю по словарю с помощью Burp Intruder.

Находим несколько нагрузок c вариантами ответа 3. При этом ошибка SQL раскрывает путь к файлу.

Также присутствуют ответ 1. Скорее всего, это показатель успешной авторизации.

Используем найденную нагрузку и заходим на сайт.

Посмотрим, что здесь есть интересного. К примеру, уязвимой может быть технология формирования отчета в формате PDF.


Снова смотрим цепочку запросов в Burp Proxy. Видим, что отправляется запрос с параметром pdf, где передаются закодированные в Base64 данные. Затем нас редиректит на страницу /mpdf/tmp/<doc>.pdf.

Burp Inspector позволяет нам автоматически декодировать эти данные.

Видим, что передается таблица в HTML. Скорее всего, используется какая‑то уже готовая технология преобразования формата, а в пути указан каталог mpdf. Тогда я решил найти эту технологию по ключевому слову. Однако сразу же нашел готовый эксплоит.

ТОЧКА ОПОРЫ
Уязвимость в mPDF позволяет получать произвольные файлы с удаленного хоста в качестве вложения в сгенерированном PDF-документе. Составим нагрузку, использовав найденный эксплоит. Для теста попробуем прочитать файл /etc/passwd.

Полученную нагрузку отправляем в параметре pdf.

В ответе получаем имя созданного файла. В адресной строке на странице полученного ранее документа заменяем имя файла. В новом файле видим вложение /etc/passwd.


Так как мы получили возможность читать файлы, теперь нужно получить файл с важными данными. К примеру, это может быть файл с настройками для подключения к базе данных. До этого при сканировании мы обнаружили db_connect.php, а путь к каталогу, где он содержится, раскрыла полученная ранее ошибка SQL. Генерируем новую нагрузку для такого пути:
/var/www/scheduling/admin/db_connect.php
Отправляем ее и во вложении сгенерированного PDF видим учетные данные.

Берем пароль для подключения к базе данных, а имя пользователя — из файла passwd и авторизуемся по SSH.

ПРОДВИЖЕНИЕ
Теперь, когда мы получили доступ к хосту, нужно собрать информацию для дальнейшего продвижения. Я для этого использую скрипты PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим скрипт на хост, дадим право на выполнение и запустим сканирование. Из вывода скрипта узнаем, что он не смог получить настройки sudoers, так как требуется ввести пароль, а также у отладчика GDB должна быть системная возможность cap_sys_ptrace.


Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.
Так как настройки sudoers мы не получили, запросим их вручную и введем пароль.
sduo -l

Оказывается, мы можем выполнить команду /usr/local/bin/meta-git от имени пользователя developer. Я сразу решил поискать публичные эксплоиты. В этом нам поможет Google.

В итоге обнаружился публичный отчет на HackerOne, где описан способ получить удаленное выполнение кода. Как сказано в отчете, пользовательский ввод без предварительной проверки используется при формировании и выполнении команды ОС, поэтому мы можем устроить инъекцию. Для теста выполним команду id.
sudo -u developer /usr/local/bin/meta-git clone 'qweqwe | id'

Команда выполняется, давай попробуем получить приватный ключ пользователя, если такой имеется.
sudo -u developer /usr/local/bin/meta-git clone 'qweqwe | cat /home/developer/.ssh/id_rsa'

Получаем ключ, командой chmod 0600 id_rsa назначаем нужные права и подключаемся как пользователь developer.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Команда id показала, что мы находимся в группе debug, при этом не забываем про возможность CAP_SYS_PTRACE у файла gdb.
Справка: Linux capabilities
В Linux пользователь root получает особый контекст при запуске любых процессов. Так, ядро и приложения, работающие от имени root, обычно пропускают любые ограничения, заданные на действия в определенном контексте, поэтому root может делать все, что захочет. Но что, если определенному процессу, который работает в непривилегированном контексте, нужно выполнить требующее привилегий действие, не повышая уровня прав?
Например, бывает нужно разрешить процессу записывать в журнал аудита ядра, но не позволять отключить этот аудит. Ведь если запустить этот процесс в контексте рута, он сможет выполнить оба действия!
Тут на помощь и приходят Linux capabilities. Эти «возможности» предоставляют процессу не все множество привилегий, а какое‑то его подмножество. Другими словами, все привилегии рута разбиваются на более мелкие независимые друг от друга привилегии и процесс получает только те, которые ему нужны.
CAP_SYS_PTRACE позволяет трассировать произвольные процессы с помощью ptrace. А в сочетании с группой debug мы сможем отладить с помощью GDB любой привилегированный процесс. И в списке процессов отмечаем работающий python3.
ps aux

Подключимся к нему с помощью gdb.
gdb -p 706

А теперь попытаемся выполнить команду с помощью функции system. Попробуем создать файл в домашнем каталоге пользователя.
call (void)system("touch /home/developer/qweewqqweewq")


Команды выполнена, используем один из методов персистентности. К примеру, запись публичного ключа SSH в файл authorized_keys. Сперва создадим каталог .ssh, а затем скопируем ключ уже имеющегося у нас пользователя.
call (void)system("mkdir /root/.ssh")
call (void)system("cp /home/developer/.ssh/id_rsa.pub /root/.ssh/authorized_keys")

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

Машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei