Совсем недавно в парижском Cité des Sciences et de l’Industrie прошла хакерская конференция LeHack. В этот день у меня была прекрасная возможность встретиться и пообщаться с большим количеством технически подкованных людей, настоящих профессионалов своего дела, а заодно и отведать бесплатной еды, которой всех угощали. Наевшись сверх нормы, я почувствовал усталось и решил отпить кофе - здесь и начинается эта история.
Введение
Вполне обычная кофемашина. Я заплатил за кофе кредитной картой и собрался уже уходить, но увидел это.
Здесь написано: «Загрузите приложение Coffee cApp и оплачивайте свои покупки со смартфона». Итак, это приложения на Android при помощи которого можно покупать кофе, я хакер, находящийся на хакерской конференции, и у меня много свободного времени. Пора заняться своим любимым делом!
Я скачал это невероятно *удобное* (судя по отзывам) приложение и начал им пользоваться. Следующие два часа оказались довольно продуктивными.
Account Takeover
Я создал аккаунт и в ответе от сервера увидел свой UserId.
После этого я сбросил пароль от учетной записи и вновь посмотрел на запрос. В нем я увидел параметр «Password», который был моим текущим паролем, параметр под названием «ConfirmPassword», который был моим новым паролем, и... Невероятно! Параметр с именем «UserUId». Его значение эквивалентно «UserId», которое я уже видел ранее, когда создавал учетную запись. Что произойдет, если я подменю свой UserUId на чужой? Давайте-ка попробуем!
Чтобы проверить, могу ли я сбросить пароль другой учетной записи, я создал еще одну учетку. Сбросил ее пароль и в POST-запросе к эндпоинту /User/ResetPassword заменил значение UserUId на UserUId своей первой учетной записи. Бинго, все работает! Пароль 1-го аккаунта сброшен!
Хорошо, Эллиот, это круто, но для захвата чужой учетной записи нам еще нужно иметь username жертвы.
Account enumeration
В первом запросе, сделанном во время сброса пароля, приложение отправляет ваше имя пользователя, которое совпадает с номером телефона, на свой сервер. Если это имя пользователя существует, вы получите 200 код ответа.
Если вы отправляете случайное имя пользователя, сервер выдает сообщение «UserNotExists».
Я отправил этот запрос в Burp Suite Intruder и... да! Ограничения со стороны сервера отсутствовали, можно было перебрать все допустимые имена пользователей (номер) и, таким образом, получить список валидных учеток. Объединив эти две уязвимости, мы можем взломать все учетные записи, которые есть в приложении.
Pin bruteforce
И последнее, но не менее важное: я обнаружил в приложении еще одну уязвимость. Когда вы создаете учетную запись, для ее активации, приложение отправляет вам код подтверждения в смс-сообщении.
Я уже говорил, что сервер не применяет к вам никаких санкций, в случае злоупотребления его некоторым функциями? Так вот, код можно сбрутфорсить.
Вывод
Не совершайте глупых ошибок с безопасностью и ваш кофе никто не выпьет.
Введение
Вполне обычная кофемашина. Я заплатил за кофе кредитной картой и собрался уже уходить, но увидел это.
Здесь написано: «Загрузите приложение Coffee cApp и оплачивайте свои покупки со смартфона». Итак, это приложения на Android при помощи которого можно покупать кофе, я хакер, находящийся на хакерской конференции, и у меня много свободного времени. Пора заняться своим любимым делом!
Я скачал это невероятно *удобное* (судя по отзывам) приложение и начал им пользоваться. Следующие два часа оказались довольно продуктивными.
Account Takeover
Я создал аккаунт и в ответе от сервера увидел свой UserId.
После этого я сбросил пароль от учетной записи и вновь посмотрел на запрос. В нем я увидел параметр «Password», который был моим текущим паролем, параметр под названием «ConfirmPassword», который был моим новым паролем, и... Невероятно! Параметр с именем «UserUId». Его значение эквивалентно «UserId», которое я уже видел ранее, когда создавал учетную запись. Что произойдет, если я подменю свой UserUId на чужой? Давайте-ка попробуем!
Чтобы проверить, могу ли я сбросить пароль другой учетной записи, я создал еще одну учетку. Сбросил ее пароль и в POST-запросе к эндпоинту /User/ResetPassword заменил значение UserUId на UserUId своей первой учетной записи. Бинго, все работает! Пароль 1-го аккаунта сброшен!
Хорошо, Эллиот, это круто, но для захвата чужой учетной записи нам еще нужно иметь username жертвы.
Account enumeration
В первом запросе, сделанном во время сброса пароля, приложение отправляет ваше имя пользователя, которое совпадает с номером телефона, на свой сервер. Если это имя пользователя существует, вы получите 200 код ответа.
Если вы отправляете случайное имя пользователя, сервер выдает сообщение «UserNotExists».
Я отправил этот запрос в Burp Suite Intruder и... да! Ограничения со стороны сервера отсутствовали, можно было перебрать все допустимые имена пользователей (номер) и, таким образом, получить список валидных учеток. Объединив эти две уязвимости, мы можем взломать все учетные записи, которые есть в приложении.
Pin bruteforce
И последнее, но не менее важное: я обнаружил в приложении еще одну уязвимость. Когда вы создаете учетную запись, для ее активации, приложение отправляет вам код подтверждения в смс-сообщении.
Я уже говорил, что сервер не применяет к вам никаких санкций, в случае злоупотребления его некоторым функциями? Так вот, код можно сбрутфорсить.
Вывод
Не совершайте глупых ошибок с безопасностью и ваш кофе никто не выпьет.