Escalado de privilegios en Windows 7,8,10, Server 2008, Server 2012 mediante Hot Potato

Hot Potato de @breenmachine son varias t茅cnicas para escalar privilegios en G眉indous. B谩sicamente podr铆amos decir que primero redirecciona todo el tr谩fico HTTP a local para capturar las peticiones de los servicios de la m谩quina, luego las responde mediante solicitudes de peticiones de autenticaci贸n NTLM que reenv铆a a un servidor SMB local, que finalmente crea un servicio que ejecuta un comando (un cmd.exe por ejemplo) con los privilegios correspondientes.

As铆 dicho de golpe parece un embrollo, as铆 que vamos a ver paso a paso c贸mo hacerlo...

En una red local cualquier aplicaci贸n puede utilizar Web Proxy Auto Discovery Protocol (en adelante WPAD) para encontrar proxies para poder salir a Internet. Esa informaci贸n con sus reglas y dem谩s est谩 en un fichero javascript wpad.dat que est谩 en un servidor WPAP accesible mediante la URL: http://wpad/wpad.dat. Esto lo implement贸 Netscape en 1996 y la verdad es que despu茅s de tantos a帽os no ha cambiado demasiado.

En el primer paso del ataque debemos hacer que nuestra m谩quina no env铆e las peticiones HTTP a un proxy real si no a nuestro propio equipo, y eso pasa por falsificar la URL para que apunte a localhost.

1. Falsificador local Netbios

Los clientes pueden recibir la ubicaci贸n de wpad.dat mediante DHCP (opci贸n 252) o resolviendo el nombre del servidor WPAD y haciendo un HTTP GET a la URL. Como sab茅is el orden normal de resoluci贸n de nombres es el fichero host, luego la resoluci贸n DNS y finalmente un broadcast UDP mediante NetBIOS Name Service (NBNS).

Un equipo Windows por defecto no tendr谩 entrada 'wpad' en el fichero host as铆 que el siguiente paso ser谩 la consulta al servidor DNS. Normalmente no suele haber ning煤n registro A 'wpad' pero por si acaso se utiliza una t茅cnica llamada 'agotamiento de puertos UDP' que consiste en usar todos los puertos UDP disponibles (esto en localhost se consigue bastante r谩pido) para que, a la hora de intentar realizar una consulta DNS, falle porque no hay puertos UDP origen disponibles.
A continuaci贸n la tercera v铆a ser谩 la consulta Netbios que tendremos que falsificar para que 'wpad' nos devuelva 127.0.0.1. En principio y sin privilegios no podremos esnifar el tr谩fico para hacer un MiTM, as铆 que lo que haremos ser谩 inundar el host con respuestas NBNS (ya que es un protocolo UDP). Una complicaci贸n es que el paquete NBNS tiene un campo de 2 bytes, el IDTX, que no podemos ver y que debe coincidir en la solicitud y la respuesta. Sin embargo podemos iterar sobre todos los 65536 valores posibles al hacerlo r谩pidamente.


2. Servidor WPAD falso

Una vez que hemos conseguido que 'wpad' resuelva 127.0.0.1, debemos levantar un servidor HTTP en local que cuando reciba una petici贸n a "http://wpad/wpad.dat" responda algo como:

FindProxyForURL(url,host){
if (dnsDomainIs(host, "localhost")) return "DIRECT";
return "PROXY 127.0.0.1:80";}


Esto har谩 que todo el tr谩fico HTTP sea redirigido a trav茅s de nuestro servidor se ejecuta en local/127.0.0.1.

Lo curioso que adem谩s afectar谩 a todos los usuarios de la m谩quina, incluyendo administradores y cuentas del sistema.

3. HTTP -> SMB NTLM Relay

Anteriormente el protocolo NTLM era vulnerable a ataques MiTM. Por ejemplo un atacante capturaba los intentos de autenticaci贸n mediante el protocolo SMB y los pod铆a reenviar contra la propia m谩quina de la v铆ctima o a otro servidor para obtener acceso mediante psexec o similar. No obstante, Microsoft ya parche贸 茅sto desactivando la posibilidad de usar la misma autenticaci贸n NTLM con un challenge ya en uso, algo que sin embargo sigue funcionando desde otros protocolos como HTTP (HTTP->SMB) como ya vimos recientemente en el blog.

