
Эксплойт доказательства концепции для локального повышения привилегий в Windows (CVE-2023-21746), использующий уязвимость локальной аутентификации NTLM для получения привилегий SYSTEM через доступ к общим ресурсам SMB и перехват DLL.
Уязвимость локального повышения привилегий (LPE) в Windows была сообщена Microsoft 9 сентября 2022 года Андреа Пьерини (@decoder_it) и Антонио Кокомацци (@splinter_code). Уязвимость позволяла злоумышленнику с учётной записью с низкими привилегиями на хосте читать/записывать произвольные файлы с привилегиями SYSTEM.
Хотя сама по себе уязвимость не позволяет напрямую выполнять команды как SYSTEM, мы можем скомбинировать её с несколькими векторами для достижения этого результата. Удачно, что 13 февраля другой PoC для повышения привилегий был опубликован BlackArrowSec, который злоупотребляет службой StorSvc, позволяя злоумышленнику выполнять код с правами SYSTEM, если он может записать DLL-файл в любой каталог, находящийся в PATH.
PoC LocalPotato использует недостаток в особом случае аутентификации NTLM, называемом локальной аутентификацией NTLM, чтобы обмануть привилегированный процесс, заставив его аутентифицировать сеанс, который злоумышленник начинает против локального SMB-сервера. В результате злоумышленник получает соединение, которое предоставляет ему доступ к любым общим ресурсам с привилегиями обманутого процесса, включая специальные общие ресурсы, такие как C$ или ADMIN$.
Процесс, выполняемый эксплойтом, выглядит следующим образом:
Имея привилегированное соединение с общими ресурсами SMB, злоумышленник может читать или записывать файлы на целевой машине в любом расположении. Хотя это не позволит нам напрямую выполнять команды на уязвимой машине, мы скомбинируем это с другим вектором атаки для достижения этой цели.
Обратите внимание, что уязвимость находится в протоколе NTLM, а не в SMB-сервере, поэтому этот же вектор атаки теоретически может быть использован против любой службы, использующей аутентификацию через NTLM. Однако на практике необходимо учитывать некоторые особенности при выборе протокола для атаки. PoC использует SMB-сервер, чтобы избежать некоторых дополнительных мер защиты, действующих для других протоколов против аналогичных векторов атак, и даже реализует быстрый обход для работы эксплойта против SMB-сервера. Пост автора оригинального эксплойта - (https://decoder.cloud/2023/02/13/localpotato-when-swapping-the-context-leads-you-to-system/)
До сих пор мы использовали LocalPotato для записи произвольных файлов на целевую машину. Чтобы получить привилегированную оболочку, нам всё ещё нужно выяснить, как использовать произвольную запись для выполнения команды.
Недавно был найден ещё один вектор повышения привилегий, где злоумышленник может перехватить отсутствующую DLL для выполнения произвольных команд с привилегиями SYSTEM. Единственная проблема с этим вектором заключалась в том, что злоумышленнику нужно было записать DLL в PATH системы, чтобы его запустить. По умолчанию PATH в Windows включает только каталоги, в которые могут записывать только привилегированные учётные записи. Хотя возможно найти машины, где установка определённых приложений изменила переменную PATH и сделала машину уязвимой, этот вектор атаки применим только в определённых сценариях. Комбинирование этой атаки с LocalPotato позволяет нам преодолеть это ограничение и получить полностью работающий эксплойт для повышения привилегий.
Как обнаружили BlackArrowSec (https://github.com/blackarrowsec/redteam-research/tree/26e6fc0c0d30d364758fa11c2922064a9a7fd309/LPE via StorSvc), злоумышленник может отправить RPC-вызов метода "SvcRebootToFlashingMode", предоставляемого службой "StorSvc", что, в свою очередь, приведёт к попытке загрузить отсутствующую DLL с именем "SprintCSP.dll". Если вы не знакомы с RPC, думайте о нём как об API, который предоставляет функции для удалённого использования. В данном случае служба StorSvc предоставляет метод SvcRebootToFlashingMode, который может вызвать любой, у кого есть доступ к машине. Поскольку StorSvc работает с привилегиями SYSTEM, создание SprintCSP.dll где-либо в PATH приведёт к её загрузке при каждом вызове SvcRebootToFlashingMode.
Ссылка на эксплойт - (https://github.com/decoder-it/LocalPotato)
Чтобы использовать этот эксплойт, вам сначала нужно скомпилировать оба предоставленных файла:
Давайте начнём с "RpcClient.exe". Как упоминалось ранее, нам нужно будет изменить эксплойт в зависимости от версии Windows целевой машины. Для этого нам нужно изменить первые строки файла "LPE via StorSvc\RpcClient\RpcClient\storsvc_c.c", чтобы была выбрана правильная операционная система. Это установит эксплойту правильный идентификатор интерфейса RPC. Теперь, когда код исправлен, давайте откроем командную строку разработчика и соберём проект, выполнив следующую команду: Команды: C:\LPE via StorSvc\RpcClient> msbuild RpcClient.sln C:\LPE via StorSvc\RpcClient> move x64\Debug\RpcClient.exe C:\Users\user\Desktop\ (Скомпилированный исполняемый файл будет найден на вашем рабочем столе.)
Теперь для компиляции "SprintCSP.dll" нам нужно только изменить функцию "DoStuff()" в файле "C:\LPE via StorSvc\SprintCSP\SprintCSP\main.c", чтобы она выполняла команду, предоставляющую нам привилегированный доступ к машине. Для простоты мы заставим DLL добавить нашего текущего пользователя в группу "Администраторы". Мы также можем получить обратную оболочку с этой цели на нашу машину. Теперь компилируем DLL, выполнив следующую команду, и перемещаем результат обратно на наш рабочий стол: Команды: C:\LPE via StorSvc\SprintCSP> msbuild SprintCSP.sln C:\LPE via StorSvc\SprintCSP> move x64\Debug\SprintCSP.dll C:\Users\user\Desktop\
Теперь мы готовы запустить эксплойт. Убедитесь, что у вас есть файлы эксплойта "LocalPotato.exe", "RpcClient.exe" и "SprintCSP.dll".