Перехват HTTPS-траффика между Android-устройством и внешним сервером

  • Tutorial

Иногда бывает любопытно подсмотреть, что пересылают туда-сюда разные Android-приложения по HTTP и HTTPS протоколам. Иногда даже при разработке собственного ПО удобно видеть весь трафик в реальном времени. Для реализации этих задач давно придумано много хороших программ, таких, к примеру, как Charles или Fiddler2. На самом деле их намного больше, вот только две вышеуказанные дают возможность нормально просматривать не только HTTP, но и HTTPS.

Трудности начинаются тогда, когда речь заходит о перехвате трафика между Андроид-устройством и внешним сервером. В случае незашифрованного (HTTP-протокол) трафика всё весьма тривиально (вот и инструкция есть) — разрешаем Fiddler2 внешние соединения, в Андроиде устанавливаем прокси сервером адрес нашей машины с Fiddler2 — и вуаля, всё работает. А вот на настройку перехвата HTTPS-трафика у меня ушло чуть больше времени.

Теория


Итак, в чём же сложность? В том, что при использовании протокола HTTPS клиент по-умолчанию проверяет, а действительно ли тот сервер, к которому он подключился, является нужным. Для этого используются сертификаты. И вот у настоящего сервера этот сертификат, понятное дело, тоже настоящий и соответствует открытому URL, а вот у нашего прокси — нет. Для решения этой проблемы в десктопных операционных системах в таких случаях есть возможность сгенирировать в Fiddler2 поддельный сертификат, импортировать его в доверенные — и теперь клиент всегда будет верить, что соединение с Fiddler2 вполне безопасно. К сожалению, с мобильным устройством такой легкий финт ушами не прошел.

Во-первых, возможности импортировать внешний сертификат в Андроиде версий младше 4.0 нет. Есть какие-то не внушающие доверия варианты с рутоваными девайсами — но это не наш путь.
Во-вторых, в Андроид даже версии 4.0 импортировать сертификат Fiddler2 не получается. Дело в том, что генерируемый по-умолчанию сертификат не соответствует каким-то там Андроидовским критериям безопасности и не устанавливается. Его нужно генерировать специальным образом.
В-третьих, совсем даже не факт, что все подряд программы сразу поверят поддельному сертификату. Есть нюансы.

Практика


  1. Берём устройство с Андроидом версии 4.0 или выше. Нет, девайс с 2.3 не подойдет. Да, эмулятор версии 4.0 подойдет.
  2. Устанавливаем на компьютер последнюю версию Fiddler2.
  3. Устанавливаем специальные библиотеки генерации Андроид-совместимого сертификата безопасности отсюда.
  4. Экспортируем из Fiddler2 сертификат безопасности («Tools->Fiddler Options->HTTPS->Export root certificate to Desktop»). Кладём на флешку, в корень (ну или на эмулятор, если вы используете его).
  5. На Андроиде добавляем сертификат безопасности в доверенные(«Settings > Security > Install from SD card»)


  6. Запускаем Fiddler2, разрешаем в настройках внешние коннекты
    .

  7. На Андроиде в настройках сети прописываем в качестве прокси адрес нашей десктопной машины с Fiddler2.


  8. На Андроиде открываем браузер, вводим google.com — и видим запрос с ответом в окне Fiddler2.



Итак, с браузером получилось. К сожалению, не все программы столь доверчивы, как браузер. К примеру, в моей собственной софтине, где я использую Apache HTTP Client, способ не прокатил — плевал апачевский клиент на доверенные сертификаты операционки. В этом случае мне пришлось отключить эту проверку вручную, таким вот образом:

Protocol.registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(), 443));


где EasySSLProtocolSocketFactory взят отсюда и разрешает доверие к любым сертификатам.
Не безопасно, только для отладки!

После этого трафик моей программы стал также успешно отображаться в Fiddler2.
Инфопульс Украина 260,16
Creating Value, Delivering Excellence
Поделиться публикацией
Комментарии 16
  • –4
    Мы делали это проще. Машину с установленым Wireshark прописываем как gateway на телефоне. А дальше просто анализаруем Wireshark`ом трафик.
    • 0
      А если хочется поделать что-то руками и почувствовать себя тру-хацкером, то есть LIBPCAP. Кстати, написанное приложение можно будет поставить прямо на телефон.
      • +34
        https, ага.
        • +4
          Wireshark понимает https если в него вставить ключи выданные сервером. И очень часто доступа к серверу нет.
        • –12
          По заголовку, ждал разгромную статью о том, что https устарел, в нем много дыр, и смотрите — он типа ничего не защищает… А статья о том, как человек трафик мониторил.
          • +2
            Не курите так.
            • 0
              Там лэйбочка «tutorial» в заголовке, а в статье — ровно то, что написано в заголовке и ничего больше.
              • 0
                Да, проглядел, прошу прощения.
            • +2
              Мне одному кажется странным, что в окне Fiddler HTTP траффик? а где HTTPS? или https работает только до виндовой машины, а дальше уже идет http? тогда не удивительно, что другие программы не заработали =) Особенно если в них вшиты свои сертификаты.
              • 0
                У Вас зоркий глаз, а я, оболтус, не тот скриншот вставил :)
                Всё ходит в HTTPS, и до виндовой машины, и после.
                Уже исправил.
              • НЛО прилетело и опубликовало эту надпись здесь
                • 0
                  Эта статья не в блоге «Информационная безопасность», она в блоге «Разработка под Android». Конечно, установка собственного сертификата в устройство — это не его взлом, это просто способ дать разработчику на его устройстве контроль за трафиком своих и иногда чужих\системных приложений.
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • +1
                      очень даже полезный, можно узнать, как работает приложение и на основе этих запросов организовать DDOS или еще что с обычных ПК… вот вам и ИБ.
                      • +2
                        Велосипед не бесполезный. Вот, к примеру, использую я WebDAV-библиотеку, которая по HTTPS общается с каким-то WebDAV-сервером. И вот что-то глючит, работает плохо. Я ведь должен узнать, кто виноват — сервер или библиотека. Можно долго дебажить и расставлять логи, а можно за 3 минуты по рецепту из данной статьи увидеть картину происходящего.

                        Другой пример — многопоточное приложение, при закачке 100 файлов параллельно вдруг портит парочку из них. Дебажить такое очень тяжело, а в Fiddler2 можно увидеть какие запросы были сделаны, какие ответы получены, сколько это заняло времени.
                        • НЛО прилетело и опубликовало эту надпись здесь

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

                  Самое читаемое