## 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`.

После `CloseHandle` выполняется `CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata`.
`bp clfs!CClfsLogFcbPhysical::FlushMetadata + 0x46`
Это восстанавливает данные `ClientContext`.

`CClfsBaseFilePersisted::RemoveContainer`
`bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F`
Используйте указатель поддельной виртуальной таблицы, чтобы достичь гаджета.

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

`CLFS!ClfsEarlierLsn`
`nt!SeSetAccessStateGenericMapping`

`nt!SeSetAccessStateGenericMapping`

`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`

`bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F`
## Win11 PoC
`winver`
`win11_21H2_22000.593`

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