12 marzo, 2020

Explotación local: Escalada de privilegios de 0 a SYSTEM con Metasploit

A diferencia de la explotación directa o intrusión directa y client-side donde el objetivo es la ejecución de código en una máquina remota con la finalidad de comprometer su seguridad y conseguir una conexión hacia dicha máquina.

En el contexto de Metasploit la explotación local tiene como objetivo el movimiento vertical que será la elevación o escalada de privilegios en una sesión previamente establecida en una máquina remota o directamente tenemos acceso físico a la máquina.

Tipos de explotación:
  • Explotación local
  • Bypass UAC
Con respecto a los usuarios de la máquina, nos podemos encontrar con 3 escenarios distintos:
  • 1. Proceso en un contexto de integridad alto. Administrador (RID = 500):
Figura 1: Contexto de integridad alta.
Será el propio Administrador SYSTEM. O un usuario que pertenece al grupo administradores pero a ejecutado la aplicación como Administrador (botón derecho "Ejecutar como Administrador"). En cualquier caso ya estaríamos en una ejecución en un contexto de integridad alto. No hay una escalada de privilegios como tal pudiendo impersonar al usuario con el token de SYSTEM.

  • 2. Proceso en un contexto de integridad medio. Usuario que pertenece al grupo Administradores (Bypass UAC):
Figura 2: Contexto de integridad medio.
El usuario pertenece al grupo Administrador. Pero no ejecuta en un ámbito de Administrador (botón derecho "Ejecutar como Administrador") sino que se ejecuta de forma normal, en un contexto integridad medio, por defecto es así. Y tiene la configuración por defecto establecida del UAC (User Account Control). En este escenario podremos hacer uso de los Bypasses de UAC para elevar privilegios.

  • 3. Proceso en un contexto de integridad bajo. Usuario sin ningún privilegio:
Figura 3: Contexto de integridad bajo.
El usuario pertenece al grupo de Usuarios locales o Invitado sin ningún tipo de privilegio, se ejecuta en un contexto de integridad bajo. Es el caso más complejo ya que habrá que buscar alguna configuración débil en servicios, vulnerabilidades en el propio sistema operativo (falta de la aplicación de parches de seguridad), drivers, software que se esté ejecutando con privilegios, etc., que nos permiten elevarnos a SYSTEM.

Partiendo de la base de que ya disponemos de una sesión Meterpreter establecida en la máquina remota, expondré los diferentes escenarios comentados anteriormente.

1. Proceso en un contexto integridad alto. Administrador (RID = 500)
En este caso disponemos del usuarios Administrador SYSTEM el cual con la configuración por defecto de UAC ya ejecuta un proceso en integridad alto.

Listamos los permisos actuales (getprivs). Ejecutamos una shell dentro de Meterpreter para identificar a que grupo local pertenece.

Figura 4: Obtención de privilegios del usuario Administrador.

Vemos que ya forma parte del grupo de Administradores locales del sistema.

En esta situación podemos impersonar al usuario Administrador con getsystem y así concederle el token de SYSTEM. Dejamos la sesión Meterpreter en segundo plano (background) y comprobamos que en la misma sesión el usuario ahora es NT AUTHORITY\SYSTEM y no el Administrador que teníamos al principio.

Figura 5: Impersonar al usuario Administrador local con getsystem para obtener el token de SYSTEM.

2. Proceso contexto integridad medio. Usuario que pertenece al grupo Administradores (Bypass UAC)

En este escenario hemos conseguido una sesión Meterpreter remota con un usuario del sistema local que pertenece al grupo Administradores locales y que ha ejecutado el proceso comprometido sin privilegios (botón derecho ejecutar como Administrador) pero tiene establecida la configuración por defecto del UAC, por lo tanto podemos probar diversas técnicas para realizar un bypass de UAC tipo Fileless o DLL Hijacking.

Un bypass de UAC tipo fileless es más "silencioso" para los software de antimalware que pueda tener instalado el equipo ya que no realiza escritura en disco. Existen varios binarios nativos en Windows susceptibles a esta técnica, un ejemplo sería el "Bypass UAC Fileless usando AppPaths sdclt.exe".

Invocamos una shell dentro de la sesión y vemos que el usuario pertenece al grupo Administradores pero cuando listamos los privilegios (getprivs) vemos que son escasos donde el proceso se ejecutó en un nivel de integridad media y que efectivamente el proceso no se ejecutó como administrador.

Intentamos impersonar al usuario "admin" sin éxito. No podemos obtener el token de NT AUTHORITY\SYSTEM.

Figura 6: Intento de impersonar a un usuario que pertenece al grupo administradores locales.

Para la escalada de privilegios usaremos un bypass de UAC. Mediante el uso del editor de certificados de confianza se generará un proceso con el flag del UAC desactivado consiguiendo así un contexto de integridad alto. Esto dependerá de que tipo de sistema operativo Windows se trate, no es lo mismo un Windows 7/8/8.1/10 ya que los casos de byspass de UAC fileless dependerá de la existencia de los binarios en según que versiones.

