Форум программистов, компьютерный форум, киберфорум
_lunar_
Войти
Регистрация
Восстановить пароль
Рейтинг: 4.67. Голосов: 3.

Прогулка по Рабочему столу Winlogon. Часть 1: UAC

Запись от _lunar_ размещена 02.06.2021 в 00:55
Обновил(-а) _lunar_ 08.06.2021 в 01:53

В современной операционной системе Windows есть области ядра, в которые Microsoft не хотела бы пускать обычных пользователей. Сделано это, естественно, в целях безопасности.
Это могут быть процессы, сервисные службы, и даже Рабочие столы. Немного освежим память для целостности картины.
Не буду расписывать всё досконально (это всё есть в моих предыдущих блогах), но вот как происходит процесс загрузки ОС до того момента когда пользователь увидит свой привычный рабочий стол:
- ядро создаёт сессию 0
- в сессии создаётся несколько Рабочих станций
- интерактивной является оконная Рабочая станция WinSta0, она имеет три Рабочих стола: Default, Winlogon и Disconnent (Рабочий стол Default является общим для всех остальных Рабочих станций, но об этом я расскажу в других блогах).
Аналогично создаётся окружение и для сессии 1 (названия Рабочих станций и Рабочих столов точно такие же).
В сессии 0 загружаются системные процессы (минимальные процессы), а в сессии 1 пользовательские процессы.
Таким образом осуществлена изоляция ядра от пользователя.

Кроме того, стоит вспомнить, что первым wininit.exe создаёт Рабочий стол Winlogon, и если он валиден, то создаётся Рабочий стол Default.
Рабочий стол Disconnent всё ещё покрыт тайной (по крайней мере его создаёт не wininit.exe), но я заметил одну интересную особенность - момент когда он создаётся и последствия этого.
Но об этом тоже в других блогах, скажу лишь что этот Рабочий стол осуществляет переключение окружения между сессиями.

Теперь, когда немного освежили память, перейдём непосредственно к UAC.
UAC (или User Account Control - Контроль учётных записей) это средство безопасности, которое проверяет SID пользователя и выдаёт создаваемому процессу повышенные (Elevated) права.
Посмотрим что происходит, когда система просит нас подтвердить можно ли предоставить процессу повышенные права.
Т.к. на Рабочем столе Winlogon отключена функция PrintScreen я делал фото на телефон (сорри если не очень качественно, потом переделаю).

Это обычный Рабочий стол
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 77
Размер:	638.9 Кб
ID:	7002
Запустим KernelExplorer, который запросит повышенные права
Нажмите на изображение для увеличения
Название: 2.JPG
Просмотров: 77
Размер:	464.1 Кб
ID:	7003
Обычный пользователь подумает, что это просто снимок экрана без учёта ярлыков, файлов и Панели задач с Пуском, находящихся на его Рабочем столе Default.
Но на самом деле это не ваш Рабочий стол
От вашего Рабочего стола осталась только картинка, применённая к Обоям. А окружение, которое вы видите, это непосредственно Рабочий стол Winlogon.
Чтож, давайте узнаем как и почему это Рабочий стол Winlogon.

Запустим KernelExplorer и перейдём на Рабочий стол Winlogon (всё делается в пользовательской сессии 1, переходить в терминальную сессию не нужно):
Инструменты -> Сменить Рабочий стол -> Перейти на Рабочий стол Winlogon
Нажмите на изображение для увеличения
Название: 3.jpg
Просмотров: 78
Размер:	44.3 Кб
ID:	7004

Всё что вы увидите это черный экран и внизу справа мою утилиту управления UI0Return.
Давайте запустим KernelExplorer на этом Рабочем столе: кнопка Kernel Explorer
Нажмите на изображение для увеличения
Название: 4.JPG
Просмотров: 78
Размер:	346.5 Кб
ID:	7005
Не закрывайте KernelExplorer и вернитесь на Рабочий стол Default: кнопка Переключиться между Рабочими столами.

На вашем обычном Рабочем столе закройте KernelExplorer, и снова его откройте чтобы запросить у системы повышенные права.
Когда вы увидите запрос Контроль учётных записей, нажмите Alt+Tab для переключения между окнами.
Вот что вы увидите
Нажмите на изображение для увеличения
Название: 5.JPG
Просмотров: 68
Размер:	276.0 Кб
ID:	7006

Как вам?
Сейчас мы находимся в очень интересном месте ядра ОС. Во-первых, это Рабочий стол Winlogon. Во-вторых, мы можем посмотреть что такое этот UAC.
Для этого запустим Process Hacker:
Инструменты -> Внешние инструменты -> Process Hacker
Нажмите на изображение для увеличения
Название: 6.JPG
Просмотров: 72
Размер:	288.4 Кб
ID:	7007

