Passwörter mit Batch versteckt speichern + auslesen

Ich habe letztens auf Stackoverflow einen kleinen Trick gefunden, wie sich beliebige Textinformationen, beispielsweise Zugangsdaten oder Passwörter, mit Batch versteckt in Dateien speichern und von dort wieder auslesen lassen.
Das dient sicher nicht für kritische Daten – vor einfachen neugierigen Blicken in Batch-Dateien kann man aber immerhin etwas verbergen.

Mit diesem kurzen Code wird ein beliebiger Textstring in einer Datei versteckt:

echo mypassw0rd>file.bat:pwd

Hier der Code zum Auslesen der Daten:

for /F "usebackq delims=" %i in (file.bat:pwd) do echo %i

(Für die Verwendung in einem Batch-Skript müssen doppelte Prozentzeichen verwendet werden.)
passwoerter-mit-batch-in-dateien-verstecken-cmd

Der Trick ist aus mehreren Gründen cool:
1.) Die versteckte Information lässt sich an jede beliebige Datei hängen von jedem beliebigen Dateityp hängen. Die Datei funktioniert anschließend genauso wie vorher, nur ist eine Information verborgen, die extrahiert werden kann.
passwoerter-mit-batch-in-dateien-verstecken-jede-datei

2.) Die erzeugte oder manipulierte Datei wird nicht in ihrer Dateigröße verändert bzw. ist immer 0 Byte groß. Egal wie lang der Text ist, der versteckt wird. Somit lassen sich ganze Text-Dokumente verstecken, ohne, dass an der Datei etwas erkennbar wäre, außer das Änderungsdatum.

3.) Jeglicher Text kann versteckt werden – egal ob Umlaute oder kryptische Zeichen.
passwoerter-mit-batch-in-dateien-verstecken-zeichen

4.) Die versteckten Informationen sind so gut wie unsichtbar. Die Dateigrößenveränderung ist 0 Byte, alle normalen Texteditoren zeigen absolut nichts an, selbst HEX-Editoren erkennen keinen Inhalt. Also keine Ahnung wie das technisch realisiert ist, aber es ist sexy. Kenny, sollte er den Beitrag lesen, weiß dazu vermutlich mehr 😉

Fazit: Mit dieser Methode kann in jede Datei beliebig viel Information in jeglicher Art von Textform eingebaut werden, ohne, dass das irgendwie erkennbar oder die Information sichtbar ist. Wenn eine Person nicht gerade weiß, dass in Datei X Informationen versteckt wurden, ist das erst einmal safe. In einem Betriebssystem mit Hunderttausenden von Dateien könnte man somit also eine Menge verstecken – wenn man ein kleines Tool dazu schreiben würde, welches sich die bnutzten Dateien merkt und den Prozess nutzerfreundlich gestaltet.

Nachteil: Wird dieser Trick in einem Skript fest verbaut, muss letztlich natürlich irgendwann in einem Skript immer diese Information geladen werden. Dabei wird natürlich erstens der Befehl zum Auslesen der Information benutzt und zweitens muss die entsprechende Datei angegeben werden. Wer sich also gut auskennt, kann das in einem Skript erkennen und mit dem entsprechenden Befehl auch selbstständig die Information abgreifen.
Da hilft nur verrücktes obfuskieren:
passwoerter-mit-batch-in-dateien-verstecken-obfuscate
(Aber selbst dann kann einfach mit @echo on die Batch Ausgabe erzwungen werden und die geladenen Informationen sind im Endeffekt ablesbar (wenn die Ausgabe pausiert wird))

Dennoch: lustige Spielerei und besser als Klartextinformationen in Batch!

