
Обход UAC путем перехвата DLL, находящейся в Native Image Cache
Обходите контроль учётных записей (UAC) для получения повышенных привилегий (администратора) и запуска любой программы на высоком уровне целостности.

Я решил обновить ByeIntegrity, сделав его гораздо быстрее, легче и надёжнее. Это значительная переработка, поэтому я создал новый проект в решении VS под названием «ByeIntegrity2021», который является обновлённой версией этой атаки. Разумеется, оригинальная версия всё ещё доступна. Для получения дополнительной информации о новой версии разверните подробности ниже.
Новая версия теперь может перехватывать NIC без зависимости от существующих собственных образов, установленных в NIC. Она делает это, создавая собственные дескрипторы собственных образов и полезные нагрузки, а затем перемещая их в NIC, устраняя необходимость в:
*.ni, созданных NGEN.exeCLR загружает собственные образы из NIC, выполняя рекурсивное сканирование каталогов каждой записи, а затем читая её файл *.aux. Этот файл содержит информацию о собственном образе и его зависимостях. На основе информации из файла AUX CLR либо загружает образ, либо отклоняет его и переходит к следующему кандидату. Если подходящих кандидатов не найдено, загружается стандартный образ, и JIT компилирует его обычным образом. Никакая часть фактического собственного образа не читается (проверяется только его существование), поэтому ByeIntegrity просто помещает DLL с полезной нагрузкой с тем же именем, которое имел бы собственный образ.
Обновлённая версия ByeIntegrity поставляется с инструментом AUXGen, который принимает имя сборки из GAC и затем генерирует соответствующий файл AUX. Файл AUX генерируется так, чтобы соответствовать проверкам CLR, и CLR загрузит «собственный образ», описанный файлом AUX. Примечание: AUXGen не обрабатывает зависимости при генерации файла AUX. Он делает только то, что необходимо, чтобы CLR загрузила образ. Я опубликую подробности о формате файла AUX позже.
Теперь ByeIntegrity использует ISecurityEditor, как и UACMe, что сокращает объём необходимого кода. Также требуется, чтобы вы сгенерировали файл AUX для сборки MMCEx и поместили его в ту же директорию, что и ByeIntegrity. MMCEx теперь является целевым образом из-за порядка загрузки и более короткого имени.
ByeIntegrity перехватывает DLL, расположенную в кэше собственных образов (NIC). NIC используется .NET Framework для хранения оптимизированных сборок .NET, созданных такими программами, как Ngen — генератор собственных образов .NET Framework. Поскольку Ngen обычно запускается от имени текущего пользователя с правами администратора через планировщик задач, NIC предоставляет доступ на изменение членам группы администраторов.
Оснастка брандмауэра Windows в консоли управления Microsoft (MMC) использует .NET Framework, и при её инициализации модули из NIC загружаются в процесс MMC. Исполняемый файл MMC использует AutoElevate — механизм Windows, который автоматически повышает токен процесса без запроса UAC.
ByeIntegrity перехватывает определённую DLL в NIC с именем Accessibility.ni.dll. Он записывает шелл-код в область заполнения подходящего размера, расположенную в секции .text этой DLL. Затем точка входа DLL обновляется так, чтобы указывать на шелл-код. При загрузке DLL выполняется точка входа (которая фактически является шелл-кодом). Шелл-код вычисляет адрес kernel32!CreateProcessW, создаёт новый экземпляр cmd.exe, работающий от имени администратора, и затем просто возвращает TRUE. Это происходит только для причины DLL_PROCESS_ATTACH; все остальные причины немедленно возвращают TRUE.
Эта атака реализована в UACMe как метод #63. Если вы хотите опробовать эту атаку, сначала воспользуйтесь UACMe. Атака та же, однако UACMe использует другой метод для изменения NIC. ByeIntegrity использует IFileOperation, тогда как UACMe использует ISecurityEditor. Кроме того, UACMe выбирает правильный Accessibility.ni.dll для вашей системы и при необходимости выполняет задачи обслуживания системы (для генерации компонентов NIC). ByeIntegrity просто выбирает первую существующую запись NIC (которая может быть как правильной записью, используемой MMC, так и нет) и не запускает задачи обслуживания системы. ByeIntegrity содержит значительно больше кода, чем UACMe, поэтому чтение реализации UACMe будет намного проще для понимания, чем чтение кода ByeIntegrity. Наконец, ByeIntegrity запускает дочерний процесс во время атаки, тогда как UACMe — нет.
Кратко: UACMe проще и эффективнее ByeIntegrity, поэтому сначала используйте UACMe.
Если вы это читаете, то, вероятно, знаете, как скомпилировать исходный код. Учтите, что это не тестировалось и не разрабатывалось для x86, и, скорее всего, всё равно не будет работать на x86.
Как и в случае с UACMe, я никогда не буду загружать скомпилированные бинарные файлы в этот репозиторий. Всегда находятся люди, желающие, чтобы мир рухнул и сгорел, и я не стану предоставлять им лёгкий способ запустить это на чужом компьютере и намеренно нанести ущерб. Я также не хочу, чтобы скрипт-кидди использовали эту атаку, не понимая, что она делает и какой ущерб может причинить.
Эта атака работает, начиная с Windows 7 (7600) и до последней версии Windows.