В этой статье речь пойдет об уязвимости, позволяющей выполнить локальное повышение привилегий (LPE) в операционных системах семейства Windows. Баг напрямую связан с NTLM-аутентификацией, поэтому сначала поговорим о том, как она устроена, а потом перейдем непосредственно к разбору CVE-2023-21746.
Читайте также - Стенды Ролл ап (Roll up). Принцип действиях у них одинаковый. Внутри корпуса, как правило алюминиевого, закреплен подпружиненный барабан, к которому крепиться полотно с рекламно-информационным материалом. При освобождении барабана от специальных стопоров, которые установлены предварительно на производстве, полотно скручивается на барабане и в скрученном виде размещается внутри корпуса конструкции -
ролл ап конструкции по доступным ценам.
NTLM-аутентификация
Предположим, пользователь хочет получить доступ к файловому ресурсу на другом компьютере или сервере. Аутентификация выполняется в четыре этапа:
- Пользователь отправляет серверу запрос с именем учетной записи.
- В ответ сервер отправляет ему случайное число, называемое challenge.
- Пользователь шифрует это число своим NT-хешем и отправляет обратно.
- Сервер извлекает из SAM (Security Account Manager — RPC-сервер Windows, оперирующий базой данных учетных записей) хеш пользователя и проделывает те же самые действия, что и пользователь, сравнивая полученные хеши. Если результаты совпали, то аутентификация считается успешной.
Локальная аутентификация NTLM
Рассмотрим локальную аутентификацию NTLM, которая начинается с аутентификации пользователя на самой машине.
Эта аутентификация выполняется следующим образом:
- Пользователь вводит свои учетные данные, логин и пароль, при входе на машину.
- Введенные данные передаются подсистеме локальной безопасности LSA, которая преобразует пароль в хеш.
- Далее LSA передает имя пользователя SAM, который извлекает хеш указанного пользователя.
- LSA сверяет хеши, и если они совпадают, то пользователь получает доступ к машине.
Далее срабатывает рассмотренный выше механизм, основанный на модели клиент — сервер.
Локальная аутентификация NTLM — это частный случай, она применяется, когда клиентская и серверная части работают на одной машине.
Клиент получает учетные данные вошедшего в систему пользователя и создает запрос, содержащий имя рабочей станции и домена клиента.
Сообщение типа 1. Клиент посылает это сообщение для начала соединения. Оно используется для согласования параметров аутентификации, как и раньше, но также содержит имя клиентской машины и ее домен. Сервер может проверить имя и домен клиента, и, если они совпадают с его собственными, начинается процесс локальной аутентификации.
Сообщение типа 2. Сервер создает контекст безопасности, вызывая функцию AcceptSecurityContext (NTLM)
, и в этом сообщении отправляет клиенту его идентификатор. Затем клиент может использовать идентификатор контекста безопасности, чтобы связать себя с соединением.
Сообщение 3-го типа. Клиент получает токен и передает его в InitializeSecurityContext (NTLM)
. Если InitializeSecurityContext (NTLM)
возвращает SEC_E_OK
, то взаимная аутентификация завершена и можно начинать защищенный сеанс. Если же он возвращает код ошибки, то переговоры о взаимной аутентификации завершаются. В противном случае токен безопасности, возвращенный InitializeSecurityContext (NTLM)
, отправляется клиенту и шаги 2 и 3 повторяются.
Как работает LocalPotato
LocalPotato использует недостаток в механизме локальной аутентификации NTLM. Эксплоит обманывает привилегированный процесс и заставляет аутентифицировать сеанс, запущенный хакером. В результате атакующий получает соединение, предоставляющее ему доступ к любым ресурсам с привилегиями обманутого процесса.
«Картошка» работает следующим образом:
- Хакер запускает привилегированный процесс для подключения к подконтрольному ему серверу. В принципе, это работает аналогично предыдущим Potato, когда непривилегированный пользователь заставлял ОС создавать соединения, использующие права SYSTEM.
- Сервер на машине создаст контекст безопасности А для привилегированного соединения, но не будет отправлять его сразу. Хакер запустит свой клиент, чтобы он одновременно с локальным инициировал соединение с сервером. Легитимный клиент отправляет сообщение, чтобы инициировать соединение, а сервер в ответ пошлет сообщение с идентификатором нового контекста безопасности Б.
- Злоумышленник также запускает свой сервер и меняет идентификаторы контекстов обоих соединений таким образом, чтобы привилегированный процесс получил контекст соединения с сервером злоумышленника, а не со своим собственным. В результате хакер сможет получить доступ к любому сетевому ресурсу с привилегиями SYSTEM.
StorSvc и DLL hijacking
До сих пор мы использовали LocalPotato для записи любых файлов на целевую машину. Чтобы получить привилегированную оболочку, нам нужно выяснить, как использовать произвольную запись для выполнения команды.
В этой статье речь пойдет об уязвимости, позволяющей выполнить локальное повышение привилегий (LPE) в операционных системах семейства Windows. Баг напрямую связан с NTLM-аутентификацией, поэтому сначала поговорим о том, как она устроена, а потом перейдем непосредственно к разбору CVE-2023-21746. Читайте также - Стенды Ролл ап (Roll up). Принцип действиях у них одинаковый. Внутри корпуса, как правило алюминиевого, закреплен подпружиненный барабан, к которому крепиться полотно с рекламно-информационным материалом. При освобождении барабана от специальных стопоров, которые установлены предварительно на производстве, полотно скручивается на барабане и в скрученном виде размещается внутри корпуса конструкции - ролл ап конструкции по доступным ценам. NTLM-аутентификация Предположим, пользователь хочет получить доступ к файловому ресурсу на другом компьютере или сервере. Аутентификация выполняется в четыре этапа: Пользователь отправляет серверу запрос с именем учетной записи. В ответ сервер отправляет ему случайное число, называемое challenge. Пользователь шифрует это число своим NT-хешем и отправляет обратно. Сервер извлекает из SAM (Security Account Manager — RPC-сервер Windows, оперирующий базой данных учетных записей) хеш пользователя и проделывает те же самые действия, что и пользователь, сравнивая полученные хеши. Если результаты совпали, то аутентификация считается успешной. Локальная аутентификация NTLM Рассмотрим локальную аутентификацию NTLM, которая начинается с аутентификации пользователя на самой машине. Эта аутентификация выполняется следующим образом: Пользователь вводит свои учетные данные, логин и пароль, при входе на машину. Введенные данные передаются подсистеме локальной безопасности LSA, которая преобразует пароль в хеш. Далее LSA передает имя пользователя SAM, который извлекает хеш указанного пользователя. LSA сверяет хеши, и если они совпадают, то пользователь получает доступ к машине. Далее срабатывает рассмотренный выше механизм, основанный на модели клиент — сервер. Локальная аутентификация NTLM — это частный случай, она применяется, когда клиентская и серверная части работают на одной машине. Клиент получает учетные данные вошедшего в систему пользователя и создает запрос, содержащий имя рабочей станции и домена клиента. Сообщение типа 1. Клиент посылает это сообщение для начала соединения. Оно используется для согласования параметров аутентификации, как и раньше, но также содержит имя клиентской машины и ее домен. Сервер может проверить имя и домен клиента, и, если они совпадают с его собственными, начинается процесс локальной аутентификации. Сообщение типа 2. Сервер создает контекст безопасности, вызывая функцию AcceptSecurityContext (NTLM), и в этом сообщении отправляет клиенту его идентификатор. Затем клиент может использовать идентификатор контекста безопасности, чтобы связать себя с соединением. Сообщение 3-го типа. Клиент получает токен и передает его в InitializeSecurityContext (NTLM). Если InitializeSecurityContext (NTLM) возвращает SEC_E_OK, то взаимная аутентификация завершена и можно начинать защищенный сеанс. Если же он возвращает код ошибки, то переговоры о взаимной аутентификации завершаются. В противном случае токен безопасности, возвращенный InitializeSecurityContext (NTLM), отправляется клиенту и шаги 2 и 3 повторяются. Как работает LocalPotato LocalPotato использует недостаток в механизме локальной аутентификации NTLM. Эксплоит обманывает привилегированный процесс и заставляет аутентифицировать сеанс, запущенный хакером. В результате атакующий получает соединение, предоставляющее ему доступ к любым ресурсам с привилегиями обманутого процесса. «Картошка» работает следующим образом: Хакер запускает привилегированный процесс для подключения к подконтрольному ему серверу. В принципе, это работает аналогично предыдущим Potato, когда непривилегированный пользователь заставлял ОС создавать соединения, использующие права SYSTEM. Сервер на машине создаст контекст безопасности А для привилегированного соединения, но не будет отправлять его сразу. Хакер запустит свой клиент, чтобы он одновременно с локальным инициировал соединение с сервером. Легитимный клиент отправляет сообщение, чтобы инициировать соединение, а сервер в ответ пошлет сообщение с идентификатором нового контекста безопасности Б. Злоумышленник также запускает свой сервер и меняет идентификаторы контекстов обоих соединений таким образом, чтобы привилегированный процесс получил контекст соединения с сервером злоумышленника, а не со своим собственным. В результате хакер сможет получить доступ к любому сетевому ресурсу с привилегиями SYSTEM. StorSvc и DLL hijacking До сих пор мы использовали LocalPotato для записи любых файлов на целевую машину. Чтобы получить привилегированную оболочку, нам нужно выяснить, как использовать произвольную запись для выполнения команды.
Теги: CSS