
CVE-2019-9729. Transferido de https://github.com/DoubleLabyrinth/SdoKeyCrypt-sys-local-privilege-elevation
SdoKeyCrypt.sys é um driver de proteção de teclado para um MMORPG, ou seja, um jogo de RPG multijogador online massivo, chamado MapleStory Online, publicado pelo Shanda Group na China.
O site oficial do jogo: http://mxd.sdo.com. (Idioma: chinês)
Este driver é baixado e instalado na pasta C:\Windows\System32\ na primeira vez que o jogo é executado. Como o jogo é muito grande, aproximadamente 13.11 GB, fiz aqui um backup SdoKeyCrypt.sys para qualquer pessoa que queira reproduzir este exploit.
SdoKeyCrypt.sys é certamente OFICIAL e NÃO foi modificado por ninguém.
Você pode ver que há uma assinatura de resumo válida assinada pela Shanda Computer (Shanghai) Co., Ltd. que confirma que o SdoKeyCrypt.sys foi de fato criado pela Shanda.

Na rotina de tratamento de IRP_MJ_DEVICE_CONTROL, quando o código IOCTL é (DWORD)(-0x7FFF3FFC + 0x18) = 0x8000c01c, o driver não trata adequadamente os dados passados do espaço do usuário, o que faz com que um valor de tamanho possa ser negativo, resultando em um underflow de heap.
Com a ajuda de heap spraying, também conhecido como ataque de pool Feng Shui, é possível desabilitar o SMEP e executar qualquer shellcode em modo kernel para realizar a elevação de privilégio local.


Com o compilador Microsoft Visual C++ x64 (que suporta c++11)
$ cl poc.cpp /Fe:poc.exe /link /dynamicbase:no /fixed ntdll.lib
Testado no Visual Studio 2017 Community, a seguir está um exemplo de saída:
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
Em seguida, certifique-se de que SdoKeyCrypt.sys está carregado e execute poc.exe diretamente. Se nada der errado, você deve obter um shell nt authority\system.
O código PoC foi testado e funciona corretamente no Win10 1709 e no Win10 1803.
No entanto, ele não funciona no Win10 1809, que usa pool baseado em heap, o que mitiga o ataque de heap spraying. Mas ele pode causar BSOD, portanto há pelo menos uma vulnerabilidade local de negação de serviço.
A seguir, um vídeo de teste no Win10 1803 17134.619.
