Daten|teiler
Kopieren als Kulturtechnik

Steganografie für Anfänger

22. August 2011 von Christian Imhorst

Für die August-Ausgabe der Hakin9 habe ich meinen alten Blog-Post Steganografie für Anfänger „recycelt“. Der neue Artikel ist etwas anders strukturiert und um Befehle für die PowerShell erweitert worden:

Steganografie kommt aus dem Griechischen und heißt “geheimes Schreiben”. Herodot berichtet, dass einem Sklaven der Kopf geschoren wurde, um die Nachricht auf seine Kopfhaut zu tätowieren. Als das Haar wieder nachgewachsen war, wurde er zum Empfänger der geheimen Nachricht geschickt, der den Kopf des Sklaven wieder rasierte, um sie lesen zu können. Die Haare haben also die eigentliche Nachricht verdeckt. Ähnlich funktioniert Steganografie noch 2500 Jahre danach. Steganografie ist die Kunst, Information zu tarnen, um sie verborgen zu übermitteln. Ihr Zweck ist also, geheime Information mithilfe anderer unverfänglicher Information so zu verbergen, dass sie von einem unbedarften Beobachter, Mensch oder Maschine, nicht erkannt wird. Eine geheime Nachricht wird dabei in einer anderen Nachricht, zum Beispiel in einer Bilddatei versteckt. Dem Empfänger muss natürlich bekannt sein, dass das Bild eine geheime Nachricht enthält, so wie dem Empfänger in der Antike klar sein musste, dass sich die Nachricht unter dem Haar des Sklaven befand. Wenn das Originalbild fehlt, ist es sehr schwierig herauszufinden, ob ein Bild eine Geheimbotschaft versteckt. Die meisten Steganogramme werden enttarnt, wenn sie mit der Originaldatei verglichen werden und sich daraus Abweichungen ergeben. Wenn das Original gelöscht und ein gutes Bild mit vielen Unschärfen, hoher Pixelzahl und wenig Kanten gewählt wurde, dann ist im Prinzip nicht mehr festzustellen, ob eine Bilddatei ein Steganogramm ist.

Man kann eine Textdatei auch ohne aufwendige Software wie Steghide [1] oder Outguess [2] in einer Bilddatei verstecken. Wobei diese Methode auf keinen Fall sicher ist, da die Information nicht im Bild selbst eingebettet und damit versteckt wird, sondern einfach an die Datei angehängt wird. Mit einem einfachen Archivprogramm wie Unzip, Unrar oder 7-Zip [3] kann die Information problemlos wieder ausgelesen werden. Man kann aber auf diesem Weg zumindest Dateien vor den Augen eines durchschnittlichen Computernutzers verstecken. Das Bild der Quell- und Zieldatei wird aber zum Schluss des Experiments nur deshalb genau gleich aussehen, weil das Ende der Datei, also die komprimierte Textdatei, nicht mehr zu den Bilddaten gehört.

Das Experiment erfolgt einmal mit den Bordmitteln von Unix, genau genommen mit der Kommandozeile Bash, die es in vielen Linux-Distributionen und in MacOS X gibt. Auf der Seite von Windows findet das Experiment in der PowerShell statt, die seit Windows 7 vorinstalliert ist und für Vista und XP kostenfrei heruntergeladen werden kann. Für das Experiment erstellt man in der Konsole zuerst die Textdatei meeting.txt zusammen mit der geheimen Nachricht. Egal, ob man die Bash oder die PowerShell benutzt, tippt man folgendes ein:

echo "Dies ist der geheime Text" > meeting.txt

Einer der vielen Vorteile der PowerShell gegenüber der alten Konsole cmd.exe ist zum Beispiel, dass man ein paar Befehle der Bash eins zu eins übernehmen kann, weil sie Aliase von Commandlets, also der eigentlichen Befehle sind. Dabei ist der Befehl echo in der Powershell ein Alias für den eigentlichen Befehl Write-Output. Anschließend wird die Datei als Zip-Datei gepackt, was in der Bash mit dem Befehl zip kein Problem ist:

zip meeting.txt.zip meeting.txt

In der PowerShell ist das etwas schwieriger. Am einfachsten ist es vielleicht, die Text-Datei im Explorer mit der rechten Maustaste anzuklicken und im Kontextmenü dann „Senden an“ und „ZIP-komprimierten Ordner“ auszuwählen, oder eine Software wie 7-Zip zu verwenden. Ganz hartgesottene können auch das folgende Skript nehmen, den Text in einen Editor wie Notepad einfügen und als Datei zip.ps1 abspeichern.