7 Kommentare

  1. Naja. „Versteckt“.

    Dieser „Trick“ verwendet die sogenannten Alternate Data Streams von NTFS, die bereits seit Windows XP (mehr oder weniger) unterstützt werden. In solchen Streams speichert z.B. der Internet Explorer die Information ab, dass eine Datei aus dem Internet geladen wurde und potentiell gefährlich ist, etc.

    Es gibt Extensions für den Explorer, mit denen man sich die zusätzlichen Streams anzeigen lassen kann und die Powershell kann das wohl inzwischen auch: https://blogs.technet.microsoft.com/askcore/2013/03/24/alternate-data-streams-in-ntfs/

    Bei solchen „versteckten“ Daten sollte man übrigens aufpassen. Kopiert man sie auf einen Datenträger, der nicht mit NTFS formatiert ist (z.B. FAT-formatierte USB-Sticks), verliert man die zusätzlichen Streams ohne Vorwarnung.

    1. Ahaaa. Verstehe. Heißt also 1.) das „:pwd“ hinter dem Dateinamen ist nur ein beliebiger Bezeichner und gar keine fest definierte Komponente. Und 2.) können die besagten Dateien auch nichts durch Internet geschickt werden.
      1.) Das funktioniert also auch:

      echo mypassw0rd>a.dll:asdf
      for /F "usebackq delims=" %%i in (a.dll:asdf) do echo %%i
      

      Check, funktioniert.
      2.) Upload auf FTP, Download, Data Streams sind gelöscht, damit auch die Informationen. Somit vermutlich auch keinerlei Cloud-Speicherung usw.

      Dennoch, wie gesagt, eine ausreichende Spielerei und nicht-kritische Daten etwas schwerer zugänglich zu machen.

  2. Alles richtig erkannt. 🙂

    Noch ein kleiner Einwurf zur Obfuscation: Obfuscation hilft nie. Eine Standardmethode, die auch ich inzwischen einsetze, um Code zu deobfuscaten, ist, den Code an kritischen Stellen so zu modifizieren, dass der deobfuscatete Content einfach ausgegeben wird.

    In deinem Fall könnte man z.B. einfach folgendes einbauen:

    echo %mlp%.%crx%:%bts%

    Das Vorgehen funktioniert auch bei JavaScript-Malware wunderbar – natürlich muss man sicherstellen, dass der deobfuscatete Code nicht ausgeführt wird. 😀

  3. Deswegen mein Anmerkung unter dem Bild 😉
    Ich selbst hab im Script ja einfach mit „echo Datei: %mlp%.%crx%“ den fertigen Dateinamen ausgegeben.
    Aber ich will mal sehen wie unsere Mitarbeiter den Batch Code schreiben 😀 So einfach er ist, Grundwissen muss man dafür schon haben.

  4. hallo dringende hilfe benötigt
    ich möchte das das ausgelesene passwort
    dann im script eingefügt wird so das ich eine netzwerkanmeldung machen kann im cmd
    ich habe berreitz die grundfunktion
    net use * /delete /yes

    net use z: \\DSSTATION-415\usbshare1 /user:admin %PASSWORD%

    satatt dem „PASSWORD“
    soll
    for /F „usebackq delims=“ %i in (file.bat:pwd) do echo %i

    es dann an dieser stelle eintragen eintragen
    aktuell wird es nur ausgelesen kommt aber an falscher possition.

    1. Es ist schon ne Weile her.
      Die Frage kommt bestimmt öfter auf.

      Folgendes:
      Für eine Batch-Datei muss der Variablenbezeichner verdoppelt werden (%Variable%, bzw bei einer for-Schleife (%%i)

      setlocal
      REM Mit dieser Einstellung werden Variablen nur lokal benutzt und werden beim Beenden der Batchdatei gelöscht.
      for /F „usebackq delims=“ %%i in (file.bat:pwd) do set Password=% %i
      REM hier wird der aus dem ADS ausgelesene String der Variablen „Password“ zugeordnet
      net use * /delete /yes
      REM Alle per net-use verbundenen Laufwerke werden getrennt
      net use z: \\DSSTATION-415\usbshare1 %Password% /user:admin
      REM Das Variable „Password“ wird nach dem Pfad eingefügt.
      set Password=
      REM Die Variable Password wird wieder gelöscht. Ist bei „setlocal“ nicht unbedingt nötig.
      exit

      Noch ein Tipp am Ende:
      Man kann das Ganze noch toppen, indem man die ADS-Strings vorher in HEX wandelt und sie mit der Batch wieder in Ascii zu konvertieren.
      Das macht den Code komplizierter, schreckt aber einen Könner auch nicht ab.

      Oder man trägt die Anmeldedaten in cmdkey ein. Dann braucht man kein Passwort mehr.

Schreibe einen Kommentar