LPE и семья картошек
Как работает семейство уязвимостей известных как "Potatoes" и как обнаружить эксплуатацию
Last updated
Как работает семейство уязвимостей известных как "Potatoes" и как обнаружить эксплуатацию
Last updated
Локальное повышение привилегий (Local Privilege Escalation, LPE) — это одна из ключевых техник, используемых злоумышленниками для получения контроля над системами. Если атакующий уже имеет доступ к системе с ограниченными правами, его следующей целью часто становится повышение привилегий до уровня администратора или даже SYSTEM.
Семейство уязвимостей, известных как "Potatoes" (например, Hot Potato, Juicy Potato, MultiPotato, Remote Potato, Rogue Potato, Silver Potato, GodPotato), представляет собой набор техник, которые активно используются для локального повышения привилегий в операционных системах Windows.
История семейства уязвимостей "Potatoes" началась в 2016 году с Hot Potato. Далее патчи от Microsoft заставляли "картошки" эволюционировать с такой скоростью, что уже никто точно не знает сколько их. Но общая схема повышения привилегий остается неизменной:
Заставить аккаунт NT AUTHORITY\SYSTEM (или NT AUTHORITY\NETWORK SERVICE) авторизоваться на некотором эндпоинте, который контролирует атакующий.
Перехватить авторизацию и получить токен системы.
Имперсонировать токен, используя привилегию SeImpersonatePrivilege или ее аналог SeAssignPrimaryTokenPrivilege.
SeImpersonatePrivilege — это привилегия, которая позволяет процессу имитировать токен другого пользователя. Это ключевой элемент для эксплуатации уязвимостей "Potatoes". Обычно этой привилегией обладает сервисная учетная запись, от имени которой запущен веб-сервис или сервис базы данных. Именно поэтому эксплуатация уязвимости "картошка" часто является следующим шагом после RCE - получения возможности исполнить код через уязвимый сервис.
Также для понимания техник нужно представлять, что существуют COM-объекты, понимать, что они могут взаимодействовать между собой. И у каждого COM-объекта есть уникальный идентификатор – CLSID.
Первая "картошка" появилась в 2016 году. HotPotato использовала WPAD, чтобе перехватить и перенаправления NTLM-аутентификацию на локальный адрес (127.0.0.1). Это позволяло получить токен SYSTEM.
В том же 2016 году появилась RottenPotato, которая использовала механизмы DCOM/RPC для получения токена SYSTEM. Она стала улучшенной версией HotPotato, так как не зависела от WPAD. Вызовом API RottenPotato просила активировать DCOM-объект BITS и обратиться за ним на свой RCP-лисенер 127.0.0.1:6666. Процесс, принимающий локальные соединения на порту 6666 и мог стать хорошим индикатором этого инструмента (Event ID 5156, Sysmon 3)
В 2018 году JuicyPotato стала новой версией RottenPotato. Она позволяла выбирать CLSID и порт RPC-сервера, что делало её более универсальной.
Как атакующий выбирает COM-компонент:
Запущен от привилегированного пользователя, NT AUTHORITY\SYSTEM – этот токен атакующий и крадет
Может быть активирован текущим пользователем
Поддерживает маршалинг интерфейсов (механизм обмена данными между COM-объектами, нужно при активации)
Тут правила обнаружения становятся уже сложнее, но более универсальными:
COM-объект (обычно процесс svchost.exe) открывает соединение на локальный (127.0.0.1) порт (по умолчанию 10247). Если посмотреть на командную строку запуска этого процесса, то можно определить используемый CLSID. Наример C:\WINDOWS\system32\svchost.exe -k print -s PrintNotify - это {854A20FB-2D44-457D-992F-EF13785D2B51}.
Некоторый процесс (это эксплоит-картошка) принимает это соединение - тот же самый порт.
Процесс, принимающий соединение, запускает дочерний процесс, уже в привилегированной сессии.
Microsoft выпустила обновления, которые ограничили возможность выбора портов и CLSID для локального OXID-резолвера.
OXID-резолвер – если очень просто, это сервис Windows используемый COM-объектами, который разрешает OXID-объекты в некоторые строковые значения и позволяет тем самым с ними взаимодействовать. Можете думать о резолвере OXID, как о DNS для DCOM.
В 2020 году появилась RoguePotato, которая использовала удаленный OXID-резолвер для обхода ограничений JuicyPotato. То есть атакующему для эксплуатации нужен был еще один подконтрольный сервер внутри периметра, куда эксплоит просит COM-объект обратиться. Там запрос перенаправляется на поддельный OXID-резолвер, который говорит атакуемому объекту подключиться к подконтрольному именованному каналу.
В качестве эндпоинта для перехватат токена, RouguePotato использует именованный канал. По умолчанию \\roguepotato\pipe\epmapper
, но часть сroguepotato
можно задать произвольную. В этот момент можно увидеть попытки авторизации с машинной учетной записью атакованного узла. И обращение к именованному каналу \\roguepotato\pipe\epmapper
(Event ID 5145).
Далее все происходит по той же схеме, используя «SeImpersonatePrivilege» атакующий крадет токен NT AUTHORITY\NETWORK SERVICE.
То есть правила обнаружения немного изменились:
Часть с удаленным OXID-резолвером можно опустить. Она заключается в том, что некоторый систменый процесс открывает соединение на удаленный узел, а потом процесс-эксплоит принимает соединение с того же узла. При этом нет совпадений ни по портам, ни по чему, поэтому это можно использовать как вспомогательное правило, но не основное.
Процесс-эксплоит создает именованный канал - поддельный epmapper
Sysmon 17.
Индикатором может стать создание именованных каналов вида *\pipe\epmapper
.
При обращении COM-компонента на этот канал, регистрируется событие Event ID 5145, доступ с локалхоста, от имени NT AUTHORITY\NETWORK SERVICE.
Подлкючение осуществляется к IPC$ к *\pipe\epmapper
.
Как и ранее, от процесса-эксплоита стартует процесс в уже привилегированной сессии.
Тут наступила эра различных "удаленных" картошек, для работы которых нужен был еще один подконтрольный сервер внутри периметра, чтобы осуществлять Relay. То есть сценарии в этом период времени были довольно ограниченные, атакующие не могли просто пробить сервис на периметре и поднять привилегии.
И на самом деле ни RemotePotato, ни MultiPotato не являются полноценными картошками.
Принцип работы MultiPotato очень похож на предыдущий. Токен крадется при подключении к подконтрольному именованному каналу. По умолчанию используется \\.\pipe\pwned/pipe/srvsvc
, но имя также можно изменить параметром -p.
Но в MultiPotato не реализован триггер авторизации SYSTEM, то есть не используются COM-объекты и OXID-резолверы. Атакующий может интегрировать любой другой способ принудительной авторизации, например модифицированный PetitPotam, который заставит машинную учетную запись обратиться на нужный именованный канал. Атакующему также необходимо присутствовать во внутренней сети.
А интересна эта реализация «картошки» тем, что помимо старта процесса предлагает из коробки другие способы использования токена: создать нового пользователя или открыть BIND-шелл. То есть в этих случаях в логах мы не увидим характерного для LPE через манипуляцию токенами события старта процесса.
RemotePotato, использует NTLM-релей без необходимости привилегии SeImpersonatePrivilege. Потому что ее идея не в краже токена и имперсонализации, а в том, чтобы перехватить NTLM или осуществить релей на внешний сервис (SMB, HTTP, LDAP…).
Несмотря на то, что под капотом многое изменилось, используются другие «особенности» Windows, принципиально подход остался тем же. Как и способ обнаружение (совпадает с оригинальной JuicyPotato).
GodPotato появилась в 2022 году как улучшенная версия JuicyPotato. Она также использует механизмы COM/DCOM (просто новые недостатки rpcss), привилегию SeImpersonatePrivilege для подмены токенов, но еще и именованный канал *\pipe\epmapper
.
Поддерживает больше CLSID, чем JuicyPotato.
Может работать на системах, где JuicyPotato уже неэффективна.
Обнаруживается все также: Sysmon 17, Event ID 5145, старт привилегированного процесса.
Использует уязвимость в локальной NTLM-аутентификации, благодаря чему от атакуемого процесса получает доступ на запись в любые общие сетевые ресурсы, включая C$ и ADMIN$. А дальше, уже комбинируя этот доступ с другими техниками, атакующий получает повышенные привилегии. Оригинальный эксплоит, например, подменяет библиотеку PrintConfig.dll
на свою вредоносную библиотеку, которая исполняется службой печати.
Кстати, LocalPotato не требует наличия привилегии SeImpersonatePrivilege или SeAssignPrimaryTokenPrivilege.
TBD...
В 2022 году появилась JuicyPotatoNG, которая вернула возможность локальной эксплуатации, используя новые уязвимости в механизмах COM. Вдохновителем стало , которое показало, что атаку снова можно проводить локально.