¿Cómo distribuir código malicioso sin que te pillen?
Este es el reto diario de los equipos de simulación de ataques y los atacantes. A medida que los equipos de defensa implementan nuevas soluciones de seguridad (EDR, XDR, antivirus de última generación), los equipos de ataque deben redoblar su ingenio para evitar ser detectados y que estas herramientas alerten a los SOC.
Conectar una memoria USB infectada, enviar un correo electrónico que contenga un archivo comprimido o un enlace a un repositorio comprometido son ataques que pueden tener éxito en los sistemas de información más vulnerables. Sin embargo, estos sistemas generan registros de actividad que permiten detectar rápidamente cualquier compromiso de seguridad.
La solución consiste en aprovechar una función que todos utilizan y que está presente en todos los navegadores web: la caché
Nota del editor: La presentación se basa en el sistema operativo de Microsoft y en los navegadores Firefox y Chrome.
¿Qué es la caché?
Con el fin de mejorar el rendimiento de los navegadores web y reducir el consumo de ancho de banda en la red profesional o personal, la caché permite almacenar el contenido de las páginas web visitadas (HTML, CSS, JS, imágenes y archivos multimedia, así como fuentes).
La próxima vez que el usuario visite estas mismas páginas web, solo se cargarán algunos de los recursos, y no todos. Esto reduce el tiempo de respuesta y, por lo tanto, la hace más rápida.
Este comportamiento se puede comprobar mediante el inspector de tu navegador para determinar si un recurso se ha cargado directamente desde el servidor web remoto o desde tu caché.

Almacenamiento en caché de páginas web con Firefox
Aunque esté oculto, este proceso tiene una duración bien definida. Mantener el mismo recurso en la memoria del disco sin límite de tiempo puede provocar fallos en el sitio web. Por ejemplo, si el administrador del sitio ha actualizado el recurso. Por lo tanto, cada recurso del disco tiene una fecha de caducidad.
¿Dónde se esconde?
Dependiendo del navegador que utilices, puedes ver los recursos almacenados en la caché directamente escribiendo «about:cache» en Firefox o desde tu disco duro.
C : \Users\John\AppData\Local\Mozilla\Firefox\Profiles\{profile folder}\cache2.
Estos archivos no tienen extensión.

Archivos almacenados en la caché del navegador Firefox con fecha de caducidad
¿Cómo determina el navegador qué tipo de archivo puede almacenar en la caché?
A través del campo «content-type» de la solicitud HTTP
¿Quién define el tipo de contenido?
El servidor web remoto
A sus teclados, listos, ¡a hackear!
Por lo tanto, basta con crear un sitio web falso e insertar código malicioso en los recursos. En el ejemplo presentado, se tratará de un shell inverso en formato de una DLL (Dynamic Link Library) creada mediante Metasploit en Kali Linux. Solo queda asignarle el tipo «imagen» en la configuración del servidor web para que esta se cargue en el navegador de la víctima cuando visite el sitio web comprometido. El archivo de caché contendrá el contenido de calc.dll

Configuración del tipo de imagen en el servidor web

Página HTML del sitio web malicioso con el archivo DLL
¡Pero espera! ¿Se puede ejecutar un archivo DLL desde un archivo de caché?
Microsoft ha implementado una medida para impedir la ejecución de código arbitrario sin extensión, lo que plantea un problema. Sin embargo, añadiendo un «.» al final del archivo de caché, es posible ejecutarlo mediante rundll32.
La entrega se ha realizado correctamente, pero…
Por lo tanto, es posible ejecutar un archivo ejecutable, pero el siguiente reto consiste en encontrar una forma de ejecutar ese archivo de manera silenciosa y, sobre todo, en identificar un método para distinguirlo dinámicamente de los demás archivos presentes en la caché.
¿Por qué? Porque en el disco, el nombre del archivo de caché está compuesto por números y letras aleatorias, por lo que hay que localizar el archivo que nos interesa para poder ejecutarlo.
En cuanto a este último punto, basta con una sencilla técnica para resolver el problema: insertar un indicador (una cadena de caracteres definida de antemano).
En cuanto a Firefox, podemos configurar este indicador en el encabezado HTTP de la respuesta a nivel del servidor web.

