Comments 40
Мне интересно знать, насколько такой рандом юзабелен:
$random = uniqid(mt_rand(), true);
Гениально.
А откуда мы узнаем когда и во сколько была создана сессия, идентификатор которой мы подбираем?
Можно просто не послать id сессии в куке, и тогда она будет каждый раз генериться заново
Идентификатор собственной сессии чем-то секретным не является.
Смысл в том, что нужен как раз собственный PHPSESSID, с помощью него мы можем получить сид для mt_rand(), uniqid(), т.е. предугадывать все случайные числа.
Если обратиться к скрипту с session_start() без Cookie PHPSESSID, генерируется новый PHPSESSID, отправляется клиенту в Set-Cookie. php_combined_lcg инициализируется при запуске нового процесса, поэтому задача атакующего — заставить веб-сервер создать несколько свежих процессов, при чем так, чтобы microtime обладал наиболее низкой энтропией (с помощью техник ATS и Request Twins). Создать новые процессы можно путем отправки большого количества Keep-Alive запросов. Т.е. отправляя keep-alive запросы на скрипт c session_start, можно получить PHPSESSID из свежего процесса, в котором атакующий брутит pid, microtime, две дельты. IP и время (заголовок Date), естественно известны.
Тут не подбирается id сессии, он известен, тут описывается уязвимость в функциях типа mt_rand
Ссылка на оригинал: crypto.di.uoa.gr/CRYPTO.SEC/Randomness_Attacks.html
И да, Take One 2008 года: raz0r.name/articles/predskazyvaem-sluchajnye-chisla-v-php/
Допустим, Вы занимаетесь подбором сессий, и для этого Вам необходимо сделать N запросов к серверу.
Как на это отреагирует аппаратная часть защиты, которая ведет мониторинг трафика на наличие аномалий? ( к примеру Cisco IPS 4200)
Как на это отреагирует аппаратная часть защиты, которая ведет мониторинг трафика на наличие аномалий? ( к примеру Cisco IPS 4200)
нет их делать не надо) в том то и вся соль, запросов там будет десятка 2 не более
Сессии мы брутим у себя, требуется отправлять запросы лишь для создания новых процессов. Как правило, требуется всего ~100 keep-alive запросов для Apache+mod_php, чтобы веб-сервер начал создавать новые процессы.
Тогда вопрос: как сделать ту же uniqid менее угадываемой?
Хм, а откуда информация о том, что PHPSESSID это 32x (то есть генерируется именно из md5)?
Проверил — выдаётся строка из 26 символов вида «vranubpab5ab56aedat6r8jak6», в документации по PHP не сказано про md5(неважночто).
Проверил — выдаётся строка из 26 символов вида «vranubpab5ab56aedat6r8jak6», в документации по PHP не сказано про md5(неважночто).
В PHP есть две директивы:
- session.hash-function — по умолчанию 0 (md5), 1 — sha1
- session.hash-bits-per-character — преобразовывает байты хэша в удобочитаемый формат, возможные значения '4' (0-9, a-f), '5' (0-9, a-v) и '6' (0-9, a-z, A-Z, "-", ","). У нас реализован только режим '4', так как он наиболее часто используется, но мы скоро добавим поддержку и остальных форматов.
Хмм, то есть vranubpab5ab56aedat6r8jak6 это те же самые байты хеша, но в другой последовательности?
Да, это тот же md5. Функция bin_to_readable.
И вдогонку — что скажете о следующих настройках сервера?
session.entropy_file = /dev/urandom
session.entropy_length = 128
А в чем различия от исследлования Сами 2010 года?
media.blackhat.com/bh-us-10/whitepapers/Kamkar/BlackHat-USA-2010-Kamkar-How-I-Met-Your-Girlfriend-wp.pdf
samy.pl/phpwn/
Я не «обидеть» или «наехать» хочу, если что… просто он(Сами) про это рассказывал давно, и вроде идея та же самая была и софт он показал (практическая реализация), а перечитывать и искать новизну — лень, все таки раз это исследование, то обзор аналогов обязательная часть 8)))
Спасибо за статью в любом случае!
media.blackhat.com/bh-us-10/whitepapers/Kamkar/BlackHat-USA-2010-Kamkar-How-I-Met-Your-Girlfriend-wp.pdf
samy.pl/phpwn/
Я не «обидеть» или «наехать» хочу, если что… просто он(Сами) про это рассказывал давно, и вроде идея та же самая была и софт он показал (практическая реализация), а перечитывать и искать новизну — лень, все таки раз это исследование, то обзор аналогов обязательная часть 8)))
Спасибо за статью в любом случае!
Да, с этой работой мы разумеется знакомы. Действительно, идея та же, но софт Сами в реальных условиях едва ли применим, так как требует информацию, которую можно получить только локально на атакуемой машине, например pid и вывод функции lcg_value(). Новизна в том, что энтропию microtime можно значительно уменьшить за счет техник ATS и Request Twins, кроме того, в работе Сами не учитывается то, что у атакующего есть возможность заставить веб-сервер создавать новые процессы со свежими сидами для php_combined_lcg.
Софт Сами можно назвать просто PoC'ом, так как не реализует даже многопоточности, нам же было необходимо готовое решение для внутреннего пользования, что привело к созданию такой программы (есть и pro версия ;))
Софт Сами можно назвать просто PoC'ом, так как не реализует даже многопоточности, нам же было необходимо готовое решение для внутреннего пользования, что привело к созданию такой программы (есть и pro версия ;))
Спасибо за хороший инструмент и статью! А можете собрать вариант для ATI карточек под OpenCL? Они быстрее и дешевле Nvidia.
Есть практические суровые НО, на которые стоит обратить внимание администраторам, прежде чем пытаться решить проблему на стороне каких-то Cisco.
Эта атака имеет существенное ограничение, про которое не стоит забывать — ей нельзя атаковать реальные веб-проекты. Дело в том, что заголок Date, который необходим в реальной жизни переписывает фронтэндом или балансером. Поэтому мешается. Keep-alive тоже в 50% случаях запрещен просто на балансирующей nginx и приехали. В этих условиях беда-беда, особенно если таймзона аппсервера и балансера разбежались. Это даже если открыт server-status, который в реальной жизни встречается в 5% случаев.
По статье, все очень грамотно изложено, но причем тут фраза «Принцип такой. Отправляем два запроса один за другим: первый на сброс пароля себе, второй — на сброс пароля админа. Разница в microseconds будет минимальна.» и как это связано с PHPSESSID хоть убейте — не понимаю!
Также просьба — пишите, пожалуйста, ссылки на исследования, которые легли в основу в тексте, в частности www.suspekt.org/2008/08/17/mt_srand-and-not-so-random-numbers/ забыли. Ссылки в комментах искать нереально, а разобраться почему работает тот же keep-alive, просто по атаке, очень трудно.
Еще раз спасибо за инструмент и статью, вы МОЛОДЦЫ!
Есть практические суровые НО, на которые стоит обратить внимание администраторам, прежде чем пытаться решить проблему на стороне каких-то Cisco.
Эта атака имеет существенное ограничение, про которое не стоит забывать — ей нельзя атаковать реальные веб-проекты. Дело в том, что заголок Date, который необходим в реальной жизни переписывает фронтэндом или балансером. Поэтому мешается. Keep-alive тоже в 50% случаях запрещен просто на балансирующей nginx и приехали. В этих условиях беда-беда, особенно если таймзона аппсервера и балансера разбежались. Это даже если открыт server-status, который в реальной жизни встречается в 5% случаев.
По статье, все очень грамотно изложено, но причем тут фраза «Принцип такой. Отправляем два запроса один за другим: первый на сброс пароля себе, второй — на сброс пароля админа. Разница в microseconds будет минимальна.» и как это связано с PHPSESSID хоть убейте — не понимаю!
Также просьба — пишите, пожалуйста, ссылки на исследования, которые легли в основу в тексте, в частности www.suspekt.org/2008/08/17/mt_srand-and-not-so-random-numbers/ забыли. Ссылки в комментах искать нереально, а разобраться почему работает тот же keep-alive, просто по атаке, очень трудно.
Еще раз спасибо за инструмент и статью, вы МОЛОДЦЫ!
А можете собрать вариант для ATI карточек под OpenCL? Они быстрее и дешевле Nvidia.
OpenCL не планируем, если реализовывать в отдельности под каждую GPU-платформу, скорость будет выше.
ей нельзя атаковать реальные веб-проекты
Не надо преувеличивать, согласен, что на некоторых серверах могут возникнуть трудности с keep-alive и Date, но на самом деле все не так плохо.
и как это связано с PHPSESSID хоть убейте — не понимаю!
Здесь не упомянули возможность извлечения значения microseconds из токена.
Ссылки добавим, спасибо за комментарий!
ей нельзя атаковать реальные веб-проекты
Собственно, проверяли мы на реальных веб-хостингах реальные веб-приложения и показатель успешности демонстрирует то, что реальные веб-проекты на реальных системах с помощью этой методики можно атаковать!
Самая главная сложность — server-status. С этого можно начать и закончить.
Про Date — вы так атаковали хотя бы один сервер с балансером или фронотэдом? Как?
Про атаки на сами веб-приложения все-таки не совсем не понятно по статье. Давайте разделять — веб-сервер с пыхом в целом, и там генерация PHPSESSID и отдельно веб-приложения, в частности, с выводом mt_rand значений в HTTP ответ. Тогда с примерами покажите как это связать вместе.
Про Date — вы так атаковали хотя бы один сервер с балансером или фронотэдом? Как?
Про атаки на сами веб-приложения все-таки не совсем не понятно по статье. Давайте разделять — веб-сервер с пыхом в целом, и там генерация PHPSESSID и отдельно веб-приложения, в частности, с выводом mt_rand значений в HTTP ответ. Тогда с примерами покажите как это связать вместе.
На тему получения pid+microtime от самого аппсервера решал эту задачу и добавил в слайды с Defcon-Russia: oxod.ru/DCG7812-Cryptography-in-webapps.pdf
Вместе с этим инструментов и хотел бы использовать, но AMD все испортило :(((
Вместе с этим инструментов и хотел бы использовать, но AMD все испортило :(((
Sign up to leave a comment.
Случайные числа. Take Two