>
Сентябрь 2017
Пн Вт Ср Чт Пт Сб Вс
« Авг    
 123
45678910
11121314151617
18192021222324
252627282930  

Как взломать Mail.ru приложение для Android.

Случайным образом, копая очередной BugBounty, я натолкнулся на цепочку уязвимостей в достаточно популярном почтовом клиенте от IT-гиганта Mail.Ru. Эксплуатация уязвимостей из этой цепочки не требовала на устройстве особых прав и могла привести к полной компрометации содержимого почтового ящика жертвы или даже содержимого SD-карты. В статье я опишу методы, с помощью которых были найдены эти уязвимости, вспомогательные тулзы и финальный вектор с демонстрацией на видео.

Как взломать Mail.ru приложение?

Первым делом понадобится, конечно, девайс (или эмулятор), Android SDK tools, нужный нам APK, drozer и набор мелких утилит для декомпиляции и разбора Java-кода. Но обо всем по порядку.

Первым делом инсталлируем SDK Tools и настраиваем девайс/эмулятор. Я буду рассматривать реальный девайс, но только потому, что мне так удобнее, и вообще — комп с запущенным эмулятором греется! Права рута на устройстве сильно облегчают тебе жизнь, но для нахождения и эксплуатации многих уязвимостей они не требуются.

После настройки SDK Tools скачиваем и устанавливаем drozer из официального репозитория, ставим APK-клиент на устройство. Отлично, связанные с девайсом приготовления закончены, чтобы проверить работоспособность — подключаемся, пробросив порт (это делать необязательно, если используется реальный девайс из твоей сети, а не эмулятор):

Ну и конечно же, ставим на устройство само приложение почты Mail.Ru, которое будем ломать. Распаковываем и декомпилируем аппликуху при помощи утилиты dex2jar. Для просмотра и поиска по исходникам я советую использовать JD-GUI, ну или можешь взять любой другой редактор кода на твой вкус. Все готово, начинаем ресерч.

взлом mail.ru

так выглядит успешно запущенная консоль drozer’а

ИЩЕМ ВЕКТОР АТАКИ ДЛЯ ВЗЛОМА MAIL.RU ПРИЛОЖЕНИЯ

Теперь дело за малым — найти уязвимости, продумать вектор и написать эксплоит. Начинаем со сканирования приложения: ищем то, за что можно будет зацепиться. Делается это при помощи drozer’а следующим образом:

Как видишь, у приложения довольно много экспортированных контент-провайдеров, с них я и предлагаю начать поиски. Команда run app.provider.info -a ru.mail. mailapp выведет нам список из двух провайдеров:

Кстати, можно оставить автоматическое сканирование провайдера drozer’у при помощи команды

Но я предпочитаю искать уязвимости руками, поэтому просто пробуем вызывать данный контент-провайдер непосредственно через adb при помощи команды am start, выполненной на устройстве. Повторюсь, так как контент-провайдер экспортирован, права root нам необязательны.

Как можно увидеть, пользователю предложат выбрать, что же делать с данным URL, какой из Activity запускать. Чтобы избежать подобных вопросов, дополняем команду am параметром -n и указываем нужный нам активити, например ru.mail.mailapp/ru.mail.ui.writemail.SharingActivity. Приложение тут же завершится с ошибкой, а мы топаем в logcat, чтобы узнать, в чем проблема.

Подставляем кавычку, получаем ошибку SQL. Классика!

А проблема в том, что это типичная union-based SQL injection, которую можно классическим образом раскрутить и получить вывод (как на экран телефона, так и в системный лог):

Как оказалось, SQL-инъекции подвержен не только первый контент-провайдер, но еще и второй, доступный сторонним приложениям. Под него можно использовать следующий вектор:

Чтобы понять, почему это происходит, предлагаю обратиться непосредственно к исходному коду декомпилированного приложения. Ответ кроется в файле, расположенном по адресу ru/mail/mailbox/content/contact/ ContactsProvider.java. Как видишь, результат выполнения функции getContactAccount() попадает сразу в SQL-запрос, не проходя никаких проверок, — это и позволяет злоумышленнику проводить инъекцию.

Выполняем union-based-инъекцию и получаем вывод в ошибке

РАСКРУЧИВАЕМ ИНЖЕКТ

Но этого мне было мало, я хотел получить полный доступ к файлам приложения (среди прочего и к файлу mailbox_db), расположенным в системной папке в /data/data/ru.mail.mailapp/databases/, где приложение хранит основную информацию, в том числе содержимое писем. Как можно было заметить ранее, содержимое одной из колонок отвечает за путь до прикладываемого к письму файла. Так как к файлу обращается само приложение, мы можем указать доступные именно приложению «Почта Mail.Ru» файлы, например /data/ data/ru.mail.mailapp/databases/mailbox_db.

Тогда выбранный вектор примет, например, следующий вид:

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

Так как нам доступны некоторые экспортированные activity, среди них можно обнаружить следующий — ru.mail.ui.writemail. MailToMySelfActivity, который отвечает за автоматическую отправку писем «себе». Используем его в конечном векторе атаки, чтобы письмо сразу отправлялось без какого-либо участия со стороны пользователя. Добавляем к нему предыдущий вектор и в качестве extras указываем нашу почту и другие данные для отправки. Эти параметры, кстати, можно тоже нехитрым образом отыскать в исходном коде (буквально грепая по сорцам). Но я их как-то довольно быстро угадал и без подсказок.

Конечный вектор атаки выглядит следующим образом:

где EMAIL — наш почтовый ящик, на который придет письмо с указанным файлом (в данном случае это файл /data/ data/ru.mail.mailapp/databases/mailbox_db).

Что же произойдет после запуска данной команды? Приложение запустится, через SQL injection вектор подгрузит указанный файл и выполнит отправку письма «самому себе», не игнорируя при этом наши передаваемые extras. Демонстрацию работы эксплоита можно посмотреть на видео.

 

ИТОГ

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

Естественно, я сообщил обо всех уязвимостях в BugBounty Mail.Ru, но, к сожалению, вознаграждения не получил, а официальный ответ был такой:

“Few mistakenly exported Content providers and activities are reported to have vulnerabilities, allowing application data access and manipulation. This report was marked as a duplicate due to known fact activities and content providers are exported by mistake (fix is under development).”

Почему статус репорта изменился на None Applicable, хоть уязвимости и присутствовали в официальном приложении на момент репорта? Я не знаю, но продолжать искать уязвимости в продуктах и сервисах Mail.Ru мне теперь не особо хочется. Надеюсь, что другие в этом преуспеют лучше меня, в любом случае — удачи! 🙂

Share Button
[Всего голосов: 11    Средний: 3.9/5]

Вам может быть интересно также:

Last updated by at .

Leave a Reply

You can use these HTML tags

<a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">