Añadir el encabezado para Firefox
En el caso de Chrome, es un poco más complejo debido al almacenamiento en una base de datos SQLite. No obstante, podemos generar una cadena de caracteres específica al principio y al final del archivo calc.dll. Esto nos permitirá crear una expresión regular con estos dos parámetros para identificar el archivo de destino con vistas a su ejecución.
A un paso de
Para no activar alertas en los EDR y pasar desapercibido para el SOC, la ejecución de este archivo DLL debe realizarse a través de un proceso principal procedente de un programa legítimo utilizado en la empresa. Además, debe conectarse a Internet para que sea posible establecer un shell inverso y que este quede encapsulado en el protocolo HTTP/HTTPS.
Más vale utilizar un servicio que se conecta constantemente a Internet y que está instalado en casi todos los ordenadores de los usuarios profesionales: Microsoft Teams.
Un ataque muy conocido en las versiones anteriores de Teams y OneDrive consiste en aprovechar la carpeta en la que está instalada la aplicación. Se trata de «localappdata», un espacio en el que un usuario que no sea administrador puede leer los archivos Y escribir en ellos.
Por lo tanto, es el objetivo perfecto.
También hay que tener en cuenta que, durante su ejecución, Microsoft Teams utiliza archivos DLL necesarios para su correcto funcionamiento. Las llamadas pueden fallar, ya que los archivos pueden estar repartidos por varias ubicaciones del sistema Windows.
El sistema Windows sigue un orden determinado al buscar un archivo DLL:
- La carpeta de la propia aplicación
- C:\Windows\System32
- C:\Windows\System
- C:\Windows
- La carpeta en la que se ejecutó el archivo binario de la aplicación
- Los directorios incluidos en la variable de entorno PATH
Al utilizar la herramienta «Process Explorer» de la suite Sysinternals, podemos identificar las llamadas del proceso de Teams y la búsqueda de determinados archivos DLL. Los que no se encuentren directamente en la carpeta de la propia aplicación se buscarán siguiendo el orden de búsqueda del sistema operativo de Microsoft.
Lo primero que se carga, lo primero que se ejecuta
El objetivo es, por tanto, modificar y sustituir nuestro archivo DLL malicioso por uno ya existente que sea necesario para el funcionamiento de Teams y que aún no se encuentre en la carpeta de la aplicación. También debemos hacer referencia al archivo DLL auténtico al final de nuestro programa. ¿Por qué? Teams necesita ciertas funciones presentes en el archivo DLL legítimo para iniciarse; de lo contrario, el programa se cerrará con un error.
¿Pero quién va a hacer esta copia?
La respuesta: el usuario
El objetivo es planificar una campaña de ingeniería social, seleccionar a una víctima para que visite el sitio web del atacante y así cargar en la caché el contenido del archivo DLL malicioso. A continuación, hacerse pasar por el servicio de asistencia al usuario y alegar que se está navegando por un sitio web de un país de dudosa reputación (Rusia, China, etc.). Enviarle un comando de Powershell para que lo ejecute desde su equipo. El objetivo será copiar el archivo de caché que contiene el indicador en la carpeta de la aplicación Teams. Este comando también renombrará el archivo con un nombre real de un archivo DLL que se encuentra en system32 y que utiliza Teams, por ejemplo: VERSION.dll.
La próxima vez que se inicie Teams, se ejecutará el archivo DLL, el Reverse Shell estará operativo y este último también llamará al archivo «VERSION.dll» legítimo.
Esta técnica se denomina «proxying de DLL».
A continuación se ofrece un resumen del ataque:

Paso 1: Almacenamiento en caché de la carga útil

Paso 2: Ingeniería social para ejecutar la carga útil

Paso 3: Ejecución de la carga útil mediante Microsoft Teams
¿Cómo protegerse?
Realizar el refuerzo de la sesión de usuario:
- Desactivar los motores de scripting para quienes no los necesiten
- Instalar los programas en C:\Programas
- Crear una clave de registro para vaciar la caché al final de cada sesión
• Realizar tareas de detección
- Activar una alerta si no es un proceso del navegador el que manipula los archivos almacenados en la caché
- Supervisar la actividad ubicada en LocalAppData
Conclusión: un ataque que no fue necesariamente perfecto
Este ataque presenta numerosas limitaciones:
- La caché tiene una vida útil limitada, por lo que hay que aprovechar el ataque antes de que expire.
- Un ataque basado en spear phishing y en ingeniería social que requiere la intervención de la víctima
- Aprovechamiento de una vulnerabilidad conocida de versiones anteriores de Teams/OneDrive que ya han sido corregidas
- Algunos EDR detectan las DLL de proxy y la acción de ejecutar PowerShell por parte de un usuario con el fin de copiar un archivo en la carpeta «AppData».
- Ataque muy vulnerable dependiendo del tipo de navegador utilizado (especialmente para recuperar nuestra carga útil)
- El puesto de usuario puede ser redirigido a un proxy, y se puede bloquear un shell inverso hacia una IP o un dominio no clasificado
Un buen delantero es aquel que se mantiene oculto.
El contenido de este artículo se basa en las investigaciones de Aurélien Chalot (aurelien.chalot@protonmail.com)
Vicent L.
Ingeniero de seguridad


