En el sistema de fichero NTFS los Alternate Data Streams (ADS) son atributos ocultos de los distintos ficheros o carpetas. Estos pueden tener además del atributo primario de datos ($Data) otros alternativos como por ejemplo el ADS Zone.Identifier que nos indica el origen del fichero. Los ADS contienen en muchos casos información útil, como esta que comentábamos del origen, pero han sido y siguen siendo utilizados también para esconder y ejecutar malware en nuestro sistema, por lo que conviene conocer su funcionamiento.

Alternative Data Streams

Muchos componentes en los sistemas operativos Windows reaccionan de manera diferente ante la ejecución de ficheros dependiendo de su origen. En ficheros descargados de Internet nos encontraremos habitualmente con los típicos avisos de seguridad para prevenir ejecuciones no deseadas. Esta identificación se realiza mediante los Alternative Data Streams (ADS).

Para los ficheros descargados de Internet por ejemplo, se crea automáticamente un flujo de datos alternativo (ADS) que contiene un identificador de zona Zone.Identifier. Este identificador indica a través de un valor determinado su origen. En la siguiente tabla vemos los posibles valores de este Zone.Identifier:

Identificador (valor)
URLZONE_LOCAL_MACHINE (0)
URLZONE_INTRANET (1)
URLZONE_TRUSTED (2)
URLZONE_INTERNET (3)
URLZONE_UNTRUSTED (4)

Por lo tanto un archivo descargado de Internet, debería tener un ADS alternativo, Zone.Identifier de valor 3. Como decíamos en base a estos metadatos nuestro sistema operativo tratará a este fichero de una determinada manera, ya que por lógica no debería tener el mismo nivel de confianza un fichero descargado de Internet que por ejemplo un archivo generado en nuestra misma máquina. De todas maneras en ocasiones nos puede ser útil tanto comprobar estos datos como ser capaces de alterarlos. Vamos a ver una serie de ejemplos tanto con Powershell que nos permite unas mayores capacidades como con otras herramientas de Windows.

 

Ver ADS de un fichero


  • cmdlet Get-Item

En Powershell utilizando el cmdlet Get-Item, obtendremos una información detallada de todos los ADS, sus nombres, tamaños, tipo... Toda esta información, en especial los datos referentes al ADS por defecto no aparecerán en las otras opciones que veremos después.

get-item -path C:\users\cyberseguridad\desktop\internet.png -stream *

PSPath : Microsoft.PowerShell.Core\FileSystem::C:\users\cyberseguridad\desktop\internet.png::$DATA
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\users\cyberseguridad\desktop
PSChildName : internet.png::$DATA
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName : C:\users\cyberseguridad\desktop\internet.png
Stream : :$DATA
Length : 3374

PSPath : Microsoft.PowerShell.Core\FileSystem::C:\users\cyberseguridad\desktop\internet.png:Zone.Identifier
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\users\cyberseguridad\desktop
PSChildName : internet.png:Zone.Identifier
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName : C:\users\cyberseguridad\desktop\internet.png
Stream : Zone.Identifier
Length : 26

En este caso vemos como el fichero internet.png (una imagen descargada de Internet), presenta como decíamos además del ADS primario ($DATA) pero además uno altenativo, el Zone.Identifier.

  • comando dir

Alternativamente también podemos utilizar el comando "dir /r" para mostrar los ADS en los ficheros, como vemos en el siguiente output efectivamente el fichero descargado contiene un ADS con el nombre "Zone.Identifier"

C:\Users\cyberseguridad\Desktop\test>dir /r internet.png
30/10/2016 08:02 3.374 internet.png
26 internet.png:Zone.Identifier:$DATA
1 File(s) 3.374 bytes

  • Streams

Una tercera opción es usar una herramienta especificamente diseñada para ello como es el Streams de Sysinternals, en este caso se nos muestra el tamaño del ADS

C:\Users\cyberseguridad\Desktop\test>streams internet.png

