Un aspecto no muy conocido que está disponible en los sistemas de ficheros de tipo NTFS es el denominado flujo de datos alternativo (alternate data streams - ADS), mediante el cual es posible guardar dentro de un fichero o carpeta información adicional que en un principio va a quedar oculta a la vista de los usuarios. Esta información añadida puede ser de cualquier tipo: un fichero de texto, una imagen, un pdf, un video, un ejecutable…. lo que ofrece multiples posibilidades tanto para bien como para mal.

Los ADS se diseñaron en un principio para ser compatible con el sistema de ficheros utilizado en máquinas Macintosh, el sistema HFS+. Su primera aparición fue con Windows XP y están disponibles en todas las versiones posteriores de Windows, con ligeros cambios en su uso que se introdujeron en pos de la seguridad. En otros sistemas operativos y sistemas de ficheros podemos encontrar funcionalidades parecidades (los extended file attributes en Linux, por ejemplo), si bien las características que ofrecen son más limitadas y con menos versatilidad que las ofrecidas en NTFS.

Generalmente, es el sistema operativo (Windows) el que hace uso de esta característica para añadir información extra o metainformación para realizar ciertas labores de gestión y control, si bien cualquier programa puede hacer uso de ello para sus propios fines. Ejemplo de uso:

  • El Administrador de Datos Adjuntos de Windows (Windows Attachment Manager) hace uso de ello para comprobar si los ficheros descargados son seguros.
  • Los antivirus los utilizan para mejorar sus análisis.
  • Algunos servidores de bases de datos se sirven dellos para mantener la integridad de las bases de datos.
  • En el lado negativo, mucho malware se apoya en ellos para usos ilícitos.

Características principales

Enumeremos los puntos más relevantes a tener en cuenta a la hora de tratar con ADS:

  • Los flujos de datos alternativos no son visibles con las herramientas gráficas normales de Windows, es decir, no los veremos con el explorador de ficheros de Windows. Para poder visualizarlos debemos recurrir a herramientas externas o a la linea de comandos con cmd o PowerShell.
  • Al añadir un flujo alternativo no se modifica nada del fichero principal al que se ha añadido dicho flujo. No veremos nuevos atributos y el tamaño no varía. Si a un fichero de texto de 2 KB le añadimos un fichero de video de 1 GB no se reflejará este incremento de tamaño y en el explorador de archivos seguiremos viendo los 2 KB originales.
  • Solo están disponibles en sistemas de ficheros NTFS. Si el fichero principal lo copiamos a otro tipo de sistemas de ficheros, por ejemplo FAT, el flujo alternativo se perderá. Lo mismo ocurrirá si comprimimos el fichero original, por ejemplo, a formato zip.
  • Para leer los datos de un flujo alternativo es necesario acceder a ellos mediante una aplicación que pueda leerlos en función de su tipo. Si los datos son simplemente texto podermos abrirlos con una aplicación como notepad. Si lo guardado es una imagen necesitaremos un programa como paint, por ejemplo. ¿Y qué pasa con un ejecutable, con un .exe? Este caso lo veremos detenidamente más adelante.
  • Para poder crear un flujo alternativo en un fichero o carpeta se debe tener permiso de escritura sobre ellos.
  • Si bien los datos almacenados en un flujo alternativo no son visibles a los usuarios esto no significa que no sean accesibles. Los datos no están encriptados ni es necesario ningún tipo de autenticación para acceder a ellos. Si un usuario sabe que un determinado fichero tiene un flujo alternativo y tiene acceso de lectura al fichero podrá acceder a los datos.

Trabajar con flujos de datos alternativos

Para trabajar con flujos de datos alternativos vamos a hacer uso de la línea de comandos. Partimos del siguiente escenario, una carpeta en la que tenemos un fichero de texto, una imagen y un video:

Escenario de inicio

Podemos añadir un flujo de datos alternativo al fichero misnotas.txt mediante el siguiente comando:

echo "Datos alternativos" > misnotas.txt:streamalternativo

Si volvemos a consultar el contenido de la carpeta con dir no veremos nada diferente. Tampoco si hacemos uso de los comandos type o more. Sin embargo, si ejecutamos el comando dir con la opción /r veremos los cambios realizados:

Resultado comando dir /r

Podemos ver que tenemos los ficheros iniciales pero que también se lista un fichero denominado misnotas.txt:streamalternativo:$DATA, que es el flujo que hemos añadido. Como vemos, la nomenclatura usada para hecer referencia a un flujo alternativo es la siguiente: nombre_fichero_principal:nombre_flujo_alternativo:$DATA. Además, si comparamos esta imagen con la anterior podemos ver que el fichero misnotas.txt no ha variado de tamaño. Tenía 46 bytes y sigue teniendo el mismo tamaño a pesar de haberle añadido los 23 bytes del flujo alternativo.

Puesto que los datos añadidos son de tipo texto para poder leerlos necesitamos una aplicación compatible, como por ejemplo el Bloc de Notas de Windows. Con el siguiente comando podemos abrirlo y visualizar los datos:

