## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-H1BANA-CVE-2023-28218
# Report CVE-2023-28218
## Обзор уязвимости
Уязвимость приводит к повышению привилегий в ядре Windows. Ошибка присутствует в драйвере `Windows Ancrillary Function Driver for WinSock` (AFD.sys). Уязвимость была исправлена в обновлении от 11 апреля 2023 года. Имеет оценку `CVSS:3.1 7.0 / 6.1` и классифицируется как `Important`.
## Описание уязвимости
* Тип ошибки: `Double fetch` и `Integer overflow`, приводящие к `pool overflow`.
* Ошибка возникает в функциях `Afd!AfdComputeCMSGLength` и `Afd!AfdCopyCMSGBuffer`. 
Обе функции принимают `v82` в качестве входного параметра. `v82` — это адрес, контролируемый usermode. В функции `Afd!AfdComputeCMSGLength` этот адрес напрямую разыменовывается для получения значения. Затем вычисляется длина CMSG buffer и возвращается. После этого по этому размеру выделяется pool. Контролируя два входных параметра `a1` и `a2`, можно контролировать размер, который будет возвращён в параметре `a3`. 
В функции `Afd!AfdCopyCMSGBuffer` адрес `v82` напрямую разыменовывается для получения значения. После нескольких проверок это значение будет использоваться как размер операции `memmove`. 
В этой функции есть ошибка `Integer overflow`; в сочетании с тем, что обе функции напрямую выполняют fetch из адреса на стороне usermode, мы можем изменить это значение во время выполнения. Это приводит к тому, что размер, используемый в memmove, становится очень большим. Когда копирование доходит до недоступной области памяти, срабатывает try catch. Но копирование предыдущих областей памяти уже произошло. Таким образом, мы можем выполнять копирование нужного нам размера. 
* Чтобы запустить POC, сначала нужно создать `socket` с параметром `type` равным `SOCK_DGRAM`. Затем использовать handle этого `socket` в качестве параметра при вызове функции `bind`. Наконец, создать 2 потока: один поток будет постоянно вызывать `DeviceControl` с IOCTL `0x120D3`. Настроить подходящий userbuffer, чтобы обойти некоторые проверки. Оставшийся поток будет постоянно изменять значение, хранящееся по usermode-адресу, который передаётся в качестве параметра в обе вышеупомянутые функции.
## Эксплуатация
* С помощью этой ошибки можно переполнить non-paged NX pool с нужным размером, при этом данные полностью контролируются со стороны usermode.
* Подход к эксплуатации: распылить (spray) как можно больше объектов Namedpipe, затем освободить часть объектов, чтобы создать дыры в куче. Затем создать пул на основе размера, вычисленного функцией `Afd!AfdComputeCMSGLength`; этот размер должен совпадать с размером объекта `Namedpipe`. Тогда пул будет выделен в только что освобождённые объекты. Используя ошибку, переполнить соседние объекты `Namedpipe`, после чего использовать механизмы `Namedpipe` для получения возможности чтения/записи памяти ядра. Прочитать токен системного процесса и записать его в токен текущего процесса.
## Затронутые версии
* Windows Server 2012 R2 (установка Server Core) сборки до версии 6.3.9600.20919
* Windows Server 2012 R2 сборки до версии 6.3.9600.20919
* Windows Server 2012 (установка Server Core) сборки до версии 6.2.9200.24216
* Windows Server 2012 сборки до версии 6.2.9200.24216
* Windows Server 2008 R2 for x64-based Systems Service Pack 1 (установка Server Core) сборки до версии 6.1.7601.26466
* Windows Server 2008 R2 for x64-based Systems Service Pack 1 сборки до версии 6.1.7601.26466
* Windows Server 2008 for x64-based Systems Service Pack 2 (установка Server Core) сборки до версии 6.0.6003.22015
* Windows Server 2008 for x64-based Systems Service Pack 2 сборки до версии 6.0.6003.22015
* Windows Server 2008 for 32-bit Systems Service Pack 2 (установка Server Core) сборки до версии 6.0.6003.22015
* Windows Server 2008 for 32-bit Systems Service Pack 2 сборки до версии 6.0.6003.22015
* Windows Server 2016 (установка Server Core) сборки до версии 10.0.14393.5850
* Windows Server 2016 сборки до версии 10.0.14393.5850
* Windows 10 Version 1607 for x64-based Systems сборки до версии 10.0.14393.5850
* Windows 10 Version 1607 for 32-bit Systems сборки до версии 10.0.14393.5850
* Windows 10 for x64-based Systems сборки до версии 10.0.10240.19869
* Windows 10 for 32-bit Systems сборки до версии 10.0.10240.19869
* Windows 10 Version 22H2 for 32-bit Systems сборки до версии 10.0.19045.2846
* Windows 10 Version 22H2 for ARM64-based Systems сборки до версии 10.0.19045.2846
* Windows 10 Version 22H2 for x64-based Systems сборки до версии 10.0.19045.2846
* Windows 11 Version 22H2 for x64-based Systems сборки до версии 10.0.22621.1555
* Windows 11 Version 22H2 for ARM64-based Systems сборки до версии 10.0.22621.1555
* Windows 10 Version 21H2 for x64-based Systems сборки до версии 10.0.19044.2846
* Windows 10 Version 21H2 for ARM64-based Systems сборки до версии 10.0.19044.2846
* Windows 10 Version 21H2 for 32-bit Systems сборки до версии 10.0.19044.2846
* Windows 11 version 21H2 for ARM64-based Systems сборки до версии 10.0.22000.1817
* Windows 11 version 21H2 for x64-based Systems сборки до версии 10.0.22000.1817
* Windows 10 Version 20H2 for ARM64-based Systems сборки до версии 10.0.19042.2846
* Windows 10 Version 20H2 for 32-bit Systems сборки до версии 10.0.19042.2846
* Windows 10 Version 20H2 for x64-based Systems сборки до версии 10.0.19042.2846
* Windows Server 2022 (установка Server Core) сборки до версии 10.0.20348.1668
* Windows Server 2022 сборки до версии 10.0.20348.1668
* Windows Server 2019 (установка Server Core) сборки до версии 10.0.17763.4252
## Патч
* Ошибка была исправлена заменой двух старых функций на две новые; к именам старых функций добавлен суффикс `_old`. Эти новые функции уже. В двух новых функциях, хотя double fetch всё ещё присутствует, извлечённое значение проверяется перед использованием. Функции Rtl используются для замены арифметических операций, предотвращая `Integer overflow`.
## Заключение
* Уязвимость затрагивает очень широкий диапазон систем и угрожает многим системам. Однако у эксплойта при запуске всё ещё есть небольшой процент неудач, приводящих к падению Windows из-за spray в куче. Кроме того, после повышения прав процесса cmd до System, выход из этого процесса также приведёт к падению Windows, поскольку в процессе эксплуатации объект Namedpipe был повреждён (corrupt).
## Вложения
* Минимальный POC 
* Эксплойт POC 