streams v1.60 - Reveal NTFS alternate streams.
Copyright (C) 2005-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\Users\cyberseguridad\Desktop\test\internet.png:
:Zone.Identifier:$DATA 26

 

Ver el contenido del ADS



Hemos comprobado que efectivamente ese fichero contiene un ADS, pero vamos a ver como leer esos datos, para ello podemos utilizar de nuevo varias opciones:

  • cmdlet Get-Content

Con Powershell podemos invocar este cmdlet para mostrar en pantalla el contenido del ADS, en el ejemplo siguiente veréis que he mostrado el ADS Zone.Identifier, pero también podríamos mostrar el ADS por defecto no indicando el switch "-stream"

get-content -path C:\users\cyberseguridad\desktop\internet.png -stream Zone.Identifier
[ZoneTransfer]
ZoneId=3

  • notepad

Otra manera sería invocando al notepad desde línea de comandos, indicando el nombre de fichero y el nombre del ADS

C:\Users\cyberseguridad\Desktop\test>notepad internet.png:Zone.Identifier

  • comando more

Y aún otra manera de ver esos datos sería a través del comando more

C:\Users\cyberseguridad\Desktop\test>more < internet.png:Zone.Identifier
[ZoneTransfer]
ZoneId=3

Como vemos, efectivamente el valor de zona indicado en este ADS es el que se correspondía en la anterior tabla con el origen Internet.

 

Buscar ADS


Nos puede resultar útil en ocasiones buscar aquellos ficheros que contienen un ADS en concreto o que simplemente tengan alguno extra al por defecto, identificando por ejemplo los archivos descargados de Internet. Para ellos podemos utilizar el de nuevo Powershell

  • cmdlet Get-ChildItem

gci -recurse | % { gi $_.FullName -stream * } | where stream -ne ':$Data'

En este caso, buscamos en el directorio actual y dentro de los subdirectorios, mostrando el nombre de fichero en caso que contenga un stream no igual al por defecto.

 

Crear ADS


Un fichero puede contener diversos ADS, vamos a ver a continuación como crear un nuevo ADS:

  • cmdlet set-content

Con Powershell de nuevo tenemos la manera más sencilla y eficiente de realizar este paso, con el siguiente comando podemos escribir linea a linea los datos acabando con un enter cuando queramos cerrar el proceso.

set-content -path C:\users\cyberseguridad\desktop\internet.png -stream ejemplo

cmdlet Set-Content at command pipeline position 1
Supply values for the following parameters:
Value[0]: esto
Value[1]: es
Value[2]: un
Value[3]: ejemplo
Value[4]:

Ahora podemos comprobarlo con

get-content -path C:\users\cyberseguridad\desktop\internet.png -stream ejemplo
esto
es
un
ejemplo

  • comando echo

A través del comando echo también podemos crear ADS de la siguiente manera

echo hello > internet.png:nombredestream

 

Eliminar ADS


Eliminar un ADS no es recomendable ya que muchas veces el software que lo ha creado lo necesita de alguna manera para su correcta utilización.

  • cmdlet remove-item

remove-item –path {path to the file} –stream {name of the stream}

  • Streams

También podemos utilizar Streams, esta vez con el siguiente comando:

C:\Users\cyberseguridad\Desktop\test>streams -d internet.png

streams v1.60 - Reveal NTFS alternate streams.
Copyright (C) 2005-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\Users\cyberseguridad\Desktop\test\internet.png:
Deleted :Zone.Identifier:$DATA

Tenemos también la opción de eliminar los ADS recursivamente en subdirectorios con la opción "-s" aunque recomendaría utilizar este switch con precaución.

  • Explorador de Windows

El explorador de Windows también nos permite eliminar este ADS en particular, haciendo click derecho sobre el fichero y en sus propiedades, clickar en el botón de "desbloqueo" en las opciones de seguridad.


 

Como veis toda una serie de opciones para manipular estos ADS, grandes desconocidos para la mayoría de usuarios pero que dan bastante juego y que nos permiten aumentar el control sobre nuestros ficheros.