Mobile-пентест: как рвать Android и iOS на куски без джейлбрейка
Здарова, братишка. Снова мы в деле. Сегодня на нашем операционном столе — мобильные приложения. Многие думают, что без рута или джейлбрейка там ловить нечего, мол, «песочница», «безопасность от вендора». Сказки для новичков. Мы-то с тобой знаем: где код — там и дыры. Просто нужно знать, куда копать.
Точка входа: Декомпиляция APK
Первое, что мы делаем, — вскрываем пациента. Нам нужно заглянуть ему под капот, изучить его анатомию. Для этого нет ничего лучше старого доброго apktool.
Что я вижу: У нас есть app.apk. Это просто ZIP-архив с ресурсами и скомпилированным кодом. Наша задача — превратить его обратно в читаемый вид.
Как я думаю: Мне не нужен весь Java-код. Мне нужны манифест, чтобы увидеть разрешения и компоненты, ресурсы (особенно строки, где могут быть ключи API), и smali-код, чтобы понять логику. Smali — это ассемблер для виртуальной машины Dalvik/ART, читается тяжело, но даёт полное представление о работе приложения.
Куда я лезу:
- Сначала находим полный путь к пакету на устройстве, если он уже установлен. Это нужно, чтобы убедиться, что мы работаем с нужной версией, и чтобы потом вытаскивать данные.
1 2 3 4 |
# Ищем имя пакета adb shell pm list packages | grep 'target' # Находим путь к файлу APK adb shell pm path com.target.app |
2. Теперь декомпилируем сам APK-файл. Команда проста до безобразия:
1 |
apktool d app.apk |
- На выходе получаем папку
app
со всей структурой. Особое внимание наAndroidManifest.xml
(ищемandroid:allowBackup="true"
, экспортируемыеactivity
,services
), папкуres/values/strings.xml
(хардкод) и, конечно, папкуsmali
.
Вектор атаки: Сетевой трафик и обход SSL-Pinning
99% приложений общаются с сервером. А где есть общение — есть что перехватить. Наш главный инструмент здесь — Burp Suite.
Что я вижу: Приложение при запуске ломится на свои API-эндпоинты. Если оно делает это по HTTP, мы победили сразу. Но сейчас все используют HTTPS. А умные разработчики прикручивают SSL-Pinning — приложение доверяет только своему, заранее вшитому сертификату, и посылает лесом наш сертификат от Burp.
Как я думаю: Сначала нужно направить трафик с эмулятора на мой Burp. Затем, если сработает пиннинг, нужно его обойти. Для этого есть Frida — швейцарский нож для инъекций в процессы.
Пошаговый разбор:
- Настройка прокси в Burp Suite:
- В Burp идём в
Proxy > Options
. - Добавляем новый listener на
All interfaces
и любой свободный порт (например, 8080). Это позволит эмулятору достучаться до нашего хоста.
- В Burp идём в
- Настройка прокси на эмуляторе Android:
- Открываем настройки эмулятора (три точки сбоку), идём в
Settings > Proxy
. - Выбираем
Manual proxy configuration
, вводим IP-адрес нашего компьютера в локальной сети и порт 8080. Если эмулятор и Burp на одной машине, можно использовать специальный IP10.0.2.2
, который в эмуляторе является алиасом дляlocalhost
хост-машины. - Устанавливаем сертификат Burp на эмулятор, чтобы он в принципе мог работать с HTTPS.
- Открываем настройки эмулятора (три точки сбоку), идём в
- Обход SSL-Pinning с помощью Frida:
- Устанавливаем Frida на хост и
frida-server
на эмулятор (для этого, увы, чаще всего нужен рут на эмуляторе, но не на реальном устройстве, которое мы атакуем). - Запускаем
frida-server
на эмуляторе. - На хосте выполняем команду, которая запускает приложение и одновременно подгружает в него JavaScript-пейлоад для обхода пиннинга:
- Устанавливаем Frida на хост и
1 |
frida -U -f com.target.app -l ssl_bypass.js --no-pause |
-U
: подключаемся к USB-устройству.-f com.target.app
: запускаем указанное приложение.-l ssl_bypass.js
: загружаем наш скрипт. Готовые скрипты есть на Frida CodeShare.
{ "status": "fail", "balance": 0 }
, мы можем черезProxy > Intercept
илиProxy > Match and Replace
подменить ответ на{ "status": "ok", "balance": 9999 }
и посмотреть, как приложение сбрендит.
Трюк: Автоматизация и поиск данных
Руками ковырять — это хорошо, но долго. Часть рутины можно и нужно автоматизировать.
Что я вижу: У нас есть APK, и мы хотим быстро получить отчёт о самых очевидных дырах: хардкод, небезопасные разрешения, уязвимые компоненты.
Как я думаю: Зачем делать работу, которую за меня сделает робот? Используем MobSF (Mobile Security Framework). Это комбайн для статического и динамического анализа.
Куда я лезу:
- Разворачиваем MobSF локально (он есть на GitHub).
- Загружаем в его веб-интерфейс наш
app.apk
. - MobSF сам его декомпилирует, проанализирует манифест, найдёт хардкоженные ключи, проверит настройки сетевой безопасности и выдаст красивый отчёт. Это экономит часы работы.
Поиск бэкапов:
Если в AndroidManifest.xml
мы нашли android:allowBackup="true"
, это наш шанс. Эта опция позволяет делать резервную копию данных приложения через adb
.
1 |
adb backup -f backup.ab com.target.app |
Полученный файл backup.ab
можно распаковать и найти внутри много интересного: базы данных SQLite, файлы SharedPreferences (это XML-файлы с настройками, токенами, ключами) и другие кэшированные данные. Часто там лежат сессионные токены, логины и пароли в открытом виде.
Советы
- Копай глубже в хранилище. Кроме SharedPreferences, приложения хранят данные в базах SQLite (
/data/data/com.target.app/databases/
) и на внешней карте памяти. Проверь всё. - Изучай Smali-код. Ищи в нём кастомные алгоритмы шифрования/обфускации. Часто разработчики пишут свои «велосипеды», которые легко сломать, зная алгоритм.
- Используй Objection. Если не хочешь писать скрипты для Frida сам, используй Objection. Это готовый фреймворк поверх Frida, который позволяет на лету исследовать приложение, дампить память, обходить SSL-pinning одной командой (
android sslpinning disable
). - Фаззинг API. Когда ты перехватил запросы в Burp, не останавливайся на анализе. Отправь их в Intruder и начни фаззить параметры. Ищи SQLi, IDOR, XSS и прочую классику веб-уязвимостей.
- Проверь экспортируемые компоненты. Если в манифесте есть
activity
,service
илиreceiver
с флагомandroid:exported="true"
, их можно дёргать из других приложений, что может привести к утечке данных или выполнению несанкционированных действий.

На этом все. Всем хорошего дня!