company_banner

Незаметная выдача прав администратора

Автор оригинала: MalwareTech
  • Перевод
Всех с пятницей, друзья. Сегодня делимся с вами еще одним материалом, переведенным в преддверии запуска курса «Реверс-инжиниринг».



У меня была классная идея, как заставить пользователя запустить ваше приложение без социальной инженерии или применения сторонних эксплойтов. Дальше вы сможете просто двигаться вперед и инициировать массовое заражение исполняемых файлов, но это может вызвать множество непредвиденных проблем, а также будет означать, что приложения с цифровой подписью от доверенных поставщиков будут отображаться как ненадежные файлы. Хорошей идеей будет «захват» всего одной dll. Я не буду называть этот метод обходом UAC(User account Control), поскольку все равно потребуется получить разрешение на запуск приложения (только не вашего).

LoadLibrary


Возможно, вы уже знакомы с этим понятием, но я все же объясню, что это такое. Когда приложение вызывает LoadLibrary в dll, но не предоставляет полный путь к файлу, система сначала проверяет раздел реестра KnownDlls, в котором она ищет путь, если там его нет, система будет искать в каталоге, из которого было выполнено приложение, а уже затем будет искать в системных путях, таких как system32/syswow64.

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

  • Приложение должно загружать dll по имени, а не по полному пути (как бывает часто);
  • Требуемая библиотека не должна существовать в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs;
  • Ваша dll должна соответствовать архитектуре процессора (помните о том, что 64-разрядные процессоры будут просто пропускать 32-х разрядные библиотеки и наоборот);
  • Библиотека находится в System32 или Syswow64, поскольку специфические пути часто не работают.

Вирус ZeroAccess использовал этот метод, чтобы воспользоваться «социальной инженерией» и заставить пользователя запустить файл. Для начала с официального был скачан установщик Adobe Flash, dll бота была записана в ту же директорию, где лежал установщик, а потом установщик запустили. Когда установщик выполнился, контроль учетных записей пользователей выдает сообщение, что приложение поставляется доверенным источником “Adobe Systems Incorporated”, а пользователь с наибольшей вероятностью ставит это приложение (это приводит к тому, что выполняется вредоносная dll бота).


Это настоящее обновление Flash Player? Или ZeroAccess? Никто не знает.

Менее инвазивный метод


Представьте, что существует папка, в которой находятся 90% приложений, которые требуют повышенных прав учетной записи, и что она доступна для записи без такого рода прав. Что ж, такая папка существует и это папка %userprofile%Downloads. Наверное, вы понимаете, к чему я клоню.

Я не ожидал найти dll, которая загружается большинством приложений и при этом соответствует всем критериям вредоносной dll, и примерно через пять минут поиска я нашел золотую жилу: dwmapi.dll. Эта библиотека не только соответствовала всем критериям, но и загружалась всеми установочными файлами. Теперь давайте создадим нашу собственную dll, назовем “dwmapi.dll”, поместим ее в папку Загрузки и запустим установочный файл.



Успех! Но дело в том, что как только мы начнем установку, она не заработает, поскольку мы заменили важную библиотеку, но это легко исправить. Мы инфицируем dll.

Создание DLL инфектора


Сначала я хотел просто добавить новый заголовок раздела, изменить поле NumberOfSections в заголовке PE, а затем просто добавить свой раздел в конец файла PE. Оказалось, что непосредственно после последнего заголовка раздела находится директория связанного импорта, которая будет перезаписан нашим заголовком раздела. Поэтому примерно через 2 часа написания приложения для восстановления всего РЕ с нуля кто-то напомнил мне, что директория связанного импорта существует лишь для того, чтобы ускорить загрузку импортируемых файлов и может быть перезаписана, а затем просто отключена в заголовке РЕ.

Следующие 15 минут я держал CTRL+Z, чтобы вернуться к тому, с чего начал и чувствовал себя глупо. Спустя две строчки кода мой инфектор заработал как надо, и я мог перейти к следующему шагу. Сейчас инфектор просто отключает и перезаписывает директорию связанного импорта новым заголовком раздела, добавляет новый раздел в конец РЕ-файла, корректирует SizeOfImage для размещения нового раздела, а затем изменяет AddressOfEntryPoint, чтобы указать на наш новый раздел.

Все, что нам сейчас нужно, это код, который мы туда поместим.

Шелл-код


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

  • Проверяется стек, чтобы убедиться, что dwmapi.dll была вызвана DLL_PROCESS_ATTACH;
  • Используется структура Ldr PEB для получения базового адреса Kernel32 и Ntdll;
  • Используется простая реализация GetProcAddress для импорта следующих функций: NtOpenProcessToken, NtQueryInformationToken, NtClose, ExpandEnvironmentStringsA, CreateProcessA;
  • Открывается текущий токен процесса и код запрашивает его, чтобы подтвердить, что приложение, из которого мы запускаемся, имеет права администратора UAC;
  • Получается путь cmd.exe, а затем вызывается командная строка;
  • Выполнение передается обратно в реальную точку входа dwmapi.dll, именно поэтому выполнение может продолжаться.

Соберем все вместе


Конечный результат работы инфицирует dwmapi.dll нашим шелл-кодом и помещает ее в папку загрузок, как только пользователь загружает и запускает установщик, который требует прав администратора, будет вызвана командная строка, запущенная от имени администратора (из-за Wow64FsRedirect и того факта, что большинство настроек работают под wow64, мы можем использовать один и тот же код на 32-разрядных и 64-разрядных системах Windows).

Полный инфектор и шелл-код вы можете найти на моем github: https://github.com/MalwareTech/UACElevator.

