CVE-2021-1732 - это уязвимость нулевого дня, использованная организацией BITTER APT в ходе одной операции, которая была раскрыта в феврале этого года [1] [2] [3]. Эта уязвимость использует возможность обратного вызова пользовательского режима в модуле win32kfull, чтобы прервать нормальный поток выполнения и установить флаг ошибки дополнительных данных оконного объекта (tagWND), что приводит к нарушению доступа к памяти за пределами пространства ядра.
Анализ причин
Основная причина CVE-2021-1732: В процессе создания окна (
Обычный процесс создания оконного объекта (
Из приведенного выше рисунка мы видим, что: когда размер дополнительных данных окна (
Вот два режима сохранения адреса дополнительных данных tagWND (
[Режим 1] В системной куче пользовательского пространства
Как и в обычном процессе, показанном на рисунке выше, указатель дополнительной памяти данных, выделенной в системной куче пользовательского пространства, сохраняется непосредственно в
[Режим 2] В куче рабочего стола в пространстве ядра
Функция
Один макет памяти tagWND для режима 2 показан на следующем рисунке:
Затем верните управляемое значение смещения пользовательского режима в tagWND.pExtraBytes через ntdll! NtCallbackReturn и, наконец, реализуйте возможность чтения / записи за пределами контролируемого смещения на основе базового адреса кучи рабочего стола в пространстве ядра.
Измененный процесс, который может вызвать уязвимость, показан следующим образом:
В соответствии с измененной блок-схемой выше, ключевые этапы запуска этой уязвимости объясняются следующим образом:
BSOD snapshot:
Анализ эксплойта
Из анализа первопричины мы можем увидеть, что: «Возможность чтения / записи данных по адресу, который вычисляется по базовому адресу кучи рабочего стола в пространстве ядра + указанному смещению» может быть получена через эту уязвимость.
При использовании режима ядра целью атаки является получение системного токена в целом. Общий метод показан следующим образом:
Одно из решений показано на следующем рисунке:
Ccылки
[1] https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-1732
[2] https://ti.dbappsecurity.com.cn/blo...-is-used-by-bitter-apt-in-targeted-attack-cn/
[3] https://www.virustotal.com/gui/file...f20dd11acd708d7db7fa37ff75bf1abfc29/detection
[4] https://en.wikipedia.org/wiki/Privilege_escalation
От ТС
Отригинал тут
Перевод:
Azrv3l cпециально для xss.pro
Анализ причин
Основная причина CVE-2021-1732: В процессе создания окна (
CreateWindowEx), когда объект окна tagWND имеет дополнительные данные (tagWND.cbwndExtra! = 0), указатель функции user32! _XxxClientAllocWindowClassExtraBytes, сохраненный в ntdll! _PEB.kernelCallbackTable (смещение + 0x58) в пользовательском режиме, будет вызывается через механизм обратного вызова nt! KeUserModeCallback, а системный распределитель кучи (ntdll! RtlAllocateHeap) используется для выделения дополнительной памяти данных в пользовательском пространстве. При подключении функции user32!_XxxClientAllocWindowClassExtraBytes в пользовательском режиме и изменении свойств дополнительных данных объекта окна в функции перехвата вручную атомарная операция выделения памяти для дополнительных данных в режиме ядра может быть прервана, после чего наконец, достигается возможность чтение/записи на основе дополнительной памяти данных.Обычный процесс создания оконного объекта (
CreateWindowEx) показан следующим образом (частично):
Из приведенного выше рисунка мы видим, что: когда размер дополнительных данных окна (
tagWND.cbWndExtra) не равен 0, win32kfull!xxxCreateWindowEx вызывает функцию пользовательского режима user32!_XxxClientAllocWindowClassExtraBytes через механизм обратного вызова ядра, запрашивает данные памяти дополнительного окна в пользовательском пространстве. После выделения указатель выделенной памяти в пользовательском пространстве будет возвращен свойству tagWND.pExtraBytes:
Вот два режима сохранения адреса дополнительных данных tagWND (
tagWND.pExtraBytes): [Режим 1] В системной куче пользовательского пространства
Как и в обычном процессе, показанном на рисунке выше, указатель дополнительной памяти данных, выделенной в системной куче пользовательского пространства, сохраняется непосредственно в
tagWND.pExtraBytes. Один макет памяти tagWND для режима 1 показан на следующем рисунке:
[Режим 2] В куче рабочего стола в пространстве ядра
Функция
ntdll!NtUserConsoleControl выделяет дополнительную память данных в куче рабочего стола пространства ядра функцией DesktopAlloc, вычисляет смещение выделенного адреса дополнительной памяти данных относительно базового адреса кучи рабочего стола ядра, сохраняет смещение в tagWND.pExtraBytes и изменяет tagWND.extraFlag | = 0x800:
Один макет памяти tagWND для режима 2 показан на следующем рисунке:
Затем верните управляемое значение смещения пользовательского режима в tagWND.pExtraBytes через ntdll! NtCallbackReturn и, наконец, реализуйте возможность чтения / записи за пределами контролируемого смещения на основе базового адреса кучи рабочего стола в пространстве ядра.
Измененный процесс, который может вызвать уязвимость, показан следующим образом:
В соответствии с измененной блок-схемой выше, ключевые этапы запуска этой уязвимости объясняются следующим образом:
- Измените указатель функции
user32! _XxxClientAllocWindowClassExtraBytesвPEB.kernelCallbackTableна пользовательскую функцию-перехватчик. - Создайте несколько обычных оконных объектов и найдите адреса памяти пользовательского пространства этих объектов ядра tagWND через
user32!HMValidateHandle. - Уничтожьте часть обычных оконных объектов, созданных на шаге 2, и создайте один новый оконный объект с именем «hwndMagic» с указанным
tagWND.cbwndExtra. HwndMagic, вероятно, может повторно использовать ранее освобожденную память оконных объектов. Следовательно, путем поиска адресов памяти пользовательского пространства ранее найденых оконных объектов с указаннымtagWND.cbwndExtraв настраиваемой функции перехвата, hwndMagic может быть найден до возврата CreateWindowEx. - Вызовите NtUserConsoleControl в пользовательской функции перехвата, чтобы изменить
tagWNDMagic.extraFlagс флагом 0x800. - Вызовите NtCallbackReturn в пользовательской функции перехвата, чтобы назначить поддельное смещение для
tagWNDMagic.pExtraBytes. - Вызов SetWindowLong для записи данных по адресу базового адреса кучи рабочего стола в пространстве ядра + указанного смещения, что может привести к нарушению доступа к памяти за пределами допустимого диапазона.
Код:
void* WINAPI MyxxxClientAllocWindowClassExtraBytes(ULONG* size) {
do {
if (MAGIC_CBWNDEXTRA == *size) {
HWND hwndMagic = NULL;
//search from freed NormalClass window mapping desktop heap
for (int i = 2; i < 50; ++i) {
ULONG_PTR cbWndExtra = *(ULONG_PTR*)(g_pWnd[i] + _WND_CBWNDEXTRA_OFFSET);
if (MAGIC_CBWNDEXTRA == cbWndExtra) {
hwndMagic = (HWND)*(ULONG_PTR*)(g_pWnd[i]);
printf("[+] bingo! find &hwndMagic = 0x%llx in callback :) \n", g_pWnd[i]);
break;
}
}
if (!hwndMagic) {
printf("[-] Not found hwndMagic, memory layout unsuccessfully :( \n");
break;
}
// 1. set hwndMagic extraFlag |= 0x800
CONSOLEWINDOWOWNER consoleOwner = { 0 };
consoleOwner.hwnd = hwndMagic;
consoleOwner.ProcessId = 1;
consoleOwner.ThreadId = 2;
NtUserConsoleControl(6, &consoleOwner, sizeof(consoleOwner));
// 2. set hwndMagic pExtraBytes fake offset
struct {
ULONG_PTR retvalue;
ULONG_PTR unused1;
ULONG_PTR unused2;
} result = { 0 };
//offset = 0xffffff00, access memory = heap base + 0xffffff00, trigger BSOD
result.retvalue = 0xffffff00;
NtCallbackReturn(&result, sizeof(result), 0);
}
} while (false);
return _xxxClientAllocWindowClassExtraBytes(size);
}
BSOD snapshot:
Анализ эксплойта
Из анализа первопричины мы можем увидеть, что: «Возможность чтения / записи данных по адресу, который вычисляется по базовому адресу кучи рабочего стола в пространстве ядра + указанному смещению» может быть получена через эту уязвимость.
При использовании режима ядра целью атаки является получение системного токена в целом. Общий метод показан следующим образом:
- Воспользуйтесь уязвимостью, чтобы получить произвольный примитив чтения / записи памяти в пространстве ядра.
- Утечка адреса какого-либо объекта ядра, поиск системного процесса по цепочке EPROCESS.
- Скопируйте токен системного процесса в токен процесса атаки, чтобы завершить задание повышения привилегий.
Одно из решений показано на следующем рисунке:
- Смещение дополнительных данных tagWNDMagic (
wndMagic_extra_bytes) можно контролировать с помощью уязвимости, поэтому мы можем использовать SetWindowLong для изменения данных по указанному адресу, рассчитанному по базовому адресу кучи рабочего стола + контролируемому смещению. - Используйте возможность уязвимости для изменения
tagWNDMagic.pExtraBytesна смещение tagWND0 (смещение tagWND0 получается с помощью tagWND0 + 0x8), вызовите SetWindowLong, чтобы изменить tagWND0.cbWndExtra = 0x0fffffff, чтобы получить измененныйtagWND0.pExtraBytes. - Вычислите смещение от
tagWND0.pExtraBytesк tagWND1, вызовите SetWindowLongPtr, чтобы заменить spMenu tagWND1 поддельным spMenu с помощью подделанногоtagWND0.pExtraBytes, реализовать возможность произвольного чтения из памяти с помощью поддельного spMenu и функции GetMenuBarInfo. Логика GetMenuBarInfo для чтения данных по указанному адресу показана следующим образом: данные из 16 байтов сохраняются в структуре MENUBARINFO.rcBar:
- Используйте измененный
tagWND0.pExtraBytes, чтобы изменитьtagWND1.pExtraBytesс указанным адресом, и используйте SetWindowLongPtr tagWND1, чтобы получить возможность произвольной записи в память. - После получения произвольного примитива чтения / записи в память нам нужно утечь адрес объекта ядра в куче рабочего стола, чтобы найти EPROCESS. К счастью, при установке поддельного spMenu для tagWND1 на шаге 3 возвращаемое значение SetWindowLongPtr - это адрес ядра исходного spMenu, который можно использовать напрямую.
- Наконец, найдите системный процесс, пройдя цепочку EPROCESS, и скопируйте токен системного процесса в процесс атаки, чтобы завершить задание повышения привилегий. Этот метод относительно распространен, поэтому подробно описывать его не будем.
Ccылки
[1] https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-1732
[2] https://ti.dbappsecurity.com.cn/blo...-is-used-by-bitter-apt-in-targeted-attack-cn/
[3] https://www.virustotal.com/gui/file...f20dd11acd708d7db7fa37ff75bf1abfc29/detection
[4] https://en.wikipedia.org/wiki/Privilege_escalation
От ТС
Отригинал тут
Перевод:
Azrv3l cпециально для xss.pro