Crackme Open

Jan 07 2023
Ein Leitfaden für Anfänger zum Knacken passwortgeschützter Dateien
Machen Sie sich bereit für ein bisschen Hacking-Spaß! In diesem Blogbeitrag zeigen wir Ihnen, wie Sie mit Ubuntu 20.04 LTS in eine einfache ausführbare C-Datei einbrechen, die mit einem Kennwort gesichert ist.
PC: IEEE-Spektrum

Machen Sie sich bereit für ein bisschen Hacking-Spaß! In diesem Blogbeitrag zeigen wir Ihnen, wie Sie mit Ubuntu 20.04 LTS in eine einfache ausführbare C-Datei einbrechen, die mit einem Kennwort gesichert ist. Egal, ob Sie gerade erst anfangen oder ein erfahrener Profi sind, dieses Tutorial bietet für jeden etwas. Zeit, diese Cyber-Fähigkeiten unter Beweis zu stellen!

Alle in diesem Tutorial verwendeten Dateien finden Sie hier auf GitHub . Sie können das Repository in Ihre lokale Umgebung klonen, um auf die verschlüsselten Dateien zuzugreifen.

Zunächst können wir die crackmeDatei ausführen, um ihr Verhalten zu beobachten, indem wir zum Crackme-Verzeichnis navigieren und den folgenden Befehl eingeben:

$ ./crackme

Access Denied

Der fileBefehl wird verwendet, um den Typ einer Datei zu identifizieren. Dazu führt es eine Reihe von Tests in einer bestimmten Reihenfolge durch: Dateisystemtests , Magic-Number-Tests und Sprachtests .

PC: Hier

Diese Tests dienen dazu, den Typ der Datei basierend auf ihrem Inhalt und allen damit verknüpften Metadaten zu bestimmen. Wenn Sie den Befehl verwenden möchten, fileum den Typ einer bestimmten Datei zu identifizieren, können Sie dies tun, indem Sie ihn file [filename]in Ihrem Terminal ausführen. Zum Beispiel:

$ file crackme

crackme: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=e06e0b0229279a69506925702a7f79e36bdc3eb2, not stripped

  1. Eine ausführbare Datei, die für die Ausführung auf einem 64-Bit-Linux-Betriebssystem entwickelt wurde
  2. Für die x86–64-Architektur kompiliert und dynamisch gelinkt, was bedeutet, dass es auf gemeinsam genutzte Bibliotheken angewiesen ist, um zu funktionieren
  3. Interpretiert vom /lib64/ld-linux-x86–64.so.2-Interpreter
  4. Gebaut für GNU/Linux 2.6.24 und hat eine eindeutige Kennung namens „BuildID“
  5. Wurde nicht entfernt, enthält also noch Debugging-Informationen und Symbole, die für die Analyse verwendet werden können.

Es ist auch erwähnenswert, dass ltracees in Verbindung mit anderen Tools wie gdb( GNU Debugger ) verwendet werden kann, um das Verhalten des Programms weiter zu analysieren und es möglicherweise zurückzuentwickeln, was wir für dieses Tutorial nicht verwenden werden.

Wir können ltracedie Crack-Me-Datei ausführen, indem wir den folgenden Befehl eingeben:

$ ltrace ./crackme