На этом все. До встречи на курсе!
OTUS. Онлайн-образование
705,70
Цифровые навыки от ведущих экспертов
Поделиться публикацией

Похожие публикации

Комментарии 21

    –1
    Кто-нибудь знает как в win7 под пользователем без прав админа установить принтер? В xp это через shift можно сделать
      +1
      Права админа требуются для установки драйвера устройства, хоть в XP, хоть в 7, если этот драйвер отсутствует.
      В семерке при попытке установки драйвера из под пользователя автоматом запросят логин и пароль учетки с правами админа (если не выключен UAC).

      Если UAC выключен и включать нельзя (почему?):
      Через шифт можно установить драйвер, запустив программу установки от имени админа — если знаете пароль, т.е. имеете учетку с правами админа.
      Если файла установки нет, и надо именно с сетевого принтера, а админская учетка есть — можно перелогиниться (либо прибить эксплорер и запустить от имени админа).

      Если пользователям без прав администратора необходимо устанавливать драйвера принтеров (зачем и для чего, ведь принтеры в домене можно политиками раздать?), то администратор может разрешить это опять же политиками.
        0
        Это всё так, но интересует именно возможность установки принтера через shift как в xp. Это возможно? И можно подробнее этот момент: зачем и для чего, ведь принтеры в домене можно политиками раздать?
          0
          Установка принтеров групповой политикой

          По поводу установки через shift как в xp. Не уверен, что в windows 7 есть такой функционал, но как насчет включить обратно UAC? Тогда при попытке установки принтера обычным порядком запросится логин и пасс админа.
            0
            Благодарю, почитаю
        0
        Вроде помогает выключение политики «Administrative Templates > Printers > Point and Print Restrictions», по краней мере при установке с сервера.
          0
          Возможно, придется указать адреса принт-серверов, если они используются. Иначе мап через GPO работать не будет.
        0
        А как защититься? Есть патч реестра, который добавляет dwmapi.dll в список известных, к примеру?
          +2
          Защититься можно, исключив пользователя из группы «Администраторы» и включив политику ограниченного использования программ (в ней есть возможность блокировать подключение библиотек из несанкционированных папок). Минус — теперь пользователь не сможет запускать скачанные из интернета приложения. Хотя, с другой стороны, это плюс.
            0
            Спасибо. Положил себе в HowTo
          +1
          В своё время была одна похожая уязвимость, ну и сейчас частично осталась. Это положить в корень диска исполняемый файл с названием C:\program.exe
          Многие программы, прописываясь в автозапуск не указывают кавычки. Поэтому ссылка C:\Program files\Firm name\file.exe -arg=value без кавычек является не однозначной, где тут путь, а где аргументы запуска, поэтому Windows последовательно пыталась запустить:
          «C:\Program.exe» с аргументами «files\Firm name\file.exe -arg=value»
          «C:\Program files\Firm.exe» с аргументами «name\file.exe -arg=value» и т.д.
          Проверялось переименованием калькулятора calc.exe в c:\program.exe и после перезагрузки считаем сколько экземпляров калькулятора запустилось. У меня в своё время до 5 штук открывалось. Ну или посмотреть все места автозапусков глазами.
          ПС: лечится указанием кавычек:
          «C:\Program files\Firm\file.exe» -arg=value
            0
            Если у человека есть возможность положить *.exe в корень диска — права админа у него уже есть.
              +2
              Эта уязвимость времён наверное WinXP, а сейчас просто интересный факт.
                0
                Времен Win 9k скорее, т.к. с правами по умолчанию для того чтобы разместить файл в корне диска, в WinXp тоже нужны права администратора. Если мне не изменяет память.
                  0
                  Win XP может быть установлена на раздел fat32. (Не представляю когда это бывает нужно, но теоретически возможно). В этом случае для размещения файла в любом месте системного диска, в том числе и в корне, права администратора не нужны.
            0
            А разве исполняемый файл приложения не проверяет свои dll перед загрузкой? Я имею ввиду конечно приложения серьёзных компаний, а не поделки хелловордщиков.
              0
              Вообще, техника называется "DLL Search Order Hijacking" и известна довольно давно.
              К сожалению, в разработке софта всегда были, есть и будут баги, поэтому иногда такое можно найти даже у серьёзных компаний, в том числе у защитных решений (антивирусов, сканеров безопасности и так далее). По ссылке есть примеры.
                0
                А разве исполняемый файл приложения не проверяет свои dll перед загрузкой?
                Тут 2 проблемы:
                1) Нельзя линковаться с DLL стандартными способами. Иначе Windows загрузит DLL до старта приложения. Только загружать всё руками, проверять подпись DLL, импортировать функции руками.
                2) Развесистые зависимости. Нужно заранее знать, что некая DLL из Win32API (например, winmm.dll) зависит от некоей api-ms-win-core-errorhandling-l1-1-0.dll и ещё 50 подобных файлов. Все их надо будет проверить.
                0
                Коммиты в репозитории 4 летней давности, вероятно антивирусы не дадут скачать такой файл.
                  0
                  В вин10 есть забавная особенность, если скачать из интернета zip-файл с софтом в виде portable дистрибутива, где exe и dll файлы без инсталлятора, и распаковать через проводник, то с высокой вероятностью софт не запустится или будет выдавать непонятные ошибки. Проводник на распакованные исполняемые файлы ставит флаг недоверенного файла. В статье эксперимент судя по скриншотам был в вин7. Мне кажется в 10 уже не будет работать так.
                    0
                    В вин10 есть многие прикольные фичи. Одна из таких, что мне понравилась — бьёт по рукам разработчиков, что привыкли класть свои dll в system32, путём удаления вот этих самых dll, насколько я могу судить со слов нашей техподдержки пользователей.

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

                  Самое читаемое