CoderCastrov logo
CoderCastrov
Приложения

Парсинг приложений

Парсинг приложений
просмотров
10 мин чтение
#Приложения

Извлечение данных из мобильных приложений

Веб - это ценный источник данных. Так ценен, что существует множество инструментов для сбора информации с веб-сайтов. С распространением использования смартфонов и постепенным переходом доступа к Интернету с персональных компьютеров на мобильные устройства, некоторые платформы доступны только в виде мобильных приложений.

В отличие от веб-сайтов, приложения не создают HTML-страницы, поэтому схемы извлечения данных, используемые на веб-сайтах, не работают. Однако, в какой-то момент информация, которая находится на сервере, должна быть отправлена в приложение, и этот процесс осуществляется через использование API.

В этом посте мы рассмотрим, как выполнить атаку "человек посередине" на вашем собственном эмуляторе Android, чтобы узнать структуру API, используемую приложением, и как использовать эту информацию для получения данных с помощью Python.

План:


Настройка прокси

Чтобы наблюдать отправленные запросы и полученные ответы от приложения, нам нужно перенаправить сетевой трафик через прокси, который будет просто регистрировать (логировать) весь этот трафик для нас. В старые добрые времена http мы могли перенаправить трафик через прокси без особых настроек, но также мог сделать это любой умник с ноутбуком, подключенным к той же сети, логируя и даже изменяя ваш трафик без вашего согласия. Это так называемая атака "человек посередине" (man-in-the-middle attack), при которой третье лицо мониторит и изменяет ваш трафик без вашего согласия.

Чтобы решить эту огромную проблему, используется протокол https. Он шифрует общение между клиентом и сервером, предотвращая возможность понимания или изменения сообщений третьим лицом. Я не буду вдаваться в подробности о том, как устанавливается связь через https, но одна последняя информация важна для понимания того, что мы собираемся сделать дальше. При установке связи между клиентом и веб-сайтом клиенту необходимо знать, что предлагаемая веб-сайтом идентификация действительно подлинная. Это делается с помощью сертификатов, выдаваемых удостоверяющими центрами, которые уже установлены на устройствах или веб-браузерах, использующих интернет. Видео Computerphile очень хорошо объясняет, как работает атака "человек посередине" и что делается для ее предотвращения. В этой статье Joshua Davis показывает роль сертификатов и удостоверяющих центров в этом процессе.

Ожидается, что приложение, из которого вы будете извлекать данные, использует https, поэтому давайте настроим прокси с поддержкой перехвата трафика в https.

Шаги 2 и 3, описанные ниже, основаны на этой статье в блоге Ropnop и были воспроизведены здесь для удобства читателя.

Шаг 1

Первым шагом является установка Burp Suite, который имеет бесплатную версию и будет использоваться в качестве нашего прокси.

Шаг 2

Теперь мы экспортируем сертификат ЦС, выданный Burp. Этот сертификат будет установлен на устройстве и позволит Burp выдаваться за любой веб-сайт при перенаправлении трафика через него. Откройте Burp Suite с настройками по умолчанию для временного проекта, перейдите в Proxy -> Options и нажмите Import / export CA certificate. Выберите Certificate in DER format и нажмите Next. Укажите путь для сохранения сертификата и продолжайте до конца, чтобы завершить процесс.

Шаг 3

Отформатируйте сертификат в соответствии с требованиями Android. Мы установим этот сертификат в создаваемый нами эмулятор.

openssl x509 -inform DER -in NOME_DO_CERTIFICADO.der -out cacert.pem
openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1

Скопируйте значение, сгенерированное второй командой, и замените его на HASH в следующей команде, чтобы переименовать файл в соответствии с Android-стандартами.

mv cacert.pem HASH.0

В моем случае получившийся файл имел следующее название: 9a5ba575.0

Шаг 4

Настройте прокси Burp для принятия запросов. В Burp Suite перейдите в Proxy -> Options, а затем в раздел Proxy Listeners нажмите Add. В открывшемся окне на вкладке Bindings выберите порт, который не используется, например, 8082, и All interfaces для Bind to address. Нажмите OK, чтобы сохранить изменения и закрыть окно.

Настройка портов прокси в Burp

Шаг 5

Наконец, отключим перехват сообщений в прокси. Вкладка Proxy -> Intercept, отключите перехват, если он включен.

Desabilitação da interceptação de mensagens no Burp

Создание и настройка эмулятора Android

Чтобы узнать, какое API использует приложение, нам нужно запустить его. Самый простой и безопасный способ сделать это - использовать эмулятор. Это безопаснее, потому что мы установим сертификат CA Burp на устройство с разрешением root, и всегда лучше избегать вмешательства в такие вещи на своем телефоне, если вы действительно не знаете, что делаете. Настройка эмулятора Android очень проста, и мы рассмотрим это в следующих шагах.

