Alternate Data Streams (ADS)

Praktische maar elementaire toepassing van ADS in CTF- en Pentesting-omgevingen

Wat zijn Alternate Data Streams (ADS) ?

Het is een functie die is toegevoegd aan het New Technology File System, ook bekend als NT File System (NTFS), om de vergelijkbaarheid met het Macintosh Hierarchical File System (HFS) te vergroten. In lekentaal is het iets dat het gemakkelijker maakt om uw bestanden zowel op uw Mac (Apple) als op uw PC (Windows) te gebruiken.

Hoe werkt het en waarom zou ik me er druk over maken ?

Wanneer je iets opslaat in een bestand, een .txt bestand bijvoorbeeld, dan sla je de inhoud van je bestand (ascii tekst) op in een data stream die windows herkent als de standaard stream zodat de volgende keer dat je je bestand opent, je dezelfde stream zal openen om je gegevens te bekijken.

Als voorbeeld

Als ik een .txt-bestand maak met Kladblok op mijn Windows-systeem en dit opsla in een bestand (secret.txt), dan zou ik elke keer dat ik het open mijn gegevens te zien krijgen.

Secret.txt Kladblok

Secret.txt Notepad

Maar wat als er meer gegevens in het bestand staan waar je geen weet van hebt?

Dat is waar alternatieve gegevensstromen in het spel komen.

Ik zal gebruik maken van cmd.exe (Command Prompt) gebruiken om de voorbeelden te demonstreren, zodat mensen de CLI (Command Line Interface) gemakkelijker kunnen begrijpen, maar dezelfde resultaten kunnen ook worden bereikt met Power Shell.

Dus als ik command prompt gebruik om de inhoud van mijn directory te bekijken, kan ik mijn secret.txt en de grootte van het bestand is 33 bytes.

dir
command prompt

command prompt

Dit ziet eruit als een normaal bestand, maar wat als ik de /r aan mijn commando toevoeg ?

dir /r
Command prompt dir /r

Command prompt dir /r

Nu zien we een ander bestand in dezelfde directory met hetzelfde voorvoegsel als onze oorspronkelijk aangemaakte secret.txt maar met een achtervoegsel van evil.txt waar de $DATA ons vertelt dat dit een $DATA type stream is.

Door de /r aan ons commando toe te voegen kunnen we zien dat beide bestanden in dezelfde directory staan maar we kunnen alleen de secret.txt op ons Bureaublad, we kunnen ook het verschil in bestandsgrootte zien terwijl ons secret.txt bestand nog 33 bytes is onze secret.txt:evil.txt is 74 wat meer dan 2 keer onze secret.txt is.

Vergelijken van de uitvoer van beide commando’s.

# First Command
dir# Second Command
dir /r
Commando Prompt dir en dir /r

Commando Prompt dir en dir /r

In dit kunnen we de informatie door beide commando’s nauwkeuriger zien we in staat zijn om de veranderingen in een duidelijker perspectief te zien.

  • Beide uitgangen zeggen dat er slechts 2 bestanden in de directory staan en geven ons dezelfde grootte, dit komt omdat secret.txt en secret.txt:evil.txt hetzelfde bestand zijn niet verschillende bestanden maar de gegevens zijn opgeslagen in aparte streams.
  • De totale gebruikte ruimte in de directory en beschikbaar op het systeem zijn nog steeds hetzelfde.

Laten we de inhoud van beide samen bekijken:

Terwijl we ze beide bekijken kunnen we zien dat de inhoud verschillend is, we kunnen ook het verschil zien in de naam van de bestanden, wat ons het idee geeft dat we gemakkelijk informatie kunnen opslaan in een andere gegevensstroom voor meerdere doeleinden. Datastromen volgen een basis naamgevingsconventie in het NTFS bestandssysteem die FileName:StreamName:StreamType is, dat wil zeggen dat de volledige naam van secret.txt in het NTFS bestandssysteem secret zou zijn.txt::$DATA

Een alternatieve methode om beide te bekijken zonder ze in kladblok te openen zou zijn.

# View secret.txt
type secret.txt# View Alternate Data Stream
more < secret.txt:evil.txt