Hackeando Mac – Cómo usar imágenes para contrabandear datos a través de firewalls

Los datos se pueden inyectar en imágenes rápidamente sin el uso de herramientas de metadatos. Los atacantes pueden utilizar este conocimiento para exfiltrar información confidencial de una MacBook enviando las imágenes a sitios web comunes de intercambio de archivos.

Continuando con los temas de evasión de DPI, ofuscación de payloads y uso de sitios web populares para evadir los firewalls, veremos una forma alternativa de incrustar datos en imágenes. A diferencia del uso de etiquetas de metadatos para almacenar payloads dentro de una imagen, este método consiste en inyectar texto directamente en el pie de página del archivo de imagen.

Entendiendo el ataque

Hemos creado un simple script Bash para este artículo, para demostrar cómo un atacante puede exfiltrar fácilmente datos dentro de imágenes encontradas en una computadora Mac que tenemos como objetivo. El script está debajo y disponible en GitHub también.

El script ejecutará primero un comando arbitrario (por ejemplo, system_profiler). La salida de ese comando es la información que el atacante desea exfiltrar. La secuencia de comandos intentará ubicar una imagen JPEG o PNG en el directorio de inicio (~/) del objetivo e inyectará la salida del comando directamente en la imagen. La imagen se carga inmediatamente (contrabandea los datos) a cualquier sitio web que el atacante desee.

A continuación, se muestra un ejemplo de un archivo de imagen pequeño abierto con el editor de texto nano en Kali. Podemos ver que la imagen produce algunos caracteres inusuales ya que las fotos no deben abrirse con editores de texto.

Desplazándose hacia la parte inferior del mismo archivo, encontraremos lo que parece ser la salida de algunos comandos ls y system_profiler.

Los detalles técnicos sobre cómo las imágenes pueden retener datos están un poco más allá del alcance de este artículo. Lo importante es que los datos que se encuentran en la parte inferior de la imagen no dañen la foto. Los visores de imágenes como la Vista previa de Apple continuarán abriendo la imagen sin detectar datos en el archivo. También hace que las imágenes sean un excelente mecanismo de transporte para la exfiltración de datos.

¿Por qué exfiltrar/extraer datos dentro de imágenes?

El principal beneficio de la extracción de datos de esta manera es la evasión del firewall. Con las soluciones de firewall basadas en la red, es posible observar cada paquete que deja un dispositivo en particular en la red. Las políticas estrictas firewall dificultan que un atacante obtenga grandes cantidades de información fuera de la red. El contrabando de datos dentro de las imágenes ayuda a resolver este obstáculo.

Entendiendo el payload

Vamos a desglosar el script, línea por línea.

Comienza con varias variables que deben cambiarse adecuadamente para adaptarse al escenario. La primera variable determinará qué comandos se ejecutan en la MacBook de destino. La salida del comando está incrustada en el archivo de imagen. El siguiente ejemplo ejecuta un simple comando ls del directorio de inicio del destino. Se utilizan comillas simples para esta variable para ayudar a escapar de los caracteres. Ten en cuenta esto cuando tengas que ejecutar comandos.

Hay muchos lugares donde la imagen puede ser exfiltrada. Con sitios web como Dropbox y Flickr, existen API oficiales para hacer que la carga de archivos sea lo más conveniente posible para un usuario final (y el atacante). De manera similar, curl puede emular solicitudes POST, enviando la imagen a sitios web para compartir archivos y otros foros. Para esta demostración, usaremos una configuración simple del servidor PHP en el sistema del atacante.

Como veremos más adelante en el script, este intenta enumerar una imagen viable para guardar los datos de salida dentro. Sin embargo, si no se descubre ninguno, la secuencia de comandos descargará la imagen de abajo y la utilizará para contrabandear los datos de salida. La siguiente URL enlaza con una imagen aleatoria en uno de los dominios de Apple, pero puede ser literalmente cualquier JPEG o PNG en Internet.

Encontrando el archivo

El script intentará find (encontrar) un archivo de imagen (-type f) inferior a 100k y que contenga la extensión de archivo JPEG, JPG o PNG. Utilizará la primera imagen (-print -quit) dentro de este criterio como el archivo de exfiltración. Los requisitos de tamaño de archivo son en su mayoría arbitrarios. Los archivos de imagen más pequeños harán que el proceso de carga sea más rápido. Estas opciones de find se presentan principalmente para mostrar cómo se pueden perfeccionar los criterios.

