Задание: Даниил Фукалов, SPbCTF Прохождение: Влад Росков, SPbCTF
В космопоездах беда: появился обаятельный андроид-шулер, который обыгрывает всех в наперстки и обирает до нитки: robotrickster.apk
Совершите маленькую шалость — выиграйте у робошулера весь миллион монет, которые звенят в его карманах.
На примере этого демо-задания мы хотим показать несколько универсальных приёмов, как можно заглянуть под капот мобильного приложения под Андроид: посмотреть его трафик, пропатчить приложение и восстановить его алгоритм на Java. Каждый из этих подходов пригодится при анализе безопасности любых мобильных приложений.
В задании нас ждёт единственный файл robotrickster.apk размером 6 МБ, и по его расширению мы опознаём в нём пакет для установки Android-приложения.
Чтобы понять, что за приложение перед нами и что оно умеет, первым делом стоит его запустить. К счастью, для этого необязательно иметь телефон на Андроиде в кладовке — есть много эмуляторов, которые позволяют запустить Android в виртуальной машине прямо на компьютере.
Мы будем использовать официальный SDK от Гугла, в нём после запуска Android Studio эмулятор находится по More Actions → Virtual Device Manager. Перетащим файл .apk в окно виртуального девайса, где уже запустился Андроид, и стартуем установленное приложение.
Напёрстки с жуликом
Итак, нам предлагается обыграть напёрсточника, который то и дело жульничает, мешая нам следить за перемещением напёрстков. За каждое верно угаданное положение шарика наш выигрыш удваивается, и по условиям задачи нам нужно набрать миллион — то есть удвоить 20 раз подряд. Однако при любом неверном угадывании андроид-аферист забирает у нас все монетки, кроме одной.
Попробуем восстановить справедливость.
Часто мобильное приложение — это просто красивая оболочка для взаимодействия с сервером по API. Получше узнать, что происходит внутри такого приложения, можно с помощью перехвата его сетевого трафика. Давайте этим займёмся.
Для начала нам понадобится Burp Suite — комплект для удобного анализа HTTP-трафика (достаточно бесплатной Community-версии). Мы подробно рассказывали о работе с ним в разборе задания «Cringe Archive» с IT’s Tinkoff CTF 2023, рекомендуем освежить в памяти, если вы не работаете с Бёрпом каждый день.
Посмотрите разбор Cringe Archive, если не поняли, что происходит на скриншоте
Burp показывает тот трафик, который проходит через его прокси-сервер. Встроенный Chromium-браузер, который идёт в комплекте, настроен на этот прокси изначально, поэтому зайти поковырять какой-нибудь сайт легко. Однако эмулятор Андроида ходит в сеть напрямую, без прокси.
Подробная инструкция, как завернуть Андроид через прокси Бёрпа, есть например в статье на Хабре от @W0lFreaK, но краткая выглядит так:
Перевешиваем прокси на внешний интерфейс
Изначально прокси слушает на локалхосте, эмулятор не сможет к нему подключиться. Proxy → ⚙️ Proxy Settings → Proxy listeners → Edit → выбираем любой IPv4 кроме 127.0.0.1
Прописываем прокси в Андроиде
В расширенных настройках виртуальной WiFi-сети «AndroidWifi» настраиваем использование прокси. IP-адрес тот, что только что выбрали в Бёрпе, порт 8080.