#Parameter für das Skript 
Param([string]$file,[string]$zipfile)
$CurPath = get-location
$filepath = -join ($CurPath, "\", $file)
$zipfilepath = -join ($CurPath, "\", $zipfile)
 
#Die Zip-Datei wird erstellt
$zipHeader=80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
$fmode=[System.IO.FileMode]::Create
$emptyZip=new-object -type System.IO.FileStream $zipfilepath, $fmode
$emptyZip.Write($zipHeader,0,22) 
$emptyZip.Flush() 
$emptyZip.Close()
 
#Die Text-Datei wird in das Zip-Archiv kopiert
$shell=New-Object -ComObject Shell.Application 
$zip=$shell.Namespace($zipfilepath) 
$zip.Copyhere($filepath)

Das Skript wird dann innerhalb der PowerShell ausgeführt:

.\zip.ps1 meeting.txt meeting.txt.zip

Der Unix-Befehl cat wird dazu genutzt, um zwei Dateien miteinander zu verketten. In diesem Fall sind es die Dateien Pingu.jpg und meeting.txt.zip, die mit dem Größer-als-Zeichen (>) in die neue Datei secret.jpg umgeleitet werden; eine Bilddatei, an der dann die „geheime“ Botschaft angehängt ist.

cat Pingu.jpg meeting.txt.zip > secret.jpg

Den Befehl cat gibt es als Alias auch auf der PowerShell und steht hier wiederum für das Cmdlet Get-Content, funktioniert allerdings nicht mit dem Größer-als-Zeichen. Hier muss man die Ausgabe von Get-Content nach Set-Content, die Kurzform ist sc, weiterleiten, damit die neue Datei erstellt wird:

cat -Encoding Byte "Pingu.jpg","meeting.txt.zip" | sc -Encoding Byte secret.jpg

Danach löscht man die Original- und die Zip-Datei von meeting.txt mit dem Befehl rm. Da rm auf der PowerShell ein Alias von Remove-Item ist, funktioniert der Befehl in beiden Shells.

rm mee*

Mit dem Befehl unzip kann man auf der Bash die Textdatei jeder Zeit wieder aus dem Steganogramm extrahieren.

unzip secret.jpg
   Archive:  secret.jpg
   extracting: meeting.txt

Den Befehl unzip gibt es auf der PowerShell leider genauso wenig, wie den Befehl zip. Da Windows in der Datei secret.jpg unbedingt eine Bilddatei sehen will, helfen auch Bordmittel wie die Bibliothek zipfldr.dll nicht weiter, die unter Windows dafür sorgt, dass man sich ZIP-Archive im Explorer anschauen kann. Deshalb entpackt der folgende Befehl auch nicht die Zip-Datei, sondern öffnet einfach nur das Bild:

rundll32.exe zipfldr.dll,RouteTheCall secret.jpg

Externe Archiv-Programme wie 7-Zip kann man aber nicht täuschen. Der folgende Befehl in der PowerShell entpackt die Datei meeting.txt aus der versteckten Zip-Datei, vorausgesetzt natürlich, 7-Zip ist auch installiert:

& "$env:ProgramFiles\7-Zip\7z.exe" e secret.jpg

Den Inhalt der gelöschten und nun wieder entpackten Datei meeting.txt kann man sich im letzten Schritt mit dem Befehl cat anschauen, was wieder in beiden Shells funktioniert.

cat meeting.txt
   Dies ist der geheime Text

Man sieht also, dass dieses Steganogramm sehr leicht auszulesen ist. Wenn man die Größe der beiden Dateien in der Konsole vergleicht, sieht man auch, dass secret.jpg 180 Byte größer ist, als das Originalbild:

-rw-r--r-- 1 christian christian    26 2011-06-26 11:00 meeting.txt
-rw-r--r-- 1 christian christian 37244 2011-05-13 21:07 pingu.jpg
-rw-r--r-- 1 christian christian 37424 2011-06-26 11:00 secret.jpg

Dadurch wird sofort klar, dass secret.jpg etwas verbergen könnte und das Steganogramm ist leicht enttarnt. Diese Methode ist also – wie bereits gesagt – nicht sehr sicher.

Allerdings wird durch dieses Experiment auch ein weiterer Nachteil der Steganografie klar: Sie ist symmetrisch. Das heißt, Sender und Empfänger müssen sich gegenseitig darüber informieren, dass ein Steganogramm unterwegs ist und, sollte es verschlüsselt sein, mit welcher Passphrase es verschlüsselt wurde. Diese Form der Verschlüsselung ist anfällig für Angriffe, die versuchen, den Code zu knacken. So kann sich beim Man-in-the-middle-attack jemand zwischen Sender und Empfänger schalten und die Passphrase und das Steganogramm mitschneiden.

Um diese Sicherheitslücke zu umgehen, wird Steganografie meist zusammen mit der asymmetrischen Verschlüsselung benutzt. Mit einem Programm wie PGP [4] oder GnuPG [5] wird ein Schlüsselpaar erstellt. Dabei ist der erste Schlüssel ein geheimer und der zweite ein öffentlicher Schlüssel. Der öffentliche Schlüssel kann möglichst weit verteilt werden, meinen kann man zum Beispiel im Impressum meines Weblogs finden. Wenn mir jemand eine Nachricht schreibt, die mit meinem öffentlichen Schlüssel verschlüsselt ist, kann nur ich sie mit meinem geheimen Schlüssel entschlüsseln. Wenn jemand nicht wissen soll, dass ich mir mit einer weiteren Person verschlüsselte Botschaften austausche, kann man sie in einem Steganogramm verstecken. Das macht vor allem in Ländern Sinn, die Verschlüsselung verbieten. Sollte ein Steganogramm enttarnt werden, dann hat der Angreifer zwar die verschlüsselte Botschaft, kann sie aber ohne den geheimen Schlüssel nicht lesen. Selbst wenn er den geheimen Schlüssel stehlen sollte, braucht er noch die Passphrase, um die Botschaft entschlüsseln zu können. Steganografie kombiniert mit asymmetrischer Verschlüsselung ist in der Regel nur dann sinnvoll, wenn geheime Nachrichten zwischen Sender und Empfänger ausgetauscht werden und niemand wissen soll, dass es sich dabei um geheime Nachrichten handelt. Dafür sollte man dann aber professionelle Programme verwenden.

[1] http://steghide.sourceforge.net/
[2] http://www.outguess.org/
[3] http://www.7-zip.de/
[4] http://www.pgp.de/
[5] http://www.gnupg.org/index.de.html

Geschrieben in Publikationen