Итак, процесс UAC называется consent.exe (его создаёт один из хостов svchost.exe с сервисом Appinfo)
Нажмите на изображение для увеличения
Название: 7.JPG
Просмотров: 69
Размер:	804.8 Кб
ID:	7008
Процесс является системным (NT AUTHORITY\СИСТЕМА) и достаточно прожорливым (более 65МБ). Давайте узнаем что у него под капотом.

Щелкните два раза левой кнопкой мыши по нему для открытия окна Свойств
Нажмите на изображение для увеличения
Название: 8.JPG
Просмотров: 67
Размер:	738.1 Кб
ID:	7009
Интересной будет являться вкладка Windows, т.к. Контроль учётных записей с предложением повышения прав процессу является окном.
Здесь мы видим и заголовок окна, и что более интересно имя окна и его класс
$$$Secure UAP Background Window и $$$Secure UAP Background Window Class соответственно.

Ничего не напоминает?
Исследование сервиса "Обнаружение интерактивных служб" (UI0Detect) Часть 1: Windows Vista - Windows 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
typedef BOOLEAN(NTAPI* _RtlTimeToSecondsSince1980)(
    _In_ PLARGE_INTEGER Time,
    _Out_ PULONG ElapsedSeconds
    );
_RtlTimeToSecondsSince1980 RtlTimeToSecondsSince1980;
 
LRESULT WINAPI Session0ViewerWindowProcHook(int nCode, WPARAM wParam, LPARAM lParam)
{
    HMODULE hModule = GetModuleHandle(TEXT("ntdll"));
 
    if (hModule)
        RtlTimeToSecondsSince1980 = (_RtlTimeToSecondsSince1980)GetProcAddress(hModule, "RtlTimeToSecondsSince1980");
 
    BOOL UserWorkItem = FALSE;
    DWORD LastSecondsStart = NULL;
    ULONG SecondsSince1980 = NULL;
    FILETIME SystemTimeAsFileTime{};
 
    if (!nCode && *(PDWORD)(lParam + 16) == 24) {
        if (*(PDWORD64)(lParam + 8)) {
            if (!FindWindow(TEXT("$$$UI0Background"), nullptr) && !GetParent(*(HWND*)(lParam + 24)) && !InterlockedCompareExchange(&g_lWorkItemGuard, 1, 0)) {
                GetSystemTimeAsFileTime(&SystemTimeAsFileTime);
                if (RtlTimeToSecondsSince1980((PLARGE_INTEGER)&SystemTimeAsFileTime, &SecondsSince1980)) {
                    if (SecondsSince1980 > g_dwElapsedSinceLastStart && SecondsSince1980 - g_dwElapsedSinceLastStart >= 0x12C) {
                        UserWorkItem = QueueUserWorkItem(StartUI0DetectThreadProc, nullptr, WT_EXECUTEDEFAULT);
                        LastSecondsStart = g_dwElapsedSinceLastStart;
                        if (UserWorkItem)
                            LastSecondsStart = SecondsSince1980;
                        g_dwElapsedSinceLastStart = LastSecondsStart;
                    }
                }
            }
        }
    }
 
    InterlockedCompareExchange(&g_lWorkItemGuard, 0, 1);
 
    return CallNextHookEx(nullptr, nCode, wParam, lParam);
}
Цитата:
Внутри Session0ViewerWindowProcHook довольно простая логика: выполняется проверка является ли вызов оконным сообщением WM_SHOWWINDOW, которое сигнализирует о появлении нового окна на рабочем столе. Если это так, DLL сначала проверяет имя окна $$$UI0Background и отключается, если это окно уже существует.
Видимо в Microsoft любят называть всякие секретные объекты ядра начиная с трёх символов $ (ну или это как-то связано с внутренней архитектурой ядра, не знаю).

Проводить дальнейший анализ UAC на паблик я не стану (чтобы уж совсем не обидеть ребят из MS и не только).
Но тем, кому интересно, могут спокойно подключать отладчики и анализировать выполнение кода для возможного его обхода.
В общем вот такой получился блог. Если есть вопросы пишите (коменты модерирую я, так что бред сивой кобылы и прочую ахинею можете оставить при себе).

