Привет!
Большой ку$h - соревнование на поиск уязвимостей в системе дистанционного банковского обслуживания.
В этом году система была доступна для скачивания за два дня до конкурса, что значительно упрощало жизнь. Исходные тексты и виртуальная машина
на хабре.
Подробнее о сервисе:
Существовал десктопный и мобильный вариант сервиса.
Пользователи различались по способу отправки денег:
1 вид - Mobile bank - Отправка денег не требовала подтверждения;
2 вид - SMS-tokens - На наш номер "отправлялась" СМСка с кодом подтверждения;
3 вид - Transaction authentication numbers - 20 одноразовых паролей (otp), которые запрашивались для подтверждения транзакции.
Уязвимости
- Обход Captcha: ничего не поменялось с прошлого раза - подробнее в статье HeartLESS.
- Неавторизованные платежи. Отсутствие проверок идентификатора пользователя в параметре card_id позволяет переводить средства с одного аккаунта на другой зная только otp одного пользователя. Уязвимость была у третьего типа пользователей.
- Ошибка округления. Позволяет накручивать деньги при совершении микротранзакций с рублевого счета на долларовый. У меня переводилось 2 рубля на 6 центов и обратно, прибыль была где-то 14 копеек.
- Прямой доступ в панель оператора позволял получить доступ к информации о состоянии счета пользователя и его шаблонах http://(ip)/Operator/userInfo/id/1. Редактирование шаблона можно выполнить перейдя по url http://(ip)/Operator/editTemplate/id/1
- Слабые пароли. Брут форс слабых паролей по словарю. У меня было 50 паролей.
- XSS в панели оператора позволяла грабить награбленное. Я не эксплуатировал ее.
Эксплоит
был написан на python2.7 + использовались две библиотеки
Requests и
lxml
У меня было 3 основных модуля:
- Редактирование пользовательских шаблонов. Скрипт узнавал состояние счета пользователя через панель оператора и в дальнейшем изменял шаблон таким образом чтобы были переведены все средства за один раз на мой счет. Скрипт работал в бесконечном цикле, чтобы защитится от редактирования шаблона другими игроками.
- Брут в пять потоков пытался подобрать пароль к пользователю. В случае успеха пользовательский пароль заменялся на мой. Средства переводились на мой счет через вторую уязвимость.
- Накрутка. 1000 раз с рублевого счета на долларовый скрипт переводил малые суммы. Валовый поток запросов на сервер пару раз выводил его из строя в течение конкурса.
Брут форс отработал быстро и позволил мне вывести средства со всех счетов кроме одного. Редактор шаблонов отработал только на половине пользователей, а округлении валют принесло очень мало средств. Этого было достаточно чтобы победить в конкурсе.
Спасибо за внимание!