Если пришел код подтверждения. Уязвимость ВКонтакте: отправляем сообщение с кодом восстановления страницы на чужой номер
Обычным весенним днем, занимаясь «подготовкой» к ЕГЭ по информатике, наткнулся на , позволявшей взломать все аккаунты в социальной сети, за которую выплатили 15000$. Суть уязвимости заключалась в переборе кодов восстановления на тестовом домене компании. Я подумал, а чем собственно ВКонтакте хуже? И решил попробовать провернуть подобный трюк у них. Зная, что веб-версия уже достаточно хорошо исследована, жертвой должен был стать Android клиент, а что из этого вышло можно прочитать под катом.
Смотрим трафик
Первым делом я захотел узнать, какую информацию приложение передает в сеть во время процесса восстановления страницы. Помощником в этом деле выступил Fiddler, я настроил его и Android устройство, как написано в официальной документации . Таким образом в Fiddler становятся доступны все HTTP/HTTPS запросы c устройства. Теперь, в приложении, смело выходим из аккаунта ВКонтакте и нажимаем на кнопку «Забыли пароль?». После ввода номера телефона приложение отправляет 2 HTTPS запроса. Особую ценность представляет второй, потому что именно он отвечает за отправку SMS с кодом восстановления.
Особое внимание стоит обратить на некоторые параметры запроса:
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"]}