26 марта 2020 г. API Sniffing Android Instagram macOS Proxy Debug EN In English

Чтение запросов Instagram Private API с помощью Charles Proxy

Для автоматизации управления аккаунтами в Instagram я использую различные библиотеки, которые используют так называемый Private API.

Библиотеки генерируют запросы, притворяясь официальным приложением, но со временем Instagram меняет свой API и библиотеки теряют свою актуальность.

Приходится ждать когда сообщество исправит проблему, либо исправляю её сам.
Изначально идея кажется здравой, сообщество вокруг библиотеки будет помогать в её развитии, но на деле все ждут, что кто-то решит появившуюся проблему.

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

Reverse Engineering

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

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

Есть решение проще - снифинг трафика от приложения к API, в итоге будет виден сразу любой запрос и не надо собирать его по кусочкам.

Проксирование запросов

Но есть проблема - все запросы в Private API идут через HTTPS. Читать такой трафик невозможно, он зашифрован.

В настройках Facebook (для Instagram) можно разрешить пользовательские сертификаты и отключить TLS, этим в статье мы и займемся!

Для решения проблемы мы будем использовать Charles Proxy. С его помощью мы будем мониторить трафик от Android смартфона на десктоп (в моём случае это macOS Mojave).

Установите Charles Proxy, он запустит на вашем десктопе прокси и предложит установить его сертификаты (Help > SSL Proxying > Install Charles Root Certificate on Mobile Device or Remote Browser):

Добавляем Charles в брандмауэр macOS (Настройки > Защита и безопасность > Брандмауэр):

Отлючаем кеширование в Charles (Tools > No Caching):

Теперь нам надо перейти в Researcher Settings on Facebook и включить пользовательские сертфикаты для вашей учетной записи в Instagram:

Установите галочки напротив "Enable user installed Certificate Authorities (CAs) for your Facebook account" и "Enable user installed CAs for your Whitehat Test Accounts.", а также выберите Instagram в "Select on which apps you want to enable the Mobile Settings".

Остановите приложение Instagram на вашем смартфоне и очистите данные для этого приложения. Запустите приложение Instagram снова и нажмите "Войти через Facebook". После чего перейдите в Настройки > Служебные > Whitehat Settings и включите "Allow user installed certificates" и "Do not use TLS 1.3":


Устанавливаем сертификат Charles на смартфон

Помните, ваш смартфон и десктоп должны быть в одной локальной сети!

В настройках WiFi соединения укажите прокси, адрес которого был получен в самом первом скриншоте Charles:

Как только через этот прокси пойдут запросы, Charles предложит подтвердить соединение, жмите Allow:

Откройте браузер на смартфоне и перейдите по ссылке chls.pro/ssl, вам предложат сохранить сертификат. Откройте сертификат через "Установщи к сертифика":

И установите его:

Теперь сделаем любой запрос через приложение Instagram (просто погуляйте по интерфейсу) и помечаем хосты для использования SSL:

Резюме

В результате, у вас должно отобразиться дерево запросов к Private API:

Ну и сами запросы с заголовками тоже будут видны:

Однако, если ваш трафик выглядит примерно так:

Значит вы неверно настроили пользовательские сертификаты, оставьте развернутый комментарий к этой статье и я постараюсь вам помочь!

Но если вы можете прочитать заголовки и тело запроса по прежнему бинарного вида, тогда смотрите заголовок Accept-Encoding. Если в нём указано zstd, то тело запроса можно прочитать с помощью моей утилиты zstdcat.

pip install zstdcat
cat /tmp/response.bin | zstdcat

Читайте также:

Комментарии

У вас это точно работало для ios? У меня на android клиенте только включается internal.

Ответил по почте Кириллу и убрал упоминание iOS из статьи.
Тем кому интересно можете почитать https://habr.com/ru/company/dataart/blog/424485/

На сегодня уже отрезали разрешение своих сертификато через Whitehat, в самом FB уже нет такого пункта.

"Researcher Settings on Facebook" - нет Researcher Settings
В приложении instagram нет "Служебные"
Устройство:
cool 1 (c106)
Версия Android:
9

В настройках больше нет "Enable user installed Certificate Authorities (CAs) for your Facebook account" и "Enable user installed CAs for your Whitehat Test Accounts."

Сделал по статье, была проблема: "You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu."
Решение:
Go to Proxy>SSL Proxy Settings
In SSL Proxying tab check Enable SSL Proxying
Click Add button to add * in Host and * in Port to filter all hosts and Ports, click OK button. Here you can put any Host or Port that you want to enable SSL Proxying for those Host and Port only.
Но в конце трафик выглядит как на последнем скрине. Галки в facebook проставлены все, и даже больше)
В instagram все галки тоже стоят(снизу надпись красная тоже появилась)
В Charles на https://i.instagram.com в overiew поле Notes: "SSL Proxying enabled for this host"
на самих запросах Notes:"SSL Proxying not enabled for this host: enable in Proxy Settings, SSL locations"
SSL сертификат установлен(пробовал и для vpn и приложений, и для wifi - результат одинаков), прокси в настройках wifi включен.

@Михаил, можем созвониться и решим проблему, скорее всего

@adw0rd, скайп, дискорд, что-то другое? Когда и во сколько удобно?

привет :)

вот у меня получился сценарий с неправильно настроенным сертификатом, то есть все показывает ок, только контент такой, как на скрине? что можно сделать?

привет, спасибо за статью, что может помочь в порядок привести контент? то есть ситуация, как на последнем скриншоте

@igor, Михаил решил проблему так:

Поставил сертификат с charlesproxy.com/getssl
Он кидает переадресацию на http://chls.pro/ssl
Но файл называется иначе, хоть и имеет тот же вес

На android ниже 6 версии лучше устанавливать через "установить сертификат" в настройках, так он сразу цепляется
на 7.1 помогла установка сертификата по длинной ссылке то ли для vpn/приложений, то ли для wifi - точно не помню

В итоге у него стал расшифровать трафик

igor, была такая же проблема, поставил сертификат с charlesproxy.com/getssl (в итоге кинет на тот же короткий адрес)
Попробуй ставить его под wifi и под vpn/приложения, предварительно удалив старый. Во время установки сертификата, charles должен быть запущен

Сергей Прохоров 29 декабря 2020 г. 13:13

была та же проблема, что и у всех, прокси работает, но данные зашифрованы. проблему удалось решить так: очистил данные приложения в смартфоне, перелогинился через ФБ (на время логина пришлось отключить прокси), снова в настройках инсты включил Whitehat - профит!
ЗЫ скачивал сертификаты на мобильный с обеих ссылок, какой именно заработал - не помню точно. но есть мнение, что на самом деле оба рабочие. устанавливать сертификат нужно для VPN, должно появиться предупреждение андроида о возможной незащищенности канала (во всяком случае у меня так)

Hi...thanks you for the explanation...I usually reverse engineer apps with mitmproxy..so tried it with Instagram after attempting to remove the ssl pinning (I didn't know there was a researcher settings at the time) needless to say...it wasn't a successful operation.

Now, after reading your explanation I attempted to read the requests with charles and enabled the research settings on Instagram...the requests however are marked as 'unkown' and as if it was sent from a normal user account with no testing enabled...I've eliminated the possibility that I could have misconfigured the CA certificate as I can read the requests sent via the mobile browser.

So I'm not sure what is causing this problem...your help would be greatly appreciated.
Thanks.

This is the error I'm getting in charles: "SSL handshake with client failed: CA certificate could not be matched with a known, trusted CA (unknown_ca)"
"You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu."

I'm using Android, not IOS in this case.

Оставьте свой комментарий

Markdown