1P by GN⁺ 14시간전 | ★ favorite | 댓글 1개
  • 두 명의 사이버보안 학생이 재미와 도전으로 세탁기 해킹을 시도함
  • 세탁기의 모바일 앱을 역공학으로 분석해 API와 암호화 방식을 연구함
  • XOR 암호화 키를 찾아내어 세탁기 상태 데이터를 실시간으로 읽고 해독하는 방법을 구현함
  • Discord 웹훅을 활용해 세탁기 작동 상태 및 완료 알림을 자동화하는 노티피케이션 봇을 제작함
  • 향후 다른 "멍청한" 가전제품에도 비슷한 방식의 스마트홈 자동화 적용을 계획함

서론

  • 필자는 새로 이사한 집에서 친구와 함께 세탁기 해킹 프로젝트를 진행함
  • 순수한 실용성보다는 재미와 기술적 도전이 목적임
  • 세탁기와 기타 가전제품을 스마트홈 시스템에 연결하고 싶다는 호기심이 출발점임
  • 직접 해킹해서 얻은 경험이 실전 역공학 연습에도 도움이 되었음

배경 설명

  • 집에는 Wi-Fi가 지원되는 스마트 세탁기가 기본으로 비치됨
  • 이 세탁기는 모바일 앱으로 진행상황 알림을 받을 수 있음
  • 한 번에 한 명만 앱과 연동 가능해서 공유가 불편
  • 이 문제를 기회로 보고, 앱의 제한 없이 여러 사람이 상태 알림을 받도록 만들기로 결정함

도어벨 사례

  • 집 도어벨은 433MHz 무선 신호로 알림을 보내는 시스템임
  • 친구가 도어벨 신호를 감지해 Discord 서버에 알림을 보내는 시스템을 만듦
  • 실제 도어벨 소리와 함께, 백업 알림용으로도 활용됨
  • 이 성공 사례를 보고 세탁기도 같은 방식으로 자동화 알림 연동을 시도하게 됨

계획 및 준비

  • 필자는 모바일 앱을 리버스 엔지니어링해 API 동작을 파악하기로 함
  • 스마트 세탁기에서 직접 네트워크 트래픽을 캡처하기 위해 OpenWRT 라우터를 활용함
  • 세탁기를 임시 Wi-Fi로 연결하여 패킷 캡처로 통신 패턴 파악을 시도함

세탁기 트래픽 분석

  • 세탁기는 자신의 IP, 255.255.255.255 (브로드캐스트) , 외부 서버(HTTP API, 암호화 트래픽), 직접 앱과 HTTP 통신(포트80) 등 여러 경로로 트래픽 송수신함
  • 특히 모바일 앱과 직접 통신하는 부분에 주목, 이 부분을 집중적으로 분석함

세탁기 API 리버스엔지니어링

  • 앱은 /http-read.json?encrypted=1 (상태 읽기)과 /http-write.json?encrypted=1 (명령 전송) 두 엔드포인트를 반복 사용함
  • 관심 대상은 읽기 엔드포인트이나, 응답 데이터가 암호화(HEX, HTML 타입) 되어 있음
  • query 파라미터 encrypted=0을 줘도 복호화 실패 혹은 400 에러만 발생

암호화 분석 및 키 구하기

  • XOR 기반 간단 암호화일 것이라는 추정과 함께, CyberChef 등 온라인 툴로 브루트포스 해킹을 시도함
  • 참조 프로젝트(CandySimplyFi-tool) 에서 이미 키 추출에 성공한 코드를 확인, 이를 활용해 몇 초 만에 키 복원 및 데이터 해독에 성공함
  • 데이터 스키마를 추가로 파악하기 위해, ofalvai/home-assistant-candy 오픈소스 코드 참고

