stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу, как регистрировать системные вызовы в Linux, что поможет нам перехватить данные пользователя. Но на пути к системе нам понадобится заюзать SSRF на сайте через X-Skipper-Proxy и установить свой модуль в CMS Blazor.
Наша цель — получение прав суперпользователя на машине Lantern с учебной площадки Hack The Box. Уровень задания — сложный.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел три открытых порта:
Главная страница сайта
Описание вакансий
Также находим форму отправки резюме.
Форма отправки файла
На порте 3000 нас встречает форма авторизации.
Форма авторизации
Если просмотреть историю запросов в Burp History, заметим много запросов, типичных для CMS Для просмотра ссылки Войдиили Зарегистрируйся. С этой системой я уже сталкивался, когда писал райтап по Для просмотра ссылки Войди или Зарегистрируйся.
Burp History
Осмотрев сайты, углубимся в изучение найденных продуктов. У нас есть Skipper Proxy и Blazor, начнем с первого. Сначала стоит проверить, есть ли для обнаруженной версии CMS актуальные эксплоиты.
Поиск эксплоитов в Google
Из Google узнаём, что Skipper Proxy 0.13.237 уязвим к Для просмотра ссылки Войдиили Зарегистрируйся. Как сказано в Для просмотра ссылки Войди или Зарегистрируйся, можно эксплуатировать SSRF для доступа к внутренним ресурсам, просто указав адрес ресурса в заголовке X-Skipper-Proxy.
Описание эксплоита
Перейдем в Burp Repeater и добавим заголовок X-Skipper-Proxy: Для просмотра ссылки Войдиили Зарегистрируйся.
Эксплуатация SSRF
Сервер отдаст нам содержимое сайта на порте 3000, что подтверждает наличие уязвимости.
Burp Repeater — вкладка Positions
Burp Repeater — вкладка Payloads
Сортируем результаты сканирования по коду ответа и получаем четыре открытых порта для адреса 127.0.0.1.
Результаты сканирования
Порт 5000 отвечает за технологию Blazor, а значит, через SSRF мы можем получить доступ к файлу /_framework/blazor.boot.json, который содержит информацию обо всех загружаемых сборках.
Содержимое файла blazor.boot.json
Из всех сборок наиболее интересна кастомная библиотека InternaLantern.dll, в которой, видимо, и реализованы основные возможности. Нам нужно ее скачать, и для этого обратимся к файлу через специальный прокси. Для этого в контекстном меню переходим к Request in browser → In current browser session.
Запрос в Burp Repeater
Получаем ссылку, по которой нужно перейти в браузере Burp. В результате получаем скачанную библиотеку.
Ссылка на страницу
Скачанный DLL-файл
Так как библиотека написана на C#, мы можем декомпилировать исходный код для анализа. В этом нам поможет бесплатная утилита Для просмотра ссылки Войдиили Зарегистрируйся. В исходном коде среди перечисления данных о пользователях находим длинные строки в Base64.
Исходный код InternaLantern.Pages
При декодировании первой строки получаем данные пользователя, в том числе и описание.
Результат декодирования Base64
Декодируем все строки из файла и получаем пароль пользователя admin.
Данные пользователей
С этими учетными данными заходим на основной сайт.
Главная страница сайта
Форма загрузки файлов
Структура файлов
Просмотрим основной файл app.py. Мое внимание привлек эндпоинт /PrivacyAndPolicy, который принимает параметры lang и ext и использует их в формировании пути без какой‑либо фильтрации (строки 38–45).
Содержимое файла app.py
То есть на сервере есть уязвимость, позволяющая получить содержимое произвольного файла. Для проверки получим содержимое файла /etc/passwd.
Для просмотра ссылки Войдиили Зарегистрируйся
Содержимое файла /etc/passwd
Раскрутить эту уязвимость не вышло, поэтому я обратил внимание на функцию использования модулей. Если изменить стандартный модуль Logs на любой произвольный, то получим ошибку, раскрывающую путь к компонентам.
Ошибка загрузки модуля
Получается, что, если загрузить в каталог свой модуль, его можно будет подключить в программу. Отловим запрос на загрузку файла evil.dll в Burp Proxy.
Burp Proxy — запрос на сервер
Данные передаются в сериализованном виде, поэтому просто изменить их не получится. Для десериализации и сериализации данных будем использовать расширение Для просмотра ссылки Войдиили Зарегистрируйся.
Установка расширения
Blazor Traffic Processor
Имя загружаемого файла передается в параметре name. Сделаем свой компонент и повторим загрузку. Для этого сперва создадим проект.
Создание проекта
Теперь перейдем к файлу Class1.cs внутри проекта и изменим код. Наш модуль будет считывать и выводить на страницу приватный ключ пользователя tomas (о нем узнали из файла /etc/passwd).
Осталось добавить необходимые компоненты AspNetCore и собрать нашу DLL.
Релиз проекта
Повторяем загрузку файла, на моменте десериализации данных изменяем путь загрузки файла и выполняем повторную сериализацию.
Сериализация данных
Применяем сериализованные данные в Burp Proxy и отправляем остановленный ранее запрос. Файл успешно загружен по указанному пути.
Результат загрузки файла
Переходим к панели администратора и указываем имя модуля. В ответе сервера получаем приватный SSH-ключ пользователя.
SSH-ключ
С этим ключом авторизуемся по SSH и читаем первый флаг.
Для просмотра ссылки Войдиили Зарегистрируйся
sudo -l
Настройки sudoers
Судя по содержимому файла sudoers, мы можем выполнить команду /usr/bin/procmon в привилегированном контексте без ввода пароля. Проверим тип файла /usr/bin/procmon и узнаем, что это исполняемый ELF.
Проверка файла procmon
Справка дает понять, что это аналог Process Monitor для Windows, только в Linux.
Справка procmon
Таким образом, запуская приложение через sudo, мы можем просматривать системные вызовы (параметр -e) для любого процесса на хосте. Давай выберем процесс для отслеживания. Меня заинтересовал nano /root/automation.sh.
Список процессов
Процесс постоянно завершается и запускается заново, поэтому его PID меняется. Запустим procmon и укажем ему, что нужно собирать системный вызов write у процесса с PID 909 и сохранять лог в базу данных db.db.
Отслеживание процесса через procmon
Минуты через две завершаем программу и забираем базу данных на свой хост для анализа.
Логи после завершения procmon
Сразу обращаем внимание, что встречаются вызовы с большой задержкой (duration) и перехваченные данные немного отличаются.
Данные вызова с малой задержкой
Данные вызова с большой задержкой
Я написал SQL-запрос, который извлекает из каждого вызова с большой задержкой (duration > 100000000) девятый символ. Позже запрос подкорректировал, так как девятым может идти пробел, в этом случае будем брать десятый.
Результат выполнения запроса
И получаем введенный в nano текст: echo Q3Eddtdw3pMB | sudo ./backup.sh. У нас есть пароль рута, и ничто не мешает забрать последний флаг.
Флаг рута
Машина захвачена!
Наша цель — получение прав суперпользователя на машине Lantern с учебной площадки Hack The Box. Уровень задания — сложный.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.29 lantern.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 8.9p1;
- 80 — веб‑сервер Skipper Proxy;
- 3000 — веб‑сервер Kestrel.