Salimos de la sesión dejándola en background. Usamos el módulo "exploit/windows/local/bypassuac"  el cual hará un bypass UAC fileless (que afecta al "editor de certificados de confianza") y establecemos los parámetros del host local (nuestra máquina Kali), la sesión meterpreter, el payload (código que se va ejecutar) será un meterpreter reverse_tcp y lanzamos el exploit.

Si se cumplen las condiciones de que la configuración del UAC está por defecto y el usuario comprometido pertenece al grupo Administradores, el exploit tendrá éxito. Se creará una nueva sesión y si listamos los privilegios veremos que ya disponemos de privilegios más altos.

Figura 7: Obteniendo una sesión privilegiada con un Bypass de UAC tipo fileless.

Ahora ya podemos impersonar al usuario para obtener el token de SYSTEM. Si dejamos la sesión en background y listamos las sesiones actuales veremos la existencia de dos sesiones establecidas. Una con el token del usuario inicial "admin" y otra con el token de NT AUTHORITY\SYSTEM.

Figura 8: Impersonar nuevamente al usuario para conseguir el token de SYSTEM.

3. Proceso contexto integridad bajo. Usuario sin ningún privilegio

Este escenario sería el más complejo en cuanto a escalada de privilegios, pasaremos de 0 a SYSTEM sin utilizar ninguna técnica de bypass de UAC. Hemos comprometido un equipo remoto y tenemos una sesión Meterpreter de un proceso ejecutado por un usuario regular o "raso" sin privilegios, que pertenece al grupo "Usuarios" locales, aunque también podría pertenecer al grupo "Invitados" siendo este último el más restrictivo en el sistema en cuanto a permisos.

Deberemos encontrar alguna vulnerabilidad:
  • Ya sea en el propio sistema operativo por falta de parcheo y carencia de algunas actualizaciones (será el que veremos en este ejemplo). 
  • Vulnerabilidades en los drivers instalados.
  • Alguna aplicación que se esté ejecutando en un contexto privilegiado.
  • Servicios vulnerables por malas configuraciones (rutas absolutas no entrecomilladas, se detallan algunos ejemplos al final del artículo).
Desde un usuario no privilegiado listamos los permisos actuales (getprivs) y vemos que son muy limitados. Invocamos una shell para comprobar a que grupo pertenece y vemos que forma parte del grupo Usuarios locales.

Figura 9: Reconocimiento de permisos y pertenencia a grupos locales desde un usuario sin privilegios.

Desde la misma shell ejecutamos el comando "systeminfo". Nos mostrará varios detalles de interés, entre ellos las actualizaciones actuales instaladas en el sistema. En esta ocasión vemos que solo existe una sola KB instalada.

Copiamos toda la info que nos devuelve este comando a un fichero texto plano. (En este ejemplo se guardó en la máquina Kali en la ruta "/root/systeminfo27").

Figura 10: Comprobar las actualizaciones instaladas con systeminfo.

Existe un script en python llamado Windows Exploit Suggester con el cual podemos comparar el resultado del fichero guardado anteriormente con una base de datos xls actualizada.


A partir del fichero que contiene el resultado del systeminfo, nos mostrará aquellas actualizaciones de seguridad que podremos explotar y que no estarían instaladas en la máquina comprometida. A parte del código de la propia vulnerabilidad, nos mostrará una breve descripción de lo que hace, su nivel de criticidad y los enlaces al boletín de seguridad de MS para obtener más detalles y/o enlaces al propio exploit en exploit-db.com.

Para reconocer las vulnerabilidades Windows Exploit Suggester emplea la siguiente tipificación:
  • [*] Falta la actualización.
  • [M] Existe un módulo en Metasploit.
  • [E] Existe un exploit público que no está incorporado o importado en Metasploit.
Es totalmente recomendable que revisemos los expedientes o boletines de seguridad oficiales para entender lo que vamos a explotar, no tendría sentido empezar a probar exploits a loco porque seguramente perderíamos el control del proceso del test de intrusión.

Una vez descargo el script del repositorio de Github, actualizamos la base de datos. Se nos descargará un fichero en local con extensión xls o xlsx.
./windows-exploit-suggester.py --update
Ejecutamos el script indicándole la base de datos y el fichero almacenado que habíamos guardado con la información en plano del resultado de ejecutar el comando systeminfo.
python windows-exploit-suggester.py -d BASE_DE_DATOS.xlsx -i FICHERO_SYSTEMINFO
Figura 11: Windows Exploit Suggester - Resultado de posibles actualizaciones explotables en base al fichero systeminfo.

En este ejemplo haremos uso de la vulnerabilidad MS14_058 que ya dispone de un módulo integrado en Metasploit. 

Recogida en en la base de conocimiento KB3000061, código CVE-2014-4113 reconocida con un CVSS de 7.2. Exploit de Metasploit disponible en https://www.exploit-db.com/exploits/35101.