Шаг 1

Первый шаг - скачать и установить Android Studio.

Шаг 2

Откройте Android Studio. Он попросит вас создать проект. Вы можете создать проект с настройками по умолчанию, нам он не понадобится.

Запуск Android Studio с проектом по умолчанию.

С открытой Android Studio нажмите Ctrl + Shift + a и введите AVD Manager. AVD Manager - это менеджер эмуляторов Android Studio.

Выберите Create Virtual Device. Вы можете выбрать любое устройство, предположу, но в этом руководстве я выбрал стандартное, Nexus 5X. Продолжайте с Next.

На следующем экране мы выберем версию Android для нашего эмулятора. Во вкладке x86 images выберите желаемую версию. Версия должна быть совместима с Open GAPPS (о котором мы поговорим позже). В этой ссылке вы найдете соответствия между версией Android и номером API. В этом руководстве я выбрал API уровня 28, что соответствует Android 9. Я не знаю, нужно ли использовать образ с Google APIs, но так как этот образ более полный, я решил использовать его сразу при первой попытке. Возможно, вам захочется использовать образ с Google Play, но он не подойдет, так как он не предоставляет root-доступ. После выбора желаемого образа нажмите Download рядом с его названием, чтобы скачать его. После загрузки выберите его и нажмите Next, чтобы продолжить.

На следующем экране мы настроим эмулятор. Единственное изменение, которое я сделал, - это в Boot Option, изменив его на Cold Boot. Quick Boot вызывал проблемы в прошлом, поэтому я всегда меняю эту настройку на всякий случай. Нажмите Show Advanced Settings и в Emulated Performance -> Boot Options выберите Cold Boot. Нажмите Finish, чтобы создать эмулятор.

В окне AVD Manager вы увидите имя эмулятора, запомните его на будущее.

Создание эмулятора Android

Шаг 3

Теперь установим Google Play на созданный нами эмулятор. Шаги установки, описанные ниже, были взяты из поста Daishi Kato, но мы воспроизведем их здесь для удобства читателя.

Сначала перейдите на страницу Open GAPSS и загрузите соответствующую версию Android, которую вы настроили в эмуляторе. Я использовал вариант Nano.

Загрузка Open GAPPS

Извлеките файлы для установки. Замените OPEN_GAPPS_DOWNLOAD.zip на имя загруженного файла