notepad.exe misnotas.txt:streamalternativo

Otro aspecto a destacar que nos muestra la anterior imagen es el referente al fichero UnderTheStars.jpg, el cual ya tiene asociado un flujo alternativo que nosotros no hemos creado. Este fichero se descargó de Internet y dicho flujo fue añadido por Windows para marcar el archivo como procedente de una descarga. Si ejecutamos:

notepad.exe UnderTheStars.jpg:Zone.Identifier

podemos ver los datos contenidos:

Flujo Alternativo visto con Notepad

En la nomenclatura manejada por Windows el valor “ZoneId” puede tomar los siguientes valores:

  • 0 Mi PC
  • 1 Zona de Internet local
  • 2 Zona de páginas de confianza
  • 3 Zona de Internet
  • 4 Zona de páginas restringidas

Como ya hemos comentado más arriba, la creación de un flujo de datos no está restringida a datos de texto. Siguiendo con nuestro ejemplo, vamos a añadir la imagen que tenemos como flujo alternativo con el siguiente comando:

type UnderTheStars.jpg > misnotas.txt:streamimagen

Imagen añadida como flujo alternativo

Comprobamos que se ha añadido el nuevo flujo al fichero misnotas.txt y que no ha habido variaciones en los tamaños de los ficheros. Ahora, para poder acceder a esta imagen necesitamos utilizar un programa que pueda leer imágenes, como Paint:

mspaint misnotas.txt:streamimagen

Incluir ejecutables en flujos alternativo

Al igual que hemos hecho con la imagen podemos incluir un ejecutable como flujo de datos alternativo. Como ejemplo, añadamos la calculadora de Windows:

type c:\Windows\System32\calc.exe > misnotas.txt:streamexe

Ahora bien, ¿cómo podemos acceder a este ejecutable? En Windows XP, cuando se incluyeron los flujos de datos alternativos, se usaba la orden start. Mediante ella se accedía al flujo con independencia del tipo de datos que éste contuviera, por lo que con la orden start misnotas.txt:streamexe podríamos ejecutar la aplicación. A partir de Vista se cambió este procedimiento por el que hemos visto hasta ahora, el tener que usar una aplicación acorde con el tipo de los datos leidos. En principio, este escenario parace que nos limita a la hora de poder acceder a ficheros ejecutables, que es el objetivo principal por el que se dejó de permitir el uso de start. Si el hecho de poder ocultar datos ya no inspira mucha confianza desde el punto de vista de la seguridad, el que estos datos puedan ser ejecutados sin muchas restricciones es un serio motivo de preocupación. Por tanto, si ahora intentamos hacer uso de start nos encontraremos con un error y no podremos ejecutar la aplicación.

Entonces, ¿no es posible acceder a un ejecutable? Es posible, pero puesto que no tenemos la opción de hacerlo directamente tenemos que dar un rodeo para ello. Veamos dos formas de llevarlo a cabo.

Primera opción.

Utilizando enlaces simbólicos. Para ello tenemos que seguir los siguientes pasos:

  • Crear un enlace simbólico asociado al flujo alternativo que contiene el fichero ejecutable:
 mklink enlace_ejecutable.exe misnotas.txt:streamexe
  • Crear un nuevo ejecutable con el contenido del enlace creado:
type enlace_ejecutable.exe > micalculadora.exe

Como resultado tendremos los siguientes ficheros:

Tratar ejecutable como flujo alternativo

un enlace al flujo alternativo de datos y un ejecutable, micalculadora.exe, con el contenido del enlace, el cual podemos ejecutar directamente.

El procedimiento es un poco enrevesado y, además, hay que tener presente que para poder crear en enlace simbólico debemos estar ejecutando la consola en modo Administrador. En caso contrario, obtendremos un mensaje de error avisándonos de que carecemos de privilegios suficientes.

Segunda opción.

Utilizando un script como intermediario. La idea es utilizar un script en Python que sea el encargado de lanzar el fichero ejecutable. Pasos a seguir:

  • Crear un fichero con el código del script. Por ejemplo, creamos un fichero con nombre script.py y con el siguiente contenido:
#!/usr/bin/env python
import sys, string, os
os.system("C:\Windows\System32\calc.exe")
  • Asociar el script creado a un flujo de datos alternativo:
type script.py > misnotas.txt:scriptoculto
  • Finalmente, invocamos al script:
python misnotas.txt:scriptoculto

Con esta segunda opción no es necesario ejecutar la consola como Administrador pero tiene el inconveniente de necesitar una instalación de Python en el sistema.

Herremientas externas

Existen diversas herramientas de terceros que ofrecen la posibilidad de trabajar con los flujos de datos alternativos. Vamos a destacar dos. La primera de ellas es streams, herramienta de linea de comandos que viene incluida en la suite de sysinternals. Es una utilizadad muy versatil que permite incluso la eliminación de flujos alternativos asociados a un fichero principal. La segunda es AlternateStreamView, de NirSoft, que ofrece una interfaz gráfica para su uso.