TL;DR

  • Wi-Fi 스마트 주전자를 구매해 네트워크와 펌웨어를 살폈지만, 주전자 내부의 웹 서비스나 앱과 주전자 사이의 직접 통신은 발견되지 않음
  • 초기 설정 과정에서 주전자가 자체 개방형 액세스 포인트를 생성하지만 DHCP로 IP 주소를 배포하지 않는 동작이 확인됨
  • 주전자에는 TCP 6668 포트 하나만 열려 있었고, 웹 서비스나 배너는 응답하지 않음
  • 가짜 액세스 포인트와 패킷 캡처를 사용한 결과, 주전자는 앱과 직접 통신하지 않고 Azure 클라우드TLS 1.2로 연결해 상태를 전송하고 명령을 가져오는 구조로 추정됨
  • Wi-Fi 모듈과 클라우드 백엔드는 Tuya 플랫폼으로 확인됐으며, 기기를 Tuya 클라우드 없이 구동하는 펌웨어 플래시는 검토했지만 해당 기기가 너무 최신이라 적용하지 못함

스마트 주전자 구매와 초기 설정

  • 지난 토요일 장을 보던 중 특가 매장에서 Wi-Fi로 제어하는 스마트 주전자를 발견하고, 만우절 농담으로 작성된 HTTP 상태 코드 418 ‘I'm a tea pot’와 Mastodon에 올린 관련 게시물이 떠올라 해당 기기를 구매함.
  • 스마트 Wi-Fi 사물인터넷(IoT) 기기를 다루는 프로젝트나 해킹을 아직 진행하지 않았기 때문에 작동 방식과 예상되는 동작을 알지 못한 상태였음.
  • 처음에는 스마트폰 앱이 주전자와 직접 통신하며, 주전자에서 일종의 서버 또는 애플리케이션 프로그래밍 인터페이스(API)가 실행될 것으로 예상함.
  • 주전자 받침대를 전원에 연결하고 Wi-Fi 버튼을 누르자 주전자가 신호음을 내고 불빛을 깜박인 뒤 자체 개방형 액세스 포인트를 생성함.
  • 해당 네트워크에는 연결할 수 있었지만, DHCP를 통해 IP 주소를 배포하지는 않음.
  • 다음 시도에서 스마트폰에 Lidl Smart Home App을 설치하고 초기 설정을 실행함.
  • 집의 Wi-Fi 자격 증명을 입력한 뒤 주전자 자체 Wi-Fi에 연결함.
  • 입력한 데이터가 주전자로 전송되고, 몇 차례 신호음 이후 주전자가 집의 Wi-Fi에 연결되어 앱에서 사용 가능한 상태가 됨.
  • 앱에서 물을 끓일 온도와 보온 시간을 설정할 수 있음.
  • 차 종류별로 미리 정의된 프로그램과 온도 설정도 제공되며, 주전자의 상태와 물 온도도 표시됨.
  • 화면 하단에 달력 아이콘이 있지만 끓이기 일정을 예약하는 기능은 제공되지 않음.

주전자에서 실행 중인 서비스 탐색

  • Fritzbox의 네트워크 신규 장치 알림으로 주전자의 IP 주소를 확인함.
  • 해당 IP를 대상으로 nmap 스캔을 실행해 주전자에서 실행 중인 서비스를 확인함.
  • TCP 6668 포트 하나가 열려 있었지만, nmap은 해당 포트에서 실행 중인 서비스를 식별하지 못함.
  • netcat으로 배너를 가져오려 했으나 연결은 성립했을 뿐 실행 중인 서비스를 알려주는 배너는 반환되지 않음.
  • 브라우저에서 HTTP 또는 https://192.168.178.70:6668에 접속하는 시도도 실패함.
  • 주전자에서 직접 웹 서비스를 찾는 방식은 예상보다 간단하지 않은 접근이었음.

