Hacking Trick: Environment Variable $Path Interception y Escaladas de Privilegios para Windows #pentest #windows
En el artículo de hoy quería mostrar un pequeño truco para tener en cuenta siempre en tu proyecto de Ethical Hacking o de Red Team. En algunas ocasiones nos preguntamos qué vías o trucos podemos utilizar para hacer una escalada de privilegios. Sabemos que cuando se accede a una máquina se dispone de unos privilegios concretos y que en función de ellos deberemos hacer unas acciones u otras.
Por ejemplo, si se accede a una máquina, cuyo proceso comprometido es de un usuario del grupo administradores nos valdrá con un bypass de UAC, pero si, por el contrario, el proceso es un usuario “raso” tendremos que buscar otras vías para primero hacer una elevación de privilegios. Fundamental en cualquier Hacking de Windows.
De eso va este artículo, de mostrar otra vía. En este blog ya se ha hablado de algunos trucos para hacer escalada de privilegios, usando las rutas inseguras sin comillas para la carga de DLLs o haciendo la carga insegura de DLLs, o usando vulnerabilidades en el sistema como la famosa MS16-075. Incluso hemos hablado de la herramienta BeRoot para buscar todas estas posibilidades. De todo esto hay que estar más que preparado en la fortificación de sistemas Microsoft Windows.
Environment Variable $Path Interception
Pues bien, hoy quería mostrar uno sencillo que se puede comprobar rápidamente. El “trick” se llama Environment Variable $Path Interception. Consiste en aprovecharse de los permisos de ciertos directorios que están contenidos en la variable $PATH del sistema Windows. Ahora profundizaremos más. Vamos a ver en qué condiciones se puede usar este truco, ya que se tienen que dar, principalmente, dos circunstancias:
Otra forma de ver las variables de entorno desde Powershell sería ejecutar la siguiente instrucción: ‘$env:Path’. Se puede ver la carpeta ‘poc’ en primer lugar, por lo que cuando un binario sea buscado en las diferentes carpetas, será ejecutado en la primera carpeta que lo contenga.
El siguiente paso es revisar los permisos que tiene la carpeta ‘poc’. Para ello, hacemos uso del binario icacls.exe. Con la instrucción icacls.exe c:\poc mostramos los permisos que tiene la carpeta. Como se puede ver los usuarios autenticados en el sistema pueden escribir en ella, por lo que se puede copiar o mover un binario a dicha ruta, con el objetivo de que sea invocado por algún servicio, por algún usuario privilegiado o por alguna tarea en un nivel de integridad alto.
Tras verificar los permisos de la carpeta ‘poc’, en la que se mirará antes que en el resto de carpetas de la variable $PATH la existencia o no de un binario concreto, vamos a ver qué podemos meter. Para hacer pruebas se ha suplantado un binario en la carpeta. El binario es cleanmgr.exe. Este archivo es una copia de cmd.exe, realmente, aunque le hemos renombrado a cleanmgr.exe. Cuando un servicio, una tarea o un usuario con integridad alta lo intente ejecutar a través de $PATH, lo encontrará primero en la carpeta "c:\poc", por lo que lo ejecutará.
Cuando dicho binario se ejecute, se abrirá un cmd.exe y no el binario buscado. Ahora, se puede cambiar el cmd.exe por otro binario que nos proporcione una sesión de Meterpreter o la ejecución de lo que nos interese en un momento determinado, ya que la escalada de privilegios estaría conseguida. Como ejemplo, se muestra la imagen de un servicio denominado poc2 que hace uso de dicho binario, aunque lo interesante de esta técnica es entender que el binario puede ser invocado de muchas maneras y no solo a través de un servicio.
Otra opción interesante, aparte de las tres indicadas anteriormente, es que el binario que se introduzca en la carpeta ‘poc’ sea un binario modificado que ejecute en un hilo un Meterpreter u otra cosa. Es decir, imagina que se ejecuta una calc.exe modificada, la cual lanza un hilo con un payload que a nosotros nos interese en la escalada. Y luego, le damos ya juego a nuestro Pentesting con Metasploit.
Por último, podemos ver la integridad del proceso en una ejecución, ya sea a través del servicio, de un proceso, de un usuario o de una tarea programada. Esto lo podemos ver fácilmente con la herramienta Process Explorer.
Como se puede ver es un truco sencillo, el cual está condicionado a lo que el pentester puede encontrarse en un sistema, como ocurre en la mayoría de los casos de la escalada de privilegios. Hay que recordar que se debe encontrar una carpeta en el Path donde poder escribir y que, además, se encuentre por delante de system32 en el Path.
Saludos,
Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root", “Pentesting con Powershell” y de "Empire: Hacking Avanzado en el Red Team", Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica. Para consultas puedes usar el Buzón Público para contactar con Pablo González
Figura 1: Hacking Trick: Environment Variable $Path Interception y Escaladas de Privilegios para Windows |
Por ejemplo, si se accede a una máquina, cuyo proceso comprometido es de un usuario del grupo administradores nos valdrá con un bypass de UAC, pero si, por el contrario, el proceso es un usuario “raso” tendremos que buscar otras vías para primero hacer una elevación de privilegios. Fundamental en cualquier Hacking de Windows.
Figura 2: Hacking Windows: Ataques a sistemas y redes Microsoft |
De eso va este artículo, de mostrar otra vía. En este blog ya se ha hablado de algunos trucos para hacer escalada de privilegios, usando las rutas inseguras sin comillas para la carga de DLLs o haciendo la carga insegura de DLLs, o usando vulnerabilidades en el sistema como la famosa MS16-075. Incluso hemos hablado de la herramienta BeRoot para buscar todas estas posibilidades. De todo esto hay que estar más que preparado en la fortificación de sistemas Microsoft Windows.
Environment Variable $Path Interception
Pues bien, hoy quería mostrar uno sencillo que se puede comprobar rápidamente. El “trick” se llama Environment Variable $Path Interception. Consiste en aprovecharse de los permisos de ciertos directorios que están contenidos en la variable $PATH del sistema Windows. Ahora profundizaremos más. Vamos a ver en qué condiciones se puede usar este truco, ya que se tienen que dar, principalmente, dos circunstancias:
• El path contiene una carpeta donde se puede escribir, ya que se necesita que el usuario, sin privilegio pueda escribir en ella.Si vemos las variables de entorno disponibles en el sistema, podemos encontrar algo similar a lo que se ve en la imagen. Importante es ver que hemos creado una carpeta llamada ‘poc’ en la raíz del sistema. Emularemos que hay una carpeta que tiene escritura disponible para los usuarios autenticados en el sistema.
• La carpeta donde se puede escribir debe preceder a la carpeta c:\windows\system32. Esto es obvio, quién invoca al binario debe ejecutar a éste desde la ubicación preparada y no desde la legítima.
Figura 3: Carpeta "poc" con permiso de escritura para los usuarios como variable de entorno |
Otra forma de ver las variables de entorno desde Powershell sería ejecutar la siguiente instrucción: ‘$env:Path’. Se puede ver la carpeta ‘poc’ en primer lugar, por lo que cuando un binario sea buscado en las diferentes carpetas, será ejecutado en la primera carpeta que lo contenga.
Figura 4: Revisión de variables desde PowerShell |
El siguiente paso es revisar los permisos que tiene la carpeta ‘poc’. Para ello, hacemos uso del binario icacls.exe. Con la instrucción icacls.exe c:\poc mostramos los permisos que tiene la carpeta. Como se puede ver los usuarios autenticados en el sistema pueden escribir en ella, por lo que se puede copiar o mover un binario a dicha ruta, con el objetivo de que sea invocado por algún servicio, por algún usuario privilegiado o por alguna tarea en un nivel de integridad alto.
Figura 5: Permisos de la carpeta c:\poc revisados con icacls.exe |
Tras verificar los permisos de la carpeta ‘poc’, en la que se mirará antes que en el resto de carpetas de la variable $PATH la existencia o no de un binario concreto, vamos a ver qué podemos meter. Para hacer pruebas se ha suplantado un binario en la carpeta. El binario es cleanmgr.exe. Este archivo es una copia de cmd.exe, realmente, aunque le hemos renombrado a cleanmgr.exe. Cuando un servicio, una tarea o un usuario con integridad alta lo intente ejecutar a través de $PATH, lo encontrará primero en la carpeta "c:\poc", por lo que lo ejecutará.
Figura 6: Suplantación de binario en carpeta c:\poc |
Cuando dicho binario se ejecute, se abrirá un cmd.exe y no el binario buscado. Ahora, se puede cambiar el cmd.exe por otro binario que nos proporcione una sesión de Meterpreter o la ejecución de lo que nos interese en un momento determinado, ya que la escalada de privilegios estaría conseguida. Como ejemplo, se muestra la imagen de un servicio denominado poc2 que hace uso de dicho binario, aunque lo interesante de esta técnica es entender que el binario puede ser invocado de muchas maneras y no solo a través de un servicio.
Figura 7: Fichero poc2 |
Otra opción interesante, aparte de las tres indicadas anteriormente, es que el binario que se introduzca en la carpeta ‘poc’ sea un binario modificado que ejecute en un hilo un Meterpreter u otra cosa. Es decir, imagina que se ejecuta una calc.exe modificada, la cual lanza un hilo con un payload que a nosotros nos interese en la escalada. Y luego, le damos ya juego a nuestro Pentesting con Metasploit.
Figura 8: Pentesting con Metasploit y Hacking Avanzado con Metasploit |
Por último, podemos ver la integridad del proceso en una ejecución, ya sea a través del servicio, de un proceso, de un usuario o de una tarea programada. Esto lo podemos ver fácilmente con la herramienta Process Explorer.
Figura 9: Revisando privilegios con Process Explorer |
Como se puede ver es un truco sencillo, el cual está condicionado a lo que el pentester puede encontrarse en un sistema, como ocurre en la mayoría de los casos de la escalada de privilegios. Hay que recordar que se debe encontrar una carpeta en el Path donde poder escribir y que, además, se encuentre por delante de system32 en el Path.
Saludos,
Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root", “Pentesting con Powershell” y de "Empire: Hacking Avanzado en el Red Team", Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica. Para consultas puedes usar el Buzón Público para contactar con Pablo González
Figura 10: Contactar con Pablo González |
No hay comentarios:
Publicar un comentario