Panorama#

Los dos capítulos anteriores describieron dos caras de la evasión. La evasión del canal (3.10) disimula la forma de la conversación del C2 para que se parezca a tráfico normal; la evasión del payload (3.11) disimula la huella del código para que el AV/EDR no lo reconozca en el disco ni en la memoria. Este capítulo cubre la tercera: esconder lo malicioso dentro de un portador que en sí mismo es legítimo. Donde la evasión del canal hace que el tráfico parezca normal y la del payload hace que el binario parezca benigno, la esteganografía hace que la cosa maliciosa viva dentro de algo que efectivamente es normal —una imagen real, una página HTML que renderiza igual, un campo no usado de un paquete, un evento real de un calendario compartido—.

Conviene distinguir dos conceptos hermanos. La esteganografía es el arte de ocultar la existencia del mensaje —a diferencia de la criptografía, que oculta su contenido pero no que hay un contenido—: una imagen con datos escondidos en sus píxeles no parece llevar nada. Un canal encubierto (covert channel), formalizado por Butler Lampson en 1973, es un canal que viola una política de seguridad transportando información por medios que no forman parte del diseño del sistema —campos reservados o resignificados de un protocolo—. Los dos persiguen el mismo fin defensivo-evasivo: pasar bajo la inspección de contenido del perímetro, el AV estático y el DLP (Data Loss Prevention).

La tesis que ordena el capítulo hereda la de 3.11 y la traslada un plano más allá: la esteganografía y los canales encubiertos ganan contra la inspección de contenido, no contra la telemetría de ejecución ni el análisis estadístico. Lo que viaja es una imagen legítima, una página que dice «servidor caído», un evento de Google Calendar —y el escáner de red o el AV estático no ven nada anómalo porque no lo hay en la superficie—. Pero la ocultación solo protege la fase estática: en disco y en tránsito. En el momento en que el payload se recupera de los píxeles y se ejecuta, la defensa conductual recupera toda su oportunidad. Ocultar el qué y el dónde de un artefacto o una comunicación no oculta que, al final, ese código tiene que correr. Esa es la grieta que la sección de detección explota, y la razón de que el estegoanálisis sea, sobre todo, un problema de triaje estático apoyado en una red de seguridad conductual.

flowchart LR
  M["Payload / comando / datos\n(2ª etapa · C2 · exfil)"] --> C["Portador legítimo\n(imagen · audio · HTML · campo de protocolo · SaaS)"]
  C -->|"cruza inspección de contenido\n(perímetro · AV estático · DLP)"| V["Víctima / operador\nrecupera lo oculto"]
  V --> X["…y el payload EJECUTA\n(fin de la fase estática)"]
  X -.->|"telemetría de ejecución"| D["Detección conductual\n(3.11 · esta § defensa)"]

Todo sistema estego se juzga por tres propiedades en tensión permanente. La capacidad —cuánta información cabe—, la invisibilidad —qué probabilidad hay de que un estegoanalista lo detecte— y la robustez —cuántas alteraciones del portador soporta el mensaje antes de perderse—. Subir una no es gratis: más capacidad suele significar menos invisibilidad. Y una consecuencia operativa central: la robustez la impone el canal de transmisión, no la técnica. Una herramienta LSB clásica se destruye al subir la imagen a Twitter o Facebook, porque esas plataformas recomprimen y reescalan; una técnica sobre coeficientes DCT (como F5) sobrevive a esa recompresión. La elección de técnica la decide, antes que nada, por dónde va a pasar el portador. En términos de MITRE ATT&CK el capítulo cubre T1001.002 (Data Obfuscation: Steganography), T1027.003 (Obfuscated Files: Steganography), T1102 (Web Service como C2), T1140 (Deobfuscate/Decode) y, para la exfiltración, T1567 (Exfiltration Over Web Service).

Ocultar en el fichero: LSB, dominio DCT y EoF#

La cara más común del estegomalware es traer la segunda etapa —un script o una DLL— escondida en un fichero de aspecto inocente que cruza el AV estático. Las técnicas se ordenan por dónde meten los bits.