__libc_start_main(0x40087d, 1, 0x7ffeef764458, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9)                                                                                                         = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9)                                                                                     = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9)                                                                                                         = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9)                                                                                                    = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9)                                                                                                          = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9)                                                                                                      = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9)                                                                                                            = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9)                                                                                     = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9)                                                                                                  = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9)                                                                                                     = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9)                                                                                         = -4
strncmp("USER=vagrant", "Passw0rd=", 9)                                                                                                            = 5
strncmp("SHLVL=1", "Passw0rd=", 9)                                                                                                                 = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9)                                                                                                       = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9)                                                                                          = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9)                                                                                            = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9)                                                                                     = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9)                                                                                     = -32
strncmp("DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "Passw0rd=", 9)                                                                                     = -12
strncmp("SSH_TTY=/dev/pts/0", "Passw0rd=", 9)                                                                                                      = 3
strncmp("OLDPWD=/home/vagrant/crackme_tut"..., "Passw0rd=", 9)                                                                                     = -1
strncmp("_=/usr/bin/ltrace", "Passw0rd=", 9)                                                                                                       = 15
puts("Access Denied"Access Denied
)                                                                                                                              = 14
+++ exited (status 1) +++

      
                
PC: ALX

  1. __libc_start_mainist eine Funktion, die die Umgebung eines Programms einrichtet und seine Hauptfunktion aufruft. Sie nimmt verschiedene Argumente entgegen und wird von der C-Standardbibliothek ( libc ) bereitgestellt. Es wird von der Haupteinstiegspunktfunktion des Programms aufgerufen.
  2. Die mit beginnenden Zeilen strncmpzeigen, dass das Programm die Funktion aufruft strncmp, bei der es sich um eine Funktion handelt, die eine bestimmte Anzahl von Zeichen (in diesem Fall 9 Zeichen) zweier Zeichenfolgen vergleicht. Die verglichenen Zeichenfolgen scheinen verschiedene Umgebungsvariablen zu sein (z. B. "SHELL", "PWD", "LOGNAME" usw.) und die Zeichenfolge "Passw0rd=". Es scheint, dass das Programm überprüft, ob eine der Umgebungsvariablen mit der Zeichenfolge beginnt "Passw0rd=".
  3. Die putsFunktion wird am Ende mit der Zeichenfolge „ Zugriff verweigert “ aufgerufen, was darauf hinweisen kann, dass das Programm diese Nachricht ausgibt, wenn keine der Umgebungsvariablen mit beginnt "Passw0rd=".

Um eine Umgebungsvariable in Linux zu setzen, können wir den exportBefehl im Terminal verwenden. Um beispielsweise eine Umgebungsvariable mit dem Namen Passw0rdauf den Wert zu setzen test, können wir Folgendes ausführen:

export Passw0rd=test

$ ltrace ./crackme

__libc_start_main(0x40087d, 1, 0x7fff085f1d38, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9)                                                                                                         = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9)                                                                                     = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9)                                                                                                         = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9)                                                                                                    = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9)                                                                                                          = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9)                                                                                                      = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9)                                                                                                            = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9)                                                                                     = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9)                                                                                                  = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9)                                                                                                     = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9)                                                                                         = -4
strncmp("USER=vagrant", "Passw0rd=", 9)                                                                                                            = 5
strncmp("SHLVL=1", "Passw0rd=", 9)                                                                                                                 = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9)                                                                                                       = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9)                                                                                          = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9)                                                                                            = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9)                                                                                     = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9)                                                                                     = -32
strncmp("Passw0rd=test", "Passw0rd=", 9)                                                                                                           = 0
MD5_Init(0x7fff085f1b90, 0x400b06, 9, 6)                                                                                                           = 1
strlen("test")                                                                                                                                     = 4
MD5_Update(0x7fff085f1b90, 0x7fff085f2f68, 4, 0x7fff085f2f68)                                                                                      = 1
MD5_Final(0x7fff085f1bf0, 0x7fff085f1b90, 0x7fff085f1b90, 0)                                                                                       = 1
sprintf("09", "%02x", 0x9)                                                                                                                         = 2
sprintf("8f", "%02x", 0x8f)                                                                                                                        = 2
sprintf("6b", "%02x", 0x6b)                                                                                                                        = 2
sprintf("cd", "%02x", 0xcd)                                                                                                                        = 2
sprintf("46", "%02x", 0x46)                                                                                                                        = 2
sprintf("21", "%02x", 0x21)                                                                                                                        = 2
sprintf("d3", "%02x", 0xd3)                                                                                                                        = 2
sprintf("73", "%02x", 0x73)                                                                                                                        = 2
sprintf("ca", "%02x", 0xca)                                                                                                                        = 2
sprintf("de", "%02x", 0xde)                                                                                                                        = 2
sprintf("4e", "%02x", 0x4e)                                                                                                                        = 2
sprintf("83", "%02x", 0x83)                                                                                                                        = 2
sprintf("26", "%02x", 0x26)                                                                                                                        = 2
sprintf("27", "%02x", 0x27)                                                                                                                        = 2
sprintf("b4", "%02x", 0xb4)                                                                                                                        = 2
sprintf("f6", "%02x", 0xf6)                                                                                                                        = 2
strcmp("c4032d9e95a93d91b9b595dcfcca640b"..., "098f6bcd4621d373cade4e832627b4f6"...)                                                               = 51
puts("Access Denied"Access Denied
)                                                                                                                              = 14
+++ exited (status 1) +++

      
                
