Alternate Data Stream: ADS – Flujo de datos alternativos en NTFS

Un flujo de datos alternativo (ADS – Alternate Data Stream) es una característica del sistema de ficheros NTFS que consiste en incluir metainformación en un fichero. Podríamos decir que son ficheros secundarios “ocultos” guardados dentro de otros ficheros. El objetivo inicial es almacenar información extra acerca del fichero principal, pero esta técnica también fue muy usada para propagar virus de forma transparente para el usuario.

Aclarar que en este artículo me voy a centrar sólo en el sistema de ficheros NTFS sobre Windows 8 en concreto. En otros sistemas de ficheros existen técnicas similares; el símil con sistemas de ficheros como ext3, ext4, JFS, HFS+, etc., serían los atributos extendidos (EAs – Extended Attributes). La limitación de los EAs es que no se puede incluir una imagen o un archivo ejecutable como sí puede almacenarse en los ADS. Pero como he comentado, en este artículo sólo nos centraremos en NTFS y los ADS.

Hay que tener en cuenta algunas consideraciones de los flujos de datos alternativos:

  • Una aplicación de escritorio solo leerá el flujo principal de un archivo. Es decir, mediante el explorador de Windows sólo se abrirá el fichero que pertenezca al flujo principal. Los flujos alternativos sólo se pueden ejecutar mediante consola de comandos.
  • De igual forma, con el explorador de Windows solo se verá el flujo alternativo, incluso, solo se mostrará el tamaño del fichero perteneciente al flujo principal. Si hay un vídeo de 100MB por ejemplo, éste tamaño no se verá reflejado en el tamaño del fichero.
  • Los flujos de datos alternativos se pueden ver y abrir mediante la consola de comandos.

La finalidad de los flujos de datos alternativos es asociar ficheros o información que pueda ser confidencial, a ficheros de forma que queden ocultos a usuarios. Pero de la misma forma se puede usar esta técnica para alguna actividad maliciosa.

Como particularidad, mencionar que cuando descargamos un fichero de Internet, lleva asociado un flujo alternativo llamado “Zone.Identifier”, que indica la zona desde donde se ha descargado el fichero. Windows después utiliza dicho valor para abrir o ejecutar los ficheros. El significado de los valores es:

Después de la introducción, vamos a ver un ejemplo de cómo crear y ver el contenido de un flujo de datos alternativo. Para el ejemplo vamos a tomar dos ficheros:

  • principal.pdf, lo trataremos como fichero del flujo principal
  • img_oculta.jpg, lo trataremos como fichero del flujo alternativo

Ejecutamos dir para el contenido de la carpeta. Importante, fijaos en los tamaños de los ficheros:

Creamos ahora el flujo de datos alternativo, el comando sería el siguiente:

type img_oculta.jpg > principal.pdf:img_oculta.jpg

¿Qué ocurre si volvemos a hacer un dir? Aparentemente nada ha cambiado…

Se puede observar que el tamaño del fichero principal.pdf no ha cambiado absolutamente nada. Ejecutemos ahora el comando dir /r:

Como se ve en la imagen, el fichero principal.pdf tiene un flujo alternativo identificado como :img_oculta.jpg. Este flujo de datos alternativo coincide en tamaño con el original img_oculta.jpg, de hecho éste se podría eliminar, pero el flujo de datos alternativo seguiría existiendo. También, como ya hemos comentado antes, el tamaño del fichero principal.pdf tampoco se ha alterado.

Para abrir el contenido del flujo de datos alternativo utilizaríamos el comando:

Nombre_de_la_aplicacion fichero.extension:alternativo.extension

En nuestro caso vamos a abrir la imagen oculta con el editor de imágenes de Windows Paint:

mspaint principal.pdf:img_oculta.jpg

En sistemas operativos antiguos como Windows XP, la ejecución de un flujo de datos alternativo se hacía mediante el comando start, pero a partir de Windows 7 esto no está permitido, por lo que se cambió a invocar directamente la aplicación para abrir el fichero.

Supongo que ya os habréis hecho la pregunta: ¿qué ocurre si añado un “.exe” como flujo alternativo? En este caso, nos encontramos con que a partir de Windows 7 no está permitido (por motivos de seguridad) ejecutar un “.exe” como flujo alternativo. Veamos un ejemplo.

Vamos a asociar a un fichero llamado principal.txt la calculadora de Windows:

type c:\Windows\System32\calc.exe > principal.txt:calc.exe

Ahora ejecutamos mediante el comando start:

start .\principal.txt:calc.exe

Y el resultado es un mensaje de error que dice “Windows no puede encontrar el archivo”. Tal y como esperábamos, no podemos ejecutar un fichero “.exe” en un flujo de datos alternativo. Pero como esperábamos, eso no es del todo cierto. Para saltarnos esta medida vamos a crear un script en Python, y mediante este script llamaremos al ejecutable. Por cambiar un poco del típico ejemplo, he decidido iniciar una instancia Google Chrome.

Creamos un fichero llamado script_py.txt con el siguiente contenido:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, string, os			
os.system('"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"')

Ahora asociamos el fichero como flujo de datos alternativo de un fichero de texto llamado principal.txt.

type script_py.txt > principal.txt:script_py.txt

Para ejecutar el script de Python lo haremos mediante la sentencia:

C:\Python27\python.exe principal.txt:script_py.txt

Si todo ha ido bien, con esto lograremos ejecutar un fichero “.exe” a partir de un flujo alternativo. En este caso, se abrirá una nueva instancia del navegador Google Chrome.

Esta técnica era muy utilizada por atacantes para insertar malware en flujos alternativos. Aunque hemos visto que en los sistemas operativos actuales no se puede hacer directamente, sí se puede de forma indirecta, por lo que sigue siendo un aspecto a tener en cuenta para garantizar la seguridad.

Aunque no se ha visto en el artículo, existen herramientas para ver los flujos de datos alternativos en modo gráfico. Una herramienta es AlternateStreamView de Nirsoft, la cual te permite escanear carpetas en busca de ficheros alternativos.

Sin lugar a dudas, hay que tener en cuenta los flujos de datos alternativos para garantizar la seguridad de los sistemas, y no ejecutar código malicioso que permanezca oculto. Además, este tema resulta muy interesante a la hora de realizar un análisis forense para una pericial, ya que podríamos obtener información relevante que a simple vista no está accesible.