unzip OPEN_GAPPS_DOWNLOAD.zip 'Core/*'
rm Core/setup*
lzip -d Core/*.lz
for f in $(ls Core/*.tar); do
  tar -x --strip-components 2 -f $f
done

Запустите эмулятор. Замените AVD_NAME на имя вашего созданного эмулятора Android (сохраните @)

$ANDROID_HOME/tools/emulator @AVD_NAME -writable-system &

Установите пакеты

$ANDROID_HOME/platform-tools/adb root
$ANDROID_HOME/platform-tools/adb remount
$ANDROID_HOME/platform-tools/adb push etc /system
$ANDROID_HOME/platform-tools/adb push framework /system
$ANDROID_HOME/platform-tools/adb push app /system
$ANDROID_HOME/platform-tools/adb push priv-app /system

И перезагрузите систему

$ANDROID_HOME/platform-tools/adb shell stop
$ANDROID_HOME/platform-tools/adb shell start

Примечание: Может потребоваться закрыть эмулятор и запустить его заново.

Шаг 4

Войдите в Google Play и установите приложение, из которого вы хотите извлечь данные.

Шаг 5

Теперь нужно установить сертификат CA на устройство. Для этого следуйте инструкциям на блоге Ropnop.

Чтобы получить root-доступ к эмулятору и передать сертификат CA на эмулятор, используйте следующие команды. Замените CERTIFICATE.0 на имя ранее созданного сертификата CA.

$ANDROID_HOME/platform-tools/adb root
$ANDROID_HOME/platform-tools/adb remount
$ANDROID_HOME/platform-tools/adb push CERTIFICATE.0 /sdcard/

Теперь откройте терминал эмулятора

$ANDROID_HOME/platform-tools/adb shell

Переместите сертификат в правильную папку и исправьте разрешения

mv /sdcard/CERTIFICATE.0 /system/etc/security/cacerts/
chmod 644 /system/etc/security/cacerts/CERTIFICATE.0

Выйдите из терминала эмулятора с помощью ctrl + d и перезагрузите устройство

$ANDROID_HOME/platform-tools/adb reboot

Вы можете проверить установку сертификата, перейдя на эмуляторе в Настройки -> Безопасность и местоположение -> Дополнительно -> Шифрование и учетные данные -> Доверенные удостоверения и найдя PortSwigger

Проверка установленного сертификата CA

Шаг 6

Закройте эмулятор.

Теперь давайте запустим его, используя сеть через наш прокси.

$ANDROID_HOME/tools/emulator @AVD_NAME -writable-system -http-proxy localhost:8082

Готово, теперь у нас есть работающий прокси и эмулятор. Теперь давайте посмотрим, как использовать их, чтобы узнать, какое API использует приложение.


Открытие структуры API

Теперь давайте посмотрим, как устроено API, которое использует приложение. Для этого давайте оставим вкладку Proxy -> HTTP history в Burp открытой и откроем наше приложение. В журнале Burp мы будем искать в столбце Host конечную точку (URL), связанную с доменом приложения. В нашем случае это было очень легко найти, конечная точка была api.NOME_DO_APP.com.

Журнал HTTP-запросов в Burp

Приложение использует REST API. В таком API используются различные типы глаголов для отправки запросов, каждый из которых выполняет свою роль в идентификации намерений клиента. Каждый тип глагола сопровождается структурой в запросе. Здесь мы рассмотрим основы двух наиболее распространенных типов запросов для нашего случая: GET и POST.

GET

Запросы типа GET используются для получения информации с сервера. Параметры, которые вы передаете в запросе для идентификации информации, которую вы хотите получить, обычно вставляются в URL, это те множественные _alguma_variavel=algum_valor_, которые вы видите, разделенные & после ? в поиске Google.

POST

Запросы типа POST используются для отправки информации на сервер. Информация обычно вставляется в тело сообщения в формате JSON.

Наконец, стоит сказать, что REST API организовано в виде набора ресурсов, которые для наших целей можно рассматривать как набор путей, которые мы добавляем после конечной точки для выполнения конкретных действий. Эти пути похожи на организацию папок, с / в начале каждого подуровня. Так, для примера, /auth может использоваться для аутентификации, а /calendar/users/me для получения календаря пользователя.

Вернитесь к журналу приложения в Burp и найдите запросы, сделанные приложением. При выборе запроса, как на изображении выше, Burp покажет две вкладки: первая с информацией о запросе, вторая с информацией о ответе. Каждая вкладка содержит подвкладки, которые показывают различные способы просмотра информации, содержащейся в запросе/ответе. Первая подвкладка (Raw) содержит всю информацию о запросе/ответе в текстовом формате. Вы можете переходить по другим вкладкам, чтобы лучше понять, что представляет собой каждая часть текста во вкладке Raw. Информация, которую нам понадобится для отправки запросов, включает:

  • Конечная точка: найдена в поле Host таблицы.
  • Тип запроса: найден в поле Method таблицы.
  • Ресурс: найден в поле URL таблицы перед ?, если есть.
  • Заголовки: найдены на вкладке Request -> Raw. Это пары ключ-значение, начиная со второй строки до следующей пустой строки. Они также могут быть найдены в таблице на вкладке Headers.
  • Параметры: могут быть найдены в поле URL таблицы после ?. Не все запросы имеют параметры.
  • Полезная нагрузка (или данные): может быть найдена на вкладке Request -> Raw после пустой строки, следующей за заголовками. Не все запросы имеют полезную нагрузку.

Чтобы узнать, как запросить какую-либо информацию у сервера, пройдите по приложению так, чтобы оно сделало такой запрос. Затем просто запомните модель HTTP-запроса, определите перечисленные выше элементы и примените их в следующем скрипте на Python.


Извлечение данных с помощью Python

Теперь мы реализуем скрипт для выполнения запросов, подражая установленному на мобильном приложению.

Я предполагаю, что у вас уже есть некоторый опыт работы с Python и у вас уже установлен Python. Если нет, я предлагаю начать с Anaconda, используя Jupyter Notebook для разработки (он уже поставляется с Anaconda). Anaconda также поставляется с библиотекой Requests, но если вы используете чистую установку Python, вам нужно установить Requests.

python -m pip install requests

Requests - это библиотека на Python, которая упрощает отправку HTTP-запросов, все, что нам нужно для нашей цели.

Следующий код приводит пример запроса к API приложения, копируя то, что мы наблюдали в журнале Burp. Мы используем сеанс для сохранения куки и также для сохранения заголовков, которые повторяются между вызовами, чтобы не повторять их в коде каждый раз.


Заключение

В этой статье мы показали, как выполнять парсинг данных из приложения для Android. Веб-сайты являются ценным источником информации, и я надеюсь, что этот руководство поможет вам, когда вам понадобится извлечь данные из приложения.

Для получения дополнительной информации о науке о данных, искусственном интеллекте и связанных темах, следите за Группой Тьюринг в Facebook, Linkedin, Instagram и наших публикациях в Medium :).

Отказ от ответственности

Эти шаги работали для меня. При их повторении следует быть осведомленным о том, что вы делаете.

Сбор данных может нарушать условия использования некоторых платформ, поэтому ознакомьтесь с условиями использования, которые применяются в вашем случае.