Итак ... вот эта уязвимость cуществует уже давно: локальная уязвимость повышения привилегий в PsExec. Эта локальная эскалация привилегий позволяет процессу, не являющемуся администратором, стать SYSTEM, если PsExec выполняется локально или удаленно на целевой машине. Я смог подтвердить, что она работает с Windows 10 до XP, и, согласно моему расследованию, она затрагивает версии от PsExec v2.2 (последний на момент написания) вплоть до v1.72 (2006). Мы дали Microsoft 90 дней на исправление проблемы, но она еще не исправлена.
*gif на форум залить не получилось
Если вы не знакомы с PsExec, это инструмент системного администратора, входящий в состав пакета SysInternals, который позволяет удаленно выполнять приложения на клиентских машинах. Ниже я кратко описываю, как работает PsExec:
PsExec содержит встроенный ресурс под названием «PSEXESVC», который представляет собой исполняемый компонент уровня обслуживания, который извлекается, копируется и выполняется на удаленном компьютере как SYSTEM всякий раз, когда клиент PsExec выполняет PsExec, нацеленное на удаленный компьютер. Связь между клиентом PsExec и удаленной службой PSEXESVC осуществляется по именованным каналам. В частности, канал с именем «\ PSEXESVC» отвечает за синтаксический анализ и выполнение команд клиента PsExec, таких как «какое приложение выполнять», «соответствующие данные командной строки» и т.д
Конечно, из соображений безопасности канал «\ PSEXESVC» службы PSEXESVC защищен и разрешает доступ только администраторам для чтения / записи, тем самым предотвращая чтение / запись в канал службы локальных пользователей с низким уровнем привилегий.
Однако через приседание канала (метод, при котором вы сначала создаете канал), приложение с низким уровнем привилегий может получить доступ к этому каналу. Если локальное приложение с низким уровнем привилегий создает именованный канал «\ PSEXESVC» до выполнения PSEXESVC, то PSEXESVC получит дескриптор существующего экземпляра, а не создает сам именованный канал, что, как мы увидим позже, будет иметь некоторые неожиданные последствия. Ниже я покажу как PSEXESVC создает канал «\ PSEXESVC».
Здесь мы видим из аргумента nMaxInstances, что он позволяет существовать неограниченному количеству экземпляров канала «\PSEXESVC». Мы также видим, что это не гарантирует, что это первое приложение, которое создает канал «\ PSEXESVC», что обычно делается с помощью флага FILE_FLAG_FIRST_PIPE_INSTANCE. В этом случае он попытается создать именованный канал, и, если он уже существует, просто получит дескриптор существующего канала «\ PSEXESVC» после вызова. Это приведет к унаследованию существующего ACL канала вместо того, чтобы применять к каналу собственный ACL «Только администраторы», независимо от того, что в атрибутах безопасности указано иное в его вызове CreateNamedPipe (см. Выше).
Здесь я создал простую программу «PipeHijack.exe», которая создает этот канал «\ PSEXESVC» с доступом для чтения / записи, доступным для «Дэвида Уэллса», пользователя без повышенных прав.
При этом запуске, если PsExec когда-либо будет выполняться локально или удаленно на этом компьютере в будущем, экземпляр PSEXESVC получит дескриптор моего канала, который я, конечно, могу читать / писать, тем самым позволяя моему приложению с низким уровнем привилегий взаимодействовать с это сервис PSEXESVC SYSTEM!
На этом по сути конец. Все, что мне нужно было сделать, это поговорить со службой PSEXESVC. Я перепроектировал протокол PSEXESVC v2.2 и создал способ связи по этому каналу и выполнения любого желаемого двоичного файла, который я хочу, как SYSTEM. По сути, это имитирует клиент PsExec, от которого он думает, что получает команды, поэтому выполнить любой процесс как SYSTEM довольно просто.
Полный PoC вы можете найти его здесь: https://github.com/tenable/poc/tree/master/Microsoft/Sysinternals/PsExecEscalate.cpp
От ТС
Оригинал вот: https://medium.com/tenable-techblog/psexec-local-privilege-escalation-2e8069adc9c8
Перевод:
Azrv3l cпециально для xss.pro
*gif на форум залить не получилось
Если вы не знакомы с PsExec, это инструмент системного администратора, входящий в состав пакета SysInternals, который позволяет удаленно выполнять приложения на клиентских машинах. Ниже я кратко описываю, как работает PsExec:
PsExec содержит встроенный ресурс под названием «PSEXESVC», который представляет собой исполняемый компонент уровня обслуживания, который извлекается, копируется и выполняется на удаленном компьютере как SYSTEM всякий раз, когда клиент PsExec выполняет PsExec, нацеленное на удаленный компьютер. Связь между клиентом PsExec и удаленной службой PSEXESVC осуществляется по именованным каналам. В частности, канал с именем «\ PSEXESVC» отвечает за синтаксический анализ и выполнение команд клиента PsExec, таких как «какое приложение выполнять», «соответствующие данные командной строки» и т.д
Конечно, из соображений безопасности канал «\ PSEXESVC» службы PSEXESVC защищен и разрешает доступ только администраторам для чтения / записи, тем самым предотвращая чтение / запись в канал службы локальных пользователей с низким уровнем привилегий.
Однако через приседание канала (метод, при котором вы сначала создаете канал), приложение с низким уровнем привилегий может получить доступ к этому каналу. Если локальное приложение с низким уровнем привилегий создает именованный канал «\ PSEXESVC» до выполнения PSEXESVC, то PSEXESVC получит дескриптор существующего экземпляра, а не создает сам именованный канал, что, как мы увидим позже, будет иметь некоторые неожиданные последствия. Ниже я покажу как PSEXESVC создает канал «\ PSEXESVC».
Здесь мы видим из аргумента nMaxInstances, что он позволяет существовать неограниченному количеству экземпляров канала «\PSEXESVC». Мы также видим, что это не гарантирует, что это первое приложение, которое создает канал «\ PSEXESVC», что обычно делается с помощью флага FILE_FLAG_FIRST_PIPE_INSTANCE. В этом случае он попытается создать именованный канал, и, если он уже существует, просто получит дескриптор существующего канала «\ PSEXESVC» после вызова. Это приведет к унаследованию существующего ACL канала вместо того, чтобы применять к каналу собственный ACL «Только администраторы», независимо от того, что в атрибутах безопасности указано иное в его вызове CreateNamedPipe (см. Выше).
Здесь я создал простую программу «PipeHijack.exe», которая создает этот канал «\ PSEXESVC» с доступом для чтения / записи, доступным для «Дэвида Уэллса», пользователя без повышенных прав.
При этом запуске, если PsExec когда-либо будет выполняться локально или удаленно на этом компьютере в будущем, экземпляр PSEXESVC получит дескриптор моего канала, который я, конечно, могу читать / писать, тем самым позволяя моему приложению с низким уровнем привилегий взаимодействовать с это сервис PSEXESVC SYSTEM!
На этом по сути конец. Все, что мне нужно было сделать, это поговорить со службой PSEXESVC. Я перепроектировал протокол PSEXESVC v2.2 и создал способ связи по этому каналу и выполнения любого желаемого двоичного файла, который я хочу, как SYSTEM. По сути, это имитирует клиент PsExec, от которого он думает, что получает команды, поэтому выполнить любой процесс как SYSTEM довольно просто.
Полный PoC вы можете найти его здесь: https://github.com/tenable/poc/tree/master/Microsoft/Sysinternals/PsExecEscalate.cpp
От ТС
Оригинал вот: https://medium.com/tenable-techblog/psexec-local-privilege-escalation-2e8069adc9c8
Перевод:
Azrv3l cпециально для xss.pro