Не секрет, что большинство крупных сервисов на серверной стороне используют какой-либо API (Application Programming Interface) для взаимодействия с различными клиентами.

На «очной ставке» NeoQUEST-2016 Максим Хазов рассказал о различных подходах к определению и использованию скрытого серверного API-функционала на примере таких популярных сервисов, как ВКонтакте, Instagram, Facebook.

В данной статье остановимся на основных моментах доклада и поделимся всеми электронными материалами: видеозаписью выступления, презентацией, а также демонстрациями атак для каждой рассматриваемой социальной сети (всё под катом).

Намекнём: «прогулки» по социальным сетям ещё предстоят участникам NeoQUEST-2017, регистрация на online-этап которого идет полным ходом!

Как это звучало на NeoQUEST?


Сразу же, как и обещали, делимся презентацией (тык) и докладом:



Зачем определять API?





Основных цели в данном случае две:

  1. Искать уязвимости (на серверной стороне или в протоколе взаимодействия).
  2. Автоматизировать действия в социальных сетях (всеми любимые “боты”).

Подобных ботов можно назвать “хамелеонами”, так как они будут мимикрировать под официальное мобильное приложение сервиса, выполняя такие же запросы с такой же структурой. На серверной стороне будет непросто отличить такого бота от настоящего пользователя мобильного приложения.

Как изучать API?


Есть 3 главных направления:

  • Изучение документации (хорошо, если она есть!);
  • Анализ сетевого трафика (наиболее простой способ, далее выбран в качестве основного);
  • Реверс-инжиниринг мобильного приложения (наиболее “хардкорный” способ, но иногда без него не обойтись).

Примеры и демонстрации




Для демонстраций была использована контролируемая Wi-Fi точка, а также прокси для HTTP-запросов Burp Suite. В данном случае все тестируемые приложения взаимодействовали с API с помощью протокола HTTP и его модификаций.

ВАЖНО!


Исследование проводилось весной-летом 2016 года, на данный момент в архитектуре приложений и протоколов взаимодействия могут быть изменения (например, с ноября 2016 приложение ВКонтакте для Android больше не поддерживает протокол HTTP).

ВКонтакте и незащищенный протокол HTTP


Мобильное приложение ВКонтакте под Android по умолчанию использует протокол HTTP, а значит (как было показано в первой части доклада, видеозапись которого в конце статьи):

  1. Приложение уязвимо для атак типа Man in the Middle (MITM). Тем не менее, API предусматривает некоторые меры защиты от модификации и повторения запросов.
  2. Не составляет никакого труда проанализировать API, используемое приложением (хотя к нему и так существует открытая документация).

В демонстрации показан перехват незашифрованного трафика и нахождение в нем запроса к API, отвечающего за отправку сообщения.



Instagram и HTTPS


Во второй части доклада было рассмотрено приложение Instagram под Android, для взаимодействия с API оно использует защищенный протокол HTTPS (HTTP + SSL). Это значит, что в общем случае (при отсутствии доступа к устройству у исследователя и достаточно современной версии TLS) протокол взаимодействия не уязвим к атакам MITM.

Но, имея доступ к телефону, можно установить на него свой корневой сертификат и легко расшифровывать трафик, подменяя сертификаты для HTTPS соединений (BurpSuite умеет это делать в автоматическом режиме). В демонстрации показаны перехват шифрованного трафика после установки на телефон контролируемого корневого сертификата и нахождение в нем запроса к API, отвечающего за лайк к фотографии.



У Instagram существует публичное документированное API для разработчиков. В нем заданы достаточно строгие лимиты для ключевых функций (лайки, подписки, постинг и т.д.). Как выяснилось, приложение Instagram использует другое, приватное API, в котором, разумеется, подобных лимитов нет.

Чем интересно это приватное API в плане “ботоведения”? Главное отличие приватного API: подпись всех важных запросов секретным ключом (уникальным для версии приложения). Так как ключ хранится внутри приложения, можно достать его с помощью реверс-инжиниринга приложения.

Facebook и SSL Pinning


В третьей части доклада было рассмотрено приложение Facebook под Android. Данное приложение для взаимодействия с API использует защищенный протокол HTTPS + надстройку под названием SSL Pinning.

SSL Pinning – внедрение в код мобильного приложения SSL-сертификата сервера API. Эта технология предназначена для защиты от перехвата трафика путем установки корневого сертификата на устройство и подмены сертификатов.

Тем не менее, SSL Pinning можно отключить (и даже разными способами):

  1. С помощью декомпиляции и модификации приложения (сложный способ).
  2. Модифицируя низкоуровневые SSL функции на устройстве (требует root-доступ, не всегда работает стабильно). Программы Android SSL Bypass, iOS SSL KillSwitch работают именно по этому принципу.

В докладе был продемонстрирован способ отключения SSL Pinning в мобильном приложении Facebook под Android (с помощью удаления одной из библиотек, используемых приложением – libsslx.so) и последующий успешный перехват трафика.

Как выяснилось при анализе трафика, мобильное приложение Facebook использует некоторые недокументированные методы API (в том числе, для регистрации аккаунтов и входа в систему).

Также был найден недокументированный метод API, позволяющий получить ID пользователя Facebook по номеру телефона. Вот как выглядит демонстрация возможного автоматизированного использования полученных недокументированных методов:



В заключение


При должном желании всегда можно проанализировать протокол взаимодействия между мобильным приложением и сервером. Использование дополнительных средств защиты (таких, как SSL Pinning) может лишь несколько затруднить работу исследователю. Поэтому разработчикам следует избегать использования привилегированных недокументированных методов API в приложении (особенно если есть публичное и документированное API).

Кроме того, есть возможность сделать бота, который будет отправлять точно такие же запросы, как официальное мобильное приложение. Для борьбы с подобными ботами можно порекомендовать усложнять структуру запросов к API и тщательно анализировать все параметры запросов на серверной стороне.

На «очной ставке» NeoQUEST-2017, которая пройдет 29 июня в Питере, как и всегда, будут классные доклады о самых актуальных тенденциях кибербезопасности, современных механизмах защиты и способах их обхода.

Если ты не из Питера, смело планируй свой отпуск на июнь и приезжай! Белые ночи, разводные мосты, бесконечные дожди и NeoQUEST-2017 космической тематики с докладами, демонстрациями, конкурсами и призами — все это ждет тебя. Также ты можешь посетить «очную ставку» как участник hackquest и сразиться за главный приз — поездку на одну из международных конференций по информационной безопасности! Для этого — регистрируйся тут и с 1 по 10 марта проходи задания online-этапа. Возможно, именно ты окажешься лучшим? Узнаем 10 марта…
Поделиться с друзьями
-->

Комментарии (2)


  1. FSA
    06.02.2017 18:38

    приложение Instagram под Android, для взаимодействия с API оно использует защищенный протокол HTTPS (HTTP + SSL)

    Вроде говорили, что Telegram — защищённый месседжер. Судя по всему он пользуется теми же методами для шифрования, что и XMPP? Однако в XMPP можно использовать свой собственный сервер, который может быть установлен хоть у себя дома. Я правильно понял?


    1. Vespertilio
      08.02.2017 15:07

      Вы не спутали Instagram и Telegram? Нет не теми же методами. Алгоритмами — возможно. Протокол Телеграмма подразумевает многоуровневое шифрование https://core.telegram.org/mtproto, у XMPP же просто оборачивается в SSL контейнер.

      У Телеграмма открытый протокол и исходиники клиентов, и хоть нет исходников сервера, но вы можете сами его написать при желании.