Точка входа
На сайте на 80-м порте находим интересную информацию о команде разработчиков. Можно сделать выводы об используемых технологиях.
Также находим форму отправки резюме.

Форма отправки файла
На порте 3000 нас встречает форма авторизации.

Форма авторизации
Если просмотреть историю запросов в Burp History, заметим много запросов, типичных для CMS Для просмотра ссылки Войди

Burp History
Осмотрев сайты, углубимся в изучение найденных продуктов. У нас есть Skipper Proxy и Blazor, начнем с первого. Сначала стоит проверить, есть ли для обнаруженной версии CMS актуальные эксплоиты.

Поиск эксплоитов в Google
Из Google узнаём, что Skipper Proxy 0.13.237 уязвим к Для просмотра ссылки Войди

Перейдем в Burp Repeater и добавим заголовок X-Skipper-Proxy: Для просмотра ссылки Войди

Сервер отдаст нам содержимое сайта на порте 3000, что подтверждает наличие уязвимости.
Точка опоры
Перенаправляем запрос в Burp Repeater для перебора портов через SSRF. Так мы сможем узнать о работающих внутренних сервисах.
Burp Repeater — вкладка Positions

Burp Repeater — вкладка Payloads
Сортируем результаты сканирования по коду ответа и получаем четыре открытых порта для адреса 127.0.0.1.

Порт 5000 отвечает за технологию Blazor, а значит, через SSRF мы можем получить доступ к файлу /_framework/blazor.boot.json, который содержит информацию обо всех загружаемых сборках.

Из всех сборок наиболее интересна кастомная библиотека InternaLantern.dll, в которой, видимо, и реализованы основные возможности. Нам нужно ее скачать, и для этого обратимся к файлу через специальный прокси. Для этого в контекстном меню переходим к Request in browser → In current browser session.

Запрос в Burp Repeater
Получаем ссылку, по которой нужно перейти в браузере Burp. В результате получаем скачанную библиотеку.

Ссылка на страницу

Скачанный DLL-файл
Так как библиотека написана на C#, мы можем декомпилировать исходный код для анализа. В этом нам поможет бесплатная утилита Для просмотра ссылки Войди

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

Результат декодирования Base64
Декодируем все строки из файла и получаем пароль пользователя admin.

Данные пользователей
С этими учетными данными заходим на основной сайт.

Продвижение
Можно загружать на сайт файлы, а также смотреть содержимое каталогов и файлов.
Форма загрузки файлов

Структура файлов
Просмотрим основной файл app.py. Мое внимание привлек эндпоинт /PrivacyAndPolicy, который принимает параметры lang и ext и использует их в формировании пути без какой‑либо фильтрации (строки 38–45).

Содержимое файла app.py
То есть на сервере есть уязвимость, позволяющая получить содержимое произвольного файла. Для проверки получим содержимое файла /etc/passwd.
Для просмотра ссылки Войди

Содержимое файла /etc/passwd
Раскрутить эту уязвимость не вышло, поэтому я обратил внимание на функцию использования модулей. Если изменить стандартный модуль Logs на любой произвольный, то получим ошибку, раскрывающую путь к компонентам.

Ошибка загрузки модуля
Получается, что, если загрузить в каталог свой модуль, его можно будет подключить в программу. Отловим запрос на загрузку файла evil.dll в Burp Proxy.

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


Имя загружаемого файла передается в параметре name. Сделаем свой компонент и повторим загрузку. Для этого сперва создадим проект.
Код:
mkdir evil
cd evil
dotnet new classlib -n exploit

Создание проекта
Теперь перейдем к файлу Class1.cs внутри проекта и изменим код. Наш модуль будет считывать и выводить на страницу приватный ключ пользователя tomas (о нем узнали из файла /etc/passwd).
Код:
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Rendering;
using System.IO;
namespace exploit;
public class Component : ComponentBase
{
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
string file = File.ReadAllText("/home/tomas/.ssh/id_rsa");
builder.AddContent(0, file);
}
}
Код:
cd exploit
dotnet add package Microsoft.AspNetCore.Components --version 6.0.0
dotnet add package Microsoft.AspNetCore.Components.Web --version 6.0.0
dotnet build -c release

Релиз проекта
Повторяем загрузку файла, на моменте десериализации данных изменяем путь загрузки файла и выполняем повторную сериализацию.

Применяем сериализованные данные в Burp Proxy и отправляем остановленный ранее запрос. Файл успешно загружен по указанному пути.

Результат загрузки файла
Переходим к панели администратора и указываем имя модуля. В ответе сервера получаем приватный SSH-ключ пользователя.

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

Настройки sudoers
Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи командыsudo -l.
Судя по содержимому файла sudoers, мы можем выполнить команду /usr/bin/procmon в привилегированном контексте без ввода пароля. Проверим тип файла /usr/bin/procmon и узнаем, что это исполняемый ELF.
file /usr/bin/procmon

Справка дает понять, что это аналог Process Monitor для Windows, только в Linux.

Справка procmon
Таким образом, запуская приложение через sudo, мы можем просматривать системные вызовы (параметр -e) для любого процесса на хосте. Давай выберем процесс для отслеживания. Меня заинтересовал nano /root/automation.sh.

Список процессов
Процесс постоянно завершается и запускается заново, поэтому его PID меняется. Запустим procmon и укажем ему, что нужно собирать системный вызов write у процесса с PID 909 и сохранять лог в базу данных db.db.
sudo /usr/bin/procmon -e write -p 909 -c db.db

Минуты через две завершаем программу и забираем базу данных на свой хост для анализа.

Логи после завершения procmon
Сразу обращаем внимание, что встречаются вызовы с большой задержкой (duration) и перехваченные данные немного отличаются.


Я написал SQL-запрос, который извлекает из каждого вызова с большой задержкой (duration > 100000000) девятый символ. Позже запрос подкорректировал, так как девятым может идти пробел, в этом случае будем брать десятый.
Код:
SELECT GROUP_CONCAT(
CASE
WHEN hex(substr(arguments, 9, 1)) = '20' THEN substr(arguments, 10, 1)
ELSE substr(arguments, 9, 1)
END,'') as data
FROM ebpf where duration > 100000000;

И получаем введенный в nano текст: echo Q3Eddtdw3pMB | sudo ./backup.sh. У нас есть пароль рута, и ничто не мешает забрать последний флаг.

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