Взлом «посоленных» хешей

Взлом «посоленных» хешей

Безопасность веб-приложений: Что можно, а что нельзя делать при шифровании с использованием соли.

Автор: Fb1h2s

Источник: garage4hackers.com

Безопасность веб-приложений: Что можно, а что нельзя делать при шифровании с использованием соли

Обзор:
Вопрос безопасности баз данных стал более насущным по мере того, как базы данных становились более открытыми. Шифрование является одним из пяти основных факторов безопасности данных.
Небезопасной практикой является хранение такой важной информации, как пароль, номер кредитной карты в базе данных в незашифрованном виде. Эта статья охватывает различные возможности шифрования.
Даже в если вы зашифровали вашу информацию, это совершенно не значит, что она находится в полной безопасности.  В этой статье рассматриваются действия со стороны злоумышленника.


Соль (Криптография)
http://en.wikipedia.org/wiki/Salt_(cryptography)
Предположим, что украден хешированный пароль пользователя. Известно, что пароль является одним из 200,000 английских слов. Система использует 32-х битную соль.  «Посоленный» ключ – это оригинальный пароль, добавленный к произвольной 32-х битной соли. Из-за соли посчитанные хеши злоумышленника не подойдут (не удастся использовать радужные таблицы). Злоумышленник должен посчитать хеш каждого слова с каждым из 232 (4,294,967,296) возможных вариантов соли, добавленных к паролю, до тех пор, пока не будет получено совпадение. Общее число возможных комбинаций может быть получено умножением количества слов в словаре на количество возможных вариантов соли:
2^{32} \умножить на 200 000 = 8.58993459 \умножить на 10^{14}
Для завершения брут-форс атаки злоумышленник должен перебрать почти 900 триллионов хешей, вместо всего-лишь 200,000.  Даже если пароль сам по себе достаточно прост, соль делает взлом паролей достаточно сложной операцией.
Соль должна быть неизвестной. Если злоумышленник знает, какая используется соль, он сразу может перейти к первому шагу. Ниже приведены несколько возможных способов взлома «посоленных» хешей.


Приложения, не использующие хеши:
Во время изучения веб-приложения я дошел до этого места программы. Программа использовала javascript для шифрования пароля пользователя перед отправкой. В качестве соли использовался текущий ID сессии.

onclick="javascript:document.frm.id.value='user';

document.frm.passwd.value='value';

this.form.passwd.value=(hex_md5('CC6AB28BA9FAD121184B09E00F1DD6E7'+this.form.passwd.value));
this.form.submit();

Where “CC6AB28BA9FAD121184B09E00F1DD6E7”.


Итак, на сервере:

На сервере программа не сможет проверить значение пароля по причине использования соли и случайного ID сессии. И поскольку MD5 является нереверсивной хеш-функцией, пароль не сможет быть проверен до тех пор, пока пароли хранятся в виде текста в базе данных.

В качестве соли для шифрования пароля перед отправкой используется случайно сгенерированный ID сессии. Это значит, что серверные базы данных не будут зашифрованы.

Иногда такого рода программы выдают много информации.

Пункт №1: Всегда шифруйте вашу базу данных паролей.

«Посоленные» хеши

Недавно я изучал базу данных одной известной !@#$$il[зашифровано]☺. База данных содержала адреса электронной почты и пароли. К сожалению, пароли были зашифрованы и хранились в виде хешей. Таким образом, эта статья будет посвящена тому, как я взломал эти хеши.
Взлом хешей:
Несколько возможных способов взлома хешей паролей:

  1. Алгоритм, используемый для хеширования,  должен иметь какие-то изъяны. Хеши должны быть реверсивными
  2. Использование брут-форс атаки для перебора хешей с помощью словаря или радужных таблиц.
  3. Или у вас просто UPDATE привилегии. Тогда просто замените значения хешей паролей на известные вам.

Для того, чтобы использовать все эти виды атак, вы должны знать, при помощи какого алгоритма был посчитан хеш.
Что можно сделать, чтобы выяснить используемый алгоритм хеширования??
Ответ: Все алгоритмы генерируют хеш фиксированной длины. Поэтому на основании выходного значения вы можете прикинуть, какой алгоритм использовался☺. “Все это – достаточно известные факты”, но по-прежнему я помещаю их здесь.
Для этого я размещу небольшую таблицу для выявления хеш-функций на основе их выходного значения


Язык: Алгоритм:

PHP

ASP

JAVA

MD5

Функция: md5(“входные данные”); Hash(“входные данные”); Вывод: 32 Символа Пример: “5f4dcc3b5aa765d61d8327d eb882cf99”

