Зелёная боль
блог программиста не только о программировании

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

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 клиентов.

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


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

Ваш адрес email не будет опубликован.