Skip to main content

Перехват HTTP/HTTPS трафика на Android без ПК

· 6 min read

Вступление

Info

Статья перенесена на сайт difhel.dev 21 декабря 2023 года с внесением незначительных изменений.

Смотреть оригинальную статью в веб-архиве - https://vk.com/@superdev-mobile-traffic-interception

Если вы так же, как и я редко бываете дома и часто не имеете доступа к ноутбуку с Charles Proxy / Burp Suite, то эта статья для вас.

Тут - о том, как перехватывать (и, конечно, изменять) HTTP/HTTPS трафик, имея доступ только к телефону.

Нам понадобится

Магическое приложение (aka чарлик мобайл) - это и есть SandroProxy. Программа была создана в 2012 и не обновлялась с 2016 года. Тем не менее, мне удалось ее запустить в 2023 на Android 13, хотя некоторые фичи не работают.

Начинаем магию!

Для начала выдаем разрешения SandroProxy, далее нужно предоставить root-права. Для удобства можно в Magisk временно включить автоматическое предоставление прав при запросе.

Программа встречает нас современным интерфейсом в стиле последней версии Material Design 3 /s

1. Выбираем режим Plain proxy, выделенный режим помечается звездочкой (вообще нам нужен developers mode, но у меня с ним возникло много проблем).
1. Выбираем режим Plain proxy, выделенный режим помечается звездочкой (вообще нам нужен developers mode, но у меня с ним возникло много проблем).

Далее нужно настроить систему для перенаправления всего трафика на localhost:8008. Есть вариант подключиться к WiFi и использовать прокси. Но у меня это не заработало.

Поэтому нам нужен оберточный прокси Drony. В нем нужно настроить перенаправление всего трафика системы на localhost:8008. Для этого Drony будет использовать VPN-соединение.

1. Интерфейс Drony. Не включаем прокси до настройки!
1. Интерфейс Drony. Не включаем прокси до настройки!

Далее выбираем тип соединения с интернетом - WiFi или другое (например, мобильный интернет).

1. Выбираем Hostname localhost и порт 8008, proxy type - manual
1. Выбираем Hostname localhost и порт 8008, proxy type - manual

Выбираем Hostname localhost и порт 8008, proxy type - manual.

Если мы сейчас запустим Drony, то произойдет примерно следующее.

  1. SandroProxy ловит запрос и отправляет его на заданный сервер.
  2. Поскольку запрос исходит с телефона, он проходит по VPN-соединению Drony.
  3. Drony редиректит запрос на localhost:8008.
  4. Запрос дублируется.
  5. Приложение уходит в вечную рекурсию и падает.

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

Для этого на вкладке Settings Drony ищем Filter → Edit filter rules → нажимаем на + → выставляем значения Network ID: all networks, Action: Direct, Application: выбираем SandroProxy в списке. Все остальные поля оставляем пустыми и сохраняем. После этого перезапускаем Drony.

Сама магия

Далее включаем Drony и смотрим, чтобы в логе не было ошибок. SandroProxy уже должен быть включен.

Drony

Если в логах есть что-то такое:

VK Messenger < - > 87.240.137.130:443

ConnectionHandler got an error:

java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 8008) > from /127.0.0.1 (port 48495)

after 30000ms: isConnected failed: ECONNREFUSED

(Connection refused)

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

Теперь возвращаемся в SandroProxy.

Как создать breakpoints

В приложении есть такая вкладка, как Apps - местный аналог breakpoint'ов. Оно ловит соединения (можно настроить http/https/extra) у заданных приложений. Советую выбирать только нужные приложения, если не хотите вручную обрабатывать кучу фоновых запросов от системы (ну а если вам не лень, то смело ставьте галочки в All).

Для примера будем ломать сайт https://eth0.me - сайт показывает IP-адрес клиента.

Будем перехватывать запросы из Chrome. Выбираем приложение и ставим нужные галочки.

SandroProxy

Теперь идем в Chrome и открываем тестовый сайт. Для примера я буду использовать https://eth0.me - сайт возвращает IP-адрес клиента plaintext'ом. Если сделали все правильно, сайт зависнет (так же, как и в Charles), пока вы не пропустите запрос вручную.

Вот так выглядит окно request'а:

Request in proxy

Вот так - окно response'а: Response in proxy

Заменим текст на наш собственный.

Editing response

Сохраним response (и еще пропустить запрос favicon.ico, чтобы страница запустилась), и - вуаля!

Final screenshot


Вместо заключения

Понятно, что такой инструмент не позволит полностью обойтись без Charles при тестировании безопасности веб-сервисов. Однако это точно поможет быстро проверить запросы/ответы к серверу и провести минимальные проверки, находясь в любой точке мира без компьютера.