세탁기 상태값 실험

  • 세탁기 각종 물리 조작(프로그램 변경, 온도 및 속도 조정, 작동/멈춤/종료) 시 데이터 변화 확인
  • 상태값 주요 필드:
    • Pr: 프로그램 선택 노브 상태
    • PrPh: 진행중인 워시 사이클
    • Temp: 설정 온도
    • SpinSp: 설정 회전속도
    • RemTime: 남은 시간(분, 10분 고정상황 발생도 있음)
  • 단점: 일부 값(예, SpinSp)은 실제값과 다를 수 있음

알림 자동화 스크립트 개발

  • 세탁기 API 스키마, 암호화 키, 데이터 읽기 및 해독, 상태 판별 까지 구현 완료
  • Discord 웹훅을 활용한 알림 봇 스크립트를 제작
  • 주요 동작 순서:
    1. 세탁기 폴링
    2. 상태 변화 없으면 슬립 후 반복
    3. 변화 감지 시 마지막 메시지 업데이트 또는 새 메시지 발송
    4. 반복

마무리 및 향후 계획

  • 이미 도어벨과 세탁기 알림 자동화에 성공
  • 앞으로 식기세척기, 건조기, TV 등에도 유사 자동화(스마트 플러그, 진동센서, IR 블래스터) 적용 구상
  • 웹캠을 활용한 간이 보안 시스템도 실험 예정

결론

  • 이번 프로젝트 경험을 통해 실전 IoT 리버스 엔지니어링과 간단한 스마트홈 해킹 기초를 익힘
  • 실용성과 재미 모두 경험할 수 있었던 사례임
