Не введен код подтверждения. Уязвимость ВКонтакте: отправляем сообщение с кодом восстановления страницы на чужой номер. Реверс инжиниринг: дизассемблирование

Обычным весенним днем, занимаясь «подготовкой» к ЕГЭ по информатике, наткнулся на , позволявшей взломать все аккаунты в социальной сети, за которую выплатили 15000$. Суть уязвимости заключалась в переборе кодов восстановления на тестовом домене компании. Я подумал, а чем собственно ВКонтакте хуже? И решил попробовать провернуть подобный трюк у них. Зная, что веб-версия уже достаточно хорошо исследована, жертвой должен был стать Android клиент, а что из этого вышло можно прочитать под катом.

Какие разделы следует анализировать

Через 30 дней вам будет сообщено, что ожидание закончилось, и пришло время введите новую информацию о безопасности. Существует ряд возможных объяснений того, почему коды безопасности не всегда поступают. Прочитайте этот список наиболее распространенных причин и посмотрите, относится ли к ним какое-либо из них.

Если это так, измените настройки своего телефона, а затем выберите «У меня нет кода». Скопируйте или запишите защитный код из сообщения. Вернитесь к окну, в котором запрашивается код безопасности. Введите код и следуйте инструкциям.

  • Ваш телефон блокирует звонки или тексты из неизвестных номеров?
  • Возможно, вам понадобится ввести защитный код, чтобы перейти на эту страницу.
  • Это может затруднительно отслеживать, с кем вы вошли.
Да, вы можете получать коды на телефоне, который не использует текстовые сообщения.

Смотрим трафик

Первым делом я захотел узнать, какую информацию приложение передает в сеть во время процесса восстановления страницы. Помощником в этом деле выступил Fiddler, я настроил его и Android устройство, как написано в официальной документации . Таким образом в Fiddler становятся доступны все HTTP/HTTPS запросы c устройства. Теперь, в приложении, смело выходим из аккаунта ВКонтакте и нажимаем на кнопку «Забыли пароль?». После ввода номера телефона приложение отправляет 2 HTTPS запроса. Особую ценность представляет второй, потому что именно он отвечает за отправку SMS с кодом восстановления.

Вы получите автоматические телефонные звонки, которые читают защитный код для вас вместо текста. В сообщении говорилось, что «убедитесь, что вы можете получить защитный код». Когда вы увидите сообщение с просьбой удостовериться, что вы можете получить код безопасности, это означает, что вам нужно проверить или добавить новую информацию о безопасности. Вы можете пропустить его в течение 24 часов за один раз, но через семь дней после первого уведомления вам нужно будет проверить или добавить новую информацию о безопасности, прежде чем вы сможете снова войти в систему.



Особое внимание стоит обратить на некоторые параметры запроса:

phone - номер на который отправляется SMS
session_id - рандомно генерирующаяся сессия операции восстановления

Попытка отправить запрос изменив его не увенчалась успехом. Мешает параметр «signature», который выступает в роли «подписи», как она генерируется разберемся немного позже.

Для последующего анализа, в приложении, введём случайный код восстановления и продолжим наблюдать за сетевой активностью. Видим следующий запрос, он проверяет правильность введенного кода. Так как код был случайным - проверка не пройдена.



Честно говоря на этом моменте мне хотелось начать перебирать коды восстановления, меняя значение параметра «code». К сожалению, и этот запрос защищен от изменения с помощью «signature». Придётся разобраться, как генерируется эта подпись.

Реверс инжиниринг: декомпиляция

Для первоначального анализа можно попробовать декомпилировать приложение ВКонтакте. Так можно получить некоторые части исходного кода на Java.

Открываем в jd-gui все полученные.jar файлы. И не долго думая, делаем поиск по строке «signature».

LocalObject3 = String.format(Locale.US, "%s%s?%s&signature=%s", new Object { d(), e(), localObject3, URLEncoder.encode(ru.mail.libverify.utils.m.b(f() + (String)localObject4 + ru.mail.libverify.utils.m.c(a.b())), "UTF-8") });

Эта библиотека сделана в лучших традициях security through obscurity, весь код надежно обфусцирован. Поэтому, через jd-gui мне удалось узнать только то, что за «signature» прячется MD5-хэш от неизвестной строки.



Реверс инжиниринг: дизассемблирование

Мне требовалось узнать, что за строка поступает в функцию ru.mail.libverify.utils.m.b(). Самый простой способ сделать это - немного изменить код приложения. Ну что ж попробуем. Для начала используем apktool , с командой:

Apktool.jar d vk.apk -r (ключ -r для игнорирования ресурсов)

Теперь, в папках с smali-кодом находим файл в котором происходит генерация MD5. В моем случае путь был такой: smali_classes3rumaillibverifyutilsm.smali. Переходим к нужному методу:

Method public static b(Ljava/lang/String;)Ljava/lang/String; .locals 8 .param p0 # Ljava/lang/String; .annotation build Landroid/support/annotation/NonNull; .end annotation .end param:try_start_0 const-string/jumbo v0, "UTF-8" invoke-virtual {p0, v0}, Ljava/lang/String;->getBytes(Ljava/lang/String;),"de":["wGxBWzh9DgQ","8532rqOYYg4","AY1pb3fdKj0","E-cXLIgV9eI"],"es":["UQ_-8vAE7Ug","yvMgVftTHzo","es0aMOg8YrY","8FsetOJK8Yc"],"pt":["mu7Ejm0LqXs","S5czfTIQ7Dg","S5czfTIQ7Dg","S5czfTIQ7Dg","mu7Ejm0LqXs","S5czfTIQ7Dg","mu7Ejm0LqXs","VcSDOtFEudo","NIHknTtNP9w"],"bg":["iSP0L-7igNk"],"pl":["ycBP7VDjwfM","ycBP7VDjwfM"],"la":["GP09Fqqo9iM"],"lt":["7vlddh4Ffqk"],"el":["ppVVucGNQn8"]}