2016-05-09 1 views
0

Играя через некоторые wargames и была любопытной, если это было возможно (они, вероятно, хотят, чтобы вы решили ее по-другому, но все же).Брут форсирующий крипт(), если известны хеш соли и пароля?

Там в .c файл с функцией, которая имеет код, который выглядит примерно так:

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

Есть ли способ перебирает это с учетом соли и HASHED пароль уже известны?

+0

Зависит от шифрования. Для грубой силы вам нужно иметь возможность сравнить зашифрованный простой текст с зашифрованным текстом (т. Е. Вам нужно иметь возможность воспроизвести весь метод шифрования. Увидев, что у вас есть эта функция, и вы знаете соль, я бы сказал, что вы Мощные методы шифрования вычислительно сложны в использовании в грубой силе. Поэтому выясните, сколько возможных шифров вам нужно проверить и посмотреть, сколько времени это займет. – Glubus

ответ

4

В отличие от исходного алгоритма crypt() на основе DES, используемого в более старых вариантах Unix, которые могут быть грубо вынуждены с относительно скромными современными ресурсами, более новые Unices, включая большинство GNU/Linux, используют расширенную зашифрованную спецификацию пароля. Вы можете узнать это, если зашифрованный пароль (или соль) начинается с «$ id $», где «id» - это идентификатор алгоритма, см. Таблицу ниже.

«$ 6 $» означает, что SHA-512 используется для шифрования (ну, собственно, хэширования). После второго «$» приходит соль, еще один «$» и SHA-512 пароля.

алгоритм SHA-512 используется как подробно проделать описанное здесь: ftp://ftp.arlut.utexas.edu/pub/java_hashes/SHA-crypt.txt

Этот алгоритм включает в себя, по умолчанию, 5000 раундов SHA-512 для шифрования одного пароля. Выполнение атаки с использованием грубой силы было бы вычислительно недопустимым даже для паролей с умеренной длиной и сложностью. Атака на основе словаря была бы осуществимой, но все еще требующей много времени для более коротких и менее сложных паролей.

Для формата поля пароля см выше, связанную статью или резюме см http://man7.org/linux/man-pages/man3/crypt.3.html, цитируемый в части ниже:

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: Эта статья может представлять интерес: https://www.win.tue.nl/~aeb/linux/hh/hh-4.html

Смежные вопросы