Sploitus

Exploit for CVE-2022-24481-analysis

kitploit · 2026-08-25

Exploit Code

MARKDOWN148 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-UNAME1ABLE-CVE-2022-24481-ANALYSIS
# CVE-2022-24481 Путаница типов

Путаница типов

# Уязвимый файл

`clfs.sys`

# Корневая причина

Поскольку логика проверки для `rgContainers[0]` не является строгой, после подделки `rgContainers[0]` структура `ClientContext` перекрывается со структурой `ContainerContext`. Если поддельные данные принимаются, после `CloseHandle` функция `CClfsLogFcbPhysical::FlushMetadata` восстанавливает данные `ClientContext`.

# Метод эксплуатации

После подделки `rgContainers[0]` структура `ClientContext` перекрывается со структурой `ContainerContext`. Если поддельные данные принимаются, после `CloseHandle` функция `CClfsLogFcbPhysical::FlushMetadata` восстанавливает данные `ClientContext`. Из-за перекрытия структур этот процесс изменяет `ContainerContext->pContainer` на поддельные данные. Наконец, при вызове `CClfsBaseFilePersisted::RemoveContainer` инициируется косвенный вызов функции-члена, который выполняет определённый гаджет и приводит к повышению привилегий.

# Ход выполнения PoC

## 1\. Подготовка статического файла

`createlog` создаёт новый файл журнала.

Добавьте запись `Container`.

Создайте символическую ссылку `X:\`, указывающую на текущий каталог.

Очистите диапазон `cbSymbolName_start -> cbSymbolName_end`.

Установите `cbSymbolName_start` в `X:\N`.

Скопируйте данные из `ContainerContext_start -> New_cbSymbolName_end` в `ClientContext`.

Обновите `rgContainers[0]`, чтобы он указывал на новое расположение `ContainerContext_start`.

Обновите новое значение `ContainerContext->pContainer`.

Пересчитайте контрольную сумму.

## 2\. Подготовка на этапе выполнения

Найдите адрес гаджета в памяти ядра.

Постройте поддельную виртуальную таблицу.

Выполните оставшуюся настройку памяти.

## 3\. Открытие поддельного файла журнала

`CClfsLogFcbPhysical::Initialize`

`00000001C0002EDB` хранит данные `ClientContext`.

После `CloseHandle` выполняется `CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata`.

Он копирует поддельные данные обратно в `ClientContext`. Поскольку `ClientContext` перекрывается с `ContainerContext`, `ContainerContext->pContainer` перезаписывается поддельными данными.

Затем `CClfsBaseFilePersisted::RemoveContainer` выполняет наш гаджет, что приводит к 16-байтовой записи по произвольному адресу.

# Ссылки

https://zhuanlan.zhihu.com/p/645490730

https://github.com/fr4nkxixi/CVE-2022-24481-POC

https://securelist.com/windows-clfs-exploits-ransomware-cve-2022-24521/111580/

https://starmap.dbappsecurity.com.cn/blog/articles/2022/05/10/cve-2022-24481/

https://www.4awl.net/9646.html

# Список изменений данных

# Ключевые точки потока функций

`win10_21H2_19044.1620`

`CClfsLogFcbPhysical::Initialize(0x??7c)` — процедура инициализации при открытии файла

`bp clfs!CClfsLogFcbPhysical::Initialize + 0x45F`

Этот код сохраняет память `ClientContext`.

![](https://raw.githubusercontent.com/uname1able/cve-2022-24481-analysis/HEAD/%3Cimages/cve-2022-24481-overview.png%3E)

После `CloseHandle` выполняется `CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata`.

`bp clfs!CClfsLogFcbPhysical::FlushMetadata + 0x46`

Это восстанавливает данные `ClientContext`.

![](https://raw.githubusercontent.com/uname1able/cve-2022-24481-analysis/HEAD/%3Cimages/cve-2022-24481-flushmetadata.png%3E)

`CClfsBaseFilePersisted::RemoveContainer`

`bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F`

Используйте указатель поддельной виртуальной таблицы, чтобы достичь гаджета.

![](https://raw.githubusercontent.com/uname1able/cve-2022-24481-analysis/HEAD/%3Cimages/cve-2022-24481-removecontainer.png%3E)

Обратите внимание, что если поддельный файл окажется недействительным, открытие файла завершится ошибкой, и `GetLastError` покажет причину. В этом случае ход эксплуатации не может продолжаться.

# Гаджет

`CClfsBaseFilePersisted::RemoveContainer`

![](https://raw.githubusercontent.com/uname1able/cve-2022-24481-analysis/HEAD/%3Cimages/cve-2022-24481-gadget.png%3E)

`CLFS!ClfsEarlierLsn`

`nt!SeSetAccessStateGenericMapping`

![](https://raw.githubusercontent.com/uname1able/cve-2022-24481-analysis/HEAD/%3Cimages/cve-2022-24481-clfsearlierlsn.png%3E)

`nt!SeSetAccessStateGenericMapping`

![](https://raw.githubusercontent.com/uname1able/cve-2022-24481-analysis/HEAD/%3Cimages/cve-2022-24481-nt-sesetaccessstategenericmapping.png%3E)

`movdqu xmmword ptr [rax+8], xmm0` записывает 16 байт по адресу `[rax+8]` (`XMMWORD`, 128 бит).

После последовательного выполнения результат заключается в записи 16-байтовых данных из `poi(rdx) 0xFFFFFFFF` в `poi(poi(rcx+0x48)+0x8)`.

`rcx` — это местонахождение указателя виртуальной таблицы, и это место находится под нашим контролем.

# Реализованный PoC

https://github.com/uname1able/CVE-2022-24481.git

## Win10 PoC

`winver`

`win10_21H2_19044.1620`

![](https://raw.githubusercontent.com/uname1able/cve-2022-24481-analysis/HEAD/%3Cimages/cve-2022-24481-win10-poc.png%3E)

`bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F`

## Win11 PoC

`winver`

`win11_21H2_22000.593`

![](https://raw.githubusercontent.com/uname1able/cve-2022-24481-analysis/HEAD/%3Cimages/cve-2022-24481-win11-poc.png%3E)

`bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x183`