¿TOC Toc quién está ahí?


Un análisis de interoperabilidad del subsistema de Windows Linux

Siguiendo nuestra investigación de Evil Twins y Windows Linux Subsystem, la interoperabilidad entre diferentes versiones de WSL fue algo que nos llamó la atención. El protocolo y el mecanismo para administrar los archivos desde / hasta WSL es imprescindible para los equipos azul y rojo cuya investigación proporcionará nuevas formas de ejecutar técnicas conocidas para lograr tácticas como persistencia, evasión de defensa y ejecución, entre otras.

Es importante (incluso si no se ve hoy en los arsenales regulares) comprender cómo proteger, detectar y reaccionar ante esta superficie de ataque que podría extenderse ampliamente en el futuro, donde WSL podría ser un componente de facto en cada máquina Enterprise.

Desde la versión de Windows 10 1903, es posible acceder a los archivos de Linux desde Windows utilizando la sintaxis de ruta wsl $ (DistroName) usando 9P protocolo. Durante nuestra investigación, encontramos algunos problemas de diseño en WSLv1 que se propagaron a WSLv2, a pesar de que el componente principal difiere. El problema principal implica la falta de control de seguridad en el objeto de comunicación WSL, lo que lleva a cualquier usuario propietario de la instancia a poseer el servidor de escucha Planet 9 File System. A primera vista, esto puede parecer obvio, pero una vez que controla esa comunicación, comienzan a surgir diferentes formas de usar los datos que se envían de un lado a otro desde Windows al contenedor.

Es importante mencionar que cuando se ejecuta dentro de un entorno aislado como WSLV2, ciertas actividades que no cruzan los límites pueden permanecer ocultas para los productos de seguridad, pero una vez que se detecta un intento de ejecutar una aplicación maliciosa en el lado de Windows, el mecanismo de escaneo proporcionado por MVISION Endpoint y ENS se activará para proteger. MVISION EDR proporcionará visibilidad y detección en algunos de estos artefactos. Al final de este artículo, presentamos ciertos objetos para monitorear para detectar tales casos en su organización.

Usos potenciales para equipos rojos e investigadores:

  • Persistencia al ocultar el contenido real, especialmente en WSLv2 donde la carpeta raíz es una imagen VHDX.
  • Fuzzing de protocolo para descubrir vulnerabilidades en la implementación.
  • Eludir la seguridad mediante el uso de la sintaxis \ wsl $ en aplicaciones que tienen opciones para deshabilitar el análisis de Carpetas de red y, por lo tanto, no considere esto como una ruta local. (McAfee MVision Endpoint considerará esta ruta especial).
  • Manipulación de archivos (el usuario accede a un archivo esperando algún contenido, pero se cambia durante la transferencia).

Requisitos previos de secuestro del servidor P9:

  • WSL habilitado
  • Los mismos privilegios de usuario que la instancia de WSL
  • Un servidor compatible con P9

En la siguiente sección, P9 (Protocolo del sistema de archivos Planet 9) y 9P (el protocolo) se usan indistintamente

WSLv1 y P9

La comunicación se realiza utilizando un socket AF_UNIX (archivo local) que actualmente es propiedad del usuario que ejecuta la instancia de WSL. El socket es creado por el proceso de inicio personalizado. Los procesos desde el lado de Windows utilizan un controlador p9 para acceder a ese socket mediante el uso de una implementación del Sistema de archivos P9 en lugar de acceder a los archivos como "Windows local".

Nota: el Plan 9 tiene varias implementaciones; Actualmente el formato compatible con Windows es L / W.

Una cadena simple en init muestra que:

  1. La primera instancia de WSL abrirá el servidor p9 para esa distribución.
  2. Init tiene un servidor de incrustación que crea un socket Unix en la ruta de distribución.
  3. El socket Unix se usa para comunicarse.
  4. Cada vez que se accede a \ wsl $ , el controlador P9 inicia la comunicación.
  5. Un cliente P9 se comunica con el servidor.

Ahora, ¿está protegido ese archivo fsserver? ¡No! Eso significa que podemos secuestrar ese socket e iniciar nuestro servidor P9 (en este caso, utilicé DIOD como la fuente principal) y desde allí … las opciones son infinitas, desde fuzzers de protocolo para desencadenar algo inesperado, hasta omisión de protección, hasta algo muy simple que solo sirve contenido diferente de lo esperado.

Para buscar mediante programación la ubicación raíz de fsserver usando PowerShell:

A partir de ahí, el siguiente paso sería iniciar nuestro servidor p9 desde WSL (suponiendo que la ruta se proporcionó como argumento de script como se muestra arriba):

En este ejemplo, la próxima vez que accedamos a \ wsl $ Debian, servirá los archivos de mynewroot.

