Hacker News Digest

15 сентября 2025 г. в 16:28 • kennedn.com • ⭐ 522 • 💬 162

OriginalHN

#frigate#tls#frida#mitmproxy#android#iot#pytapo#rtsp#onvif#ffmpeg

Wanted to spy on my dog, ended up spying on TP-Link

Хотел следить за собакой, а следил за TP-Link

Купил дешёвую камеру Tapo, чтобы наблюдать за собакой в своё отсутствие. В итоге пришлось реверсить процесс подключения, декомпилировать APK, перехватывать TLS-трафик и писать криптографические скрипты.

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

Примечание: для двустороннего аудио в frigate используйте tapo:// вместо rtsp://. TP-Link ленивы и реализовали аудио только в своём API.

Выяснилось, что после подключения устройство ожидает логин admin и пароль от облака Tapo. Но если сменить пароль в облаке, устройства об этом не узнают. Это навело на мысли:

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

Раздражение из-за навязчивых подписок в приложении Tapo подтолкнуло к поиску облачного решения для подключения.

Перехват трафика

Для перехвата трафика мобильного приложения нужно направить весь HTTP(S)-трафик через прокси. Современные приложения игнорируют прокси и используют привязку сертификатов. Надёжный метод — динамическая инструментация через frida, которая заставляет приложение использовать нужные прокси и сертификаты.

Схема перехвата:

Приложение Tapo (с frida) -> Ноутбук (mitmproxy) -> Камера Tapo

После запуска mitmproxy и внедрения скриптов frida удалось увидеть первоначальный логин до смены пароля:

{
  "method": "login",
  "params": {
    "cnonce": "AD0E189F6E1BA335",
    "encrypt_type": "3",
    "username": "admin"
  }
}

Последующие запросы были зашифрованы:

{
  "method": "securePassthrough",
  "params": {
    "request": "bAhdgihJ9j6PrrknnbXWATBohGTZK5llv3MEzRcmoAmcxexmlVNz3OUX2r0h9a9EG/3X0tBpPi654T2+BjqVEOn2D178kokBpf8RQj01AvBZLYD5S5sFeaCXWiRXA7MgQUppROV4AbrU4f+GOM37KgPqT59qgLVja2slw6CzrKjPzOrG4Ho6Mu6wBa1xepcj"
  }
}

Выводы:

  • У Tapo есть пароль по умолчанию, так как логин происходит до знания облачного пароля.
  • API использует зашифрованный канал securePassthrough.

Декомпиляция APK

Следующий шаг — декомпиляция APK в JADX для поиска пароля по умолчанию. Запрос логина содержит имя пользователя admin. Поиск по коду привёл к классу CameraOnboardingViewModel, где функция возвращала пароль, передаваемый в new Account().

Пароль по умолчанию для encrypt_type: 3: TPL075526460603

Анализ трафика

С паролем по умолчанию можно получать ключи сессии и расшифровывать сообщения securePassthrough. Для анализа процесса аутентификации пригодилась библиотека PyTapo. С её помощью можно было декодировать запросы из mitmproxy и провести статический анализ.