LSB (Least Significant Bit). Una imagen es una matriz de píxeles; en RGB de 24 bits, cada píxel son tres octetos (rojo, verde, azul, 0-255). La técnica sustituye el bit menos significativo de cada octeto por un bit del mensaje, sin cambio visual perceptible. Cómo se eligen los píxeles define tres variantes: secuencial —en orden desde una posición fija—, que a su vez se implementa como LSB-replacement (voltear el bit) o LSB-matching (±k: sumar o restar 1 al valor, lo que imita el ruido natural de la imagen y es demostradamente menos detectable); pseudoaleatoria —un PRNG con semilla derivada de una clave elige los píxeles, impidiendo predecir el orden—; y por bit de paridad de región —se parte la imagen en regiones y se oculta un bit por región vía Σ LSB(píxel) mod 2, tocando un solo píxel solo si la paridad no cuadra—. El LSB directo está cuestionado por dos supuestos falsos: se creyó que los bits menos significativos eran aleatorios (dejan anomalías estadísticas) y que el ojo no percibe cambios mínimos (sí los percibe en zonas uniformes y en los bordes). Sobrevive por su gran capacidad y su facilidad de implementación. En el estegomalware real, cada familia se distingue por su receta de codificación: OceanLotus toma 3 bits del rojo, 3 del verde y 2 del azul; APT29 usa 2/3/3 sobre PNG de Dropbox y descifra con AES; Worok codifica un nibble por píxel. El mismo LSB aplica a otros medios: Turla ocultó el cryptominer XMRig en las muestras de un fichero de audio WAV, y MontysThree usó BMP.

Dominio transformado (DCT). Frente al dominio temporal —sustitución directa sobre píxeles—, las técnicas de dominio transformado operan sobre los coeficientes de una transformada matemática de la imagen (la DCT del JPEG), y son más robustas y difíciles de detectar. La referencia es F5 (Andreas Westfeld): en vez de sobrescribir el LSB, decrementa el valor absoluto de coeficientes DCT elegidos pseudoaleatoriamente —lo que no rompe la forma del histograma que delataría a Jsteg u Outguess— y usa matrix encoding para minimizar los cambios. El matrix encoding 2:3 oculta 2 bits en 3 coeficientes calculando a1⊕a3 y a2⊕a3, de modo que modifica un solo bit el 75 % de las veces (en general, uno de cada 2^k-1 para ocultar k bits). Su valor operativo: F5 sobrevive a la recompresión de las redes sociales, y por eso aparece en malware, C2 y ejercicios. El estado del arte público son las técnicas adaptativas (HUGO, WOW), que ocultan solo en ejes y texturas —difíciles de modelar estadísticamente— guiadas por funciones de distorsión.

Para payloads pequeños de red team, la herramienta directa es Invoke-PSImage, que oculta un script PowerShell en un PNG usando los 4 bits bajos de 2 de los 3 canales de cada píxel; el resultado es siempre PNG lossless porque los datos viven en los colores y una compresión con pérdida los borraría. Es cómoda pero su firma es conocida —la usó tal cual el APT Powload—, lo que la vuelve un IoC.

# Estego "de calle" robusta a recompresión de redes sociales (F5 sobre DCT) f5stego -e -p <clave> gato.jpg mensaje.txt gato_stego.jpg # PowerShell dentro de un PNG (4 LSB de 2 canales por píxel) — firma CONOCIDA Import-Module .\Invoke-PSImage.ps1 Invoke-PSImage -Script .\payload.ps1 -Out .\imagen.png -Image .\portada.jpg

EoF (End of File). La técnica más antigua y la más detectable, y aun así muy usada. Consiste en anexar datos tras el marcador de fin de la estructura del fichero (FFD9 en JPEG, IEND en PNG, o las cabeceras de un RAR), aprovechando que los formatos no comprueban la longitud total: leen sus estructuras y al terminar dejan de leer. Permite ocultar cantidades ilimitadas —Scarcruft escondió el backdoor ROKRAT así, MyKings anexó una herramienta de fuerza bruta SQL empaquetada con VMProtect al final de un JPEG de Taylor Swift—, pero el peso delata: la variante de Darktrack usaba una imagen de 512×512 que ocupaba 1,09 MB, un tamaño imposible que revela datos tras el IEND. Una variante estructural más fina es el truco de la cabecera RAR: cambiando el byte HEAD_TYPE de un fichero interno de 0x74 (archivo individual) a 0x00, el descompresor deja de encontrarlo y al abrir el .rar solo aparece el fichero-cebo; el malicioso sigue ahí, invisible al análisis estático, y se recupera revirtiendo el byte tras cruzar el perímetro. Es la misma familia que usó RainDrop en el compromiso de SolarWinds, con 7-Zip.

