Виртуальное повышение. Эскалируем привилегии в VirtualBox

Если ты часто имеешь дело с различными операционными системами, то вероятнее всего слышал о программных продуктах для создания виртуальной изолированной среды на твоем компьютере. В них ты можешь развернуть любую ось, накатит пару сотен полезных приложений и выполнить задуманное. Но в этот раз давай поговорим о таком продукте как VirtualBox. Это популярное кроссплатформенное программное обеспечение для виртуализации с открытым исходным кодом, разработанное корпорацией Oracle. Чуть ранее в этом же году группа ИБ специалистов обнаружила очень интересных баг в коде. Что он дает? Для начала это самый быстрый и безболезненный путь к повышению привилегий в системе. Как ты уже догадался, сегодня речь пойдет именно об этом баге. Попробуем разобраться как он устроен и успешно эксплуатируем его в виртуальной среде.

Обнаружение уязвимости

Для работы нам потребуется образ Windows 10 и среда виртуализации VirtualBox. Думаю с этим ты справишься без моей помощи. После установки и базовой настройки в системе появится очень интересная пользовательская служба с названием VirtualBox system service, она нам потребуется. Запускаем Powershell и смотрим, что она из себя представляет:

PS C:\tools> sc.exe qc VboxSDS
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: VboxSDS
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 3   DEMAND_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "C:\\Program Files\\Oracle\\VirtualBox\\VBoxSDS.exe"
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : VirtualBox system service
        DEPENDENCIES       : RPCSS
        SERVICE_START_NAME : LocalSystem

Тут мы видим путь до самой службы и понимаем, что это системная папка, а также замечаем стартовое имя LocalSystem. Это говорит о том, что файл VBoxSDS.exe обладает правами системы. Сама служба создает каталог C:\\ProgramData\\VirtualBox\\для ведения журнала.

Этот каталог создается без указания явных списков ACL и наследует разрешения родительского каталога (C:\ProgramData), что позволяет пользователям создавать новые файлы/папки:

PS C:\tools> cacls.exe C:\ProgramData\VirtualBox
C:\\ProgramData\\VirtualBox NT AUTHORITY\\SYSTEM:(OI)(CI)(ID)F
                          BUILTIN\\Administrators:(OI)(CI)(ID)F
                          CREATOR OWNER:(OI)(CI)(IO)(ID)F
                          BUILTIN\\Users:(OI)(CI)(ID)R
                          BUILTIN\\Users:(CI)(ID)(special access:)
                                                FILE_WRITE_DATA
                                                FILE_APPEND_DATA
                                                FILE_WRITE_EA
                                                FILE_WRITE_ATTRIBUTES

При запуске службы эта папка будет заполнена файлами журналов, они будут наследовать разрешения каталога, что не позволит пользователям с низкими привилегиями изменять/удалять их и, как следствие, ограничивать злоупотребление соединениями каталогов — популярный примитив, используемый при эксплойтах. Но здесь имеются ошибки доступа в логике службы:

PS C:\tools> ls C:\ProgramData\VirtualBox\

    Directory: C:\\ProgramData\\VirtualBox

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         4/22/2024   9:44 AM              0 VBoxSDS.log
-a----         4/22/2024   9:43 AM           1924 VBoxSDS.log.1
-a----         4/12/2024   1:49 AM           1924 VBoxSDS.log.10
-a----         4/19/2024   5:32 PM           1924 VBoxSDS.log.2
-a----         4/18/2024  10:41 AM           1281 VBoxSDS.log.3
-a----         4/17/2024  11:27 PM           1924 VBoxSDS.log.4
-a----         4/17/2024  10:20 PM            665 VBoxSDS.log.5
-a----         4/17/2024  10:20 PM           1431 VBoxSDS.log.6
-a----         4/15/2024  11:04 PM           1925 VBoxSDS.log.7
-a----         4/15/2024   1:30 PM            665 VBoxSDS.log.8
-a----         4/15/2024   1:30 PM           1431 VBoxSDS.log.9

PS C:\\tools> cacls.exe C:\\ProgramData\\VirtualBox\\VBoxSDS.log
C:\\ProgramData\\VirtualBox\\VBoxSDS.log NT AUTHORITY\\SYSTEM:(ID)F
                                      BUILTIN\\Administrators:(ID)F
                                      BUILTIN\\Users:(ID)R

Анализ службы во время запуска показывает интересное поведение, когда служба VboxSDS рекурсивно выполняет операцию переименования/перемещения файлов внутри каталога C:\\ProgramData\\VirtualBox. VboxSDS.log станет VboxSDS.log.1, а VboxSDS.log.1 станет VboxSDS.log.2:

091c507cb55618298570a4fbaa293206.png

Если единственный файл внутри каталога — VboxSDS.log.10, то он будет удален:

10675b0ac2682631ac9574f7d3822dcb.png

Этим можно злоупотреблять как для удаления файлов в каталоге, так и для выполнения произвольного перемещения файлов.

Чтобы очистить каталог, нам нужна возможность запустить службу от имени пользователя с низкими привилегиями, а также возможность остановить/свернуть службу, поскольку в большинстве случаев каталог будет содержать несколько файлов журналов.

Запустить службу от имени пользователя с низкими привилегиями можно через COM. Служба VboxSDSрегистрирует COM-сервер, и всякий раз, когда этот COM-класс инициируется, запускается служба:

PS C:\tools> sc.exe queryex VboxSDS

SERVICE_NAME: VboxSDS
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 0
        FLAGS              :
PS C:\tools> [Activator]::CreateInstance([type]::GetTypeFromCLSID("74AB5FFE-8726-4435-AA7E-876D705BCBA5"))
System.__ComObject
PS C:\tools> sc.exe queryex VboxSDS

SERVICE_NAME: VboxSDS
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 11364
        FLAGS              :

Самый простой способ, с помощью которого я обнаружил сбой службы — это запретить ей создавать файл VboxSDS.log.

Это можно сделать несколькими способами, однако я считаю, что проще всего создать каталог с именем VboxSDS.log, чтобы последующий вызов CreateFile API завершился неудачей, поскольку будет ожидаться файл.

Итак, с природой данной уязвимости мы разобрались, теперь закрываем все лишние окна и переходим к ее эксплуатации с первоначальными правами пользователя.

Эксплуатация уязвимости

Имея на руках возможность очистить каталог и запустить службу можно начать создавать эксплоит.

  1. Сначала создаем файл VboxSDS.log.11 и накладываем на него блокировку;

  2. Используем COM-сервер для запуска службы;

  3. Далее у нас срабатывает блокировка на файл и нам нужно после нее создать каталог VboxSDS.log, который приведет к сбою службы;

  4. Продолжаем запускать службу до тех пор пока каталог не окажется пустым;

  5. Как только каталог становится пустым, создается файл и устанавливается уступающая блокировка;

  6. Запускаем службу заново и при срабатывании блокировки файл VboxSDS.log.9 удаляется и каталог превращается в точку соединения с каталогом NT Object Manager (\RPC Control);

  7. В каталоге Диспетчера объектов создаются две символические ссылки:

    • VboxSDS.log.9который указывает на нашу dll полезной нагрузки;

    • VboxSDS.log.10который указывает на несуществующую dll в system32 каталоге (в данном случае wow64log.dll);

  8. После создания файла wow64log.dll запускается Microsoft Edge Update Service и наша dll загружается в SYSTEMпроцесс.

Если тебе ручной способ эксплуатации не очень нравится, то предлагаю альтернативное решения для автоматизации нашей уязвимости. Для этого воспользуемся уже готовым решением с Github и попробуем эксплуатировать все это дело в два клика.

  1. Переходим на этот репозиторий;

  2. Скачиваем его в архиве;

  3. Далее запускаем файл VirtualBoxLPE_del/Source.cpp (здесь тебе потребуется Visual Studio);

  4. Собираем проект в удобном месте;

  5. Повторяем действия с VirtualBoxLPE_move/Source.cpp;

  6. Готовые PE-файлы закидываем в виртуалку и запускаем через cmd.

Готово! Привилегии администратора у тебя на руках. Все интуитивно понятно и просто. А что делать с этим дальше зависит только от твоей фантазии. Ну, а теперь пришло время подводить итоги.

Подводим итоги

Сама по себе уязвимость носит разрушительный характер и имеет крайне необычную форму происхождения. На настоящий момент уязвимость еще не устранена, хотя разработчики о ней знают. Не забывай обновляться, ведь от этого зависит безопасность твоей ОС и данных. Также не забывай про другие способы злоупотребления средой виртуализации, убирай сетевые мосты, общие папки и так далее. Таким образом ты сможешь пресечь попытки эксплуатации, и превратить свой ПК в неприступную крепость.

Подпишись на LHMedia:

Life-Hack — Хакер / Хакинг
Новостной канал
Канал с бесплатными видео курсами
Юмор

© Habrahabr.ru