PC: Here

  1. Wir wissen bereits, dass die erste Zeile zeigt, dass die __libc_start_mainFunktion mit vier Argumenten aufgerufen wurde: der Adresse der Hauptfunktion, der Anzahl der Programmargumente, einem Zeiger auf ein Array der Programmargumente und einem Zeiger auf eine Funktion, die aufgerufen werden soll, wenn die Hauptfunktion aufgerufen wird kehrt zurück.
  2. Die folgenden Zeilen zeigen eine Reihe von Aufrufen der strncmpFunktion, die zwei Zeichenfolgen vergleicht und eine Ganzzahl zurückgibt, die ihre lexikografische Reihenfolge angibt. Es scheint, dass das Programm versucht, jede der Umgebungsvariablen im System mit der Zeichenfolge zu vergleichen "Passw0rd=".
  3. Danach folgen Aufrufe der Funktionen MD5_Init, MD5_Update, und MD5_Final, die Teil der kryptografischen Hash-Funktion von MD5 sind. Es sieht so aus, als würde das Programm den MD5-Hash des Werts der Umgebungsvariablen Passw0rd berechnen.
  4. Als nächstes folgen Aufrufe der sprintfFunktion, die einen String formatiert und in einem Puffer speichert. Es scheint, dass das Programm die Bytes des MD5-Hash als Hexadezimalwerte formatiert und in Zeichenfolgen speichert.
  5. Die Ausgabe enthält einen Aufruf der strcmpFunktion mit zwei Zeichenfolgen als Argumente: „c4032d9e95a93d91b9b595dcfcca640b“ und „098f6bcd4621d373cade4e832627b4f6“. Dies zeigt an, dass das Programm den MD5-Hash des Passworts mit dem Hash der exportierten Umgebungsvariable Passw0rd vergleicht.
  6. Die putsFunktion wird am Ende mit dem String „Access Denied“ aufgerufen, der anzeigt, dass das Passwort falsch ist. Dies wird jedoch wahrscheinlich bald behoben werden.

Wir können diese Website verwenden, um die gehashten Zeichenfolgen auf ihre Werte umzukehren.

Quelle: MD5 Center

Nachdem wir festgestellt haben, dass das gehashte Passwort LionelMessi lautet , können wir die Passw0rdUmgebungsvariable auf diesen Wert setzen und den ltraceBefehl erneut ausführen, um zu sehen, ob er ein anderes Ergebnis liefert. Lass es uns versuchen!

$ export Passw0rd=LionelMessi
$ ./crackme
Access Granted

PC: hier

Es ist immer wichtig, daran zu denken, starke, eindeutige Passwörter zu verwenden und Passwörter niemals für verschiedene Konten wiederzuverwenden.

Halten Sie Ausschau nach unserer bevorstehenden Veröffentlichung auf GitHub eines C-Programms, das MD5-Hashes mit einem Wörterbuch vergleicht und sie in ihre ursprüngliche Zeichenfolgenform umkehrt. Bleib dran!

Wir hoffen, dass Ihnen dieses Tutorial zum Knacken einer einfachen Datei gefallen hat. Wenn Sie Kommentare oder Fragen haben, zögern Sie bitte nicht, diese im Kommentarbereich unten zu hinterlassen. Fröhliches Hacken!