
CVE-2019-9729. Transferred from https://github.com/DoubleLabyrinth/SdoKeyCrypt-sys-local-privilege-elevation
SdoKeyCrypt.sys est un pilote de protection du clavier pour un MMORPG, aka jeu de rôle en ligne massivement multijoueur, appelé MapleStory Online qui est publié par Shanda Group en Chine.
Site web officiel du jeu : http://mxd.sdo.com. (Langue : chinois)
Ce pilote sera téléchargé et installé dans le dossier C:\Windows\System32\ lors de la première exécution du jeu. Comme le jeu est très volumineux, environ 13,11 Go, j'ai fait une sauvegarde SdoKeyCrypt.sys pour quiconque souhaite reproduire cette exploitation.
SdoKeyCrypt.sys est bien OFFICIEL et n'a été modifié par personne.
Vous pouvez voir qu'il y a une signature de hachage valide signée par Shanda Computer (Shanghai) Co., Ltd. qui confirme que SdoKeyCrypt.sys a bien été créé par Shanda.

Dans la routine de gestionnaire IRP_MJ_DEVICE_CONTROL, lorsque le code IOCTL est (DWORD)(-0x7FFF3FFC + 0x18) = 0x8000c01c, le pilote ne gère pas correctement les données provenant de l'espace utilisateur, ce qui fait qu'une valeur de taille peut être négative, provoquant ainsi un underflow du tas.
Avec l'aide du heap spraying, aussi appelé attaque pool-Feng-Shui, on peut désactiver SMEP et exécuter n'importe quel shellcode en mode noyau pour réaliser une élévation de privilèges locale.


Avec le compilateur Microsoft Visual C++ x64 (qui supporte c++11)
$ cl poc.cpp /Fe:poc.exe /link /dynamicbase:no /fixed ntdll.lib
Testé sur Visual Studio 2017 Community, voici un exemple de sortie :
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
Assurez-vous ensuite que SdoKeyCrypt.sys est chargé et exécutez poc.exe directement. Si tout se passe bien, vous devriez obtenir un shell nt authority\system.
Le code PoC a été testé et fonctionne correctement sur Win10 1709 et Win10 1803.
Cependant, il ne fonctionne pas sur Win10 1809 qui utilise un pool basé sur le tas atténuant l'attaque de heap-spray. Mais il peut causer un BSOD, il y a donc au moins une vulnérabilité de déni de service local.
Voici une vidéo de test sur Win10 1803 17134.619.
