
CVE-2019-9729. Transferido desde https://github.com/DoubleLabyrinth/SdoKeyCrypt-sys-local-privilege-elevation
SdoKeyCrypt.sys es un controlador de protección de teclado para un MMORPG, también conocido como Massively-Multiplayer-Online-Role-Playing-Game, llamado MapleStory Online, publicado por Shanda Group en China.
El sitio web oficial del juego: http://mxd.sdo.com. (Idioma: chino)
Este controlador se descargará e instalará en la carpeta C:\Windows\System32\ cuando el juego se ejecute por primera vez. Debido a que el juego es muy grande, aproximadamente 13.11 GB, aquí he hecho una copia de seguridad SdoKeyCrypt.sys para cualquiera que quiera reproducir este exploit.
SdoKeyCrypt.sys es sin duda OFICIAL y NO ha sido modificado por nadie.
Puede ver que hay una firma de resumen válida firmada por Shanda Computer (Shanghai) Co., Ltd. que confirma que SdoKeyCrypt.sys fue realmente creado por Shanda.

En la rutina de manejo de IRP_MJ_DEVICE_CONTROL, cuando el código IOCTL es (DWORD)(-0x7FFF3FFC + 0x18) = 0x8000c01c, el controlador no maneja adecuadamente los datos pasados desde el espacio de usuario, lo que hace que un valor de tamaño pueda ser negativo, de modo que se producirá un heap underflow.
Con la ayuda de heap spraying, también conocido como ataque pool-Feng-Shui, se puede deshabilitar SMEP y ejecutar cualquier shellcode en modo kernel para lograr una elevación de privilegios local.


Con el compilador Microsoft Visual C++ para x64 (que admite C++11)
$ cl poc.cpp /Fe:poc.exe /link /dynamicbase:no /fixed ntdll.lib
Probado en Visual Studio 2017 Community, el siguiente es un ejemplo de salida:
C:\Github\SdoKeyCrypt-sys-local-privilege-elevation>cl poc.cpp /Fe:poc.exe /link /dynamicbase:no /fixed ntdll.lib
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27027.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
poc.cpp
Microsoft (R) Incremental Linker Version 14.16.27027.1
Copyright (C) Microsoft Corporation. All rights reserved.
/out:poc.exe
/dynamicbase:no
/fixed
ntdll.lib
poc.obj
A continuación, asegúrese de que SdoKeyCrypt.sys esté cargado y ejecute poc.exe directamente. Si no hay ningún problema, debería obtener un shell nt authority\system.
El código PoC ha sido probado y funciona correctamente en Win10 1709 y Win10 1803.
Sin embargo, no funciona en Win10 1809, que usa un pool respaldado por heap que mitiga el ataque de heap-spray. Pero puede causar BSOD, por lo que al menos existe una vulnerabilidad de denegación de servicio local.
El siguiente es un video de prueba en Win10 1803 17134.619.
