Ejemplo de una carga útil entregada a través de la esteganografía
En este diario, le mostraré un ejemplo práctico de cómo se usa la esteganografía para ocultar las cargas útiles (u otros datos sospechosos) de las herramientas de seguridad y los ojos de los analistas de seguridad. La esteganografía se puede definir de esta manera: es el arte y la ciencia de ocultar un mensaje secreto, archivo o imagen dentro de un operador de aspecto ordinario, como una fotografía digital, clip de audio o texto, para que la existencia misma de los datos ocultos sea indetectable para los observadores casuales (leer: personas de seguridad). Muchas implementaciones en línea de la esteganografía básica le permiten incrustar un mensaje (una cadena) en una imagen[1].
Echemos un vistazo a la muestra que encontré. Debido a que es un binario .NET, se puede descomponer fácilmente. Pero, debido a que el código fuente es fácilmente accesible, muchos malware a menudo se ofuscan. Una técnica clásica es usar UFT-16 en funciones, clases, nombres de variables, etc. En el siguiente ejemplo, el nombre clave del registro se ofusca:
Otro comportamiento común de malware en .NET es utilizar técnicas de carga de código reflexivo. La carga del código reflexivo es la capacidad de un programa en ejecución para inspeccionar, cargar y usar el código (clases, funciones, bibliotecas, incluso ensamblajes completos) que no se vinculó estáticamente o se hace referencia explícitamente en el momento de la compilación. En cambio, el programa decide en tiempo de ejecución qué traer a la memoria y cómo invocarlo. Por lo tanto, cuando invierte un programa .NET, es una buena idea buscar métodos como .Load (), .LoadFrom () o .LoadFile (). Esto puede indicar que se cargará más código (aprobado como parámetro).
Eso es lo que encontré en esta muestra, pero hubo otras cadenas interesantes: «mapa de bits», «webclient» o «openRead»:
Una carga útil de mapa de bits (léase: una imagen) se descarga de una URL. Una vez desobfuscado, obtenemos:
hxxps://i[.]ibb[.]co/LgqktNn/freemaosnry[.]png
La función deobfuscatación está aquí:
Una vez que se haya descargado la imagen, un bucle procesará todos los píxeles desde la fila superior y extraerá el valor del componente «rojo». Todos los valores se agregan en una matriz de bytes para reconstruir la próxima carga útil. Podemos reproducir esto con algunas líneas de Python:
#!/usr/bin/env python3 import sys from PIL import Image def main(): img = Image.open(“freemaosnry[.]png”).convert("RGBA") w, h = img.size pix = img.load() with open("payload.tmp", "wb") as f: for y in range(h): for x in range(w): r, g, b, a = pix[x, y] f.write(bytes([r])) if __name__ == "__main__”: main()
Echemos un vistazo a la imagen:
remnux@remnux:/MalwareZoo/20250418$ file freemaosnry.png freemaosnry.png: PNG image data, 31744 x 1, 8-bit/color RGBA, non-interlaced
Según los detalles del archivo, deberíamos obtener una carga útil de 31744 bytes:
remnux@remnux:/MalwareZoo/20250418$./decode_pic.py remnux@remnux:/MalwareZoo/20250418$ ls -al payload.tmp -rwx------ 1 501 dialout 31744 Apr 18 08:27 payload.tmp* remnux@remnux:/MalwareZoo/20250418$ file payload.tmp payload.tmp: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
¡Bingo! Tenemos la próxima carga útil que, durante la ejecución, se ha generado en la memoria. Ahora está listo para ser invocado con:
AppDomain.CurrentDomain.Load(array).EntryPoint.Invoke(null, null);
¿Qué pasa con este malware? El archivo PE inicial se llamaba «Voice_recording.bat» (SHA256: CE77B1BC3431139358E2A70FA5F731D1BE127E77FE8B534DF5CCDE59083849DD[2]). Pertenece a la familia Xworm y tiene la siguiente configuración:
{ “c2": [ "cryptoghost[.]zapto[.]org" ], "family": "latentbot" } { "attr": { "install_file": "MasonUSB.exe" }, "rule": "Xworm", "family": "xworm" }
¡Feliz caza!
[1] https://manytools.org/hacker-tools/steganography-ingode-text-into-image/
[2] https://www.virustotal.com/gui/file/ce77b1bc343113139358e2a70fa5f731d1be127e77efe8b534df5ccde59083849d/detection
Xavier Merts (@xme)
Xameco
Handler de ISC senior – Consultor de seguridad cibernética independiente
Clave PGP