Мы уже рассказывали про повышение привилегий в Windows с помощью WinPEAS. Сегодня я покажу способ повышения привилегий с помощью C++ и функции UpdateProcThreadAttribute из Windows API.
Повышение привилегий с UpdateProcThreadAttribute
Повышение привилегий Windows с помощью UpdateProcThreadAttribute — это метод, используемый для повышения привилегий процесса в системе Windows путем использования уязвимости в функции UpdateProcThreadAttribute.
Эта функция используется для обновления атрибута процесса или потока и может использоваться для установки дескриптора родительского процесса, который используется для запуска нового процесса. Манипулируя дескриптором родительского процесса, злоумышленник может создать новый процесс с повышенными привилегиями.
Уязвимость возникает из-за того, что функция UpdateProcThreadAttribute не проверяет допустимость дескриптора родительского процесса, что позволяет злоумышленнику предоставить дескриптор привилегированного процесса вместо ожидаемого дескриптора непривилегированного процесса. В случае успеха вновь созданный процесс унаследует повышенные привилегии привилегированного родительского процесса.
Этот метод обычно используется в вредоносных программах и эксплойтах для получения повышенных привилегий и выполнения вредоносного кода в системе.
Код определяет две функции:
- setPrivilege устанавливает указанную привилегию для текущего процесса. Функция принимает имя привилегии в качестве параметра и возвращает логическое значение, указывающее на успех или неудачу. Функция использует LookupPrivilegeValue, чтобы получить LUID (локальный уникальный идентификатор) привилегии, а затем AdjustTokenPrivileges, чтобы активировать привилегию для процесса.
- createProcess создает новый процесс, который наследует атрибуты безопасности указанного процесса. В качестве параметров функция принимает PID (идентификатор процесса) целевого процесса и путь к исполняемому файлу, который необходимо запустить. Функция сначала вызывает OpenProcess, чтобы получить дескриптор целевого процесса, а затем создает новый процесс с помощью CreateProcessW, передавая путь к исполняемому файлу и структуру STARTUPINFOEXW, содержащую дескриптор целевого процесса.
Основная функция вызывает функцию setPrivilege, чтобы включить привилегию SE_DEBUG_NAME для текущего процесса. Эта привилегия требуется для управления или отладки процессов с более высокими привилегиями. Затем функция извлекает PID целевого процесса из аргумента командной строки и вызывает функцию createProcess, передавая PID и путь к исполняемому файлу cmd.exe в каталоге System32. Это эффективно создает новый процесс командной строки с теми же привилегиями, что и целевой процесс.
Таким образом, этот код демонстрирует базовую технику повышения привилегий с помощью инжекта путем создания нового процесса с более высокими привилегиями. Однако следует отметить, что этот метод часто используется злонамеренно и может быть обнаружен.
Повышение привилегий Windows с помощью C++
Прежде всего, компилируем этот код.
Команда выглядит следующим образом:
1 |
x86_64-w64-mingw32-g++ -O2 App.cpp -o UpdateProcThreadAttribute -I/usr/share/mingw-w64/include/ -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -fpermissive -Wnarrowing -fexceptions |
Чтобы внедрить код, найдем процесс lssas.exe.
Он работает под управлением NT AUTHORITY SYSTEM, учетной записи пользователя Windows.
И теперь я запускаю вредоносное ПО, используя PID 652 (lsass).
И давайте проверим, с каким пользователем он запущен:
Теперь давайте посмотрим родительский процесс:
Заключение
Я думаю, что это хорошая альтернатива другим способам повышения привилегий Windows. Я также рекомендую статью «Как повысить привилегии в Windows с помощью binPath».
ПОЛЕЗНЫЕ ССЫЛКИ: