Эксперт 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ти лет."
diversenok
У вас уж очень странный список «опасных» привилегий приведён. В него каким-то образом попали Change Notify, которая по-умолчанию выдана вообще всем, и Lock Memory, которой разве что физическую память можно исчерпать. В то же время, отсутствует Impersonate (которая по смыслу аналогична попавшей в список Assign Primary Token) и TCB, которая вообще чуть ли не самая мощная (и неспроста имеет описание «Действовать в качестве части операционной системы»).
a-tk
Странный способ взлома: влезть через отладчик ядра. Если есть доступ к машине таким способом, то творить в системе можно куда более интересные вещи, чем просто потрогать привилегии без оргвыводов.