Эксплуатация уязвимости PrintNightmare
В этой статье рассмотрим эксплуатации уязвимости PrintNightmare, которая позволяет повысить привилегии в Windows с помощью бага в системе печати (CVE-2021-1675). Будем эксплуатировать уязвимость PrintNightmare на примере машины Driver с площадки Hack The Box.
Еще по теме: Эксплуатация уязвимости Microsoft Office CVE-2017-11826
Эксплуатация уязвимости PrintNightmare
Для начала добавим IP-адрес машины в /etc/hosts:
Начнем со сканирования портов. Это стандартная операция при любом пентесте. Сканирование портов позволит определить, какие службы на машине принимают соединение.
Самый популярный сканер — это Nmap. Следующий скрипт улучшит результаты сканирования:
#!/bin/bashnmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция —A).
Скрипт находит четыре открытых порта:
- 80 (HTTP) — веб‑сервер Microsoft IIS/10.0;
- 445 — служба SMB;
- 135 — служба удаленного вызова процедур (Microsoft RPC). Используется для операций контроллер — контроллер и контроллер — клиент;
- 5985 — этот порт отвечает за службу удаленного управления WinRM.
Первым делом я быстренько взглянул на SMB. Моей целью было понять, что данная служба может дать. Сделать это можно командой:
[!]Authenticationerroron driver.htb
Получается, SMB можно временн0 пропустить — без авторизации здесь искать нечего.
С WinRM на данном этапе нам может помочь только брут, а при прохождении заданий с HTB это не круто. Так что давайте смотреть веб.
Первым делом, введем популярные комбинации распространенных логинов и паролей по умолчанию. Сочетание логина и пароляadmin:admin открывает главную страницу сайта.
После быстрого анализа сайта останавливаемся на странице Firmware Updates, на которой находим форму загрузки файлов.
В начале я попытался загрузить исполняемые файлы .exe, но это не принесло ровным счетом ничего. Но есть и другие форматы файлов, которые позволят выполнить определенные операции, хоть их и ограниченное количество. Один из таких форматов — SCF (shell command files).
Файлы SCF можно использовать для операций вроде «Свернуть все окна» или «Открыть проводник Windows». А еще файл SCF может использоваться для доступа к определенному пути UNC, что может привести к утечке пользовательского хеша NetNTLMv2. Это произойдет, потому что Windows попытается аутентифицироваться на этом общем ресурсе, используя имя и пароль пользователя.
Утечка хеша NTLM
Попробуем это проэксплуатировать. Сначала создадим файлSCF @test.scf со следующим содержимым (@ позволит поместить файл вверху списка файлов в каталоге, в данном случае это необязательно).
[Taskbar]Command=ToggleDesktop
Данный файл должен свернуть все окна, это определяет параметр Command в директиве [Taskbar]. Но это нам не важно, так как хитрость кроется в другом: в директиве [Shell] параметр IconFile указывает UNC-путь к иконке файла. Именно это и заставит удаленный хост попытаться авторизоваться на нашем ресурсе.
Получить аутентификационные данные целевого пользователя при подключении к нашему SMB-ресурсу можно с помощью Responder. Давайте активируем наш «отлавливатель», а затем загрузим упомянутый файл.
Отловленный хеш пароля пользователя Tony
И получаем желанный хеш, который теперь нужно взломать. Я для этих целей обычно использую hashcat, но этой программе нужно указать тип хеша. К счастью, в справке уже все указано и нам нужно лишь найти подходящий номер. Для этого мы отображаем пример всех видов хешей и отбираем тот, где встречается NetNTLMv2.
hashcat --example | grep -A 2 -B 2 NTLM
Пример NTLM-хешей, полученных в hashcat
Мы узнаем режим: 5600. К тому же нам показывают хеш, который визуально по структуре похож на тот, что мы получили в Responder. А теперь пришло время этот хеш перебрать. Для перебора будем использовать все тот же hashcat со следующими аргументами:
- -a 0 — режим перебора, нулевой означает по словарю;
- -m [] — режим, тут указываем тип хеша, полученный ранее;
- ksven.hash — файл, в котором записан хеш или хеши;
- rockyou.txt — словарь с возможными паролями.
hash rockyou.txtРезультат взлома хеша, представленный hashcat
В итоге hashcat очень быстро находит пароль. Мы можем сразу же проверить его в службах WinRM и SMB с помощью crackmapexec.
crackmapexecwinrm driver.htb -u tony -p liltony
Учетные данные подошли к службе WinRM, поэтому и мы получили стабильный доступ. Для доступа заюзаем оболочку Evil-WinRM.
evil-winrm -i driver.htb -u tony -p liltony
Локальное повышение привилегий
Мы получили флаг пользователя, так что теперь наша задача — добыть администраторские привилегии. Первым делом можно проверить информацию о системе (командаsysteminfo) и о текущем пользователе (whoami /all), а также получить список запущенных процессов (командыtasklist илиps).
Список запущенных процессов
В системе работает процесс службы печати spoolsv.exe. Служба Windows Print Spooler — это универсальный интерфейс между ОС, приложениями и локальными или сетевыми принтерами. Она позволяет разработчикам приложений отправлять задания на печать. Проверим ее работу через службу RPC удаленно:
rpcdump.py @driver.htb | egrep 'MS-RPRN|MS-PAR'
Проверка работы службы печати
На ум сразу приходит недавняя нашумевшая уязвимость CVE-2021-1675, она же PrintNightmare. Баг кроется в вызове RpcAddPrinterDriver диспетчера очереди печати Windows. Клиент использует вызов RPC для добавления драйвера на сервер, сохраняя его в локальном или удаленном каталоге SMB. После чего клиент инициализирует объект DRIVER_CONTAINER, используемый в вызове RpcAddPrinterDriver, для загрузки драйвера.
Драйвер может содержать произвольный код, который будет выполняться на сервере с правами SYSTEM. Команду может выполнить любой пользователь, прошедший аутентификацию в службе диспетчера очереди печати. Проще говоря, имея минимальные привилегии, мы можем выполнить любую DLL от имени SYSTEM.
На GitHub уже достаточно эксплоитов для этой уязвимости, реализованных на разных языках и выполняющих разные функции. К примеру, есть эксплоит, который создаст нового пользователя‑администратора. Скачаем его на локальный хост и из каталога с эксплоитом повторим подключение с помощью Evil-WinRM. Только в этот раз будем указывать параметр -s, что поможет нам легко загрузить в память скрипт на PowerShell.
evil-winrm -i driver.htb -u tony -p liltony -s .
После подключения лучше вызвать команду menu и запатчить AMSI командой Bypass-4MSI.
Затем загружаем скрипт в память и вызываем единственную функцию Invoke-Nightmare.
Invoke-Nightmare -NewUser "ralf" -NewPassword "ralf"
Эксплуатация PrintNightmare
Подключаемся с учетными данными нового пользователя и забираем флаг администратора.
- Канал о хакинге: /me Hacker
- Канал о кодинге: the Coding
- Теневой канал: DarkTron