Polyglots. El punto débil del estegomalware clásico es que la víctima necesita ejecutar un software que revierta la ocultación —código que puede delatarlo—. Un polyglot elimina esa dependencia: es un fichero que se comporta de formas distintas según el reproductor —un JPEG que también es JavaScript, PowerShell o PHP válido—, de modo que el propio intérprete legítimo lo ejecuta. Stegosploit (Saumil Shah) oculta un exploit de navegador en el LSB de los píxeles e inserta en la cabecera un JavaScript que lo extrae y ejecuta: la imagen, alojada en una red social, se auto-ejecuta como código si el navegador es vulnerable, sin tooling externo del atacante. Powerglot automatiza la creación de estos vectores —y, señal para el defensor, también su detección, porque Stegosploit deja una marca a final de fichero—.

Ocultar la comunicación: el canal encubierto#

La otra cara del estegomalware no oculta un fichero en disco sino el canal de comunicación con el operador. Es aquí donde este capítulo se cruza con la infraestructura de C2 (3.10): un canal encubierto es, precisamente, una forma de evadir el canal escondiéndolo dentro de algo que no se puede bloquear.

El patrón dominante en los APT modernos es una cadena repetida: una etapa inicial —una macro ofimática por spear phishing que lanza PowerShell— descarga una imagen alojada en un servicio legítimo (imgur, Twitter, Dropbox, sinaimg.cn) y reconstruye desde sus píxeles el script o la DLL de la siguiente etapa. La esteganografía evade el escáner de red y el AV estático porque lo que viaja es una imagen legítima desde un dominio de confianza. El servicio legítimo hace de C2 o de dead-drop: APT29 consultaba Dropbox por un clientid para bajar sus PNG; PolyglotDuke obtenía la URL del C2 desde Twitter, Reddit e Imgur.

Por debajo de las imágenes están los canales encubiertos en los protocolos. Son viables porque casi todos los protocolos tienen campos no usados o resignificables: en IPv4 el bit Don’t Fragment, el campo de identificación o la dirección origen; en ICMP los mensajes echo request/response; en TCP el número inicial de secuencia (ISN) o el puntero de datos urgentes; y, sobre todo, DNS (tunneling por subdominios de alta entropía o registros TXT). Como los controles perimetrales modernos bloquean muchas de estas comunicaciones de bajo nivel, el malware migró a la capa de aplicaciónHTTP/HTTPS, que en la práctica no se puede filtrar en una organización— usando cabeceras, parámetros de GET/POST, redirecciones y cookies como portadores. SolarWinds/UNC2452 enmascaró sus comandos en las respuestas HTTP. Dos herramientas de referencia materializan esto: Mística (canales encubiertos sobre HTTP/DNS/ICMP) y Cloakify (convierte un fichero en listas de texto plausible —nombres, ciudades— que pasan inadvertidas en el tráfico, exfiltración por seguridad-por-oscuridad).

Los portadores más creativos amplían el catálogo más allá de imágenes y paquetes:

  • Email desde dentro del servidor. LightNeuron (Turla) compromete un servidor Exchange con un Transport Agent malicioso e intercambia comandos con estego «casera» en adjuntos JPEG y PDF —valida una firma por operaciones XOR sobre bytes de la tabla de cuantificación JPEG (o el rango 0x0B-0x10 del PDF, satisfecho poniéndolo todo a 0x00) y lee el tamaño y el offset del comando desde posiciones fijas—. Su posición en el flujo de correo le permite borrar los propios mensajes que portan el canal, minimizando el rastro.
  • Lenguajes de marcado. Platinum descarga una página HTML que a la vista dice «C&C caído» pero oculta comandos por dos técnicas textuales invisibles al render: el orden de los atributos de las etiquetas (permutaciones → log2(n!) bits; cuatro atributos = 4 bits) y el número de espacios entre tabuladores (0-7 → 3 bits, la técnica SNOW).
  • Calendarios y SaaS. APT41 (TOUGHPROGRESS) usa Google Calendar como C2, creando y consultando eventos —un servicio legítimo imposible de bloquear—, tras una cadena LNK-que-simula-PDF → imágenes señuelo → DLL que hace process hollowing sobre svchost.exe.
