Alternate Data Streams (ADS)

Praktische, aber grundlegende Anwendung von ADS in CTF- und Pentesting-Umgebungen

Was sind also Alternate Data Streams (ADS) ?

Es handelt sich dabei um eine Funktion, die dem New Technology File System, auch bekannt als NT File System (NTFS), hinzugefügt wurde, um die Vergleichbarkeit mit dem Macintosh Hierarchical File System (HFS) zu erhöhen; laienhaft ausgedrückt handelt es sich dabei um etwas, das die Verwendung von Dateien sowohl auf dem Mac (Apple) als auch auf dem PC (Windows) erleichtert.

Wie funktioniert es und warum sollte ich mich dafür interessieren?

Wenn du etwas in einer Datei speicherst, zum Beispiel eine .txt-Datei, speicherst du normalerweise den Inhalt deiner Datei (ASCII-Text) in einem Datenstrom, den Windows als Standardstrom erkennt, so dass du beim nächsten Öffnen deiner Datei auf denselben Datenstrom zugreifst, um deine Daten zu sehen.

Als Beispiel

Wenn ich eine .txt-Datei mit Notepad auf meinem Windows-System und speichere sie in einer Datei (secret.txt), dann würde ich jedes Mal, wenn ich sie öffne, meine Daten sehen.

Secret.txt Notepad

Secret.txt Notepad

Aber was ist, wenn es mehr Daten in der Datei gibt, von denen man nichts weiß?

Da kommen die alternativen Datenströme ins Spiel.

Ich werde mit cmd.exe (Eingabeaufforderung) verwenden, um die Beispiele zu demonstrieren, damit die CLI (Befehlszeilenschnittstelle) leichter zu verstehen ist, aber dieselben Ergebnisse können auch mit Power Shell erzielt werden.

Wenn ich also die Eingabeaufforderung verwende, um den Inhalt meines Verzeichnisses anzuzeigen, sehe ich meine geheime.txt und die Größe der Datei beträgt 33 Bytes.

dir
Eingabeaufforderung

Eingabeaufforderung

Das sieht aus wie eine normale Datei, aber was ist, wenn ich das /r zu meinem Befehl hinzufüge?

dir /r
Befehlseingabe dir /r

Befehlseingabe dir /r

Jetzt sehen wir eine weitere Datei im selben Verzeichnis mit demselben Präfix wie unsere ursprünglich erstellte secret.txt, aber mit dem Suffix evil.txt, wobei das $DATA uns sagt, dass es sich um einen Stream vom Typ $DATA handelt.

Durch Hinzufügen des /r zu unserem Befehl können wir sehen, dass sich beide Dateien im selben Verzeichnis befinden, aber wir können nur die secret.txt auf unserem Desktop, wir können auch den Unterschied in der Dateigröße sehen, während unsere secret.txt Datei immer noch 33 Bytes groß ist, ist unsere secret.txt:evil.txt 74, was mehr als das Zweifache unserer secret.txt ist.

Vergleiche die Ausgabe der beiden Befehle.

# First Command
dir# Second Command
dir /r
Befehlseingabe dir und dir /r

Befehlseingabe dir und dir /r

Damit können wir die Informationen von beiden Befehlen genauer sehen, wir sind in der Lage die Änderungen in einer klareren Perspektive zu sehen.

  • Beide Ausgaben sagen, dass es nur 2 Dateien im Verzeichnis gibt und geben uns die gleiche Größe an, weil secret.txt und secret.txt:evil.txt die gleiche Datei sind und nicht verschiedene Dateien, aber die Daten sind in separaten Streams gespeichert.
  • Der gesamte Speicherplatz, der im Verzeichnis verwendet wird und auf dem System verfügbar ist, ist immer noch der gleiche.

Sehen wir uns den Inhalt beider Dateien zusammen an:

Bei der Betrachtung beider Dateien können wir sehen, dass der Inhalt unterschiedlich ist, wir können auch den Unterschied in den Namen der Dateien sehen, was uns auf die Idee bringt, dass wir leicht Informationen in einem alternativen Datenstrom für mehrere Zwecke speichern können. Datenströme folgen einer grundlegenden Namenskonvention im NTFS-Dateisystem, nämlich FileName:StreamName:StreamType, wobei der vollständige Name von secret.txt im NTFS-Dateisystem secret.txt::$DATA

Eine alternative Methode, um beide Dateien anzuzeigen, ohne sie in Notepad zu öffnen, wäre:

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