La siguiente captura de pantalla muestra el procedimiento completo con un servidor P9 modificado:

  1. DIOD escuchando en el zócalo local.
  2. Listado del directorio WSL antes del secuestro.
  3. Listado del directorio WSL después del secuestro.

En el momento en que estábamos trabajando en esto, WSLv2 fue anunciado y disponible en la última actualización de Win10. La siguiente pregunta era obvia: ¿podemos hacer lo mismo, dado que la instancia ahora aloja un núcleo real debido a su naturaleza de ser alojada como una instancia interna de Hyper-V?

WSLv2 y P9

Ahora que hay un Kernel de Linux, se activa el verdadero módulo "p9 Linux". C: la unidad se monta usando P9 con varios argumentos rdfd / wdfd encima de drvfs.

El host está en CID: 2, y los puertos 50000/1/2 se usan para mensajes InterOp y control de instancia.

De vuelta al trabajo: hay algunos pasos a seguir para determinar si podemos lograr el mismo secuestro del servidor P9 o no.

  • Analice los puertos abiertos que escuchan en la instancia de WSLv2 (un punto de partida podría estar modificando código de cliente de muestra convertirse en un escáner).
  1. Busque el UID de la instancia (una opción es verificar el administrador de tareas y la línea de comando wslhost.exe).
  2. ¡Escanea la instancia!

3. ¡Hola! El puerto 0x405 (1029d) está abierto, déjenos Knock-Knock para encontrar quién está allí.

  • Se encontró el puerto del servidor P9 … ¡vamos a secuestrar!
    1. No es posible escuchar el mismo puerto que con WSLv1, a menos que encontremos una forma de eludir las restricciones (la aplicación / módulo no usa reuseaddr / port, no es posible cerrar desde el espacio de usuario, etc.).
    2. No podemos eliminar init ni descargar el módulo que sirve los archivos, por lo que nuestra mejor opción sería cerrar el puerto desde el núcleo. Al final del día, es nuestra instancia e iniciamos sesión como root.
    3. Creemos un módulo vsock que:
      1. Listar los zócalos conectados vsock actuales.
      2. Cierre un socket que escuche en un puerto determinado.

  1. Compile el módulo usando fuente del núcleo.
  2. ¡Pruébalo! (Tenga en cuenta que los mismos puertos no están presentes y deben repararse, pero para lo que queremos la salida es suficiente).

3) Ahora, somos libres de irnos, pero aún así, necesitamos iniciar nuestro servidor DIOD P9 escuchando de alguna manera en ese puerto usando un socket VSOCK. Como `socat` es compatible con este tipo de zócalo, será pan comido.

  • Acceda a \ wsl $ DistributionName y ¡listo!

Protección y detección con productos McAfee

Además de las reglas relacionadas con WSL presentadas en anteriores publicaciones, Los productos de McAfee proporcionan varias formas de detectar y proteger contra el secuestro de P9:

  • MVISION Endpoint escaneará \ wsl $ incluso si el escaneo de red está deshabilitado, por lo que desde la perspectiva de la ejecución en Windows también se aplicará la protección.
  • Mediante el uso Reglas de expertos de Endpoint Security Es posible bloquear la ejecución de las rutas WSL.
  • Para configurar la respuesta activa (WSLv1) siga los pasos a continuación:
    • Configure un desencadenador para que se le notifique esta situación cuando se elimine un archivo fsserver
      • Desencadenador de archivos con condición: el nombre de los archivos es igual a fsserver ”
    • Recopilador de archivos si está habilitado, buscando modificaciones en el servidor.
      • "Archivos donde el nombre de los archivos es igual a fsserver"

En MVISION EDR (WSLv1), el recopilador de archivos debe estar habilitado y buscar modificaciones wsl.conf (archivos donde el nombre de los archivos es igual a "fsserver"

Como nota final, esperamos que esta publicación proporcione nuevas ideas sobre la exploración futura de estas áreas clave, sobre todo teniendo en cuenta que WSLv1 y WSLv2 se pueden convertir en línea y ambas versiones se utilizarán de manera justa durante los próximos años.

Referencias

  1. http://doc.cat-v.org/plan_9/misc/ubiquitous_fileserver/
  2. http://9p.io/magic/man2html/5/intro
  3. https://github.com/chaos/diod/blob/master/protocol.md
  4. https://w4mhi.wordpress.com/complete-hyper-v-socket-client-code/
  5. https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service
  6. https://tyranidslair.blogspot.com/2019/07/digging-into-wsl-p9-file-system.html
  7. https://securingtomorrow.mcafee.com/other-blogs/mcafee-labs/using-expert-rules-in-ens-10-5-3-to-prevent-malicious-exploits/
  8. https://securingtomorrow.mcafee.com/other-blogs/mcafee-labs/the-twin-journey-part-1/





Enlace a la noticia original