El estego «casera» de estructura —firmas triviales y offsets fijos como los de LightNeuron, o el 0x00 que satisface la firma del PDF— es rápida de implementar pero firmable: deja constantes en posiciones conocidas que el estegoanalista convierte en regla. La comodidad del portador legítimo (una imagen de Dropbox, un evento de calendario) se paga en la periodicidad del beaconing a ese servicio, exactamente el punto débil estructural del C2 de 3.10.

La capa de cifrado y targeting#

Sobre el estego, las familias reales añaden una capa que las vuelve dirigidas y anti-sandbox, y que a la vez explica por qué una muestra «no hace nada» al analizarla. Los datos recuperados de los píxeles se suelen envolver en cifrado (AES, 3DES, XOR custom), pero lo interesante es cómo se ata la ejecución al entorno de la víctima. Ursnif incluye un guard de entorno: solo descarga la estegoimagen si el timezone del sistema es +01:00, lo que es a la vez anti-sandbox y targeting geográfico. Bebloh va más lejos y deriva la clave AES del propio entorno: la clave es el texto de un mensaje de excepción provocado a propósito, que depende del language pack del sistema operativo, de modo que el script solo funciona en víctimas del país objetivo. El mismo Bebloh ejecuta su script final a través del portapapeles y lo borra al terminar, dejando un rastro forense mínimo. Estas capas son la razón de que replicar el entorno exacto de la víctima —timezone, idioma, dominio— sea condición previa para que el sandbox del defensor vea algo.

Defensa y detección#

El estegoanálisis es concreto y en buena parte automatizable, y descansa en la tesis del capítulo: el estego protege la fase estática, no la ejecución. La defensa trabaja en tres planos, y el más fuerte es el conductual.

  • Fichero y artefacto (triaje estático). El EoF es el eslabón más débil: se parsea la estructura y se buscan bytes tras el marcador de fin (FFD9 / IEND, o cabeceras RAR incoherentes) y peso anómalo para la resolución —el 1,09 MB de Darktrack en 512×512—; lo automatizan stegdetect, StegSecret y zsteg. Las malas implementaciones dejan firmas fijas: InThePicture escribe la constante C8 D4 EA 35 DF E2 83 5F en un offset conocido, DeepSound cifra con AES-ECB y almacena un SHA-1 de la clave (atacable por diccionario), Camouflage usa una clave maestra prefijada que descifra cualquiera de sus estegoficheros —todas convertibles en reglas YARA—. El LSB directo cae ante el estegoanálisis estadístico (Chi-Square, RS —fiable ya a 0,005 bits por píxel—, SPAM) sobre el histograma; el dominio DCT (F5, Outguess) es más duro, pero Fridrich y otros publicaron detección fiable. Y la firma conocida de Invoke-PSImage delata su uso.
  • Endpoint (el plano más fuerte). Como el estego solo cubre lo estático, la detección conductual gana cuando el payload se ejecuta. La etapa PowerShell que descarga una imagen y reconstruye código desde sus píxeles es el eslabón visible: aflora en el Script Block Logging (Event ID 4104) ya desofuscado, en Sysmon 1 / Event ID 4688 con la línea de comandos, y en el patrón macro-Office → PowerShell → red. El process hollowing sobre svchost.exe (PLUSINJECT de APT41) deja Sysmon 8/10 y memoria RWX con parentesco anómalo —la misma firma de inyección que 3.11—, y en Android la carga vía DexClassLoader de un .dex recuperado de una imagen es el equivalente. Es la misma lección de 3.11: la ocultación vence lo que se inspecciona en reposo, no lo que el código hace al correr.
  • Red (canal y exfiltración). Las descargas de imágenes desde servicios legítimos con periodicidad de beaconing, el C2 sobre Dropbox/Twitter/Google Calendar (T1102), el DNS tunneling por subdominios de alta entropía y la exfiltración de los skimmers de Magecart por websockets —un caso de ataque al cliente emparentado con 3.3— comparten el problema con la caza de C2 de 3.10: sin inspección TLS, el proxy no ve el contenido, pero sí ve el patrón (destino, periodicidad, volumen). La caracterización del comportamiento de protocolo con aprendizaje automático (SVM) que la literatura estego propone es exactamente la línea NDR/UEBA de la defensa moderna.
  • Postura y correlación. Inspección TLS donde sea viable, DLP que entienda estructura de ficheros y no solo extensiones, y un sandbox que replique el entorno de la víctima (timezone, idioma, dominio) para vencer los guards de Ursnif/Bebloh. La telemetría de los tres planos se correlaciona —imagen descargada, PowerShell que lee píxeles, beacon al SaaS, exfil— como una sola historia; la caza de canales encubiertos y C2 sobre servicios legítimos se desarrolla del lado blue en la caza de C2 (P5), y el estegoanálisis y la detección de exfiltración en la detección de exfiltración y estegoanálisis (P5); la correlación con la telemetría de Active Directory, en 4.9.