Como en los dos pasos anteriores hemos trabajado para redireccionar todo el tr谩fico HTTP a trav茅s de un servidor local que controlamos, podemos hacer cosas como redirigirlos a alg煤n sitio que solicite la autenticaci贸n NTLM.

Con el exploit de Potato, todas las peticiones HTTP se redirigen a una redirecci贸n 302 a "http://localhost/GETHASHESxxxxx", donde xxxxx es un identificador 煤nico. Las solicitudes de "http://localhost/GETHASHESxxxxx" responden con una petici贸n 401 para autenticaci贸n NTLM.

A continuaci贸n, las credenciales NTLM son retransmitidas a un listener SMB local que crea un nuevo servicio de sistema que ejecuta un comando definido por el usuario.

Cuando la solicitud HTTP en cuesti贸n se origina desde una cuenta de privilegios elevados, por ejemplo, cuando se trata de una solicitud del servicio de Windows Update, este comando se ejecutar谩 con el privilegio "NT AUTHORITY\ SYSTEM"... bingo!

Usando el exploit

Su uso depende del sistema operativo.

Tambi茅n es un poco extra帽o a veces, debido a las peculiaridades en la forma en que Windows maneja la configuraci贸n del proxy y el archivo WPAD. A menudo, cuando el exploit no funciona, es necesario dejarlo correr y esperar. Cuando Windows ya tiene una entrada de cach茅 para WPAD o est谩 permitiendo el acceso directo a Internet, porque no se encontr贸 WPAD, podr铆a tomar 30-60 minutos para que se actualice el archivo WPAD. Es necesario dejar el exploit se ejecute y tratar de probar de nuevo m谩s tarde, una vez transcurrido este tiempo.

Las t茅cnicas que se enumeran aqu铆 se ordenan de menor a mayor complejidad. Las t茅cnicas del final de la lista deber铆an funcionar en todas las versiones anteriores. Se incluyen v铆deos y capturas de pantalla para cada uno.


Windows 7 - ver https://youtu.be/Nd6f5P3LSNM

Windows 7 puede explotarse de forma fiable a trav茅s del mecanismo de actualizaci贸n de Windows Defender.

Potato.exe tiene c贸digo para desencadenar autom谩ticamente 茅ste. Basta con ejecutar losiguiente:

Potato.exe -ip -cmd [cmd to run] -disable_exhaust true

Esto har谩 funcionar al Spoofer NBNS, falsificando "WPAD" a 127.0.0.1, y a continuaci贸n, comprobar谩 si hay actualizaciones de Windows Defender.

Si la red tiene una entrada DNS para "WPAD" puedes intentar "-disable_exhaust false". Esto deber铆a hacer que la b煤squeda de DNS falle e intente la resoluci贸n por NBNS. Esto parece funcionar bastante bien en Windows 7.


Windows Server 2008 - Ver https://youtu.be/z_IGPWgL5SY

Como Windows Server no viene con Defender, necesitamos un m茅todo alternativo. En su lugar vamos a comprobar simplemente las actualizaciones de Windows. La otra advertencia es que en algunos dominios el servidor 2K8 pregunta por WPAD.DOMAIN.TLD en lugar de s贸lo WPAD. El siguiente es un ejemplo de uso:

Potato.exe -ip -cmd [cmd to run] -disable_exhaust true -disable_defender true -spoof_host WPAD.EMC.LOCAL

Despu茅s de se ejecute correctamente, basta con comprobar si hay actualizaciones de Windows. Si no se activa, espera unos 30 minutos con el exploit funcionando y vuelve a intentarlo. Si a煤n as铆 no funciona, intenta descargar alguna actualizaci贸n.

Si en la red hay una entrada DNS para "WPAD", de igual forma que antes puedes intentar usar "-disable_exhaust false". Sin embargo, el agotamiento DNS hace que TODAS las b煤squedas fallen y el proceso de actualizaci贸n de Windows podr铆a tener que hacer algunas b煤squedas de DNS antes de llegar a WPAD... por lo que tendr铆a que hacerse en el momento oportuno para que funcione en este caso.


Windows 8/10/Server 2012 - Ver https://youtu.be/Kan58VeYpb8