Функция: System.Security.Cryptogr aphy Вывод: 32 Символа Пример: “5f4dcc3b5aa765d61d8327d eb882cf99”

Функция:java.secur ity.MessageDigest Вывод: 32 Символа Пример: “5f4dcc3b5aa765d61d 8327deb882cf99”

Соль+Crypt()

Функция: Crypt() По-умолчанию DES вывод: 13 Символов Пример: “sih2hDu1acVcA”

“ “

“ “

И многие другие:
Источник: http://www.insidepro.com/eng/passwordspro.shtml


Тип хеша

Пример хеша

Дополнительная информация

DES(Unix)

IvS7aeT4NzQPM

Используется в Linux и подобных ОС.
Длина: 13 символов
Описание:Первые 2 символа – соль (случайные символы. в нашем примере “Iv”), затем хеш

Domain Cached Credentials

Admin:b474d48cdfc4974d86ef4d24904cdd91

Используется для хеширования паролей домена Windows.
Длина: 16 байтов
Алгоритм: MD4(MD4(Unicode($pass)).Unicode(strtolower($username)))

MD5(Unix)

$1$12345678$XM4P3PrKBgKNnTaqG9P0T/

Используется в Linux и подобных ОС.
Длина: 34 символа
Описание: Хеш начинается с сигнатуры $1$, затем идет соль (до 8 произвольных символов, в нашем примере "12345678”), затем еще один символ $ и после него сам хеш.
Алгоритм: Вызов алгоритма MD5 2000 раз.

MD5(APR)

$apr1$12345678$auQSX8MvzttdBi4y6Xgi

Используется в Linux и подобных ОС.
Длина: 37 символв
Описание: Хеш начинается с сигнатуры $apr1$, затем следует соль (до 8 произвольных символов, в нашем примере "12345678"),затем еще один символ $ и после него сам хеш.
Алгоритм: Вызов алгоритма MD5 2000 раз.

MD5(phpBB3)

$H$9123456785DAERgALpsri.D9z3ht120

Используется в phpBB 3.x.x
Длина: 34 символа
Описание: Хеш начинается с сигнатуры $H$, затем идет один символ (чаще всего 9), затем следует соль (до 8 произвольных символов, в нашем примере "12345678"),затем сам хеш.

MD5(Wordpress)

$P$B123456780BhGFYS|UqGyE6ErKErL01

Используется в Wordpress
Длина: 34 символа
Описание: Хеш начинается с сигнатуры $P$, затем идет один символ (чаще всего B), затем следует соль (до 8 произвольных символов, в нашем примере "12345678"),затем сам хеш.
Алгоритм: Вызов алгоритма MD5 8192 раз

MySQL

606717496665bcba

Используется в старых версиях MySQL
Длина: 8 байтов.
Описание: Хеш состоит из двух DWORD строк, значение каждой из которой не превышает 0x7ffffff

MySQL5

*E6CC90B878B948C35E92B003C792C46C58C4AF40

Используется в новых версиях MySQL
Длина: 20 байт
Алгоритм: SHA-1(SHA-1($pass))
Примечание: Хеши загружаются без звездочки в начале.

RAdmin v2.x

5e32cceaafed5cc80866737dfb212d7f

Используется в приложении Remote Administrator v2.x
Длина: 16 байтов
Алгоритм: К паролю добавляются нули для получения длины в 100 байт, а затем вся строка хешируется при помощи алгоритма MD5

MD5

c4ca4238a0b923820dcc509a6f75849b

Используется в phpBB v.2.x, Joomla версии ниже 1.0.13 и в других форумах и CMS.
Длина: 16 байтов
Алгоритм: Тот же что и md5() функции в PHP

md5($pass.$salt)

6f04f0d75f6870858bae14ac0b6d9f73:1234

Используется в WB News, Joomla версии 1.0.13 и выше
Длина: 16 байтов

md5($salt.$pass)

f190ce9ac8445d249747cab7be43f7d5:12

Используется в osCommerce, AEF, Gallery и других CMS
Длина: 16 байтов

md5(md5($pass))

28c8edde3d61a0411511d3b1866f0636

Используется в e107, DLE, AVE, Diferior, Koobi и других CMS
Длина: 16 байтов

md5(md5($pass).$salt)

6011527690eddca23580955c216b1fd2:wQ6

Используется в vBulletin, IceBB
Длина: 16 байтов

md5(md5($salt).md5($pass))

81f87275dd805aa018df8befe09fe9f8:wH6_S

Ипользуется в IPB
Длина: 16 байтов

md5(md5($salt).$pass)

816a14db44578f516cbaef25bd8d8296:1234

Ипользуется в MyBB
Длина: 16 байтов

md5($salt.$pass.$salt)

a3bc9e11fddf4fef4deea11e33668eab:1234

Используется в TBDev
Длина: 16 байтов

md5($salt.md5($salt.$pass))

1d715e52285e5a6b546e442792652c8a:1234

Используется в DLP
Длина: 16 байтов

SHA-1

356a192b7913b04c54574d18c28d46e6395428ab

Используется во многих форумах и CMS
Длина: 20 байтов

sha1(strtolower($username).$pass)

Admin:6c7ca345f63f835cb353ff15bd6c5e052ec08e7a

Используется в SMF
Длина: 20 байтов

sha1($salt.sha1($salt.sha1($pass)))

cd37bfbf68d198d11d39a67158c0c9cddf34573b:1234

Используется в Wotlab BB
Длина: 20 байтов

SHA-256(Unix)

$5$12345678$jBWLgeYZbSvREnuBr5s3gp13vqi…

Используется в Linux и подобных ОС.
Длина: 55 символов
Описание: Хеш начинается с сигнатуры $5$, затем идет соль (до 8 произвольных символов, в нашем примере "12345678"),затем символ $, а затем сам хеш
Алгоритм: Вызов алгоритма SHA-256 5000 раз

SHA-512(Unix)

$6$12345678$U6Yv5E1|Wn6mEESzKen42o6rbEm…

Используется в Linux и подобных ОС.
Длина: 98 символов
Описание: Хеш начинается с сигнатуры $6$, затем идет соль (до 8 произвольных символов, в нашем примере "12345678"),затем символ $, а затем сам хеш
Алгоритм: Вызов алгоритма SHA-512 5000 раз

Надеемся, данная таблица когда-нибудь пригодится.
И среди этих хешей мне необходимо  взломать хеш длиной 13 символов. Судя по таблице, он был посчитан PHP функцией Crypt.
Простое описание Crypt функции PHP:

  1. Это хеш-алгоритм, который берет «строку» и «соль» и шифрует хеш.
  2. По-умолчанию используется "DES" для шифрования хешей.

Рассмотрим пример:

<?php
$password = crypt('password');
?>


Хеш: laAsfestWEiq1

Пароли сгенерированные таким образом будут основаны на случайной соли из двух цифр.
Или мы можем использовать собственную соль.

<?php
$password = crypt('password',’salt’);
?>
Хеш: sih2hDu1acVcA

Так будет выглядеть код программы проверки пароля:

<?if (crypt($user_password, $password) == $password) {
    echo "Correct Password";
}
?>

Так или иначе, соль добавляется к хешу, что является  особенностью DES. Как я упоминал выше,  криптографическая стойкость шифра при использовании соли высока в том случае, если соль неизвестна злоумышленнику. Но в данном случае это не так. Имея эту информацию, взлом хешей не составляет какого-либо труда☺.
И все эти хеши были легко взломаны. Все, что мне пришлось сделать – это использовать словарь паролей, дополненный неизменной солью. 


Рассмотрим приведенные ниже образцы программ. 


Алгоритм с неизменной солью

$password = $password_input;         //введен пользователем
$salt = "salted";
$password = md5($salt.$password);    
//сохранен в базе данных в виде md5 (saltedpassword)

Хеш: 1423de37c0c1b63c3687f8f1651ce1bf

Соль: salted

В этой программе применяется неизменная соль. Следовательно, она не сохраняется в базе данных. Таким образом, среди хешей мы не сможем найти значение соли.
Для выявления такого алгоритма, нам нужно попробовать следующее:

  1. Создать нового пользователя, используя конечное приложение.
  2. Получить информацию снова и выявить используемый алгоритм при помощи методов, описанных выше.
  3. Представим, что новый пароль был “password”. md5('password’) == “5f4dcc3b5aa765d61d8327deb882cf99”. Вместо этого, значение хеша стало "1423de37c0c1b63c3687f8f1651ce1bf”. Это означает, что используется соль, и она неизменна, т.к. она не добавляется к окончательному хешу.

Взлом соли:
Теперь нам остается только перебрать все хеши, чтобы выяснить значение соли. Например, мы знаем, что соль добавляется к каждому паролю.

Мы знаем:

Md5(‘password’)== “5f4dcc3b5aa765d61d8327deb882cf99”

Теперь вопрос:

Md5(‘password’ + “????WHAT????”) ===
“1423de37c0c1b63c3687f8f1651ce1bf”


Примечание: Никогда не используйте одну и ту же соль для всех хешей:

“Если использовать одну и ту же соль для всех хешей, взломать их будет легко”

Пункт 2: Если ваше PHP приложение хранит в себе важные значения, и вы хотите зашифровать и хранить «посоленные» хеши, в таком случае лучше отказаться от использования функции Crypt() и других функций с неизменной солью.


Алгоритм со случайной солью:

Если для каждого хеша используется случайная соль, что является необходимым для приложения, исходные коды которого доступны публично, просто необходимо хранить соль вместе с хешами. Недостатком этого метода является возможность извлечения соли из хешей. К преимуществам можно отнести то, что злоумышленнику придется строить таблицы хешей для каждой соли при взломе каждого хеша. Это делает сложным взлом множества хешей, но взломать один хеш (например, пароль администратора) все еще возможно.
Рассмотрим пример:

$password = $rand(5);             //введено пользователем
$salt = "salted";
$password = md5($salt.$password);    
//сохранен в базе данных в виде md5(saltedpassword)

Хеш: 6f04f0d75f6870858bae14ac0b6d9f73:14357
(Хеш:Соль)

Соль: 14357


В данном случае мы можем извлечь соль, но так как разные хеши будут иметь разную соль, взлом всех хешей подряд не представляется возможным.
Но все это будет зависеть от стойкости паролей.
В подобных ситуациях единственным вариантом будет перебор паролей по словарю, или нам понадобится программа взлома, распределяющая процесс  на несколько машин.
Радужные таблицы хороши не потому, что они имеют все возможные значения хешей, а из-за быстрого алгоритма «поиска».
Рассмотрим:

Проверка радужных таблиц -> поиск [Быстро]

Перебор -> Чтение значения -> Добавление соли -> Вычисление хеша -> Сравнение [Медленно]

Это делает взлом медленней, даже если мы знаем значение соли.

Поэтому для таких ситуаций пригодится распределенная система взлома

Идея распределенной системы взлома
Идея подобной системы заимствует основной принцип торрентов. Если вам что-то необходимо, для этого вы должны поделиться тем, что имеете. Если вы хотите что-то  взломать, то вы должны поделиться своими вычислительными мощностями.

Так должна выглядеть архитектура системы:

  1. Вы скачиваете клиент программы взлома
  2. У вас есть хеш администратора wordpress, который вы вводите в клиент вместе с солью.
  3. Клиент отправляет хеш на специальный сервер для взлома.
  4. Сервер принимает вас в качестве части распределенной сети для взлома.
  5. Вы получаете обновления с новым набором хешей, алгоритмов для выполнения взлома.
  6. Суть заключается в том, что когда кто-то делает работу за вас, вы должны поработать на него тоже
  7. Ваша работа будет выполняться множеством других компьютеров.

Насколько это ускоряет взлом?
1.Ваш компьютер в сети должен сгенерировать список паролей. Рассмотрим пароль длиной в 9 символов из букв и цифр. Придется перебрать 101559787037052 комбинаций. Ваш компьютер должен перебрать 101559787037052/N, где “N” – общее число клиентов в сети.

2.Ваш компьютер должен пропустить каждый сгенерированный пароль через множество алгоритмов, которые назначены вам, на многопоточном клиенте.
3.Как только клиент взламывает пароль, он отправляется на сервер взлома. Тот, в свою очередь, передает пароль другому пользователю, которому нужна эта информация.
4.Таким образом, если у вас 350 работающих вместе клиентов, то задача будет решена  за день или два.

Поиск неизвестного хеш-алгоритма
Рассмотрим случай с подобным алгоритмом.

  • Рассмотрим ситуацию, когда хеши шифруются множество раз при помощи разных алгоритмов, например:

<?php

$password = sha1('password');
// de4he6la fe4oe6late4he6lade4he6lade4he6la

$final_password= md5($password)


Хеш окончательного пароля: 1423de37c0c1b63c3687f8f1651ce1bf


  • В подобных ситуациях хеши могут выглядеть как MD5, но на самом деле это будет являться MD5 хеш от SHA-1 хеша.

Нам нужен переборщик алгоритмов для того, чтобы узнать конечный алгоритм. 


Переборщик алгоритмов

  • Мне пришла идея скрипта, который берет известный “пароль” и его “хеш”. Затем, скрипт вычисляет хеши при помощи множества разных алгоритмов и пытается найти соответствие. Найдя соответствие, скрипт выдает алгоритм, использовавшийся для вычисления хеша.
  • Пароль и хеши нужно передавать в скрипт в виде обычного текста
  • Он может быть использован в ситуации, описанной выше.

Algorithm_Bruter.php

Затем я буду посещать форумы программистов, и обновлять скрипт различными алгоритмами. Таким образом, я смогу найти нужный алгоритм.

Мы нашли признаки жизни...в вашем смартфоне!

Наш канал — питательная среда для вашего интеллекта

Эволюционируйте вместе с нами — подпишитесь!