2016-05-09 12 views
0

Durch einige Wargames zu spielen und war neugierig, ob das möglich war (sie wollen wahrscheinlich, dass du es auf eine andere Weise löst, aber immer noch).Brute zwingt crypt() ob Salz und Passwort-Hash bekannt sind?

Es gibt eine .c Datei mit einer Funktion, die Code hat, die etwa wie folgt aussieht:

char buffer[20]; 
scanf("%s", buffer); 
char* hash = crypt(buffer, "$6$") 
char* password = "$6$123456abcdef" #long string 
if (strcmp(password, hash) == 0) supersecretfunction(); 

Gibt es eine Möglichkeit, dies das Salz unter Berücksichtigung für Brute-Force und Hash-Passwort sind bereits bekannt?

+0

Hängt von der Verschlüsselung ab. Um brutale Gewalt anzuwenden, müssen Sie in der Lage sein, einen verschlüsselten Klartext mit dem verschlüsselten Text zu vergleichen (dh Sie müssen in der Lage sein, die gesamte Verschlüsselungsmethode zu reproduzieren. Wenn Sie diese Funktion kennen und Sie das Salz kennen, würde ich sagen Es ist alles auf die Schlüssellänge der Verschlüsselung zurückzuführen. Moderne Verschlüsselungsmethoden sind in Brute-Force-Umgebungen schwer zu verwenden. Finden Sie heraus, wie viele mögliche Verschlüsselungscodes Sie überprüfen müssen und wie lange es dauern wird. – Glubus

Antwort

4

Im Gegensatz zum ursprünglichen DES-basierten crypt() -Algorithmus, der in älteren Unix-Varianten verwendet wird, die mit relativ moderaten modernen Ressourcen brutal erzwungen werden könnten, verwenden neuere Unices einschließlich der meisten GNU/Linux-Varianten eine erweiterte verschlüsselte Passwortspezifikation. Sie können dies erkennen, wenn das verschlüsselte Passwort (oder Salt) mit "$ id $" beginnt, wobei "id" eine Algorithmuskennung ist, siehe Tabelle unten.

"$ 6 $" zeigt an, dass SHA-512 für die Verschlüsselung verwendet wird (na ja, Hashing tatsächlich). Nach dem zweiten '$' kommt das Salz, ein weiteres '$' und das SHA-512 des Passwortes.

Der verwendete SHA-512-Algorithmus wird hier im Detail decribed: ftp://ftp.arlut.utexas.edu/pub/java_hashes/SHA-crypt.txt

Dieser Algorithmus beinhaltet standardmäßig 5000 Runden von SHA-512 ein einziges Passwort für die Verschlüsselung. Ein Brute-Force-Angriff wäre für Passwörter mit moderater Länge/Komplexität rechnerisch unmöglich. Ein wörterbuchbasierter Angriff wäre machbar, aber immer noch zeitaufwändig für kürzere, weniger komplexe Passwörter.

Für das Format des Passwort-Feld finden Sie in der oben verlinkten Artikel oder für eine Zusammenfassung siehe http://man7.org/linux/man-pages/man3/crypt.3.html, unter teilweise zitiert:

If salt is a character string starting with the characters "$id$" 
    followed by a string terminated by "$": 

      $id$salt$encrypted 

    then instead of using the DES machine, id identifies the encryption 
    method used and this then determines how the rest of the password 
    string is interpreted. The following values of id are supported: 

      ID | Method 
      ───────────────────────────────────────────────────────── 
      1 | MD5 
      2a | Blowfish (not in mainline glibc; added in some 
       | Linux distributions) 
      5 | SHA-256 (since glibc 2.7) 
      6 | SHA-512 (since glibc 2.7) 

    So $5$salt$encrypted is an SHA-256 encoded password and 
    $6$salt$encrypted is an SHA-512 encoded one. 

    "salt" stands for the up to 16 characters following "$id$" in the 
    salt. The encrypted part of the password string is the actual 
    computed password. The size of this string is fixed: 

    MD5  | 22 characters 
    SHA-256 | 43 characters 
    SHA-512 | 86 characters 

    The characters in "salt" and "encrypted" are drawn from the set 
    [a-zA-Z0-9./]. In the MD5 and SHA implementations the entire key is 
    significant (instead of only the first 8 bytes in DES). 

Edit: Dieser Artikel ist auch von Interesse sein könnten: https://www.win.tue.nl/~aeb/linux/hh/hh-4.html