14 ago. 2019

Explotar Microsoft CTF de Windows XP a 10

Tavis Ormandy de Project Zero de Google ha publicado una vulnerabilidad de alta gravedad en MSCTF. La vulnerabilidad lleva sin parchear más de 20 años y afecta a todas las versiones de Microsoft Windows, desde Windows XP hasta el último Windows 10.

La vulnerabilidad reside en la forma en que los clientes y el servidor de MSCTF se comunican entre sí, lo que permite que incluso una aplicación de bajo privilegio o una zona protegida pueda leer y escribir datos en una aplicación de mayor privilegio.

MSCTF es un módulo en Text Services Framework (TSF) del sistema operativo Windows que administra cosas como métodos de entrada, diseños de teclado, procesamiento de texto y reconocimiento de voz.

En pocas palabras, cuando inicia sesión en su máquina Windows, inicia un servicio de monitor CTF que funciona como una autoridad central para manejar las comunicaciones entre todos los clientes, que en realidad son ventanas para cada proceso que se ejecuta en la misma sesión.

El problema está en el subsistema MSCTF que es parte del framework de servicios de texto o TSF (Text Service Framework). El TSF administra cosas como métodos de entrada, distribuciones de teclado, procesamiento de texto, etc.

Hay dos componentes principales, el servidor/monitor ctfmon y el cliente msctf. El servicio ctfmon arranca cuando se inicia sesión en la máquina como puedes comprobar simplemente viendo el administrador de tareas:
Este servicio crea un puerto ALPC (Local Inter-Process Communication) al que las aplicaciones se conectan para intercambiar mensajes sobre cambios en el layout del teclado o métodos de entrada. Cuando cualquier proceso crea una ventana, el kernel invoca una devolución de llamada o callback, USER32!CtfHookProcWorker, que carga automáticamente el cliente msctf.

El cliente se conecta al puerto ALPC y manda su HWND, el subproceso y la identificación del proceso.

El servidor espera continuamente los mensajes de los clientes, pero los clientes solo buscan mensajes cuando se les notifica a través de PostMessage(). Esta es la razón por la que los clientes llaman a RegisterWindowMessage() al inicio.

Los clientes pueden enviar comandos al monitor o pedirle al monitor que reenvíe comandos a otros clientes especificando el threat id, es decir, se pueden mandar mensajes a cualquier subproceso conectado, o al propio monitor configurando el destino en el subproceso cero. Además el protocolo CTF es bastante extenso, tiene muchos parámetros y hay fallos de diseño en este sistema. Tavis Ormandy ha creado una herramienta llamada CTFtool que nos permitirá interactuar como cliente desde la línea de comandos para experimentarlos.

Empezaremos conectándonos a nuestra sesión y viendo los clientes conectados:
¡No solo se puede enviar comandos al servidor, podemos esperar a que se conecte un cliente en particular y luego pedirle al servidor que también le envíe comandos! Además, como habéis podido imaginar, no hay un control de acceso entre los clientes y el servidor de MSCTF, lo que nos permitirá mandar comandos incluso a aplicaciones/clientes con privilegios elevados.

Y evidentemente tampoco vamos a conformarnos con cambiar una distribución de teclado para trollear... un protocolo tan antiguo como CTF tiene vulnerabilidades de corrupción de memoria y vamos a poder explotar un integer overflow para... por ejemplo, obtener una shell interactiva con privilegios de SYSTEM. "Sólo" hay que evadir CFG y ASLR y la magia ocurre...

A la caza del cliente CTF con privilegios

Ahora que sabemos que se puede comprometer a cualquier cliente CTF, ¿cómo encontramos algo útil? Como decimos, no hay control de acceso en CTF, por lo que podemos conectarnos a la sesión activa de otro usuario o esperar a que un Administrador inicie sesión y comprometer su sesión. Sin embargo, hay una mejor opción: si usamos USER32!LockWorkstation, podemos cambiar al escritorio Winlogon privilegiado que ya se está ejecutando como SYSTEM!:

O si quieres aprovecharte del cuadro de diálogo UAC con el correspondiente script sólo tienes que esperar y se iniciará la shell con privilegios (ver video):

Ahora a ver cómo Microsoft moderniza su protocolo CTF, porque esto y como dice Tavis, es sólo la punta del iceberg.

Fuente: HackPlayers

0 comentarios:

Publicar un comentario

Gracias por dejar un comentario en Segu-Info
Si vas a dejar una consulta, procura tener habilitado tu perfil en Blogger o deja una forma de contacto.

Gracias por comentar!