Помещение пользователя в группу Power Users (Опытные пользователи) -
стандартный подход системных администраторов во многих организациях. Такая
политика устраняет все неприятности работы человека под простым пользователем,
но в то же время не дает ему администраторских привилегий и возможности что-либо
испортить. Опытные пользователи могут устанавливать некоторые программы,
изменять время, работать с ActiveX компонентами,
настраивать принтеры - делать многое из того, что обычный пользователь не может.
Однако насколько такая система действительно безопасна? Совсем не безопасна, даже сама Microsoft
признает, что Опытный пользователь может без труда получить все привилегии.
Каким образом компания естественно не описывает, но это мы и рассмотрим в данной статье.
Прежде чем перейдем к описанию зададим направления поиска. В отсутствии
прямых уязвимостей (типа переполнения буфера) повышение своего статуса возможно
выполнением произвольного кода в контексте более привилегированного аккаунта.
Такими являются Administrators и Local System, от них в частности запускается
ряд служб. Следовательно, если Опытный пользователь сможет изменить файл,
исполняемый одним из этих аккаунтов, например сконфигурировать его на загрузку
нашей DLL или добавить exe-шник
в автоматический запуск этого аккакнту, то мы получим полный доступ к
компьютеру.
Для начала определим к каким файлам имеет доступ Опытный пользователь. Можно
использовать брутфорс - заходить в каждую директорию и смотреть свои права,
однако это довольно непрактично :). Можно использовать встроенную утилиту cacls, но Security Descriptor Description Language
понимать не просто, а для разбора результатов надо писать скрипт. Соответственно,
для моих нужд была написана утилита
AccessChk -
ей передается имя аккаунта или группы и путь файловой системы, реестра или
сервиса и она выдает, какие эффективные права имеет аккакунт на этот объект. Для
простоты восприятия прога пишет W в случае если
разрешено модифицирование, R - когда чтение.
Вооружившись инструментом начнем исследование Windows XP SP2.
Найдем объекты в системном каталоге:
accesschk –ws “power users” c:\windows
Это покажет нам все файлы и директории на которые мы имеем права записи.
Очевидно, что в большинство директорий мы можем писать, это корневой каталог
Windows, Windows\System32, Windows\Downloaded Program
Files, однако записью в эти директории прав не поднять. Несмотря на то, что
система дает писать в эти директории, права на изменение системных файлов,
содержащихся в них, предоставлены только пользователям Административной группы и Local System. Исключения - файлы шрифтов, логи, файлы
помощи, картинки и клипы, файлы инсталляции, но изменение этих файлов опять же
желанного успеха нам не принесет. Легким бы путем стало изменение драйверов в
Windows\System32\Drivers, но и этого, естественно, Microsoft
не дает.
В списке доступных был обнаружен ряд dll и
exe файлов, так что я стал исследовать их на возможные
уязвимости. Большинство - интерактивные утилиты или программы, доступны для запуска и под
ограниченными правами. Однако интерес вызвало появление в списке удивительного
файла - ntoskrnl.exe:
Да, Опытный пользователь может заменить ядро операционной системы! Правда,
через 5 секунд после модификации система Windows File Protection (WFP) заменит
его на находящийся в бекапе Windows\System32\Dllcache. Прав на запись в этот
каталог уже нет, так что подменить файл там не получится. Но обойти
WFP все-таки можно! Достаточно написать простую
программу которая заменит файл, сбросит модифицированные данные на диск и тут
же перезагрузит систему, не дав WFP заменить его. Я
попробовал и выяснил - данная фишка работает.
Однако это не дает нам ответа на вопрос как же повысить свою должность в
Windows? Ответ прост - можно использовать дизассемблер
для поиска функции проверки привилегий -
SeSinglePrivilegeCheck, пропатчить ее так, что бы она всегда возвращала
True. Это будет означать, что пользователь всегда
имеет те привилегии, о которых запрашивает. Таким образом мы получим права на
загрузку драйверов, получение прав владельца, создание токена, с помощью этих
функция можно легко получить админские права. Стоит отметить, что 64-битная
Windows XP препятствует внесению изменений в ядро при помощи системы
PatchGuard, но к счастью такие системы пока мало распространены.
Замена Ntoksrnl.exe не единственный путь к успеху. Одна из
dll - Schedsvc.dll - так же может быть изменена и она запускается как сервис от имени
Local System. Она нужная для работы шедулера, но ведь
Windows легко может обойтись и без него, не правда ли?
Ну а мы можем заменить dll-ку своей, которая добавляет
нас в группу Администраторов. Конечно, WPF и тут
заменит файл на оригинальный, но как это обойти я уже писал выше.
Итак, два направления уже есть, продолжим наше исследование дальше. Обратим
внимание на директорию Program Files, там такая же ситуация как и в случае
с каталогом Windows - Опытный пользователь может
писать в большинство директорий, однако изменять файлы нельзя, есть несколько
утилит типа Media Player, которые можно запускать.
Но и тут есть файлы, которые запускаются от Local System,
но тем не менее подлежат модификации обычным пользователем - например недавно установленный мной...
Microsoft Windows Defender Beta 2. Заменив его мы получим прямую возможность
записи себя любимого в Админы, тем более что его заменять обратно на оригинал никто не
будет.
Дальше просканируем реестр на потенциальные уязвимости:
accesschk –swk “power users” hklm
Доступ к HKLM\System естественно закрыт, однако открыт, например, HKLM\Software\Microsoft\
Windows\CurrentVersion\Run - это дает нам возможность прописать наш файл в
автозагрузку для всех пользователей, но это не особо хорошо в нашей ситуации,
так как требует захода пользователя с администраторскими привилегиями (если вы
типичный офисный зомби - вызов админа и его заход можно легко симулировать 🙂 ).
Опытный пользователь по умолчанию имеет возможность писать в несистемные ветви
HKLM\Software, однако тут, как и в случае с поиском в Program
Files, надо искать сторонние приложений, которые исполняются с
повышенными привилегиями. В моем случае таких не оказалось.
Ну и остались службы Windows. Программа проверяла
флаги SERVICE_CHANGE_CONFIG и WRITE_DAC - в первом случае пользователь может прописать
свою программу на старт службы, во втором - дать сам себе право
SERVICE_CHANGE_CONFIG. У меня единственной уязвимой службой стала:
Программа
PsService показала под кем исполняется сервис:
Следовательно, Опытный пользователь может изменить путь на собственный,
перезапустить систему и наслаждаться свободой.
Возможны и другие уязвимые службы. По умолчанию Windows
не дает право записи на службы сторонних производителей, однако они сами
могут прописать себе расширенные права, которые позволят нам поднять привилегии.
Например, уязвимость в моей 64-битной Windows XP позволяет расширить свои
полномочия не только Опытному пользователю, но даже и самом простому:
Ну вот, собственно и все. Мы показали как легко Опытному пользователю
получить Администраторские привилегии. Так что не стоит особо доверять такому
методу ограничения прав - решительно настроенному и знающему человеку это легко
обойти.