가짜 액세스 포인트를 이용한 트래픽 관찰

  • 다음 단계로 스마트폰과 주전자 사이의 트래픽을 확인하기 위해 중간자 공격용 가짜 액세스 포인트를 구성함.
  • Kali 가상 머신을 실행하고 알파 USB Wi-Fi 동글을 연결함.
  • 호스트 운영체제의 가정용 Wi-Fi는 가상 머신에서 eth0 유선 네트워크로 연결된 상태임.
  • 네트워크 관리자가 인터페이스에 수동으로 설정한 IP 주소를 덮어쓰기 때문에 NetworkManager.service를 중지함.
  • eth0192.168.66.129/24 고정 IP를 설정하고, 홈 라우터인 Fritzbox를 기본 경로로 지정함.
  • wlan0에는 10.0.0.1/24 고정 IP를 설정함.
  • wlan0에서 eth0으로 트래픽을 전달하도록 IPv4 포워딩을 활성화하고, 포워딩 정책을 허용하며, eth0을 통한 NAT 매스커레이드를 설정함.
  • dnsmasq를 DHCP 및 DNS 서버로 구성함.
  • 인터페이스는 wlan0으로 설정함.
  • DHCP 주소 범위는 10.0.0.10~10.0.0.250, 임대 시간은 12시간으로 설정함.
  • 클라이언트의 게이트웨이와 DNS 서버를 10.0.0.1로 지정함.
  • 상위 DNS 서버로 8.8.8.8을 사용하고 DHCP 및 DNS 질의를 기록하도록 설정함.
  • test.de127.0.0.1로 해석하는 가짜 호스트 항목을 추가함.
  • hostapd를 사용해 wlan0에서 fake라는 SSID와 1번 채널을 사용하는 가짜 액세스 포인트를 실행함.
  • Wireshark를 시작하고 wlan0에서 트래픽을 수집함.
  • 가짜 Wi-Fi를 구성한 뒤 주전자를 초기화하고 앱의 초기 설정을 다시 실행함.
  • 주전자가 가짜 Wi-Fi를 사용하도록 설정했음에도 초기 설정이 완료되어 앱과 주전자의 트래픽을 확인할 수 있었음.
  • 앱과 주전자 사이에서 직접 오가는 트래픽은 발견되지 않아 예상보다 실망스러운 결과였음.

Azure 클라우드 연결 확인

  • 관찰된 트래픽은 모두 Azure 클라우드의 IP 주소를 대상으로 함.
  • 주전자는 TLS 1.2로 암호화된 연결을 통해 정기적으로 클라우드에 접속함.
  • 해당 연결을 통해 주전자 상태를 전송하고 새로운 명령을 가져오는 것으로 추정됨.
  • 다음으로 중간자 또는 액세스 포인트 역할을 이용해 TLS 연결을 끊고 내부 동작을 확인하는 방안을 검토함.
  • 주전자에 가짜 인증서를 전달해 트래픽을 복호화한 뒤, Azure 서버의 공개 키로 다시 암호화해 정상적으로 클라우드에 전달하는 방식이 가능할 것으로 봄.
  • Ettercap 또는 bettercap으로 이를 수행할 수 있을 것으로 알았지만, 실제로 시도하지는 않음.

Tuya 플랫폼과 펌웨어 가능성

  • Wi-Fi 모듈 제조사를 확인하기 위해 MAC 주소를 조회했고, 제조사가 Tuya임을 확인함.
  • Tuya는 모듈 또는 완제품을 기반으로 기기를 만들고, 자체 로고를 적용하며, 제어 앱을 구성하고, Tuya 클라우드 서버를 백엔드로 사용할 수 있는 대형 사물인터넷(IoT) 서비스 제공업체로 보임.
  • Wi-Fi IoT 기기를 접했다면 Tuya 제품일 가능성이 상당히 높다는 판단임.
  • Tuya는 하드웨어와 API 등을 다루는 개발자 문서를 제공함: Tuya 개발자 문서
  • 해당 플랫폼에는 HTCPCP가 구현되어 있지 않은 것으로 보임.
  • Mastodon 게시물에 대한 답변을 통해 Wi-Fi 컨트롤러의 OTA 펌웨어를 플래시하고, Tuya 클라우드 없이 실행되는 ‘해방된’ 펌웨어를 설치할 수 있다는 정보를 확인함.
  • 다만 사용 중인 기기는 해당 방식이 적용되기에는 너무 최신인 것으로 보임.
  • 관련 자료는 다음과 같음.
  • Kogan Smart Kettle 관련 Home Assistant 커뮤니티 게시물
  • Tasmotizer 저장소

실험 결과

  • 이번 사물인터넷 해킹 실험은 앱과 주전자 사이의 직접 트래픽을 확인하지 못한 채 마무리됨.
  • 주전자 내부에서 통신할 수 있는 웹 서비스도 발견하지 못함.
  • HTCPCP 구현과 오류 코드 418도 확인하지 못함.
  • 다음 실험에서는 주전자 하드웨어 자체를 대상으로 추가 작업을 시도할 가능성이 남아 있음.