Hacker News 의견
  • 우선, 원글에 대한 비판이 아님을 밝힘, 정말 신기한 기기 분석 과정을 멋지게 소개했다고 생각함
    기기가 안드로이드 앱과 통신한다면, apk-mitm을 추천함
    이 도구는 거의 모든 알려진 인증서 핀닝을 apk에서 제거해주고, 로컬 인증서도 루팅 없이 사용할 수 있도록 매니페스트를 재작성해줌
    원본 앱을 삭제한 후 apk-mitm 결과물을 사이드로드하면, 일반 순정 기기에서 mitmproxy 사용 가능함
    또 중요한 점은, 앱에 암호화된 데이터를 보내고 앱에서 이를 해독해서 보여준다면, 키가 앱 어딘가에 있거나 어딘가에서 받아오게 되어 있음
    jadx로 apk를 분석하면 거의 자바 코드 형태로 볼 수 있어, 종종 키를 찾을 수도 있음
    다만 어떤 제조사는 암호화 처리를 네이티브 코드로 옮기는 경우도 있어서, 그럴 땐 Ghidra 등으로 리버스 엔지니어링해야 함
    이런 과정이 굉장히 지루하기도 하고 엄청 재밌을 수도 있음
    저자가 기존의 다른 사람들 연구결과에 기반했지만, 아무도 해본 적 없는 작업이더라도 포기하지 말고 도전할 가치가 충분하다고 생각함
    결국은 내가 소유한 기기의 동작을 밝히면서 많은 걸 배울 수 있음

    • 기기 전용은 아니지만, 나도 앱에 문제가 있어 자동 업데이트를 끄고 과거버전으로 돌려 썼음
      결국 어느 순간 서버 접속이 막혔고, 인증서 핀닝을 우연히 알게 되어 이 레포를 써봤는데, 정말 깔끔히 해결됨
      구형 광고 URL이었는지 광고도 안 보이게 됨
      개발사 역시 앱을 점점 망쳐놓는 데만 집중했기에 아쉬움 없음
  • 나는 Bosch 세탁기를 활용해서(원글과는 달리), 집 반대편에 있는 세탁기 진행 상황을 모니터링하고 있음
    Bosch API 덕분에 세탁기 사이클이 끝났는지, 문이 열렸는지 파악할 수 있음
    현재는 기본 API 버전을 사용하지만, PoC가 완료되어 앞으로는 로컬 호스팅 옵션으로 옮길 예정임
    Home Assistant로 사이클이 끝났으나 문이 안 열렸다면, 아직 젖은 세탁물이 있다는 의미가 됨
    그래서 15분마다 내 폰과, 와이프가 집에 있을 때만 그녀의 폰에 세탁물 알림이 가도록 만들었음
    아주 단순하면서 완벽하게 작동함

    • 내 세탁기는 구식 90년대 모델이라 타이머 다이얼에 따라 작동함
      컴퓨터나 센서는 없고, 물 주입 단계만 추가로 감지함
      늘 40분 타이머만 맞추면 끝나고, 알람 끄기 기능까지 있어서 더 간단할 수 없음

    • 나도 비슷한 걸 작은 오븐에 적용해보려 계획 중임
      API나 연결성은 없지만, 스마트 플러그에 꽂아서 전력 사용량을 측정해 대기 상태/작동 상태를 모니터링하고 알려주는 방식임

    • 자기 전에 세탁기를 돌렸다가 다음 날로 미루는 경우가 종종 있는데, 내 세탁기는 "연장 회전" 같은 기능이 있어 세탁물을 밤새 신선하게 유지시켜줌
      물이 좀 더 들지만 저녁 루틴을 구원해주며, 밤 시간대 전기를 사용하는 데도 도움이 됨
      내 Electrolux가 정말 마음에 드는데, 아마 타사에도 유사한 기능이 있을 거라 생각함

    • 나는 G-Shock 5600 시계를 15년 넘게 세탁기 타이머 알림에 써오고 있음
      세탁 시작할 때 전체 소요 시간을 시계 타이머에 맞추고 시작하면, 끝나면 삐 소리로 알려줌
      API 여부와 무관하게, 브랜드 상관 없이 쓸 수 있음

    • 정말 우아한 솔루션임
      간단한 논리지만 확실한 실생활 개선 효과가 있음

  • 나는 냉장고 하드웨어 해킹을 하고 있음
    소프트웨어가 아니라, 캠핑카용 고가 냉장고인데, 가스/12v/220v 지원임
    전자제어부에서 화재가 나 케이블 및 내부가 망가졌지만 냉장고 자체는 괜찮음
    그래서 부품도 다 갈아야 하니, 250불 들여 새 컨트롤 보드를 사기보단 예전 가스보일러 부품을 조합해 새로운 시스템으로 교체하려 함
    보일러 마더보드에 점화 장치가 다 들어있어, 로직과 안전장치만 잘 짜면 가스 운전 모드로 쓸 수 있을 듯함
    새 냉장고 안 사도 되고, 9살 아들에게 전자공학을 가르칠 수 있는 좋은 프로젝트임
    물론 가스라 위험할 수 있지만, 결과적으로 항상 재미있고 해킹이 끝나면 비판도 사라짐
    진행 과정이 궁금하면 전체 포스트로 남길 수도 있음

  • 나는 세탁기/건조기에 Zigbee 진동 센서를 붙여 Home Assistant에 연결해 사용함
    스마트 콘센트 전류/전압 감시 방법은 생각 못해봤는데 좋은 아이디어라고 느낌

    • 우리 집은 세탁기/건조기에 스마트 플러그를 꽂고, 전력 소비량을 MQTT로 Node-RED에 보내고 있음
      간단한 트리거 조건을 통해 세탁기 시작/완료 시점에 대시보드 업데이트 및 이메일 알림까지 자동화됨
      앱과 블루투스 기능도 있지만, 앱이 내 폰 카메라, 오디오, 연락처 접근을 요구해서 쓸 생각이 없음
      HA 연동 관련 작업이 아래 링크에서도 진행된 듯함
      https://github.com/home-assistant-HomeWhiz/home-assistant-HomeWhiz/…
  • 이런 글이야말로 Hacker News의 정수라고 생각함

    • 실제 해킹(취미적 개조)처럼 이런 글이 늘어났으면 좋겠음, 요즘엔 AI/LLM 이야기만 넘친다고 느낌

    • 이런 류 하드웨어 해킹을 좋아한다면 https://hackaday.com/ 도 강추함

  • 루팅 안 된 안드로이드에서 개인 인증서 설치는 번거로운 편임
    시스템 인증서 저장소에만 추가할 수 있고, 보통 Magisk 모듈이 필요함
    더 쉬운 방법은 구형 안드로이드 에뮬레이터를 PC에서 돌려 인증서를 심고 트래픽을 Burpsuite나 mitmproxy로 넘기는 것임
    기기 바꿀 필요도 없음
    APKLab이나 Jadx로 앱 코드를 분석하면 키 파생 알고리즘 정도 찾을 수 있을 듯함
    앱과 세탁기가 꼭 같은 네트워크에 있을 때만 작동하는지 궁금한데, 그 부분이 마음에 듦

  • “3시간짜리” (실제론 4~5시간) 세탁 사이클이란 말이 놀라돼서 질문함
    내 세탁기는 일반 에코 모드가 30분도 안 걸리고, 끝나면 매우 큰 소리로 알림을 울려줌
    짧은 사이클과 알림 조합 덕분에 별도의 복잡한 기술적 해결책이 필요 없음

    • 아마 댓글쓴이는 미국일 듯함
      유럽 세탁기는 낮은 물/전기 사용 요구 사항 때문에 더 오래 걸림
      저 글 속 기기는 세탁+건조 겸용으로 더 오래 걸리는 듯
      우리집은 일반 모드도 104분인데, 과적하면 최대 3시간까지 걸림

    • 긴 사이클이 효소제와 활성산소계 표백제 성분을 쓰면 미생물 제거가 더 확실함
      30분 코스는 세탁물을 그냥 “헹구는” 수준임
      https://pubmed.ncbi.nlm.nih.gov/25207988/

    • 내 건조기는 덕트 없는 모델(사실상 푸념), 그래서 3시간이나 걸림
      세탁부터 건조까지 4.5시간이나 소비됨
      써본 가전 중 가장 불만족스러움
      가끔은 건조도 제대로 안 됨

  • 암호화가 안 보인다고 지적함
    첫 번째 스크린샷(cyberchef.avif) input window에 있는 데이터가 단순한 unencrypted hex ASCII라고 분석함
    예시로 7D가 {, 0D0A가 CRLF, 09는 TAB, 22가 " 등의 해석을 제시
    즉, 디코딩된 평문인데, XOR 암호화라던가 설명이 맞지 않는다고 느꼈음
    또 스크린샷에 나온 키값도 바이트 경계와 정렬이 맞지 않고, 실제 입력 gap과도 일치하지 않는다고 분석함
    그래서 스크린샷이 조작되었거나 편집된 것 아닌가 의문을 가짐
    이유가 뭔지, 무슨 일이 있는지 궁금하다고 밝힘

  • “For now, I plugged this key into CyberChef, and was able to decrypt the data.” 라고 표기된 이미지 링크가 깨져 있다고 알림
    특정 HTML 요소와 관련 링크까지 상세히 제시함

  • “세탁기가 자기 자신이랑 엄청나게 통신했다”라는 부분에 대해, 네트워크 스택 설계자가 loopback 인터페이스 개념을 몰라서 발생한 것 같다고 짚음
    자기 IP로 패킷을 많이 보냈으며, 255.255.255.255로도 초당 패킷을 보냈다고 하는데, 본인은 크게 신경쓰지 않았다고 함

    • 이게 불필요하다고 느껴질 수 있지만, ARP 관련 트래픽일 수 있음
      IoT 기기에서 이런 행동을 자주 봤고, IP 충돌/변경 감지를 위해 쓰기도 함
      본인도 비슷한 생각임