El script admite la capacidad de cifrar los datos de salida del comando antes de incrustarlos en la imagen. Se puede habilitar con 1, desactivarlo con 0.

Con el cifrado habilitado, la siguiente contraseña se utiliza para proteger con contraseña los datos de salida. Se incluye en el payload por conveniencia, lo que puede hacer posible la ingeniería inversa y descifrar los datos exfiltrados dentro de la imagen, pero debe actuar como una solución rápida y sucia. La clave de criptografía pública tendría más sentido aquí.

pass=”password123″

El resto del script no necesita ser modificado. Todas las variables anteriores están codificadas en las siguientes secciones.

Instrucciones

A continuación, se muestra la primera de las dos instrucciones if, que determinarán si se detectó o no un archivo JPEG o PNG adecuado y lo usaremos en los siguientes comandos, o descargaremos la imagen de Apple definida en la variable “tmpImage”.

La segunda instrucción if utiliza OpenSSL (LibreSSL en macOS o Mac OS X) para cifrar los datos de salida con la contraseña de la variable $pass. De lo contrario, no cifrará ni inyectará los datos de salida en la imagen en texto sin formato.

Aquí, tenemos la redirección de Entrada y salida. Printf se utiliza para anexar (>>) el resultado del comando en el archivo de imagen. Se agregan nuevas líneas (\n\n) para separar los datos inyectados de los datos de imagen sin procesar, lo que facilita la extracción en los siguientes comandos.

Finalmente, la imagen se exfiltró al servidor del atacante utilizando curl con la opción -F para enviar la imagen.

Paso 1 – Iniciar el servidor PHP

El ejemplo utilizado anteriormente en este artículo utiliza File.io para almacenar las imágenes exfiltradas. Si bien los sitios web similares para compartir archivos son ideales para este ataque, mostraré rápidamente cómo usar un servidor PHP local en Kali para interceptar imágenes.

Al igual que la preparación de un servidor para la exfiltracion de capturas de pantalla, PHP se utiliza para interceptar imágenes provenientes del MacBook del objetivo.

Guarda el código PHP a continuación en un archivo llamado “index.php” e inicia el servidor con php -S 0.0.0.0:80.

Paso 2 – Implementando el payload

Hay varias formas de conseguir que un usuario de Mac ejecute algún código malicioso. El método más simple para comprometer un objetivo involucra la ingeniería social para abrir AppleScripts trojanizados. Esto se puede lograr realizando ataques de USB Dead Drop, a los que macOS es altamente susceptible, o evadiendo de forma remota a Gatekeeper.

Paso 3 – Acceder a los datos exfiltrados

Después de que el servidor PHP reciba la imagen exfiltrada, debes extaer los datos incrustados. Si el cifrado está deshabilitado en el payload, los datos exfiltrados se extraen fácilmente con el comando tail. DebesCambiar el número (-n) de líneas para imprimir según sea necesario.

Si el cifrado está habilitado, OpenSSL (LibreSSL) debes instalarlo en Kali para descifrar los datos. Asegúrate de instalar la versión 2.8 de LibreSSL. En mi prueba, la versión 2.9.x no parecía ser compatible con la versión de LibreSSL de Mojave; Los datos no se descifrarían.

En Kali, debes comenzar descargando el tarball LibreSSL.

Descomprímelo con el siguiente comando tar para extraer (x) el archivo .gz (z) (f).

Cuando hayas terminado, cambia (cd) al nuevo directorio libressl-*/.

Usa el comando ./configure para asegurarte de que todo esté listo para compilar la aplicación. Tardará unos minutos en completarse.

Luego, debes utilizar make install para instalar el software necesario en los directorios del sistema apropiados.

Finalmente, tienes que usar el comando ldconfig para crear los enlaces y la memoria caché necesarios para las bibliotecas compartidas más recientes.

Para verificar que la instalación fue exitosa, usa el comando whereis para encontrar los archivos binarios de openssl.

El binario en /usr/local/bin/ es la versión más reciente y se puede verificar mediante el siguiente comando openssl.

Una vez realizada la instalación, los datos de la imagen se pueden extraer y descifrar con el siguiente comando.

El payload (ls) utilizado en este artículo es un ejemplo elemental. En un escenario real, un atacante puede diseñar el script para ubicar y extraer datos de LastPass y 1Passwords para atacantes offline por medio de fuerza bruta. Otros ataques de exfiltración pueden incluir contraseñas del navegador, historial de la terminal, tráfico web y cualquier información que el atacante considere digno de robar.