세탁기를 해킹한 이야기
(nexy.blog)- 두 명의 사이버보안 학생이 재미와 도전으로 세탁기 해킹을 시도함
- 세탁기의 모바일 앱을 역공학으로 분석해 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 웹훅을 활용한 알림 봇 스크립트를 제작
- 주요 동작 순서:
- 세탁기 폴링
- 상태 변화 없으면 슬립 후 반복
- 변화 감지 시 마지막 메시지 업데이트 또는 새 메시지 발송
- 반복
마무리 및 향후 계획
- 이미 도어벨과 세탁기 알림 자동화에 성공
- 앞으로 식기세척기, 건조기, 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/…
- 우리 집은 세탁기/건조기에 스마트 플러그를 꽂고, 전력 소비량을 MQTT로 Node-RED에 보내고 있음
-
이런 글이야말로 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 충돌/변경 감지를 위해 쓰기도 함
본인도 비슷한 생각임
- 이게 불필요하다고 느껴질 수 있지만, ARP 관련 트래픽일 수 있음