Повышение локальных привилегий в K7

Rain

Эксперт
Статус
offline
Регистрация
30.07.2018
Сообщения
529
Репутация
433
Данную статью приволок,как обычно из-за бугра. Поэтому За первод пардоньте.

Антивирусная эксплуатация
Эй, ребята, давно нет статьи! Последние несколько месяцев я изучал использование антивирусов с помощью логических ошибок. Я кратко расскажу о подходе к исследованию уязвимости этих продуктов безопасности на примере уязвимости, которую я обнаружил в K7 Security.

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

Выбор цели
Продукты безопасности, такие как антивирусы, являются привлекательной целью (по крайней мере для меня), потому что они работают в доверенном и привилегированном контексте как в ядре, в качестве драйвера, так и в пользовательской среде, в качестве привилегированной службы. Это означает, что они имеют возможность облегчить потенциальное повышение привилегий или иным образом получить доступ к привилегированным функциям. Они присутствуют в низкопривилегированном пространстве операционной системы. Например, может существовать компонент пользовательского интерфейса, с которым пользователь может взаимодействовать, иногда позволяя изменять параметры, такие как включение / отключение антивируса, добавление каталогов или исключений файлов и сканирование файлов на наличие вредоносных программ. Антивирусы также должны получать доступ и выполнять операции над объектами операционной системы для обнаружения вредоносных программ, таких как чтение файлов, разделов реестра, памяти и т. Д. а также возможность выполнять привилегированные действия для поддержания системы в защищенном состоянии независимо от ситуации. Именно между этим доверенным пространством с высокими привилегиями и ненадежным пространством с низкими привилегиями происходят интересные вещи.


Поверхность атаки
Как упомянуто выше, антивирусы живут по обе стороны границы привилегий, как показано на следующей диаграмме:

1 - копия.jpeg



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


Давайте посмотрим, как эту диаграмму можно интерпретировать. Пользовательский интерфейс разделяет общие операции с ожидаемым процессом обслуживания. Если пользователь хочет выполнить привилегированное действие, служба выполнит его от своего имени, предполагая, что проверки безопасности пройдены. Если пользователь хочет изменить настройку, он открывает интерфейс пользователя и нажимает кнопку. Об этом сообщается сервисному процессу через некую форму межпроцессного взаимодействия (IPC), которая будет выполнять необходимые действия, например, антивирус сохраняет свою конфигурацию в реестре и, следовательно, служба откроет соответствующий раздел реестра и изменит некоторые данные. Имейте в виду, что ключ реестра хранится в
HKEY_LOCAL_MACHINE куст, который находится в пространстве с высокими привилегиями, что требует процесса с высокими привилегиями для изменения своих данных. Таким образом, пользователь с низким уровнем привилегий может косвенно изменять объект с высоким уровнем привилегий.

Еще один пример. Пользователь может сканировать на наличие вредоносных программ через пользовательский интерфейс (конечно, что хорошего в антивирусах, если они запрещают пользователю сканировать на наличие вредоносных программ?). Простая, мягкая операция, что может пойти не так? Так как процесс сканирования выполняет проверку на вредоносное ПО, интерфейс службы передает информацию сервисному процессу для нацеливания на файл. Он должен взаимодействовать с файлом, чтобы выполнить сканирование, то есть он должен найти файл на диске и прочитать его содержимое. Если в то время как данные файла были прочитаны и сканируются на наличие вредоносных программ, а антивирус не блокирует файл на диске, возможно, что вредоносная программа может быть заменена символической ссылкой 1, указывающей на файл в высоком привилегированный каталог (да, это возможно), давайте использоватьnotepad.exe, Когда сканирование завершено и определено, что оно является вредоносным, процесс обслуживания может удалить файл. Тем не менее, вредоносная программа была заменена ссылкой на notepad.exe! Если антивирус не обнаружит и не отклонит символическую ссылку, он будет удален notepad.exe без вопросов. Это пример ошибки условия гонки « Время проверки - время использования» (TOCTOU) 3 . Опять же, пользователь с низким уровнем привилегий может косвенно изменять объект с высоким уровнем привилегий, поскольку сервисный процесс выступает в качестве посредника.



Эксплуатация
Эта уязвимость позволяет пользователю с низким уровнем привилегий изменять (почти) произвольные данные реестра через настройки антивируса. Однако пользователь с низким уровнем привилегий (не администратор) не может изменить настройки антивируса.

2.png


Обход административных проверок
Чтобы сузить порядок выполнения этой административной проверки, можно использовать procmon для определения активности операционной системы при повторном доступе к странице настроек. Это заставит антивирус проверять административный статус текущего пользователя, пока он взаимодействует с операционной системой во время регистрации. Конечно, поскольку у нас низкие привилегии, а procmon требует высоких привилегий, это не практично в реальной среде. Однако, поскольку мы контролируем среду тестирования, мы можем разрешить запуск procmon, поскольку у нас есть доступ к учетной записи администратора. Настройка Promon для фильтрации в K7TSMain качестве имени процесса будет захватывать действия, выполняемые процессом пользовательского интерфейса.
3.png


Когда procmon начинает регистрироваться, попытка снова открыть страницу настроек в пользовательском интерфейсе заставит procmon мгновенно показать результаты:

4.png



Видно, что антивирус хранит административную проверку в реестре в AdminNonAdminIsValid. Просмотр значения в окне «Свойства события» показывает, что оно вернулось 0, что означает, что пользователи без прав администратора не допускаются. Но здесь есть небольшая проблема. Бонусные баллы, если вы можете определить это.


Теперь, когда мы знаем, где выполняется проверка, следующим шагом будет ее обход. procmon показывает, что процесс выполняется в пространстве с низким уровнем привилегий, как указано пользователем, а целостность среды означает, что мы являемся владельцем процесса. Если он не защищен, мы можем просто перехватить RegQueryValue функцию и изменить возвращаемое значение.
5.png



Попытка присоединиться к K7TSMain.exe процессу с помощью x32dbg разрешена! Точка останова RegQueryValueExA была установлена, когда мы снова пытаемся получить доступ к странице настроек.

6.png


x32dbg ловит точку останова при нажатии на страницу настроек. Запрашиваемое имя значения есть, ProductTypeно мы хотим AdminNonAdminIsValid, поэтому продолжение будет вызывать следующую точку останова:


7.png


Теперь мы можем видеть AdminNonAdminIsValid. Чтобы изменить возвращаемое значение, мы можем разрешить выполнение функции до возврата. Однако вызывающая функция выглядит как оболочка для RegQueryValueExA:


8.png


Итак, продолжаем снова, пока return не покажет виновную функцию, которая выполняет проверку:

9.png


Существует очевидная проверка этого значения, 1 однако текущее возвращаемое значение для данных реестра равно 0. Это решает возвращаемое значение этой функции, поэтому мы можем изменить [esp+4] или изменить возвращаемое значение, чтобы обойти проверку:

10.png


Перехват межпроцессного взаимодействия
В Windows доступно несколько способов взаимодействия между процессами 2 , таких как почтовые слоты, сопоставление файлов, COM и именованные каналы. Мы должны выяснить, что реализовано в продукте, чтобы иметь возможность анализировать протокол. Простой способ сделать это - использовать API Monitor для записи вызовов вызовов функций, выполненных процессом. Когда мы делаем это и затем применяем измененную настройку, мы можем видеть ссылки на функции именованных каналов:



11.png



Обратите внимание, что вызывающий модуль K7AVOptn.dll вместо K7TSMain.exe. Если мы посмотрим на данные, передаваемые через TransactNamedPipe, мы можем увидеть некоторую интересную информацию:




12.png


Первое , что выскакивает в том , что она выглядит как список имен расширений ( .ocx, .exe, .com) разделяются , |где некоторые из них подстановочные соответствия. Это может быть список расширений для сканирования на наличие вредоносных программ. Если мы посмотрим на реестр, в котором антивирус хранит свою конфигурацию, мы можем увидеть нечто похожее под значением ScanExtensions в RTFileScanner ключе:




13.png


Продолжая список звонков, один из них содержит очень интригующие данные:




14.png



Похоже, что антивирус применяет значения, указывая (привилегированные) ключи реестра и их значения по полному пути к ключу. Следующий очевидный шаг - посмотреть, сработает ли изменение одного из ключей и их значений. Это можно сделать, установив TransactNamedPipe точку останова на функцию в x32dbg:




15.png



Оказавшись здесь, найдите входной буфер во втором аргументе и измените данные, чтобы добавить или изменить ключ в HKEY_LOCAL_MACHINE кусте, например, так:




16.png



Если возможно изменить значения этого раздела реестра, процессы с высокими привилегиями будут вынуждены загрузить библиотеки DLL, перечисленные в AppInit_DLLs, то есть ту, которую мы контролируем. LoadAppInit_DLLs Значение также должно быть установлено значение 1(это 0 по умолчанию) , чтобы включить эту функцию. Результат:




17.png




Запуск полезной нагрузки
Возможно, вы заметили, что раздел реестра находится в пределах Wow6432Node которого является 32-разрядным аналогом реестра. Это связано с тем, что продукт является 32-разрядным, и поэтому Windows автоматически перенаправляет изменения реестра. В 64-битной Windows процессы обычно являются 64-битными, поэтому вероятность загрузки DLL полезной нагрузки AppInit_DLLs маловероятна. Надежным способом является использование антивируса, поскольку он 32-разрядный, при условии, что может быть запущен привилегированный компонент. Самый простой способ сделать это - перезагрузить компьютер, поскольку он перезагрузит все процессы антивируса, однако это не всегда практично и не чисто. Щелчок по интерфейсу показывает, что функция обновления выполняется K7TSHlpr.exe под NT AUTHORITY\SYSTEM пользователем:



18.png




Поскольку это 32-битное приложение, Windows загрузит нашу AppInit_DLLsDLL в пространство процесса.



19.png



Использование system("cmd") в качестве полезной нагрузки предложит пользователю интерактивный сеанс в контексте NT AUTHORITY\SYSTEM учетной записи через UI0Detect сервис:


20.png

Выбор для просмотра сообщения вызывает следующее:



21.png



У нас есть рут!
:солнечные очки:



Автоматизированный эксплойт



k7.gif
 

Вложения

  • k7.gif
    k7.gif
    1 MB · Просмотры: 13
Последнее редактирование: