
Уязвимость повышения привилегий в Windows Print Spooler (CVE-2019-1040/CVE-2019-1019) реализована в виде Reflective DLL для тестирования на проникновение.
PrintSpoofer — это инструмент для локального повышения привилегий, использующий уязвимость в службе диспетчера печати Windows (CVE-2019-1040 / CVE-2019-1019). Данный проект реализует эксплойт PrintSpoofer в формате Reflective DLL, что делает его пригодным для использования с фреймворками для тестирования на проникновение, такими как Cobalt Strike.
PrintSpoofer использует уязвимость в службе диспетчера печати Windows, которая позволяет пользователю с низкими привилегиями получить права уровня SYSTEM. Эксплойт злоупотребляет тем, как служба диспетчера печати обрабатывает именованные каналы.
PrintSpoofer работает, выполняя следующие шаги:
Сначала эксплойт проверяет, имеет ли текущий токен привилегию SE_IMPERSONATE_NAME. Она необходима для олицетворения токена другого пользователя.
Создаётся именованный канал с использованием случайного UUID. Путь к каналу:
\\.\pipe\<UUID>\pipe\spoolss
Ожидается асинхронное подключение к созданному именованному каналу. Создаётся событие, и канал подготавливается к приёму входящих подключений.
В отдельном потоке выполняется RPC-вызов к службе диспетчера печати.
Вызывая RpcRemoteFindFirstPrinterChangeNotificationEx, служба пытается подключиться к созданному нами каналу.
Когда служба диспетчера печати (работающая как SYSTEM) подключается к именованному каналу, эксплойт использует ImpersonateNamedPipeClient для олицетворения токена службы.
В результате получаются привилегии SYSTEM.
С токеном SYSTEM теперь можно выполнять действия с высокими привилегиями.
Служба диспетчера печати Windows обрабатывает уведомления о принтерах через именованные каналы. Поскольку служба не проверяет должным образом подключения к каналам, злоумышленник может принудить её подключиться к вредоносному каналу, а затем олицетворить токен SYSTEM.
Проект взаимодействует со службой диспетчера печати, используя протокол MS-RPRN (Print System Remote Protocol). Этот протокол описан в файле IDL (язык описания интерфейсов) и обеспечивает выполнение RPC-вызовов.
Reflective DLL ведёт себя иначе, чем стандартные DLL:
LoadLibraryОткройте файл PrintSpoofer.sln в Visual Studio.
Выберите Платформу решения и Конфигурацию:
x64 или Win32 (в зависимости от целевой архитектуры)Release (продуктовая) или Debug (отладочная)Выполните сборку решения через «Собрать решение» (Ctrl+Shift+B).
Скомпилированная DLL будет расположена по адресу:
PrintSpoofer\x64\Release\PrintSpoofer.dll (для x64)
PrintSpoofer\Win32\Release\PrintSpoofer.dll (для x86)
В проекте используются следующие определения препроцессора:
REFLECTIVE_DLL_EXPORTS: Включает экспортные функции Reflective DLLREFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN: Использует пользовательский DllMainREFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR: Включает LoadRemoteLibraryR (в режиме Release)PrintSpoofer можно использовать с командой elevate в Cobalt Strike:
elevate PrintSpoofer LISTENER_NAME
Где:
PrintSpoofer: Имя модуля повышения привилегийLISTENER_NAME: Слушатель, который примет сессию с повышенными привилегиямиDLL может быть загружена вручную с помощью методов внедрения Reflective DLL.
Успешное выполнение эксплойта покажет:
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] ImpersonateNamedPipeClient OK
[+] Exploit successfully, enjoy your shell
dllmain.cppDllMain)PrintSpoofer.cppms-rprn.idlReflectiveLoader.cppЭтот инструмент предназначен только для образовательных целей и для авторизованного тестирования на проникновение.
Этот проект лицензирован по лицензии MIT. Для получения дополнительной информации см. файл LICENSE.