En las 煤ltimas versiones de Windows, parece que la actualizaci贸n de Windows ya no "respeta" la configuraci贸n de proxy fijada en "Opciones de Internet" ni detecta WPAD. En su lugar, las configuraci贸n del proxy para Windows Update se controla con “netsh winhttp proxy…”

Aunque tambi茅n contamos con una caracter铆stica nueva de Windows, el "actualizador autom谩tico de certificados no confiables". Los detalles se pueden encontrar en https://support.microsoft.com/en-us/kb/2677070 y https://technet.microsoft.com/en-us/library/dn265983.aspx

Desde el art铆culo de TechNet "Windows Server 2012 R2, Windows Server 2012, de Windows 8.1 y Windows 8 incluyen un mecanismo de actualizaci贸n autom谩tica que descarga las listas de confianza de certificados (CTL) diariamente".

Parece que esta parte de Windows todav铆a utiliza WPAD, incluso cuando la configuraci贸n del proxy se controle mediante winhttp.

En este caso el uso de Potato es el siguiente:

Potato.exe -ip -cmd [cmd to run] -disable_exhaust true -disable_defender true

En este punto, tendremos que esperar hasta 24 horas o encontrar otra manera de accionar esta actualizaci贸n.

Si la red tiene una entrada DNS para "WPAD", consulta la documentaci贸n en Server 2008. El agotamiento de puerto podr铆a ser complicado...


TODO: Firma SMB?

No est谩 claro si este ataque va a funcionar cuando SMB signing est茅 habilitado. El exploit actual no lo hace, pero puede ser debido a la falta de soporte en la librer铆a CIFS usada. La raz贸n para sospechar que puede funcionar es que todo est谩 sucediendo en 127.0.0.1. Si las firmas se basan en host, ¿podr铆an coincidir?

Un nuevo ataque de red

Pensemos de nuevo en el ataque de suplantaci贸n NBNS.

Utilizando la misma t茅cnica de fuerza bruta TxID, t茅cnicamente podr铆amos realizar ataques de suplantaci贸n NBNS fuera de nuestra red local. De hecho, en teor铆a, siempre y cuando haya una conexi贸n lo suficientemente r谩pida como para soportarlo, debemos ser capaces de realizar ataques de suplantaci贸n NBNS contra cualquier hosts de Windows con el que podemos hablar a trav茅s del puerto UDP 137.

En realidad, aunque funciona en la pr谩ctica en la red local, todav铆a se tiene que probar m谩s y verificarlo a trav茅s de Internet.

Estan lanzando una versi贸n modificada de la herramienta "Responder.py" que lleva a cabo este ataque. El siguiente video muestra el ataque a una red distribuida de la siguiente manera:

     - firewall pfSense
     - 10.0.0.0/24 -> LAN corporativa
     - 10.0.1.0/ 24 -> Servidor de red
     - Desde la red de la empresa, vamos a atacar a una m谩quina en la red de servidores.

Demostraci贸n: https://youtu.be/Mzn7ozkyG5g


P谩gina de GitHub: https://github.com/foxglovesec/Potato

Fuente: http://foxglovesecurity.com/2016/01/16/hot-potato/  

Comentarios

  1. Vale, "Hot Potato de @breenmachine son varias t茅cnicas para escalar privilegios en G眉indous. B谩sicamente podr铆amos decir que primero redirecciona todo el tr谩fico HTTP a local para capturar las peticiones de los servicios de la m谩quina, luego las responde mediante solicitudes de peticiones de autenticaci贸n NTLM que reenv铆a a un servidor SMB local, que finalmente crea un servicio que ejecuta un comando (un cmd.exe por ejemplo) con los privilegios correspondientes."

    Pero... PARA QU脡 sirve??? :)

    ResponderEliminar
  2. Para poder abrir una consola de comandos con el m谩ximo nivel de privilegios (SYSTEM).

    Saludos,

    ResponderEliminar
  3. Ahora la duda que tengo es el exploit se descarga de alg煤n lado?

    ResponderEliminar
    Respuestas
    1. no entiendo la pregunta. Tienes el c贸digo fuente en Github, s贸lo tienes que compilarlo.

      Eliminar
  4. El servidor http local no necesita estar escuchando en el puerto 80? Para eso no se necesitan permisos de system justamente?

    ResponderEliminar
  5. Excelente post, un saludo.

    ResponderEliminar

Publicar un comentario