![image](https://habrastorage.org/getpro/habr/post_images/d67/f48/899/d67f48899df64210f2ea2489cae38ccc.jpg)
«Без разочарований не ощутишь вкус победы» © Мемфис Реймс
История началась банально. В каком то ролике на YouTube рассказывали про каршеринг. С демонстрацией функции «приветствия», когда вам не удается найти автомобиль на большой парковке. У меня тут же возникла мысль проверить — а не смогу ли я активировать функцию приветствия на абсолютно все автомобили этой компании?! Ну весело же. Крупный российский город. И в какой то момент тысячи автомобилей по команде начинают сигналить и моргать фарами. Почти как в фильме «Крепкий Орешек 4».
В результате все получилось куда интереснее. Ведь фактически я нашел возможность угона любого автомобиля.
Внутри приложения для пользователей все стандартно. Загрузка ресурсов, splash-screen и форма входа в приложение.
Но тут моя идея по манипулированию всеми автомобилями разбилась о камни. С недавних пор я живу не в России и в приложение нельзя войти без российского номера телефона. Приложение не поддерживает международный формат номеров. А о виртуальных номерах я почему-то не вспомнил.
От отчаяния я догадался ввести +7 000 0000000. И удивлению не было предела, когда появился следующий шаг с предложением ввести код из sms. Еще запустился обратный отсчет на 60 секунд, намекающий о том что срок жизни пароля очень короткий. И что нужно торопиться.
![image](https://habrastorage.org/getpro/habr/post_images/c17/a52/da4/c17a52da4a8f71367a7373dbbc95d042.jpg)
Как так? Какое sms если номер вообще не может быть реальным?!
Эта ситуация заставила меня сделать несколько выводов:
- приложение не проверяет формат телефона.
- вероятно, формат номера можно будет подбросить другой, просто перехватив запрос и изменив его на лету
- приложение, не зависимо от того какой телефон получен, отправляет команду на генерацию пароля пользователю.
Т.е где то в базе нас ждет пароль. Который был присвоен нашему красивому номеру +7 000 0000000.
Вообще такой метод аутентификации пользователя принято называть OTP (One Time Password).
Т.е пароль, который нам «присвоили», должен быть использован только один раз.
Вроде бы тупик. Можно выключать ноутбук, телефон и ложиться спать. Но меня не отпускала мысль — а что если подобрать этот пароль? Ведь у нас всего 10000 возможных вариантов! Успешность этой затеи была сомнительная. Можно было словить капчу, блокировку, в конце концов, я своим подбором мог спровоцировать единичный вызов «успешного пароля». И в формате OTP, повторное использование этого пароля не допустимо. Что же говорить о таймере обратного отсчета, который уже давно закончился.
Подходящий момент для этой гифки.
![image](https://habrastorage.org/getpro/habr/post_images/f19/c37/60f/f19c3760fd0c359b2e5df7d9cad05bf6.gif)
Ловлю запрос ввода пароля. Делаю пароль — динамическим параметром. Устанавливаю диапазон возможных значений для перебора. Со скрещенными пальцами запускаю атаку на подбор. В процессе подобных атак я никогда не пытаюсь маскировать свои действия. Не подменяю ip адреса. Не пользуюсь VPN. Не ставлю маленькое количество потоков. Мне это не надо. У меня нет мотивации чтоб меня не заметили.
Через 60 секунд на глаза попадается ответ сервера. Найден успешный пароль.
Но получится ли использовать его повторно? Ведь это One Time Password.
В приложении таймер обратного отсчета уже грустно подсветил поле ввода пароля серым цветом. Намекая тем самым на то что я опоздал.
![image](https://habrastorage.org/getpro/habr/post_images/734/6f5/3ef/7346f53ef962b47470a04977754ddfd3.jpg)
Ставлю курсор в поле с паролем. Стираю ранее веденный, ввожу успешно подобранный пароль и нажимаю кнопочку входа.
И тут очередная проблема. Приложение говорит что мы какой-то «не подтвержденный пользователь». И выбрасывает через пару секунд на главную страницу.
Или мне не удалось реализовать все задуманное. Или мой пользователь реально не прошел какую то модерацию, подтверждение документов и все такое…
В такой ситуации оставалось только два варианта. Либо искать друзей, которые пользуются этим сервисом. Либо искать активных пользователей, которые засветили на просторах интернета свои мобильные номера.
Ну как вы понимаете друзей в столь позднее время, я даже если бы захотел, не нашел.
По-этому я пошел искать пользователей. Это было самое легкое. В социалочках нашел официальные сообщество каршеринга. Посмотрел комментарии последних публикаций. Открыл страницы нескольких пользователей. На 3 или 4 профиле одного из пользователей удалось обнаружить опубликованный мобильный номер.
![image](https://habrastorage.org/getpro/habr/post_images/27e/901/620/27e901620bae2c8122916ec711986e27.jpg)
Взял этот номер и пошел проверять теорию о взломе.
Через пару минут я уже бродил по приложению и изучал его возможности. У пользователя оказалась огромная история поездок. Несколько десятков тысяч бонусных денег, которые можно использовать для поездок. Ну и несколько карт для оплаты, которые были привязаны к профилю данного пользователя.
![image](https://habrastorage.org/getpro/habr/post_images/257/9ec/041/2579ec04139efb0d55a60feccad340b3.jpg)
По изучав ролики на youtube и обзоры, стало понятно, что при аренде автомобиля от данного пользователя мне не придется вводить какие то дополнительные комбинации цифр защищающие автомобиль от угона через взломанный аккаунт.
Т.е у меня была абсолютно открытая возможность взять любой автомобиль в аренду без предъявления требуемых документов. При этом взять автомобиль и расплатиться от лица взломанного пользователя. Оплачивать возможные штрафы от ГИБДД пришлось бы так же нашей жертве.
![image](https://habrastorage.org/getpro/habr/post_images/e65/2fc/4d1/e652fc4d1ee05f18bc4da4bef0ea237a.jpg)
К этому моменту у меня просто пропал сон. Безусловно, то что я получил доступ к учетной записи пользователя — это не правильно. Но благодаря этому мне удалось обнаружить опасную логическую уязвимость.
Несколькими секундами позже я уже писал сообщения управляющим каршеринга и руководителю ИТ департамента. Найти их было не сложно.
Люди адекватно отреагировали на ситуацию. Без возражений приняли во внимание все проблемы, которые я обнаружил. И приступили к исправлению. Через 1-2 недели проблемы были устранены. Мне даже был предложен автомобиль в бесплатное пользование на несколько дней. Но я предпочел не усложнять себе жизнь чужим авто в чужом городе (в период командировки).
Из всей этой истории нужно сделать следующие выводы:
- Не стоит пренебрегать защитой от Brute-force.
- Проверяйте формат номера телефона если он используется в качестве логина.
- После однократного использования OTP не должен работать.
- Срок жизни OTP должен быть коротким, даже если его не использовали.
- В качестве логина не стоит использовать номер телефона.
- Лучше делать дополнительную авторизацию пользователя при аренде автомобиля через PIN-код (код, который устанавливает сам пользователь при регистрации). Этот PIN-код пользователь должен вводить для того чтобы разблокировать автомобиль.
Такие дела.