Прогулка по Рабочему столу Winlogon. Часть 2: Привет, друг
Размещено в Без категории
Показов 827 Комментарии 4
Всего комментариев 4
Комментарии
  1. Старый комментарий
    Видимо в Microsoft любят называть всякие секретные объекты ядра начиная с трёх символов $ (ну или это как-то связано с внутренней архитектурой ядра, не знаю).
    Проводить дальнейший анализ UAC на паблик я не стану (чтобы уж совсем не обидеть ребят из MS и не только).
    Но тем, кому интересно, могут спокойно подключать отладчики и анализировать выполнение кода для возможного его обхода.
    ...
    Всё, что вы написали, в высшей степени интересно. Но меня в данный момент больше всего на свете интересует дата-время
    1. Как ОС windows XP устанавливает дату-время?
    2. Как, в каком виде сохраняется дата-время?
    3. Где находится контрольная дата, меньше которой установить дату-время нельзя?
    4. Что надо сделать, чтобы установить произвольную дату-время?
    5. Как взаимодействуют две windows XP? Программа посредник? Или что там ещё есть?
    Ведь они передают друг другу свои знания в тот момент, когда одна из них уходит в небытие

    Я считаю, что если я доберусь (разберусь) до даты-времени, то возьму windows XP за горло.
    Время - это Самая большая тайна МС.
    Запись от wer1 размещена 06.06.2021 в 08:19 wer1 вне форума
  2. Старый комментарий
    На вашем обычном Рабочем столе закройте KernelExplorer, и снова его откройте чтобы запросить у системы повышенные права. Когда вы увидите запрос Контроль учётных записей, нажмите Alt+Tab для переключения между окнами. Вот что вы увидите...
    ...

    Это очень интересно. Но вот что непонятно. О каких повышенных правах идёт речь? Чтобы пояснить свой вопрос, я скажу как обстоит дело на моём компьютере.
    Во-первых у меня стоит windows XP.
    Во-вторых я использую файловую систему FAT32. - это позволяет мне избежать лишних объяснений с ОС по-вопросу: кто хозяин на компе, а кому должна повиноваться ОС. Слово "допуск" запрещено на моём компе! Центр службы бесопасности тоже выключен
    В-третьих из 80-ти служб я отключил 60. - Нечего им поглощать ресурсы компа

    После такой реформы ОС ведёт себя тише воды ниже травы.
    ОС не должна качать права человека. Видимо Майкрософт очень хочет, чтобы мы втянулись в неведомую нам игру с Операционной Системой и забыли для чего она (ОС) существует. ОС должна работать тихо и незаметно. У неё не должно быть вообще никаких прав.

    К примеру возьмите простой калькулятор. Он может только выразить вам своё возмущение в случае, если вы попытаетесь делить на 0. И не более того. А теперь представьте, что появится новая версия обычного калькулятора, которая будет спрашивать с вас пароль каждые 10 минут. Например: Что-то ты долго считаешь. Может ты не тот за кого себя выдаёшь? А может тебе власть не нравится? Введи на всякий случай пароль. Это для твоей же безопасности. Пароль начни словами "Да здравствует Майкрософт! Слава ей слава!" А теперь добавь к этим словам пароль.
    ...
    Вы полагаете, что такого быть не может?
    Запись от wer1 размещена 07.06.2021 в 08:45 wer1 вне форума
  3. Старый комментарий
    Аватар для _lunar_
    Цитата:
    Сообщение от wer1 Просмотреть комментарий
    Всё, что вы написали, в высшей степени интересно. Но меня в данный момент больше всего на свете интересует дата-время
    1. Как ОС windows XP устанавливает дату-время?
    2. Как, в каком виде сохраняется дата-время?
    3. Где находится контрольная дата, меньше которой установить дату-время нельзя?
    4. Что надо сделать, чтобы установить произвольную дату-время?
    5. Как взаимодействуют две windows XP? Программа посредник? Или что там ещё есть?
    Ведь они передают друг другу свои знания в тот момент, когда одна из них уходит в небытие

    Я считаю, что если я доберусь (разберусь) до даты-времени, то возьму windows XP за горло.
    Время - это Самая большая тайна МС.
    Сразу скажу, что с Windows XP я не работаю уже лет 10-12.
    Её ядро отличается от ядер ОС, начиная с Vista.
    И главное отличие - там нет пользовательской сессии, всё работает в одном окружении.
    По поводу даты и время: чуть ли не все исходники XP слиты в сеть, очень много материала из серии research.
    Посмотрите их, и т.к. обходить окружение не потребуется, можно написать небольшой драйвер для управления тем, что вам надо.
    Запись от _lunar_ размещена 08.06.2021 в 00:17 _lunar_ вне форума
  4. Старый комментарий
    Аватар для _lunar_
    Цитата:
    Сообщение от wer1 Просмотреть комментарий
    Но вот что непонятно. О каких повышенных правах идёт речь?
    О правах администратора.
    Переписывать MSDN я не буду, просто немного поясню.
    В системе очень много различного рода аккаунтов: это и службы (и их разновидности), и владельцы, доменные группы, и конечно же сама система.
    Всё это добро называется Well-known SIDs
    К примеру: S-1-5-18, этот SID предназначен системе (LocalSystem), 19 и 20 LocalService и NetworkService соответственно, а S-1-5-21 это SID пользователя.
    SID пользователя по умолчанию является урезанным по правам (обычно запись и создание) аккаунтом.
    Но этот SID может быть повышен до уровня администратора.
    Имея SID S-1-5-21 уровня администратор, можно получить полный доступ к SID системы S-1-5-18.
    Дале только ваша фантазия и умение писать код.
    Запись от _lunar_ размещена 08.06.2021 в 00:37 _lunar_ вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.