La regla de oro del estegoanalista cierra el capítulo: como el estego robusto es caro de romper de frente, el apoyo son los errores explotables como IoC —imágenes reutilizadas, uso de imágenes del propio sistema operativo para exfiltrar, marcas EoF de herramientas conocidas, firmas de tooling público—. Atados a los TTP de una familia, esos patrones separan el grano de la paja; y para lo que sobreviva al estego robusto, queda la certeza de que el código, tarde o temprano, tiene que ejecutarse.

flowchart TD
  S["Esteganografía / canal encubierto\n(vence la inspección de contenido)"] --> F["Fichero: EoF / peso anómalo\nfirmas fijas · Chi-Square / RS"]
  S --> E["Endpoint: PowerShell lee píxeles\n4104 · Sysmon 1/4688 · hollowing 8/10"]
  S --> N["Red: C2 en SaaS legítimo\nDNS entropía · exfil websocket"]
  F & E & N --> C["Correlación SIEM\n= una historia de ocultación"]
  C --> R["→ caza de C2 (P5) · estegoanálisis (P5)\n→ TLS inspection · DLP estructural · sandbox del entorno real"]

Referencias#

  • red-infra/estegomalware/cap-01Fundamentos TTP, evasión de AV y polyglots: los tres usos del estegomalware y su mapeo ATT&CK, las tres propiedades (capacidad/invisibilidad/robustez) y las tres líneas de técnica, la evasión de la fase estática, el truco de la cabecera RAR (HEAD_TYPE 0x74→0x00) y los polyglots (Stegosploit/Powerglot).
  • red-infra/estegomalware/cap-02APTs 2019-2023: LSB replacement y EoF: el patrón imagen-en-servicio-legítimo → PowerShell y las recetas de codificación por familia (Ursnif, OceanLotus, APT29, Bebloh, Worok), los medios alternativos (WAV de Turla, BMP de MontysThree) y los casos EoF (Scarcruft/ROKRAT, MyKings, Darktrack, Magecart).
  • red-infra/estegomalware/cap-03Canales de comunicación: email (LightNeuron y su Transport Agent de Exchange), markup (Platinum: orden de atributos y whitespace SNOW), calendarios (APT41 y Google Calendar), y los canales encubiertos de Lampson sobre IPv4/ICMP/TCP/DNS/HTTP con Mística y Cloakify.
  • red-infra/estegomalware/cap-04Vistazo del analista: el mecanismo interno y su detección — variantes de LSB (replacement vs matching ±k, pseudoaleatorio, paridad), dominio DCT (Jsteg/Outguess/F5 con matrix encoding), Invoke-PSImage, el reversing de Camouflage, estego en HTML/audio y el estegoanálisis estadístico (Chi-Square, RS, SPAM).
  • Alfonso Muñoz — Estegomalware (mindcrypt, 2025) y sus repositorios polyglot y powerglot; MITRE ATT&CK T1001.002 (Steganography) y T1027.003.