demande de rappel immédiat

Gérer les "Alternate Data Streams" avec CMD, PowerShell 2 et PowerShell 3

Posted by Jean-Paul Blanc Wednesday, May 09, 2012 3:05:00 PM
Rate this Content 0 Votes

 

ADS pour Alternate Data Streams est une fonctionnalité du système de fichier NTFS qui permet d'associer plus d'un flux de données à un nom de fichier en jouant sur le format de ce dernier  : "Nom_De_Fichier:Nom_De_Flux_Particulier" (Ex : Fic.txt:Zone.Identifier).

Les flux de données alternatifs n'apparaissent pas dans Windows Explorer, et leur taille n'est pas comprise dans la taille du fichier qui les héberge. Seul le flux principal d'un fichier est conservé au moment de la copie sur un système de fichier de type FAT, de l'attachement à un courrier ou du téléchargement sur un site WEB. Ceci explique le fait que les ADS ne sont pas utilisés pour le stockage de données critiques.

Les flux de données alternatifs ont étés créés pour les 'ressources forks' dans le produit 'Service for Macintosh' (SFM). Depuis des virus ont utilisés les ADS pour cacher leur code, mais aussi des lecteurs multimédias pour stocker les formats des fichiers de données (container MPEG ou OGG). Plus récemment des données ADS ont aussi été ajoutées par Internet Explorer (mais aussi d'autres browser) pour marquer les fichiers provenant de sources incertaines (téléchargement), donc peu sures pour être exécutées localement.

Attributs étendus sous NTFS

Historiquement il est possible d'accéder aux flux alternatifs à travers les commandes dir, echo et more associés aux opérateurs de redirection > et < de l'interpréteur de comande CMD.EXE

Accès aux Alternate Data Stream avec CMD.EXE :

Détecter la présence d'ADS avec la commande dir :
C:\Temp\ADSTest>dir /r
 Le volume dans le lecteur C n'a pas de nom.
 Le numéro de série du volume est 96B0-0597

 Répertoire de C:\Temp\ADSTest

09/05/2012  09:09              .
09/05/2012  09:09              ..
07/05/2012  09:25           495 616 SetupSlxWOL.msi
                                 26 SetupSlxWOL.msi:Zone.Identifier:$DATA
               1 fichier(s)          495 616 octets
               2 Rép(s)  40 051 462 144 octets libres

 

Visualiser les données d'un flux alternatif avec la commande more et l'opérateur < :
C:\Temp\ADSTest>more < SetupSlxWOL.msi:Zone.Identifier
[ZoneTransfer]
ZoneId=3

 

Modifier les données d'un flux alternatif avec la commande echo et l'opérateur > :
C:\Temp\ADSTest>echo "">SetupSlxWOL.msi:Zone.Identifier

 

Les opérations précédentes ont conduit à la supression de l'information de zone

Alternative Data Streams suppression des informations de zone

Outil en ligne de commande

 Il existe sur le site de Microsoft (Sysinternals) l'outil STREAM.EXE qui permet de rechercher et de supprimer de façon récursive les flux de données alternatifs. C'est un moyen efficace de débloquer par script des fichiers provenant d'une zone internet à laquelle on ne faisait pas confiance.

C:\Temp\ADSTest>streams

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

usage: streams [-s] [-d] 
-s     Recurse subdirectories
-d     Delete streams

 

PowerShell 2.0

Aucune des applets de commande de base de PowerShell ne permet de manipuler en direct les flux de données alternatif. La raison est que ces derniers ne sont pas exposés par les classes de base du Framework .NET. Le script suivant exploite l'appel à l'interpréteur de commande CMD.EXE à travers PowerShell 2 pour positionner et lire les ADS. 

# AlternateDataStream.ps1

# Blocks de scripts appelant CMD.EXE
$scriptBlockSetStream = {cmd /C `"echo $($Args[0])`>$($Args[1]):$($Args[2])`"}
$scriptBlockGetStream = {cmd /C `"more `<$($Args[0]):$($Args[1])`"}

$streamName = "NativeFilePath"
$File = "C:\Temp\ADSTest\toto.txt"
$streamContent = Split-Path -Path $File -Parent

# Positionnement d'un Alternate Data Stream
Invoke-Command -ScriptBlock $scriptBlockSetStream -ArgumentList $streamContent,$File,$streamName
# Récupération d'un Alternate Data Stream
$res = Invoke-Command -ScriptBlock $scriptBlockGetStream -ArgumentList $File,$streamName
$res

Il est possible d'atteindre l'API WIN32 CreateFile qui permet de manipuler les ADS à travers la couche 'interop' du Framework .NET.   

PowerShell 3

En PowerShell 3 une série d'applet de commandes prennent en charge les flux de données alternatif

PS C:\> Get-Command -ParameterName Stream  -Module Microsoft.PowerShell.Management

Capability      Name                             ModuleName
----------      ----                             ----------
Cmdlet          Add-Content                      Microsoft.PowerShell.Management
Cmdlet          Clear-Content                    Microsoft.PowerShell.Management
Cmdlet          Get-Content                      Microsoft.PowerShell.Management
Cmdlet          Get-Item                         Microsoft.PowerShell.Management
Cmdlet          Remove-Item                      Microsoft.PowerShell.Management
Cmdlet          Set-Content                      Microsoft.PowerShell.Management

 

Lister les flux d'un fichier
PS C:> Get-Item .\SetupSlxWOL.msi -Stream *


   FileName: C:\Temp\ADSTest\SetupSlxWOL.msi

Stream                   Length
------                   ------
:$DATA                   496640

 

Positionner un flux alternatif sur un fichier
PS C:\> Set-Content .\SetupSlxWOL.msi -Stream "Zone.Identifier" -Value "[ZoneTransfer]","ZoneId=3"
PS C:\> Get-Item .\SetupSlxWOL.msi -Stream *


   FileName: C:\Temp\ADSTest\SetupSlxWOL.msi

Stream                   Length
------                   ------
:$DATA                   496640
Zone.Identifier              26

 

Visualiser le contenu d'un flux alternatif d'un fichier
PS C:\> Get-Content .\SetupSlxWOL.msi -Stream "Zone.Identifier"
[ZoneTransfer]
ZoneId=3

 

Vider un flux alternatif d'un fichier
PS C:\> Clear-Content .\SetupSlxWOL.msi -Stream "Zone.Identifier"
PS C:\> Get-Item .\SetupSlxWOL.msi -Stream *


   FileName: C:\Temp\ADSTest\SetupSlxWOL.msi

Stream                   Length
------                   ------
:$DATA                   496640
Zone.Identifier               0

 

Supprimer un flux alternatif d'un fichier
PS C:\> Remove-Item .\SetupSlxWOL.msi -Stream "Zone.Identifier"
PS C:\> Get-Item .\SetupSlxWOL.msi -Stream *


   FileName: C:\Temp\ADSTest\SetupSlxWOL.msi

Stream                   Length
------                   ------
:$DATA                   496640
Comments are closed on this post.