
Volcar la memoria de un PPL con un exploit de espacio de usuario
⚠️ 2022-07-24 - A partir de Windows 10 21H2 10.0.19044.1826 (actualización de julio de 2022), el exploit implementado en PPLdump ya no funciona. Un parche en NTDLL ahora evita que los PPL carguen Known DLLs. Más información aquí.
Esta herramienta implementa un exploit en espacio de usuario que fue discutido inicialmente por James Forshaw (alias @tiraniddo) - en esta publicación de blog - para volcar la memoria de cualquier PPL como administrador.
Escribí dos publicaciones de blog sobre esta herramienta. La primera parte trata sobre los conceptos de Procesos Protegidos, mientras que la segunda discute la técnica de evasión en sí.
Simplemente ejecute el ejecutable sin ningún argumento y obtendrá una ayuda/uso detallado.
c:\Temp>PPLdump64.exe
_____ _____ __ _
| _ | _ | | _| |_ _ _____ ___
| __| __| |__| . | | | | . | version 0.4
|__| |__| |_____|___|___|_|_|_| _| by @itm4n
|_|
Description:
Dump the memory of a Protected Process Light (PPL) with a *userland* exploit
Usage:
PPLdump.exe [-v] [-d] [-f] <PROC_NAME|PROC_ID> <DUMP_FILE>
Arguments:
PROC_NAME The name of a Process to dump
PROC_ID The ID of a Process to dump
DUMP_FILE The path of the output dump file
Options:
-v (Verbose) Enable verbose mode
-d (Debug) Enable debug mode (implies verbose)
-f (Force) Bypass DefineDosDevice error check
Examples:
PPLdump.exe lsass.exe lsass.dmp
PPLdump.exe -v 720 out.dmp
En primer lugar, los PPL se introdujeron con Windows 8.1, por lo que las versiones anteriores de Windows obviamente no son compatibles. Este proyecto apunta principalmente a Windows 10 (y sus ediciones de servidor), pero también lo probé en versiones anteriores. Encontrará una tabla resumen de las pruebas que realicé en la sección homónima.
Otras herramientas de evasión de PPL normalmente ejecutan código arbitrario en el Kernel a través de un controlador firmado digitalmente. Esta es diferente, ya que solo implica trucos en espacio de usuario y es (casi) sin archivos.
Esta herramienta aprovecha un truco muy inteligente que fue discutido inicialmente por James Forshaw en 2018 (ver Créditos). Implica el uso de la función API DefineDosDevice para engañar al sistema y crear una entrada arbitraria de Known DLL. Dado que los PPL no verifican la firma digital de las Known DLL, esto se puede usar posteriormente para realizar un ataque de secuestro de DLL y ejecutar código arbitrario dentro de un PPL.
Aunque esta herramienta realiza un ataque de secuestro de DLL como segunda etapa, no crea un nuevo archivo DLL en el disco. En su lugar, utiliza una transacción NTFS para reemplazar virtualmente el contenido de uno existente, una técnica inspirada directamente en el trabajo de @_ForrestOrr (ver Créditos).
La respuesta corta es 'no'. En primer lugar, no implica acceso directo al Kernel, por lo que no hay riesgo de causar una pantalla azul (BSOD) desde este punto de vista. En el peor de los casos, la herramienta podría fallar al eliminar la entrada de Known DLL creada, pero esto no causará una denegación de servicio. Simplemente permanecerá allí hasta el próximo reinicio de la máquina. Como la entrada creada sería solo un enlace simbólico que apunta a una sección inexistente, el sistema eventualmente volverá a la ubicación predeterminada (es decir, la carpeta System32), por lo que no afectará a otros programas que se ejecuten en la máquina.
⚠️ El exploit falla en máquinas con Windows 8.1 / Server 2012 R2 completamente actualizadas. Aún tengo que averiguar qué parche causó el error.
[-] DefineDosDevice failed with error code 6 - The handle is invalid.
⚠️ En Windows 8.1 / Server 2012 R2, es posible que también tenga que compilar el binario estáticamente (consulte las 'Instrucciones de compilación' a continuación).
Esta solución de Visual Studio consta de dos proyectos (el ejecutable y una DLL de carga) que deben compilarse en un orden específico. Todo está preconfigurado, por lo que solo debe seguir estas sencillas instrucciones. La DLL de carga compilada se incrusta automáticamente en el ejecutable final.
Release / x64 o Release / x86 dependiendo de la arquitectura de la máquina objetivo.Compilar > Compilar solución.En Windows 8.1 / Server 2012 R2, es posible que deba compilar el binario estáticamente.
PPLdump.Configuration Properties > C/C++ > Code Generation.Multi-threaded (/MT) como la opción de Runtime Library.| Versión de Windows | Compilación | Edición | Arquitectura | Admin | SYSTEM |
|---|
| Windows 10 20H2 | 19042 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 20H2 | 19042 | Pro | x86 | ✔️ | ✔️ |
| Windows 10 1909 | 18363 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Educational | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Home | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Pro | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Standard | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Essentials | x64 | ✔️ | ✔️ |
| Windows 8.1 | 9600 | Pro | x64 | ⚠️ | ⚠️ |
| Windows Server 2012 R2 | 9600 | Standard | x64 | ⚠️ | ⚠️ |