La herencia de manejadores de objetos entre procesos en un sistema Microsoft Windows puede constituir una buena fuente para la identificación de vulnerabilidades de elevación de privilegios locales (LPE). Tras introducir los conceptos básicos alrededor de este tipo de debilidades de seguridad, se presentará una herramienta capaz de identificarlos y explotarlos, aportando a Pentesters y Researchers un nuevo punto donde focalizar sus acciones de intrusión e investigación respectivamente, sigue leyendo!
Dentro de un sistema operativo Microsoft Windows los procesos son capaces de interactuar con objetos securizables del sistema como ficheros, PIPES, claves de registro, hilos o incluso otros procesos. Para ello y mediante el uso del WINAPI el proceso origen requiere al S.O. de un manejador (Handle en inglés) para realizar una determinada acción sobre el objeto en cuestión.
Si se disponen de los permisos y/o privilegios adecuados el S.O. autoriza este acceso entregando el susodicho manejador del objeto al proceso que lo requiere. Desde ese momento es posible interactuar con el dentro de los límites de los permisos solicitados. Veamos el siguiente ejemplo donde un proceso origen haría uso de la función del WinApi OpenProcess para tratar de abrir un proceso destino (spoolsv.exe) con el objetivo de obtener información de forma remota de él (PROCESS_QUERY_INFORMATION).
Si el proceso origen en este caso pertenece al grupo Administradores y solicita tan solo el permiso mencionado, vemos como el S.O. entregaría el manejador del mismo ya que el proceso destino presenta una ACL que permite este tipo de interacción.
Por lo tanto, la obtención de un manejador nos permite poder realizar acciones determinadas sobre un objeto securizable concreto, hasta que decidamos no utilizarlo más y lo cerremos.
Una característica destacable de los sistemas Windows es que estos manejadores pueden heredarse de proceso padre a los procesos hijos. Basta con indicar en el momento de la apertura el valor booleano TRUE en la llamada, en la imagen anterior seteando el valor de “bInheritHandle”. Por lo tanto, mientras no se cierre el manejador, todo proceso hijo creado por el padre heredará el handle si además se le indica que aplique herencia.
Adicionalmente a esto, dentro del mundo de los sistemas operativos Windows existe el concepto de Impersonación, lo que significa que un proceso ejecutándose en un contexto de seguridad determinado puede impersonar otro contexto. Es decir, un proceso que tiene una identidad de un determinado usuario/grupo (a través de su token), puede hacerse pasar por otro en un momento concreto para, por ejemplo, realizar una acción determinada. En este sentido es habitual que servicios del S.O. que corren como usuario SYSTEM impersonen a usuarios de menor privilegio mediante la creación de un proceso hijo con capacidades restringidas.
A partir de esto, si juntamos los dos conceptos anteriores, es posible que si un programador no es muy consciente de lo que está haciendo, introduzca en el sistema una puerta de entrada a la elevación de privilegios local, de un usuario sin privilegios a un usuario como por ejemplo SYSTEM. Este tipo de vulnerabilidades no son muy populares o al menos no hay mucho “research” público al respecto, ni tampoco existe una herramienta que sea capaz de identificarlas y aprovecharlas de forma activa (al menos tras el estado del arte realizado).
Veamos un poco más en detalle el porqué de este tipo de vulnerabilidades.
Un primer proceso P1 que corre como un usuario privilegiado como SYSTEM obtiene un manejador de otro proceso privilegiado P2, o de él mismo, poniendo a TRUE el valor de la herencia. A continuación crea un proceso P3 con menor privilegio mediante impersonación, pero heredando los manejadores. En este momento, cualquier proceso con un nivel de privilegio igual al de P3 puede acceder a ese manejador, y por lo tanto, aprovechar esta vulnerabilidad de la siguiente manera.
El proceso malicioso P4 duplica el manejador de P2 en P3, por lo que, dependiendo del tipo de manejador y del acceso concedido podría, entre otras, cosas inyectar un shellcode o hacer que cree un proceso hijo como por ejemplo una shell cmd, constituyendo así un bonito LPE.
Este tipo de vulnerabilidad no es nueva (James Forshaw parece que la introduce en 2016), pero como se ha comentado, no hay mucho estado del arte al respecto y no se han evidenciado herramientas que permitan detectarlas y explotarlas de forma automatizada.
El estado del arte consultado explota 2 tipos tan solo de manejadores (hilos y procesos), pero hay muchos más que podrían permitir la puerta a elevaciones de privilegio local (LPE), como por ejemplo los de tipo Key (Registro) o File (Fichero/PIPES), entre otros.
Dicho esto, quiero aportar mis dos céntimos al estado del arte mediante el desarrollo de la aplicación LHF (Leaked Handles Finder) capaz de monitorizar el sistema en tiempo realm notificando de posibles vulnerabilidades de este tipo, y en caso de ser explotables permitiendo su explotabilidad. La herramienta está puramente desarrollada utilizando el Native Api (ntdll.dll), evitando el Api de alto nivel de Win32. Su utilidad es doble, de modo que se puede utilizar durante un proceso de pentest para elevar privilegios de forma local o se puede ser utilizada por un Security Researcher para la identificación de nuevos 0-days de tipo LPE.
A continuación se muestran alguna de las alertas que es capaz de notificar:
Como se aprecia en la imagen, LHF es capaz de identificar los manejadores heredados en todos los procesos y enriquecer estos datos con el nivel de integridad del proceso en cuestión y el de su padre, con el objetivo de compararlos entre si e identificar un potencial LPE. A su vez, si el manejador es de tipo proceso o hilo, es capaz de obtener a quien pertenece ese manejador, concluyendo si existe o no posibilidad de LPE.
Esta herramienta fue presentada en la última RootedCon Madrid 2022, os dejo el enlace al GitHub para que la probéis. Si identificáis con ella algún 0-day o simplemente tenéis dudas de cómo usarla, me enviáis un privado por Twitter a @ramado78