Figura 12: Vulnerabilidad MS14-058 incorpora un módulo en Metasploit.

Una vez identificada la vulnerabilidad que vamos a utilizar y que sabemos que ya dispone de un módulo en Metasploit que nos abstraerá de los detalles para explotarla. La buscamos usando el comando "search MSxx-xxx" y encontramos el módulo correspondiente llamado "exploit/windows/local/ms14_058_track_popup_menu".

Usamos el módulo, lo configuramos estableciendo la sesión, un payload tipo meterpreter/reverse_tcp y lo ejecutamos. Si hemos tenido éxito se establecerá un nueva sesión con un meterpreter, si comprobamos el id de usuario podemos ver que ya tenemos el token de NT AUTHORITY\SYSTEM.

Si dejamos la sesión en background veremos que tenemos dos sesiones con meterpreter establecidas, la inicial del usuario sinPrivilegio y esta última obtenida con SYSTEM.

Figura 13: Escalada de privilegios de 0 a SYSTEM obteniendo una sesión meterpreter aprovechándose de la vulnerabilidad MS14-058.

Servicios vulnerables por malas configuraciones

Algunos ejemplos aprovechándose de pequeños tricks en errores de configuración de servicios.
  • Service Permissions
Cuando un binario invoca a un servicio este se convierte en un proceso. Puede darse el caso por el diseño o desarrollo de dicho servicio que en la carpeta donde se aloja dicho binario los permisos no sean suficientemente restrictivos un usuario puede modificar una dll o incluso el propio binario (siempre y cuando no esté en ejecución), entonces en el momento de volver iniciar el servicio este llamara a ese binario no legítimo que hubiésemos "suplantado" y lo ejecutará.

Metasploit dispone de un módulo llamado "exploit/windows/local/service_permissions" que lo que hace es automatizar la búsqueda. Lista todos los servicios y busca si los permisos de los directorios donde se alojan sus binarios son adecuados para poder se utilizados por un usuario y poder modificarlos.
  • Trusted Service Path (rutas absolutas con espacios en blanco sin entrecomillar)
Existe otro módulo en Metasploit llamado "exploit/windows/local/trusted_service_path". Lista las rutas de los binarios que son ejecutados por los servicios de Windows con el objetivo de encontrar rutas que vayan sin comillas (C:\path\... vs. "C:\path\..."). Prácticamente todos los servicios se inician o detienen a través de un binario exe ya sea invocándolo directamente o con algún argumento adicional.

Figura 14: Docs Microsoft - Parámetro lpBinaryPathName en la API de Windows CreateService de Advapi32.dll.

Esto quiere decir que si tenemos una ruta absoluta sin entrecomillar que contenga algún espacio en blanco por ejemplo C:\Program Files\hello.exe, por defecto la API de Windows en su función "CreateService" de Advapi32.dll si existe una separación, espacio en blanco en la ruta, no la interpreta correctamente por lo que intentará encontrar el binario correspondiente en cada espacio en blanco hasta que finalmente ejecute el binario necesario para iniciar el servicio.

Siguiendo el ejemplo anterior sería C:\Program.exe si lo encuentra lo ejecuta sino lo encuentra seguirá hasta encontrarlo. Será en esos casos donde aprovecharemos para cargar el payload (shellcode) y que sea ejecutado, consiguiendo una sesión en un contexto elevado ya que estos binarios de servicios cuando son iniciados tienen una integridad de SYSTEM.

Si ya tenemos un sesión Meterpreter establecida con un usuario regular del sistema podemos ejecutar load powershell para cargar el módulo de Powershell e importar el siguiente código ya sea copiando y pegando directamente en una powershell_shell o a través de powershell_import la siguiente función.
$servicios = Get-WmiObject -Class win32_service
foreach ($elemento in $servicios)
{
    if ( (!$elemento.PathName.Equals("")) -and (!$elemento.PathName.Startswith("`"")) -and ($elemento.pathname -ne $null))
    {
        $binario = $elemento.PathName.Split(" ")[0]
     
        if ((!$binario.Contains(":\Windows")))
        {
            $elemento.PathName
            $elemento.Name
            $elemento.Status
            Write-Output "----------`n"
        }
    }
}
Esto nos permitirá listar aquellos servicios mal configurados en sus paths sin entrecomillar, generar un binario con msfvenom con un payload de Meterpreter por ejemplo y subirlo a través del comando upload a la máquina remota con la finalidad de sustituirlo y ponernos a la escucha con el handler de conexiones (exploit/multi/handler).

De modo que cuando se arranque el servicio nuevamente lo hará a través del usuario NT AUTHORITY\SYSTEM consiguiendo así una nueva sesión Meterpreter con el mayor privilegio.

Saludos!

Autor: Adrián Lois

Adrián Lois MyPublicInbox

No hay comentarios:

Publicar un comentario