Sploitus

Exploit for CVE-2023-28218

kitploit · 2026-09-05

Exploit Code

MARKDOWN84 lines
## 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`. ![img1](https://assets.kitploit.com/production/public/readmes/26166/4400e5eb991308f393a2f832c10974010b3ed42712ccb8b2078b047a5622b196.png)



Обе функции принимают `v82` в качестве входного параметра. `v82` — это адрес, контролируемый usermode. В функции `Afd!AfdComputeCMSGLength` этот адрес напрямую разыменовывается для получения значения. Затем вычисляется длина CMSG buffer и возвращается. После этого по этому размеру выделяется pool. Контролируя два входных параметра `a1` и `a2`, можно контролировать размер, который будет возвращён в параметре `a3`. ![img2](https://assets.kitploit.com/production/public/readmes/26166/aaa15346aa508775af450afde4a74480d762a309d588a66b617f049492974668.png)

В функции `Afd!AfdCopyCMSGBuffer` адрес `v82` напрямую разыменовывается для получения значения. После нескольких проверок это значение будет использоваться как размер операции `memmove`. ![img3](https://assets.kitploit.com/production/public/readmes/26166/1977f92aa265f9eb7d75e3d5cc66a1537790f9bda8f1a1249dc0ae243ef6384e.png)

В этой функции есть ошибка `Integer overflow`; в сочетании с тем, что обе функции напрямую выполняют fetch из адреса на стороне usermode, мы можем изменить это значение во время выполнения. Это приводит к тому, что размер, используемый в memmove, становится очень большим. Когда копирование доходит до недоступной области памяти, срабатывает try catch. Но копирование предыдущих областей памяти уже произошло. Таким образом, мы можем выполнять копирование нужного нам размера. ![img4](https://assets.kitploit.com/production/public/readmes/26166/b3ea5da5bcf4e80b70ef7f55c99662295955c12d0af202de2abcdc2824e88a49.png)

  * Чтобы запустить 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 ![minimal](https://assets.kitploit.com/production/public/readmes/26166/4d1f09cfa933c4ed81581919772046e4a553d879f371aba65a2f4db7f5b34f65.gif)
  * Эксплойт POC ![exploit](https://assets.kitploit.com/production/public/readmes/26166/ec26132dd9d526eb91cefb7844abcbf45b97732fd0a70504f991b37da97553f7.gif)