Introducción a los Retos de Esteganografía en CTF
Los retos de esteganografía en los CTF (Capture The Flag) son desafíos que ponen a prueba la capacidad del participante para descubrir mensajes, archivos o información oculta dentro de otros archivos o medios digitales. A diferencia de la criptografía, que se centra en ocultar el contenido del mensaje a través de cifrados, la esteganografía busca ocultar la existencia misma del mensaje, camuflándolo dentro de elementos aparentemente inocuos.
En los CTF, los retos de esteganografía pueden involucrar imágenes, audios, vídeos, archivos PDF, documentos, archivos binarios o incluso códigos QR, entre otros. El objetivo es identificar la presencia de información oculta, descubrir el método utilizado para esconderla y extraerla correctamente.
Estos desafíos fomentan la combinación de habilidades técnicas en análisis forense digital, manipulación de archivos, programación, y un conocimiento sólido de formatos y técnicas avanzadas de ocultación. Además, enseñan a pensar de manera creativa y detallada para detectar patrones o anomalías que a simple vista pasan desapercibidas.
La esteganografía en CTF no solo es una práctica divertida y educativa, sino que también tiene aplicaciones reales en áreas como la seguridad informática, la privacidad, y la lucha contra la censura, donde comunicar mensajes secretos de forma imperceptible puede ser crucial.
**\
**
La técnica LSB consiste en ocultar información dentro de un archivo digital (normalmente imágenes, pero también audio o vídeo) modificando el bit menos significativo de cada byte de los datos.
El bit menos significativo (Least Significant Bit) es el que menos afecta al valor final del byte, por lo que su alteración es prácticamente imperceptible para el ojo o el oído humano.
- Elegir el archivo portador (por ejemplo, una imagen BMP o PNG sin compresión con pérdida).
- Convertir el mensaje a bits.
- Reemplazar el último bit de cada byte del archivo con los bits del mensaje.
- El cambio es tan pequeño que no altera la apariencia o el sonido del archivo de forma perceptible.
Ejemplo con un byte:
- Pixel original (rojo): 10110110 (182 decimal)
- Sustituyendo el LSB: 10110111 (183 decimal)\
- Método: modificación directa de bits de datos.
- Requisitos: formatos que soporten datos sin compresión destructiva (BMP, PNG, WAV, etc.).
- Capacidad: depende del tamaño del archivo portador y del número de bits modificados por píxel (1 o más bits por canal).
- Seguridad: alta para ocultación visual, baja frente a análisis estadístico.
- Muy común en retos de forensics o steganography.
- Suelen darte una imagen aparentemente normal.
- Herramientas como zsteg, steghide, stegsolve, binwalk o scripts de Python ayudan a extraer datos.
- A veces se combina con compresión, cifrado o formatos no estándar para despistar.
- Analizar los valores RGB de cada píxel y ver si hay patrones en los bits menos significativos.
- Usar herramientas automatizadas de esteganálisis.
- Comparar histogramas de colores con y sin LSB alterado.
- Revisar canales alfa o datos ocultos en metadatos.
from PIL import Image
def extract_lsb(image_path):
img = Image.open(image_path)
bits = ""
for pixel in img.getdata():
for channel in pixel[:3]: # R, G, B
bits += str(channel & 1)
# Convertir bits a texto (ASCII)
chars = [chr(int(bits[i:i+8], 2)) for i in range(0, len(bits), 8)]
return "".join(chars)
mensaje = extract_lsb("imagen.png")
print("Mensaje oculto:", mensaje)
Elemento Valor
Tipo Esteganografía digital (bit-level)
Clave No obligatoria, pero puede usarse
Capacidad Alta (dependiendo del tamaño del portador)
Seguridad Baja ante esteganálisis técnico
Uso en CTF Forensics, stegano, retos de extracción
**\
**
Los metadatos EXIF (Exchangeable Image File Format) son información incrustada dentro de archivos de imagen (como JPEG o TIFF) que describen detalles técnicos y contextuales de la fotografía:
- Modelo de cámara
- Fecha y hora
- Configuración de exposición
- Coordenadas GPS
- Autor, copyright, comentarios, etc.
En esteganografía, estos campos pueden usarse para ocultar mensajes, contraseñas o pistas sin modificar visiblemente la imagen.
- Seleccionar un archivo de imagen (normalmente JPEG, aunque PNG y TIFF también pueden tener metadatos).
- Editar los campos EXIF usando herramientas para insertar texto o datos binarios.
- El archivo resultante se ve igual, pero conserva la información oculta.
- El receptor extrae los metadatos para recuperar el mensaje.
Ejemplo:
- Campo Artist: "CTF{Flag_Oculta_Aqui}"
- Campo UserComment: binarios codificados en Base64.
- Método: escritura de datos en campos EXIF estándar o personalizados.
- Requisitos: formato de imagen compatible con EXIF.
- Capacidad: limitada por el tamaño de los campos EXIF (normalmente unos pocos KB).
- Seguridad: muy baja; cualquiera con un visor de metadatos puede verlos.
- Muy frecuente en retos de OSINT o steganografía básica.
- Posible encontrar:
- Coordenadas GPS que apuntan a un lugar clave.
- Comentarios con hashes o contraseñas.
- Flags directamente escritas en texto.
- Herramientas recomendadas:
- exiftool (CLI)
- exiv2
- Visores online como *metapicz.com* o *exif.regex.info*
- Ejecutar:
- exiftool imagen.jpg
- Buscar campos sospechosos como UserComment, Description, Copyright, Artist.
- Si hay datos codificados, probar con Base64, Hex, o cifrados simples.
import piexif
# Leer metadatos EXIF
exif_dict = piexif.load("imagen.jpg")
user_comment = exif_dict["Exif"].get(piexif.ExifIFD.UserComment)
if user_comment:
print("Comentario oculto:", user_comment.decode(errors="ignore"))
else:
print("No hay comentario oculto")
Elemento Valor
Tipo Esteganografía en metadatos
Clave No necesaria
Capacidad Baja (unos pocos KB)
Seguridad Muy baja (visible con cualquier visor)
Uso en CTF Búsqueda de pistas, flags o coordenadas
**\
**
La esteganografía en el dominio espacial consiste en ocultar información modificando directamente los valores de los píxeles de una imagen en su forma original, sin transformaciones matemáticas como en el dominio de la frecuencia (por ejemplo, DCT en JPEG).
Aquí, los datos se insertan cambiando color, brillo o componentes de los píxeles de forma que el ojo humano no perciba las alteraciones.
Existen varias técnicas dentro del dominio espacial, siendo la más conocida LSB (Least Significant Bit), pero también hay otras más visibles o sutiles:
- Modificación directa de píxeles\
- Codificación por patrones\
- Cambio por bloques o regiones\
- Método: manipulación directa de la matriz de píxeles.
- Requisitos: acceso a la imagen sin compresión con pérdida (PNG, BMP, TIFF) para evitar distorsiones.
- Capacidad: media-alta, según la resolución y el tipo de modificación.
- Seguridad: baja ante análisis de diferencias o histogramas.
- Muy común en retos stegano donde:
- Una imagen aparentemente normal esconde un patrón.
- El reto puede requerir comparar la imagen original con la modificada.
- A veces la flag está escrita como texto muy tenue o en colores casi idénticos al fondo.
- Herramientas útiles:
- StegSolve (visualización por capas y canales)
- GIMP/Photoshop (aumentar contraste, brillo, saturación)
- Scripts en Python con Pillow o OpenCV.
- Manipulación visual:
- Ajustar brillo, contraste, inversión de colores.
- Separar canales RGB y analizar individualmente.
- Comparación de imágenes:
- Restar la imagen de un supuesto original para ver diferencias.
- Análisis de histogramas:
- Detectar patrones anómalos en la distribución de colores.
from PIL import Image
import numpy as np
# Cargar imagen y convertir a array
img = Image.open("imagen.png")
arr = np.array(img)
# Aumentar contraste artificialmente para resaltar posibles datos ocultos
arr = np.clip((arr - 128) * 4 + 128, 0, 255)
Image.fromarray(arr.astype('uint8')).save("imagen_modificada.png")
Elemento Valor
Tipo Esteganografía en píxeles (dominio espacial)
Clave No siempre necesaria
Capacidad Media-Alta
Seguridad Baja ante análisis técnico
Uso en CTF Patrones ocultos, mensajes en colores o brillo
**\
**
En lugar de modificar los píxeles directamente (dominio espacial), este método oculta la información en las frecuencias que componen la imagen.
Esto se hace usando transformadas matemáticas como la Transformada de Coseno Discreto (DCT), que es la base de la compresión JPEG.
- La DCT descompone la imagen en componentes de baja frecuencia (detalle grueso) y alta frecuencia (detalle fino).
- Los datos se insertan modificando coeficientes de frecuencia, normalmente en las medias y altas, ya que los cambios ahí son menos perceptibles al ojo humano.
- División en bloques\
- Aplicación de la DCT\
- Inserción de datos\
- Compresión y guardado\
- Método: modificación de coeficientes de frecuencia en la DCT.
- Requisitos: formato JPEG u otros que usen compresión con transformadas.
- Capacidad: media, pero mayor resistencia a compresión y ruido que el dominio espacial.
- Seguridad: media-alta; no es evidente a simple vista, pero detectables con análisis estadístico.
- Más raro que el LSB porque requiere herramientas específicas.
- Pistas típicas:
- Un JPEG que conserva calidad pero tiene tamaño sospechosamente grande.
- Un reto que menciona "frecuencia", "coseno" o "coeficientes".
- Herramientas útiles:
- StegHide
- OutGuess
- F5 Steganography
- Scripts con scipy.fftpack para extraer la DCT.
- Usar herramientas como:
- steghide extract -sf imagen.jpg
- Analizar los coeficientes DCT y compararlos con una versión limpia.
- Revisar anomalías estadísticas en frecuencias medias.
import cv2
import numpy as np
# Leer imagen en escala de grises
img = cv2.imread("imagen.jpg", 0)
# Dividir en bloques de 8x8 y aplicar DCT
h, w = img.shape
for i in range(0, h, 8):
for j in range(0, w, 8):
bloque = img[i:i+8, j:j+8]
dct_bloque = cv2.dct(np.float32(bloque))
print(dct_bloque) # Aquí se podrían buscar alteraciones
Elemento Valor
Tipo Esteganografía en el dominio de la frecuencia
Clave Suele requerirla (dependiendo del método)
Capacidad Media
Seguridad Media-Alta
Uso en CTF Reto avanzado con JPEG, uso de StegHide / OutGuess
**\
**
*(Canales de color, paletas y formato de archivo)*
Este tipo de esteganografía se basa en usar las características técnicas de la codificación de imágenes para ocultar datos. En lugar de esconder bits en el brillo o la frecuencia, se aprovechan los canales de color, la estructura del archivo o la paleta de colores para introducir información.
Es habitual en formatos como:
- PNG (canales RGBA)
- GIF (paletas de colores indexadas)
- BMP (canales sin compresión)
- TIFF (múltiples capas o etiquetas)
1. Canales de color (RGBA)
- Cada píxel tiene valores para Rojo (R), Verde (G), Azul (B) y, en PNG, Alfa (A) para transparencia.
- Un atacante puede ocultar información en un canal poco perceptible (por ejemplo, modificar mínimamente el azul o el alfa).
- Ejemplo: si el canal alfa es completamente opaco (255), cambiar ligeramente su valor para codificar bits no será visible.
2. Paleta de colores
- En imágenes indexadas (GIF, PNG de 8 bits), cada píxel guarda un índice que apunta a un color en la paleta.
- Cambiando el orden de la paleta o sustituyendo colores con valores muy similares, se pueden codificar datos.
- Ventaja: visualmente imperceptible, pero almacena mucha información en el archivo.
3. Estructura y formato del archivo
- Algunos formatos permiten campos extra o bloques no usados donde se puede insertar texto.
- Ejemplo: en PNG, los chunks *tEXt* o *zTXt* pueden contener datos arbitrarios.
- En GIF, se pueden crear frames adicionales o datos de control con mensajes.
- Método: manipulación de canales de color, paletas o campos propios del formato.
- Requisitos: conocimiento del estándar del formato.
- Capacidad: media-alta (depende del número de colores y tamaño de la imagen).
- Seguridad: media; requiere inspección binaria o de canales para detectarlo.
- Muy común en retos donde:
- El PNG tiene transparencia sospechosa.
- El GIF tiene muchos colores casi idénticos.
- La paleta de colores muestra un patrón al visualizarse como datos crudos.
- Herramientas útiles:
- StegSolve (permite ver cada canal por separado).
- zsteg (para PNG y BMP).
- ImageMagick (convert imagen.png -separate canal.png).
- Visores hexadecimales para inspeccionar chunks.
- Separar los canales de color:
- Analizar la paleta con:
- Buscar chunks ocultos en PNG:
from PIL import Image
img = Image.open("imagen.png")
r, g, b, a = img.split() # Separar canales RGBA
r.save("canal_rojo.png")
a.save("canal_alpha.png")
Elemento Valor
Tipo Esteganografía en codificación de imagen
Clave No siempre necesaria
Capacidad Media-Alta
Seguridad Media; requiere análisis de canales y estructura interna
Uso en CTF Transparencia oculta, colores casi idénticos, chunks extra
**\
**
*(Patrones ocultos en el contenido visual, no en los datos digitales)*
A diferencia de la esteganografía digital (que modifica bits de un archivo), los acrósticos visuales esconden la información en el contenido visible de la imagen. No requieren manipulación técnica del archivo, sino que el mensaje está "dibujado" o codificado dentro de la propia escena.
El nombre proviene del concepto de *acróstico* en literatura (mensaje oculto en letras iniciales), pero aquí se aplica a patrones visuales.
- Patrones intencionales\
- Uso de códigos visuales
- Morse: puntos y rayas representados por objetos (flores grandes = raya, flores pequeñas = punto).
- Binario: posición de elementos (árbol a la izquierda = 0, a la derecha = 1).
- Letras o números: formados por montañas, rocas, nubes o edificios.
- Interpretación humana o con IA\
- Método: patrones semánticos o geométricos dentro de la imagen.
- Requisitos: solo la imagen (no necesita metadatos).
- Capacidad: baja-media (limitada por la complejidad del patrón).
- Seguridad: alta contra análisis automatizado, baja contra observador humano entrenado.
En CTFs, este tipo suele aparecer en:
- Retos de *OSINT* o *forensics* donde hay que "mirar más allá".
- Desafíos de arte digital, donde la pista está en el propio dibujo.
- Imágenes con patrones repetitivos que parecen decorativos pero representan datos.
Ejemplos comunes:
- Nubes formando letras.
- Ventanas iluminadas que forman números binarios.
- Farolas que indican puntos de un polígono (y luego se interpretan como coordenadas).
- Mirada analítica
- Buscar repetición en tamaños, posiciones o colores.
- Preguntarse: "¿Esto podría ser un código?"
- Conversión a esquema
- Pasar la imagen a blanco y negro o resaltado de contornos para aislar formas.
- Numerar elementos y mapearlos en un diagrama.
- Traducción
- Si parece morse: transcribir puntos y rayas.
- Si es binario: agrupar en bytes y decodificar.
- Si es geométrico: usar coordenadas para letras (ej. cifrado Polybius).
from PIL import Image
import cv2
import numpy as np
# Cargar imagen y convertir a escala de grises
img = cv2.imread('paisaje.png', cv2.IMREAD_GRAYSCALE)
# Umbral para detectar objetos
_, thresh = cv2.threshold(img, 200, 255, cv2.THRESH_BINARY)
# Encontrar contornos (flores, estrellas, etc.)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
area = cv2.contourArea(c)
if area < 50:
print("Punto detectado")
else:
print("Raya detectada")
Elemento Valor
Tipo Esteganografía visual no digital
Clave No necesaria
Capacidad Baja-Media
Seguridad Alta contra análisis automático, baja contra ojo humano
Uso en CTF Retos de observación, patrones artísticos
**\
**
*(Ocultación de información dentro de códigos QR)*
La esteganografía en códigos QR consiste en ocultar datos secretos dentro de un código QR que a simple vista parece normal y funciona para almacenar información (como URLs, texto, etc.). Se aprovechan las propiedades del código QR para esconder mensajes adicionales sin afectar su escaneabilidad.
- Estructura básica de un QR
- Un código QR está formado por una matriz de módulos (cuadrados negros y blancos) que codifican datos.
- Tiene zonas fijas (marcadores de posición, sincronización) y zonas de datos.
- Ocultación de datos
- Se manipulan módulos específicos de la matriz para codificar información oculta.
- Técnicas comunes:
- Bits escondidos en zonas de corrección de errores: el QR puede tolerar errores; se modifican módulos que se pueden "corregir" al escanear, pero que en realidad codifican un mensaje secreto.
- Codificación en niveles de gris o colores: usar diferentes tonos o colores en módulos para codificar bits extras.
- Superposición de datos: combinar varios mensajes, donde uno es visible y otro es el mensaje oculto.
- Lectura dual
- Un lector QR normal devuelve el mensaje "visible".
- Un lector especializado o un análisis de la imagen extrae el mensaje oculto.
- Robustez: el QR tiene corrección de errores (hasta ~30%), lo que permite modificar módulos sin perder funcionalidad.
- Capacidad: limitada, depende del nivel de corrección de errores y tamaño del QR.
- Técnicas avanzadas: uso de colores o microvariaciones en módulos para codificar más información.
En retos CTF, la esteganografía en QR puede aparecer como:
- Un QR aparentemente normal que apunta a una URL o texto inocuo.
- El mensaje oculto está en las diferencias sutiles de módulos, colores o patrones que requieren análisis gráfico.
- A veces se entregan varias imágenes QR para comparar.
- Comparar con un QR estándar
- Si tienes el mensaje visible, crear el QR original y comparar con el entregado para detectar diferencias.
- Análisis visual detallado
- Usar zoom para detectar módulos con tonos o formas diferentes.
- Analizar posibles patrones.
- Herramientas especializadas
- Software de análisis de QR o scripts personalizados que extraen bits ocultos.
import qrcode
from PIL import Image
# Crear QR estándar
qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H)
qr.add_data("Mensaje visible")
qr.make()
img = qr.make_image(fill_color="black", back_color="white").convert('RGB')
# Modificar píxeles para ocultar datos (ejemplo muy simple)
pixels = img.load()
width, height = img.size
# Ejemplo: modificar algunos módulos para ocultar bits
for x in range(0, width, 10):
for y in range(0, height, 10):
r, g, b = pixels[x, y]
# Cambiar ligeramente el color para ocultar datos (solo demostrativo)
pixels[x, y] = (r, g, (b+10) % 256)
img.show()
Elemento Valor
Tipo Esteganografía en código QR
Clave A veces necesaria (para decodificar mensaje oculto)
Capacidad Baja-media (depende de corrección de errores y tamaño QR)
Seguridad Media; requiere análisis detallado para descubrir
Uso en CTF QR aparentemente normal con mensaje adicional escondido
**\
**
*(Least Significant Bit aplicado a señales de sonido)*
La esteganografía LSB en audio consiste en ocultar información modificando el bit menos significativo de cada muestra de audio digital. Como el bit LSB influye muy poco en el valor final, el cambio es casi imperceptible al oído humano.
Este método es análogo al LSB en imágenes, pero trabaja sobre el flujo temporal de muestras sonoras en lugar de píxeles.
- Digitalización del audio
- Un archivo de audio (ej. WAV) se compone de muestras que representan la amplitud de la onda sonora en intervalos de tiempo.
- Cada muestra se guarda con cierta profundidad de bits (8, 16, 24 bits, etc.).
- Modificación del LSB
- El bit menos significativo de cada muestra se sustituye por un bit del mensaje secreto.
- Esto introduce un cambio tan pequeño que es imperceptible.
- Reconstrucción del audio
- El archivo resultante suena casi igual, pero lleva embebido el mensaje.
- Método: manipulación directa de los bits LSB en las muestras de audio.
- Formato ideal: WAV o AIFF (sin compresión), ya que formatos como MP3 pueden destruir el mensaje.
- Capacidad: depende de la tasa de muestreo y profundidad de bits.\
- Seguridad: vulnerable a recodificación y filtrado; robustez baja.
En retos CTF, el LSB en audio se presenta así:
- Un archivo WAV aparentemente normal.
- El reto pide "escuchar con otros oídos" → pista de que hay *stego*.
- Puede usarse para ocultar:
- Texto plano.
- Otros archivos binarios (ej. PNG oculto dentro del audio).
- Analizar formato
- Confirmar que es WAV/AIFF y no comprimido.
- Revisar la tasa de bits.
- Inspeccionar bits
- Extraer el LSB de cada muestra.
- Agruparlos en bytes y convertir a texto o binario.
import wave
# Abrir archivo de audio
with wave.open("audio.wav", "rb") as audio:
frames = audio.readframes(audio.getnframes())
samples = list(frames)
# Extraer LSB de cada byte
bits = [str(sample & 1) for sample in samples]
# Convertir bits a texto
mensaje = "".join(
chr(int("".join(bits[i:i+8]), 2))
for i in range(0, len(bits), 8)
)
print("Mensaje oculto:", mensaje)
Elemento Valor
Tipo Esteganografía en dominio temporal (audio)
Clave No siempre necesaria
Capacidad Alta (dependiendo de la duración y calidad del audio)
Seguridad Baja ante compresión o edición
Uso en CTF Archivos WAV sospechosos con datos ocultos en las muestras
**\
**
*(Ocultación de datos en el dominio de la frecuencia)*
La ocultación en el espectrograma consiste en modificar las frecuencias de un archivo de audio de forma que, al visualizarlo en un espectrograma, aparezca un patrón, texto o imagen. Normalmente se usan:
- Frecuencias inaudibles para humanos (por encima de ~20 kHz o por debajo de ~20 Hz).
- Señales integradas en el "ruido" del archivo.
Esta técnica es visual: el mensaje no se percibe escuchando, sino mirando el espectro.
- Conversión a dominio de frecuencia
- El audio se analiza con la Transformada de Fourier para obtener las frecuencias presentes a lo largo del tiempo.
- Inserción de información
- Se modifican amplitudes específicas de ciertas frecuencias para dibujar formas o codificar bits.
- Esto puede hacerse con software de edición espectral (ej. *Sonic Visualiser*, *Audacity* con *Spectrogram View*).
- Codificación visual o binaria
- Visual: texto, logotipos, QR, figuras.
- Binaria: patrones que representan bits que luego se decodifican.
- Método: manipulación de componentes de frecuencia.
- Formatos ideales: WAV, FLAC, AIFF (sin compresión destructiva).
- Ventajas: difícil de detectar si no se visualiza el espectro.
- Limitaciones: vulnerable a filtrado de frecuencias, recodificación con pérdida.
En retos CTF, el patrón suele ser:
- Te dan un archivo de audio "ruidoso" o con sonidos extraños.
- Al visualizar el espectrograma, aparece:
- Texto claro (ej. *FLAG{...}*).
- Un código QR que hay que escanear.
- Coordenadas o símbolos.
- Abrir el audio en un analizador espectral:
- *Audacity* → Vista espectrograma (*Spectrogram View*).
- *Sonic Visualiser*.
- *Spek* (rápido para inspecciones iniciales).
- Ajustar la escala y el rango de frecuencias para ver detalles ocultos:
- Zoom en frecuencias altas o bajas.
- Cambiar paleta de colores para resaltar patrones.
- Leer o extraer la información visual:
- Texto a simple vista.
- Imagen capturada y procesada.
- Decodificación de patrones binarios.
import matplotlib.pyplot as plt
import numpy as np
from scipy.io import wavfile
from scipy.signal import spectrogram
# Cargar audio
rate, data = wavfile.read('audio.wav')
# Si es estéreo, convertir a mono
if data.ndim > 1:
data = data.mean(axis=1)
# Generar espectrograma
f, t, Sxx = spectrogram(data, rate)
plt.pcolormesh(t, f, 10 * np.log10(Sxx), shading='gouraud')
plt.ylabel('Frecuencia [Hz]')
plt.xlabel('Tiempo [s]')
plt.ylim(0, 24000) # Rango audible + un poco más
plt.show()
Elemento Valor
Tipo Esteganografía en dominio de frecuencia (audio)
Clave No siempre necesaria
Capacidad Media-alta (visual o binaria)
Seguridad Media (resiste cambios leves, pero no filtrado fuerte)
Uso en CTF Muy común; espectrogramas con texto, QR o símbolos ocultos
**\
**
*(Ocultación de datos modificando la fase de la señal sonora)*
Este método consiste en ocultar información modificando la fase de las ondas de sonido en una señal de audio digital.
Mientras que la amplitud determina el volumen y la frecuencia el tono, la fase es el desplazamiento temporal de la onda. Cambiar la fase puede ser imperceptible para el oído humano si se hace cuidadosamente, pero permite codificar datos.
- Análisis de la señal
- Se toma la señal de audio y se aplica una transformada, generalmente la Transformada Discreta de Fourier (DFT) o la Transformada Rápida de Fourier (FFT), para separar las componentes en frecuencia, amplitud y fase.
- Modificación de la fase
- Se alteran los ángulos de fase de ciertas frecuencias específicas para codificar bits del mensaje.
- La amplitud se mantiene para que el audio suene igual.
- Reconstrucción
- Se realiza la transformada inversa para obtener la señal temporal con la fase modificada.
- El resultado es un archivo de audio que suena igual pero lleva el mensaje escondido en la fase.
- Método: manipulación en dominio de frecuencia, enfocándose en fase, no en amplitud.
- Ventajas: difícil de detectar con análisis convencional (no altera amplitud ni espectro).
- Desventajas: más complejo de implementar y extraer que LSB o espectrograma.
- Robustez: alta contra compresión y ruido, pero sensible a cambios de tiempo o recortes.
Menos frecuente que LSB o espectrogramas, pero aparece en retos avanzados de esteganografía en audio donde:
- El audio parece normal y no se detectan cambios en amplitud o espectrograma.
- Se requiere analizar la fase de frecuencias para extraer datos.
- Se usan herramientas especializadas o scripts para analizar la fase.
- Transformada de Fourier
- Calcular FFT para obtener magnitud y fase.
- Comparar fase con referencia
- Si se tiene el audio original sin estego, se puede comparar fases.
- Buscar cambios significativos codificados en patrones.
- Decodificación de bits
- Mapear ciertos cambios de fase a bits 0 o 1.
- Reconstruir mensaje a partir de secuencia de bits.
import numpy as np
from scipy.io import wavfile
from scipy.fft import fft, ifft
# Leer audio
rate, data = wavfile.read('audio.wav')
if data.ndim > 1:
data = data.mean(axis=1)
# FFT
freq_data = fft(data)
# Extraer fase
phase = np.angle(freq_data)
# Aquí se analizaría/modificaría la fase para ocultar o extraer datos
# Ejemplo: detectar cambios en fase para decodificar bits
# (Este paso requiere conocer esquema de codificación)
# Reconstruir audio (sin cambios en este ejemplo)
reconstructed = ifft(freq_data).real.astype(np.int16)
# Guardar o reproducir reconstructed
Elemento Valor
Tipo Esteganografía en dominio de frecuencia (fase de audio)
Clave Generalmente sí, o referencia para comparación
Capacidad Media
Seguridad Alta, difícil de detectar con análisis común
Uso en CTF Retos avanzados de esteganografía en audio
**\
**
🧐 Esteganografía en otros archivos:
*(Ocultación de datos en frames o pistas de audio de un vídeo)*
La esteganografía en vídeos consiste en ocultar información dentro de un archivo de vídeo, usando ya sea:
- Modificación de frames (imágenes) individuales, alterando píxeles o colores.
- Ocultación en la pista de audio del vídeo.
- Manipulación de metadatos o estructuras internas del contenedor multimedia.
1. Ocultación en Frames de Vídeo
- LSB en píxeles de frames:\
- Manipulación en el dominio de la frecuencia:\
- Cambios imperceptibles en colores:\
2. Ocultación en Pista de Audio del Vídeo
- Aplicar técnicas de esteganografía en audio (LSB, espectrograma, fase) en la pista sonora asociada al vídeo.
3. Manipulación de Metadatos o Estructura
- Insertar datos en campos no visibles o poco usados del contenedor de vídeo (como MKV, MP4), sin alterar la reproducción.
- Capacidad: alta debido a gran cantidad de frames y datos de audio.
- Imperceptibilidad: bien diseñada, no se nota diferencia visual ni auditiva.
- Robustez: varía; puede perderse con recompresión o edición.
- Formato común: MP4, AVI, MKV, MOV.
- Vídeos con apariencia normal que contienen mensajes ocultos en imágenes o audio.
- A veces se entregan múltiples vídeos para comparar o pistas para analizar frames específicos.
- Se puede necesitar extracción frame a frame o analizar la pista de audio separadamente.
- Extraer frames
- Usar *ffmpeg* o software para extraer imágenes de vídeo:
- ffmpeg -i video.mp4 frame_%04d.png
- Analizar frames individualmente con técnicas como LSB, comparando con originales si existen.
- Extraer audio
- Extraer pista de audio para analizar con técnicas de esteganografía en audio:
- ffmpeg -i video.mp4 -q:a 0 -map a audio.wav
- Analizar metadatos
- Usar herramientas como *exiftool* para revisar metadatos y datos ocultos.
- Uso de software especializado
- Herramientas para esteganálisis multimedia, como *StegExpose*, *StegSolve* (más para imágenes), o scripts personalizados.
import cv2
video_path = 'video.mp4'
cap = cv2.VideoCapture(video_path)
frame_num = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
cv2.imwrite(f'frame_{frame_num:04d}.png', frame)
frame_num += 1
cap.release()
print("Frames extraídos.")
Elemento Valor
Tipo Esteganografía en vídeo (frames, audio, metadatos)
Clave Depende del método y clave del mensaje
Capacidad Alta
Seguridad Media-alta (depende de técnica y recompresión)
Uso en CTF Muy común; vídeos aparentemente normales con datos ocultos
**\
**
*(Ocultación en espacios en blanco, caracteres no imprimibles o acrósticos)*
La esteganografía en texto consiste en ocultar información dentro de un archivo de texto plano, sin alterar significativamente su contenido visible. La manipulación puede ser en el contenido visual o en los caracteres invisibles que el lector normal no percibe.
1. Espacios en blanco y tabulaciones (Whitespace Steganography)
- Se añade información en los espacios al final de cada línea (EOL) o en secuencias de espacios/tabs dentro del texto.
- La codificación se puede hacer, por ejemplo:
- Espacio = 0
- Tabulación = 1
- Herramienta famosa: SNOW (Steganographic Nature Of Whitespace).
💡 Ejemplo:
Hola mundo[␣]
Esto es un texto[Tab]
*(Los espacios y tabs aquí codifican bits de un mensaje oculto).*
2. Caracteres no imprimibles / Unicode oculto
- Se usan caracteres como zero-width space (ZWSP) U+200B, zero-width non-joiner (ZWNJ), o zero-width joiner (ZWJ).
- No se ven, pero están en el archivo y pueden representar bits.
- Ejemplo: un carácter ZWSP = 0, un ZWNJ = 1.
3. Acrósticos
- Usar la primera letra (o la última) de cada línea o párrafo para formar un mensaje oculto.
- También se pueden usar palabras iniciales para transmitir un código.
💡 Ejemplo:
Cuando
Todos
Fallan
*(Iniciales = "CTF")*
4. Manipulación tipográfica
- Uso intencionado de variantes Unicode visualmente idénticas (homoglyphs) para representar bits.
- Ejemplo: letra a normal vs. а cirílica (parecen iguales, pero son diferentes códigos).
Característica Detalle
Capacidad Baja-media, depende del método
Robustez Baja frente a edición de texto o cambios de formato
Imperceptibilidad Alta si se usan espacios, Unicode invisible o acrósticos
Riesgo Fácil de romper si se sospecha y se usa un editor hex/Unicode
- Archivos .txt aparentemente normales que contienen espacios invisibles o patrones raros.
- Mensajes ocultos en las primeras letras de líneas o párrafos.
- Textos con caracteres Unicode extraños detectables con un editor hexadecimal.
- Mostrar caracteres invisibles
- Usar cat -A archivo.txt en Linux para mostrar tabs y espacios.
- En Python:
- with open("archivo.txt", "rb") as f:
- print(f.read())
- Buscar Unicode oculto
- Usar scripts que identifiquen caracteres con código >127 o invisibles.
- Analizar acrósticos
- Extraer sistemáticamente primeras/últimas letras y comprobar si forman un mensaje.
with open("archivo.txt", "r", encoding="utf-8") as f:
data = f.read()
zwsp = "\u200B"
if zwsp in data:
print(f"Se encontraron {data.count(zwsp)} caracteres Zero-Width Space.")
Elemento Valor
Tipo Esteganografía en texto
Clave Mapeo de espacios/tabs o letras de acróstico
Capacidad Baja a media
Seguridad Baja (fácil de alterar si se formatea el texto)
Uso en CTF Muy común en retos de forense y esteganografía con .txt sospechosos
**\
**
*(Ocultación en zonas no utilizadas o "relleno" dentro del archivo)*
La esteganografía en archivos binarios consiste en ocultar datos secretos dentro de un archivo ejecutable, imagen, o cualquier archivo binario, aprovechando espacios no utilizados, relleno, o áreas reservadas que no afectan el funcionamiento o la integridad del archivo.
- Zonas no utilizadas o relleno
- Muchos formatos binarios incluyen espacios de relleno (padding) para alinear datos, o áreas reservadas que no son críticas.
- Se pueden insertar datos en estas zonas sin alterar la funcionalidad del archivo.
- Ejemplo: en archivos ejecutables, existen segmentos o secciones vacías.
- Espacios entre segmentos
- Entre bloques de datos o instrucciones pueden quedar huecos de bytes nulos (00) o valores constantes, ideales para ocultar bits.
- Metadatos internos
- Algunos archivos binarios tienen campos reservados o metadatos extensibles donde se puede incrustar información.
- Modificación controlada de bytes
- Alterar bytes que no afectan la ejecución, como códigos no usados o secciones padding, para codificar datos binarios.
Característica Detalle
Capacidad Media a alta (depende del archivo y zonas disponibles)
Robustez Alta, si se usa correctamente; no afecta funcionamiento
Imperceptibilidad Alta, porque los datos no se ven ni alteran el comportamiento
Riesgo Edición accidental puede borrar datos ocultos
- Archivos .exe, .dll, .bin o incluso imágenes con zonas de relleno.
- Pistas para examinar secciones vacías o bytes repetitivos.
- A veces se entregan con instrucciones para buscar "datos en zonas de relleno".
- Análisis hexagonal
- Abrir archivo con *hex editor* (HxD, bless, etc.).
- Buscar bloques grandes de bytes repetidos (00, FF) o patrones extraños.
- Comparar con archivo original
- Si se tiene un archivo base, comparar byte a byte para encontrar diferencias o datos extra.
- Uso de herramientas forenses
- *binwalk* puede analizar estructuras internas y detectar datos embebidos.
- Extraer segmentos específicos
- Extraer rangos de bytes sospechosos y analizar contenido (texto, binario, etc.).
with open("archivo.bin", "rb") as f:
data = f.read()
long_zeros = []
count = 0
start = None
for i, byte in enumerate(data):
if byte == 0x00:
if count == 0:
start = i
count += 1
else:
if count > 10: # Secuencia larga arbitraria
long_zeros.append((start, count))
count = 0
if long_zeros:
print("Secuencias largas de ceros encontradas en:")
for s in long_zeros:
print(f"Offset: {s[0]}, Longitud: {s[1]}")
else:
print("No se encontraron secuencias largas de ceros.")
Elemento Valor
Tipo Esteganografía en zonas no usadas o relleno en binarios
Clave Conocer estructura interna del archivo para no corromper
Capacidad Media-alta
Seguridad Alta, difícil de detectar sin análisis forense
Uso en CTF Muy usada en retos con archivos binarios o ejecutables
**\
**
*(Ocultación de datos en comentarios y estructura interna del archivo)*
La esteganografía en archivos comprimidos consiste en esconder información oculta dentro de un archivo ZIP, RAR, 7z u otro formato, sin alterar la posibilidad de descomprimirlo normalmente. Se aprovechan características específicas del formato:
- Comentarios en el archivo comprimido
- Estructura interna con campos reservados o padding
- Archivos ocultos o renombrados dentro del contenedor
1. Comentarios del archivo comprimido
- Muchos formatos (ZIP, RAR) permiten incluir un comentario de texto al archivo comprimido.
- En este comentario se puede esconder texto plano o incluso datos codificados (Base64, hex).
- El comentario no afecta la descompresión ni la integridad del archivo.
2. Archivos ocultos o renombrados
- Insertar archivos con nombres inusuales o extensiones falsas dentro del archivo comprimido.
- Se pueden renombrar archivos con extensiones dobles para despistar.
3. Manipulación de la estructura interna
- Algunos campos o metadatos en el encabezado del archivo comprimido permiten almacenamiento extra.
- Campos de relleno o zonas no usadas pueden ser modificadas para esconder datos binarios.
Característica Detalle
Capacidad Baja a media (dependiendo del tamaño de comentarios o archivos)
Robustez Alta, no afecta la descompresión
Imperceptibilidad Alta, el archivo funciona normalmente
Riesgo Fácil de detectar si se analiza con herramientas adecuadas
- Archivos ZIP o RAR que se entregan como pistas con comentarios o archivos sospechosos.
- Mensajes ocultos en comentarios o archivos con nombres raros dentro del archivo comprimido.
- A veces se usa para pasar mensajes secretos o pequeñas claves dentro de un contenedor.
- Leer comentarios del archivo
- En ZIP:
- unzip -z archivo.zip
- En RAR:
- unrar l archivo.rar
- Listar archivos ocultos o extraños
- Usar comandos normales para listar contenido:
- unzip -l archivo.zip
- rar l archivo.rar
- Buscar nombres o tamaños inusuales.
- Herramientas especializadas
- *binwalk* para analizar estructura binaria.
- *7-Zip* para examinar contenido oculto.
- Herramientas específicas para metadatos (como *zipinfo*).
import zipfile
with zipfile.ZipFile('archivo.zip', 'r') as zipf:
comment = zipf.comment
if comment:
print("Comentario oculto en ZIP:")
print(comment.decode('utf-8'))
else:
print("No hay comentario en el ZIP.")
Elemento Valor
Tipo Esteganografía en comentarios y estructura interna
Clave Acceso al archivo comprimido y lectura de metadatos
Capacidad Baja-media
Seguridad Media, detectable con herramientas
Uso en CTF Común en retos con archivos ZIP o RAR
**\
**
*(Ocultación de datos en la estructura compleja y metadatos del PDF)*
Los archivos PDF son documentos con una estructura compleja que incluye texto, imágenes, objetos, metadatos y scripts. Esta complejidad permite ocultar información en varias partes del archivo sin afectar la visualización del documento.
1. Metadatos ocultos
- Los PDFs contienen metadatos (autor, título, palabras clave).
- Se pueden añadir metadatos personalizados con mensajes ocultos o datos codificados.
2. Objetos invisibles o no referenciados
- PDFs están formados por múltiples objetos (texto, imágenes, fuentes).
- Es posible incluir objetos no referenciados ni mostrados que contengan información oculta.
3. Uso de campos de formulario
- Campos de formulario (checkbox, texto) con contenido invisible o muy pequeño.
4. Manipulación de flujos de datos
- Modificar flujos de texto o imágenes con bits específicos para ocultar información.
5. Imágenes o elementos con esteganografía interna
- Insertar imágenes que contengan datos ocultos (LSB en imágenes embebidas).
Característica Detalle
Capacidad Media a alta (depende del método y tamaño del PDF)
Robustez Media (puede dañarse si se re-optimiza el PDF)
Imperceptibilidad Alta, dado que el documento se ve normal
Riesgo Puede detectarse con análisis profundo de estructura interna
- Archivos PDF con mensajes ocultos en metadatos o en objetos no visibles.
- PDFs con imágenes o formularios que esconden pistas.
- Uso frecuente para ocultar datos cuando se desea enviar documentos "normales" con información extra.
- Inspeccionar metadatos
- Usar pdfinfo (Linux) o herramientas como *ExifTool*.
- Extraer objetos PDF
- Usar pdf-parser.py (herramienta de Didier Stevens) para listar y examinar objetos PDF.
- Buscar objetos no referenciados o sospechosos.
- Revisar contenido de campos de formulario
- Abrir el PDF en lectores avanzados y examinar campos ocultos.
- Extraer imágenes y analizarlas
- Extraer imágenes con pdfimages y analizarlas con técnicas LSB u otras.
pdf-parser.py -s "stream" archivo.pdf
Esto lista todos los objetos stream, donde pueden estar datos ocultos.
Elemento Valor
Tipo Esteganografía en metadatos, objetos invisibles, formularios, imágenes embebidas
Clave Conocimiento de la estructura PDF y uso de herramientas específicas
Capacidad Media-alta
Seguridad Media (puede perderse en re-guardados o ediciones)
Uso en CTF Muy común para esconder mensajes y archivos dentro de PDFs
**\
**
*(Herramienta para descubrir mensajes ocultos en espectrogramas de audio)*
Sonic Visualiser es un software gratuito y de código abierto utilizado para analizar archivos de audio en profundidad, permitiendo visualizar su contenido en el dominio de la frecuencia y del tiempo. En retos CTF, es una herramienta clave para encontrar mensajes ocultos en espectrogramas, ya que muchos retos de esteganografía en audio esconden texto, dibujos o códigos QR en la representación gráfica de las frecuencias.
- Carga del audio: Abrimos el archivo de audio (WAV, MP3, FLAC, etc.) en Sonic Visualiser.
- Visualización del espectrograma: Seleccionamos la opción de espectrograma, que muestra las frecuencias en el eje vertical y el tiempo en el eje horizontal, con la intensidad representada por colores.
- Búsqueda de patrones ocultos: Inspeccionamos la imagen resultante en busca de:
- Texto oculto (mensajes escritos)
- Dibujos (símbolos, logotipos)
- Códigos QR
- Interpretación y extracción: Una vez identificado el patrón, podemos:
- Leerlo directamente si es texto.
- Extraerlo como imagen para un procesamiento posterior.
Característica Detalle
Tipo de ocultación Esteganografía en el dominio de la frecuencia
Requerimientos Archivo de audio con datos ocultos en su espectro
Visibilidad Alta si se usan frecuencias audibles, baja si está en el rango inaudible
Capacidad Limitada por la duración y el rango de frecuencias
- Mensajes en espectrogramas: Textos codificados en bandas de frecuencia.
- Dibujos o logotipos: Figuras creadas mediante síntesis de frecuencias.
- Códigos QR ocultos: Codificados como imagen espectral que luego puede escanearse.
- Pistas direccionales: Frecuencias que guían al siguiente paso del reto.
- Sonic Visualiser: Disponible para Windows, macOS y Linux.
- Una vez abierto el audio:
- Pane → Add Spectrogram
- Ajustar rango de frecuencias y colores para mayor contraste.
- Usar zoom y desplazamiento para inspeccionar detalles.
Un reto puede darte un archivo mensaje.wav. A simple oído, suena como ruido blanco. Al abrirlo en Sonic Visualiser y activar el espectrograma, aparece un texto que dice:
flag{hidden_in_the_noise}
Elemento Valor
Tipo Esteganografía en audio, dominio de la frecuencia
Clave Analizar el espectro con la herramienta adecuada
Capacidad Baja-media (ideal para mensajes cortos o imágenes pequeñas)
Detección Fácil con herramientas de espectrograma
Uso en CTF Muy común para mensajes escondidos en ruido
**\
**
*(Identificación de dígitos y comandos transmitidos por tonos telefónicos)*
DTMF es un sistema de señalización usado en telefonía para enviar información a través de la pulsación de teclas. Cada número o símbolo que pulsas en un teléfono genera dos tonos simultáneos (uno de una frecuencia baja y otro de una frecuencia alta).
En retos CTF, los DTMF pueden usarse para ocultar mensajes o códigos en un archivo de audio que suena como pitidos telefónicos. Detectarlos y decodificarlos permite revelar el texto o número oculto.
- Frecuencias usadas\
697 Hz 1 2 3 A
770 Hz 4 5 6 B
852 Hz 7 8 9 C
941 Hz * 0 # D
- Proceso de detección en CTF
- Abrir el archivo de audio sospechoso.
- Escuchar si tiene pitidos cortos y distintos.
- Usar herramientas de análisis de espectro (Audacity, Sonic Visualiser, multímetros FFT) para identificar las frecuencias de cada tono.
- Mapear cada par de frecuencias a su número o letra usando la tabla DTMF.
- Extracción del mensaje
- Escribir la secuencia de dígitos/letras detectados.
- Si forman un texto, puede ser la flag o una pista.
- Si parecen números de teléfono o códigos, podrían llevar a la siguiente fase.
Característica Detalle
Tipo de ocultación Mensaje en audio mediante pares de frecuencias
Rango de frecuencias 697 Hz a 1633 Hz
Capacidad Muy baja (números/códigos cortos)
Visibilidad Fácil de oír, requiere identificación de pares de tonos
Detección Manual o con herramientas automáticas
- Audacity:
- Abrir audio → Análisis → Trazar espectro para cada tono.
- Multimon-ng (Linux):
- multimon-ng -t wav -a DTMF archivo.wav
- DTMF.io (web):
- Subir audio y obtener la decodificación automática.
- Python + scipy:
- Usar FFT para detectar frecuencias dominantes y mapearlas.
Archivo: phone_call.wav Al escucharlo, suena como una secuencia de pitidos cortos. Tras analizarlo con multimon-ng, obtenemos:
5 1 2 8 3 4
La flag del reto es:
flag{512834}
Elemento Valor
Tipo Audio → Frecuencias → Números
Clave Identificar dos frecuencias simultáneas por tono
Capacidad Baja, ideal para datos cortos
Detección Fácil con herramientas de espectro o decodificadores DTMF
Uso en CTF Muy común en retos de audio relacionados con telefonía
**\
**
*(Codificación de texto usando las letras asociadas a las teclas de un teléfono)*
Antes de los smartphones, los teléfonos móviles y fijos con teclado numérico incluían varias letras en cada número (para escribir SMS usando pulsaciones repetidas). Este sistema puede usarse como un método de codificación donde cada número representa una letra según la posición en la tecla.
En retos CTF, el mensaje puede aparecer como una secuencia de números (ejemplo: 7777 33 666 555) que corresponde a texto si se mapea correctamente.
Existen dos variantes principales:
- Multi-Tap SMS (pulsaciones repetidas)\
- 2 → A (1 vez), B (2 veces), C (3 veces)
- 7 → P (1 vez), Q (2 veces), R (3 veces), S (4 veces)
- T9 Predictive Text\
Número Letras
1 (a veces vacío o signos)
2 A B C
3 D E F
4 G H I
5 J K L
6 M N O
7 P Q R S
8 T U V
9 W X Y Z
0 Espacio
- Identificar si la secuencia de números parece un patrón de pulsaciones telefónicas.
- Suele tener repeticiones (ej: 222 666 555).
- Puede estar separada por espacios o comas.
- Usar la tabla para convertir:
- Contar cuántas veces se repite cada número antes de que cambie.
- Mapear a la letra correspondiente.
- Unir el texto y buscar la flag.
- DCode.fr -- Phone Keypad Cipher
- CyberChef -- From Phone Keypad
- Scripts en Python para contar repeticiones.
Entrada:
7777 33 666 555 0 33 666 8
Decodificación:
S E O L _ E O T
Flag:
flag{SEOL_EOT}
Elemento Valor
Tipo Sustitución basada en pulsaciones de teclado
Clave Tabla de letras por tecla (multi-tap)
Capacidad Media (texto plano, cualquier palabra)
Detección Fácil si hay secuencias repetidas
Uso en CTF Muy común en retos con números repetidos
**\
**
- StegHide: Una herramienta popular para ocultar y extraer datos de archivos de imagen y audio. A menudo requiere una contraseña.
- StegSolve: Una herramienta gráfica de Java muy útil para el estegoanálisis de imágenes, que permite visualizar los diferentes canales de color, realizar filtros y análisis de bits.
- Binwalk: Ideal para buscar archivos incrustados dentro de otros archivos (por ejemplo, un archivo ZIP dentro de una imagen).
- ExifTool: Para analizar y manipular metadatos de una gran variedad de formatos.
- Strings: Permite extraer cadenas de texto legibles de un archivo binario.
- Editores hexadecimales (como GHex o HxD): Fundamentales para examinar la estructura de un archivo a nivel de bytes y buscar patrones o datos ocultos.
- Editores de audio (como Audacity): Útiles para visualizar espectrogramas y analizar archivos de audio en busca de datos ocultos.
En general, los retos de esteganografía en CTF requieren un enfoque metódico y creativo, a menudo combinando el uso de varias herramientas para descubrir la información oculta.