De XP a Windows 10: explotando Microsoft CTF

Tavis Ormandy de Project Zero de Google ha publicado una vulnerabilidad que afecta a todas las versiones de Windows, desde XP a 10.

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... y Tavis Ormandy ha creado una herramienta llamada CTFtool que nos permitirá interactuar como cliente desde la línea de comandos para experimentarlos.

Podéis descargar incluso una versión compilada desde su repositorio de Github: https://github.com/taviso/ctftool/releases

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:


Bonito... ¿verdad? ;)

Ahora a ver cómo M$ moderniza su protocolo CTF, porque esto y como dice Tavis (mis dieses y mis miles) es sólo la punta del iceberg...

Más info y detalle: https://github.com/taviso/ctftool

1 comentarios :

  1. creen que lo solucionen pronto? :v es demasiado fácil para ser real

    ResponderEliminar