Криптология в анализе защищённости

24
Бечеда за жизнь о криптах Омар Ганиев QIWI Friday Security Party Москва, 2015

Transcript of Криптология в анализе защищённости

Page 1: Криптология в анализе защищённости

Бечеда за жизнь о криптах

Омар ГаниевQIWI Friday Security Party

Москва, 2015

Page 2: Криптология в анализе защищённости

Дисклеймер

• Бечседа о криптах• Я мало знаю о криптах• Я мало находил багов в криптах в работе• Хочу пожаловаться об этом• И услышать success-story от вас =)

Page 3: Криптология в анализе защищённости

Крипота

Page 4: Криптология в анализе защищённости

В игре

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

Page 5: Криптология в анализе защищённости

В игре

• Цезари, Виженеры, подстановки и т.д.• Всевозможные глупые (или не очень) ксоры

да Вернамы• Взлом RSA (атаки Винера, Франклина-

Райтера, Ферма, Копперсмита, …)• Атака расширения длины для хеш-функций• Атаки на эллиптические алгоритмы (типа

«быстрого» дискретного логарифма)• Распаковка рюкзаков

Page 6: Криптология в анализе защищённости

В игре

• Разные оракулы в реализации, padding oracle

• Линейный, дифференциальный криптоанализ

• Логические атаки с блочными шифрами (типа использования ECB или неправильного порядка в EDE)

• Разбор каких-то неведомых алгоритмов и прочие интересности

Page 7: Криптология в анализе защищённости

Жизнь – игра?

• Авторы тасков берут идеи вовсе не с потолка, а подумав, какие могут быть ошибки в реализации того или иного алгоритма, либо найдя ошибки в конкретном продукте

• Расскажите в конце, какие хардкорные криптобаги, компрометирующие систему, вы находили при анализе защищённости?

Page 8: Криптология в анализе защищённости

Жиза

• Пригодятся ли эти хардкорные тренировки пентестовебоэникейщикам?

• Далее несколько примеров околокриптографических багов, которые мне доводилось обнаружить на пентестах

Page 9: Криптология в анализе защищённости

Умный брут

• Нет, не тот, который убил Цезаря• Представьте себе форму авторизации в ДБО,

где часть логики зашита в JS• Для сброса 8-циферного пароля используется

фиксированный ключ PIN2. У него есть ограничения по формату, они проверяются в JS

• Также в JS проверяется сложность пароля, что отсеивает 1-2% плохих паролей

Page 10: Криптология в анализе защищённости

Умный брут• При отправке PAN сервер зачем-то в ответ

отдаёт PIN2ENC = 3DES(PIN2, hashwithmd5(salt, password))

• Поскольку PIN2 имеет определённый формат, можно перебирать всевозможные 8-циферные пароли (кроме плохих), дешифровать ими PIN2ENC и проверять соответствие формату

• Статистика показала, что подходящих паролей остаётся всего около 400 000

Page 11: Криптология в анализе защищённости

Умный брут

• Пусть в интернет-банке есть 100 000 юзеров. На каждого есть 3 попытки ввода пароля

• Посчитаем вероятность того, что мы взломаем хоть одну учётку, сделав 300 000 попыток:

>>> p=1/400000.+1/399999.+1/399998.>>> 100-pow(1-p,100000)*10052.76356614876912

• Итак, вероятность больше 50%, вин!

Page 12: Криптология в анализе защищённости

Оракул набивки

• А что если такой вот PIN2ENC, получаемый от клиента, расшифровывался бы на сервере?

• Классический баг реализации блочного шифрования с утечкой данных по побочному каналу

• Периодически встречается на цтфах, чаще всего в вебе

• Одна из наиболее прикладных криптоатак (была в ASP.NET, например), но не слишком частая

Page 13: Криптология в анализе защищённости

Оракул набивки

• Из жизни: хотите отписаться от рассылки? Жмите на /unsubscribe?long_str_in_base64

• Хм, а флипнем последний бит• 500? Padding Oracle!• Если даже токен не содержит интересных

данных, а бит-флиппинг не позволяет сделать какую-либо инъекцию, можно расшифровывать любые другие данные, получаемые от сервера

Page 14: Криптология в анализе защищённости

Некриптовые крипты

• Есть страшно баянистый факт из доков PHP, который с завидной регулярностью всех шокирует

• == не проверяет на идентичность в отличие от ===!

• true === “0” == “00e123123”• Это всё лирика, а вот прикольно проверить

это в жизни, да ещё и блекбоксом, предположив, что разрабы допустили ошибку

Page 15: Криптология в анализе защищённости

Некриптовые крипты

• /api/payment/?sum=1337&to=hacker&md5=…

• Хм… Почитаем доки SDK для API платёжки• Есть параметры, не влияющие на платёж,

но меняющие строку• Фаззим, что туда можно подавать строки из

байтов от 32 до 128• Регаем акк и получаем легитимный ключ

Page 16: Криптология в анализе защищённости

Некриптовые крипты

• Теперь нужен PoC. Если попытаться комбинаторно прикинуть шансы на эксплуатацию, получается не слишком радужная картина

>>> 2**128 / sum([10**(30 - i) for i in xrange(30)])306254130L

• Но почему-то на практике у меня получается находить коллизии гораздо быстрее, надо потестить статистику ещё

Page 17: Криптология в анализе защищённости

Некриптовые крипты

• Плевать на реальность, мы хотим PoC• Берём ключ своего аккаунта, формируем

строку запроса к API, подлежащую подписи• Берём степень свободы (дополнительный

ненужный параметр) и фаззим её, пока не получится хеш вида ^0+e\d+$

• Делаем это на плюсах с потоками: https://github.com/beched/php_hash_collision_finder

Page 18: Криптология в анализе защищённости

Некриптовые крипты

• Оп, получили строчку и пробуем что-то вроде /api/payment/?dummy=%40a`/&sum=1337&to=hacker&md5=0

• Вин! Значит, в коде написано ==, а не ===• Сломали подпись для своего аккаунта,

значит, можем сломать для любого, заслав дохреннилион запросов на сервак

Page 19: Криптология в анализе защищённости

Ода блокам

Page 20: Криптология в анализе защищённости

Ода блокам

• Ode to ECB: https://twitter.com/travisgoodspeed/status/617746044760268800

• Тривиальные с криптографической точки зрения баги (уровня crypto100 на цтфах), связанные с повторным использованием шифроблоков, порой приводят к весёлым последствиям

Page 21: Криптология в анализе защищённости

Ода блокам

• Снова представьте себе ДБО• Там есть интерфейс перевода с карты, при

этом, то ли согласно правилам PCI, то ли по ошибке платёжные данные зачем-то сохраняются в сессии в зашифрованном виде

• Сессия у многих фреймворков хранится у клиента в куках (с подписью, конечно)

Page 22: Криптология в анализе защищённости

Ода блокам

• Итак, в сессии лежит Crypto.encryptAES(userInput), при этом валидации для userInput нет

• Представьте, что мобильный интерфейс этого интернет-банка традиционно облегчил аутентификацию и логинит без 2FA по токену

• Токен – это Crypto.encryptAES(login + “|” + timestamp)

• Finita la commedia

Page 23: Криптология в анализе защищённости

Стенд-ап

• А теперь жду ваших рассказов, если вы ещё/уже не совсем пьяны

• Или кидайте зиродеи сюда:[email protected]

[email protected]

Page 24: Криптология в анализе защищённости

Заголовок слайда