
PoC para escalada de privilegios en el servicio de recopilación estándar del centro de diagnóstico de Windows 10
PoC para escalada de privilegios en el servicio Diagnostics Hub Standard Collector de Windows 10
La biblioteca Diagnostics Hub Packaging, utilizada por el servicio Windows Standard Collector, puede ser forzada a copiar un archivo arbitrario a una ubicación arbitraria debido a la falta de suplantación del cliente en DiagnosticsHub.StandardCollector.Runtime.dll.
Aquí hay un análisis detallado de cómo se encontró y explotó esta vulnerabilidad: Vulnerabilidad de escalada de privilegios en el servicio Windows Standard Collector.
El servicio Standard Collector permite definir varios valores al configurar una sesión de diagnóstico, incluyendo el directorio temporal (scratch) y el ID de sesión. El ID de sesión puede ser cualquier GUID y el directorio temporal puede ser cualquier ubicación sobre la que el usuario tenga permisos de escritura. Si la sesión de recolección se configura con un ID de c13851b2-b1e1-438f-bf73-949df897f1bf y una ruta temporal de C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\, ocurren los siguientes eventos al llamar al método GetCurrentResult del objeto ICollectionSession:
C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etlC:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65Estas carpetas y archivos ETL son creados por el servicio de recolección para el paquete .diagsession que normalmente se crea cuando una sesión ha finalizado. Llamar al método Stop en el objeto ICollectionSession hará que el servicio de recolección confirme el paquete de diagnóstico llamando a Microsoft::DiagnosticsHub::Packaging::DhPackageDirectory::CommitPackage. La función CommitPackage copiará o moverá el archivo original {ruta temporal}\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl a la carpeta de GUID aleatorio: {ruta temporal}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl
La operación de copia/movimiento desencadenada por la función CommitPackagingResult en DiagnosticsHub.StandardCollector.Runtime.dll se realiza sin suplantar al usuario (a diferencia de la creación inicial de archivos/carpetas), lo que lleva a un posible problema TOCTOU si la carpeta de destino se reemplaza con un punto de montaje que redirige la copia a una ubicación arbitraria. Para explotar este problema de manera útil, un atacante necesitaría intercambiar el contenido del archivo ETL antes de que se copie. Esto se puede lograr ganando la condición de carrera con un OpLock después de que el servicio haya liberado el identificador del archivo.
Aunque no controlamos completamente el nombre del archivo .etl que se copia, podemos usar el truco del enlace simbólico del directorio de objetos para controlarlo. La configuración de punto de montaje + enlace simbólico sería algo como esto:
{ruta temporal}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\ -> \RPC Control\\RPC Control\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl -> C:\Windows\System32\anything.dllTener control sobre el contenido del archivo, la ubicación de copia y el nombre del archivo le brinda a un atacante numerosas posibilidades de carga de DLL. Sin embargo, el PoC incluido demuestra que no es necesario controlar el nombre del archivo, ya que el servicio de recolección carga felizmente una DLL con cualquier nombre, siempre que esté en el directorio C:\Windows\System32 o C:\Windows\System32\DiagSvcs. Esto se logra iniciando una nueva sesión de recolección con un agente que tenga un nombre de ensamblado que coincida con el nombre de la DLL copiada c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl.
El PoC incluido es una solución de VS con un proyecto de DLL en C++ para el payload que lanza notepad.exe y un proyecto en C# para interactuar con el servicio y explotar la vulnerabilidad usando la biblioteca NtApiDotNet.
Pasos para reproducir:
Resultado esperado:
La operación de confirmación del paquete suplanta al usuario y falla al intentar copiar el archivo.
Resultado observado:
El archivo se copia a la carpeta de destino del punto de montaje C:\Windows\System32, luego se carga como agente de recolección y, finalmente, se lanza notepad.exe con privilegios de SYSTEM.