- 집안 강아지 관찰을 위해 Tapo 카메라를 구입했지만, 예기치 않게 TP-Link 기기와 앱의 동작 원리를 역설명함
-
온보딩 과정과 암호화 API 통신 구조를 분석하기 위해 MITM, APK 디컴파일, 암호 해독 스크립트 생성 등 다양한 기법을 사용함
-
초기 관리자 비밀번호의 발견 및 세션 키 파생 과정을 통해 암호화된 메시지를 해독하고, 디바이스와 클라우드 계정 간 신뢰성 없는 동기화 문제를 파악함
-
온보딩 전체 흐름을 분석해 주요 API 호출 과정, 계정 생성, 비밀번호 변경, Wi-Fi 연결 과정 등을 Bash 스크립트로 자동화함
-
Tapo 펌웨어 보안 설계의 허점과 덜 정교한 암호화 구현, 불규칙한 계정 동기화 등, 저가형 IoT 디바이스의 특징을 지적함
프로젝트 개요
- 필자는 실내 강아지 관찰을 위해 저가형 Tapo 카메라를 구입해 사용함
- 사용 과정에서 설정의 불편함과 온라인 정보의 부족으로 인해, 제품 동작 원리를 깊이 파헤치게 되는 동기를 갖게 됨
-
frigate 연동, 2way audio 활성화 등에서 예상치 못한 문제가 발생해, 클라우드 연동 없는 직접 온보딩 방법에 관심을 갖게 됨
온보딩 및 인증 구조 분석
- Tapo 카메라의 연결 절차를 분석하기 위해 MITM proxy와 frida 동적 후킹 도구를 사용해 앱과 카메라 간 트래픽을 가로챔
- 최신 앱들은 프록시 무시, certificate pinning 등 우회 저항 기능이 있으므로, 동적 도구를 이용한 방법이 유효함
- 이러한 우회 구조 세팅 후, 카메라 온보딩 플로우에서 기본 관리자 계정 login 과정을 정확하게 확인함
-
기본 로그인 API는 클라우드 계정 암호와 별개로 디바이스 고유의 기본 비밀번호로 동작함을 발견함
암호화 구조 및 기본 비밀번호 탐색
-
APK 디컴파일(JADX 사용) 및 코드 분석을 통해, admin 계정의 기본 비밀번호(TPL075526460603)를 확보함
- 클라우드 암호를 변경해도 이미 연동된 카메라 기기는 변경을 인지하지 못하는 점에서, 앱과 카메라 간 비밀번호 동기화가 부정확함을 확인함
- 기본 비밀번호를 알아냈으므로, 세션 키(lsk, ivb) 파생 로직을 구현해 암호화 API 메시지를 실시간으로 해독 가능하게 함
mitmproxy 스크립팅 및 API 분석
-
PyTapo 오픈소스 프로젝트를 참고해, 실제 Tapo 온보딩 절차의 API 흐름을 정밀히 분석함
-
tapo_decrypt_pretty.py 스크립트를 통해
- 로그인 핸드셰이크 감지
- 세션 키 추출
- 암호화 API 해독 및 가독성 높은 출력, JSON 저장
- 전체 온보딩 API 호출 내역 중 유의미한 주요 과정만 추려 자동화 워크플로우를 생성함
- Wi-Fi 목록 조회(scanApList)
- RTSP/ONVIF 계정 활성화
- 관리자 비밀번호 변경
- Wi-Fi 연결
자동화 및 결과
- Bash 스크립트(tapo_onboard.sh)로 위 모든 온보딩 과정을 자동 실행하게 구성함
- 기본 admin 로그인
- Wi-Fi 선택 및 연결
- 카메라 피드 로고 제거
- RTSP/ONVIF 사용 허용
- 관리자 비밀번호 재설정
- 카메라 펌웨어 구조상 다음과 같은 특징 및 허점을 발견함
- 일부 API는 SHA-256 해시를 사용하나, 몇몇은 MD5 등 구식 암호 방식 유지
-
공개키가 2개 존재하며, 어떤 상황에 어느 키를 사용해야 하는지 불분명함
- 앱과 디바이스 간 비밀번호 동기화가 매우 불안정함
결론 및 소감
- Tapo 카메라 펌웨어와 API 보안 구조는 임시방편 및 덜 정교한 설계로 느껴짐
- 저가형 IoT 기기의 보안적 허점과 불완전한 온보딩 시스템 현실을 간접적으로 체험함
- 프로젝트의 궁극적인 목표였던 강아지 체크에는 성공했으며, 강아지는 소파 혹은 침대에서 자는 모습을 주로 확인함