Esta semana también tendremos un Bypass de User Account Control en los sistemas Microsoft Windows de que hablar. En este caso trata de un bypass de UAC de mediados de mayo, pero he querido explicarlo aquí debido a su sencillez para llevar a cabo. Es un bypass de UAC que debe estar parcheado en Windows 10RS2. La técnica utilizada hoy permite, incluso, hacer un bypass UAC cuando la política por defecto ha sido modificada a notificar siempre. El "trick", denominado Environment Variables in Scheduled Tasks, trata de aprovecharse de la debilidad de utilizar variables de entorno en un proceso que ejecuta acciones con integridad alta, como es el caso del programador de tareas.
Lo que llamará la atención es la simplicidad para aprovecharse de esta técnica por un pentester o, en el peor de los casos, un atacante o malware. El punto de mira o de estudio es el planificador de tareas. Esta herramienta es interesante de estudiar, ya que puede ejecutar acciones y programas que se ejecutarán con integridad alta o no. Si juntamos la aplicación schtasks con DiskCleanup tenemos la posibilidad de ejecutar acciones con integridad alta aprovechándonos de las variables de entorno. Vamos a explicarlo.
Revisando acciones y propiedades del programador de tareas con SilentCleanUp
En primer lugar, vamos a utilizar Powershell para ver con qué integridad y qué usuario está ejecutando el programador de tareas. Para ello, tenemos en Powershell la posibilidad de ejecutar el cmdlet Get-ScheduledTask. Este cmdlet nos permite obtener el listado de tareas programas que hay en el sistema. Para este caso, aunque se podría estudiar otras posibilidades, nos interesa SilentCleanup. Por ello, ejecutamos la instrucción Get-ScheduledTask SilentCleanup.
Si nos fijamos en la imagen, el nivel de integridad del proceso es alto, por lo que ya es interesante. Un usuario que no esté ejecutando como administrador puede arrancar SilentCleanup. Antes de continuar, vamos a fijarnos en las acciones que lleva a cabo esta tarea. Para verlas, ejecutamos sobre la variable $tarea la instrucción $tarea.Actions.
Como podemos ver, se ejecutan variables de entorno, tanto en el atributo execute como en el atributo arguments. Esto permite a un usuario intentar modificar la variable de entorno en cuestión con el objetivo de que realice cualquier tipo de acción evitando la ejecución de lo programado. Por ejemplo, si modificamos la variable de entorno %windir% por un cmd.exe y metemos el comando REM después del cmd.exe, todo lo que va después del %windir% sería comentado, por lo que no se ejecutaría. Estamos ante una especie de inyección también.
PoC: Probemos este bypass de UAC
En el Github de Tyranid se puede encontrar las instrucciones, que no son más de dos, necesarias para preparar el bypass. Como se puede entender es realmente sencillo de explotar y llevar a cabo, por lo que es un claro candidato a ser utilizado por el malware. Sea como sea, Microsoft ya tiene en el radar su parcheo.
En primer lugar, podemos ejecutar la instrucción:
Esto lo que hace es arrancar una cmd, eliminar la variable de entorno que hemos, previamente, creado y con el comando REM comentar todo lo que hay después, es decir, lo que viene después de la variable de entorno %windir% en el campo execute visto anteriormente. Para el ejemplo, utilizaremos la instrucción reg add hkcu\Environment /v windir /d "cmd && REM”.
Ahora, vamos a arrancar la tarea del SilentCleanup. Para ello, se ejecutará la instrucción schtasks. La instrucción completa que ejecutaremos es:
En la imagen se puede ver como obtenemos una cmd.exe y la instrucción fue ejecutada en la Powershell que se puede ver en la imagen, en la parte inferior. Este cmd.exe se está ejecutando con nivel de integridad alto saltándonos el control de UAC. Si abrimos Process Explorer podemos ver, fácilmente, la información del nivel de integridad con el que se ejecuta el cmd.exe.
Lo interesante es que modificando la política de UAC, el bypass sigue funcionando. Esto no ocurre, generalmente, en el resto de bypasses de UAC. Por esta razón, este caso es una técnica muy interesante.
Una nueva técnica utilizable en tus proyectos de Ethical Hacking. Sin duda, está siendo un año muy negro para el UAC y los diferentes tipos de bypass. En la Defcon 25, @fuzzysecurity, ha realizado un workshop haciendo una recopilación interesante sobre este tipo de temáticas. Esto ya lo habíamos pensado en su día a nosotros y puede que más adelante lo veáis. Sea como sea, os dejamos la documentación utilizada en el workshop de Defcon 25 sobre la temática de UAC Bypass.
Figura 1: 2017, el año que "bypasseamos" UAC peligrosamente. |
Lo que llamará la atención es la simplicidad para aprovecharse de esta técnica por un pentester o, en el peor de los casos, un atacante o malware. El punto de mira o de estudio es el planificador de tareas. Esta herramienta es interesante de estudiar, ya que puede ejecutar acciones y programas que se ejecutarán con integridad alta o no. Si juntamos la aplicación schtasks con DiskCleanup tenemos la posibilidad de ejecutar acciones con integridad alta aprovechándonos de las variables de entorno. Vamos a explicarlo.
Revisando acciones y propiedades del programador de tareas con SilentCleanUp
En primer lugar, vamos a utilizar Powershell para ver con qué integridad y qué usuario está ejecutando el programador de tareas. Para ello, tenemos en Powershell la posibilidad de ejecutar el cmdlet Get-ScheduledTask. Este cmdlet nos permite obtener el listado de tareas programas que hay en el sistema. Para este caso, aunque se podría estudiar otras posibilidades, nos interesa SilentCleanup. Por ello, ejecutamos la instrucción Get-ScheduledTask SilentCleanup.
Figura 2: Get-ScheduledTask SilentCleanup |
Si nos fijamos en la imagen, el nivel de integridad del proceso es alto, por lo que ya es interesante. Un usuario que no esté ejecutando como administrador puede arrancar SilentCleanup. Antes de continuar, vamos a fijarnos en las acciones que lleva a cabo esta tarea. Para verlas, ejecutamos sobre la variable $tarea la instrucción $tarea.Actions.
Figura 3: &tarea.Actions |
Como podemos ver, se ejecutan variables de entorno, tanto en el atributo execute como en el atributo arguments. Esto permite a un usuario intentar modificar la variable de entorno en cuestión con el objetivo de que realice cualquier tipo de acción evitando la ejecución de lo programado. Por ejemplo, si modificamos la variable de entorno %windir% por un cmd.exe y metemos el comando REM después del cmd.exe, todo lo que va después del %windir% sería comentado, por lo que no se ejecutaría. Estamos ante una especie de inyección también.
PoC: Probemos este bypass de UAC
En el Github de Tyranid se puede encontrar las instrucciones, que no son más de dos, necesarias para preparar el bypass. Como se puede entender es realmente sencillo de explotar y llevar a cabo, por lo que es un claro candidato a ser utilizado por el malware. Sea como sea, Microsoft ya tiene en el radar su parcheo.
Figura 4: GitHub de Tyranid |
En primer lugar, podemos ejecutar la instrucción:
reg add hkcu\Environment /v windir /d "cmd /K reg delete hkcu\Environment /v windir /f && REM "Esta instrucción lo que hace es crear o modificar la variable de entorno windir en el hive de registro del usuario en cuestión. El valor de la clave es cmd /K reg delete hkcu\Environment /v windir /f && REM.
Esto lo que hace es arrancar una cmd, eliminar la variable de entorno que hemos, previamente, creado y con el comando REM comentar todo lo que hay después, es decir, lo que viene después de la variable de entorno %windir% en el campo execute visto anteriormente. Para el ejemplo, utilizaremos la instrucción reg add hkcu\Environment /v windir /d "cmd && REM”.
Figura 5: Variable Environment creada |
Ahora, vamos a arrancar la tarea del SilentCleanup. Para ello, se ejecutará la instrucción schtasks. La instrucción completa que ejecutaremos es:
Figura 6: schtasks /Run /TN \Microsoft\Windows\DiskCleanup\SilentCleanup /I. |
En la imagen se puede ver como obtenemos una cmd.exe y la instrucción fue ejecutada en la Powershell que se puede ver en la imagen, en la parte inferior. Este cmd.exe se está ejecutando con nivel de integridad alto saltándonos el control de UAC. Si abrimos Process Explorer podemos ver, fácilmente, la información del nivel de integridad con el que se ejecuta el cmd.exe.
Figura 7: Nivel de integridad alto para esta consola |
Lo interesante es que modificando la política de UAC, el bypass sigue funcionando. Esto no ocurre, generalmente, en el resto de bypasses de UAC. Por esta razón, este caso es una técnica muy interesante.
Figura 8: PoC de Bypass UAC en Windows 10 con Environment Variables en Scheduled Tasks
Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”, Microsoft MVP en Seguridad y Security Researcher en ElevenPaths
Excelente investigaciones publicadas Pablo!
ResponderEliminarY qué habría que hacer para protegerse? Cambiar en todas las tareas vulnerables %windir% por C:\Windows? Si está puesto en vez de %windir% la variable de entorno %systemroot% ya no es vulnerable?
ResponderEliminarEn windows 7 he identificado varias tareas de usuario con %windir%: en Location, Netrace, 2 en TCIP y en Windows Error Reporting.