- Hai sinh viên an ninh mạng đã thử hack máy giặt vì vui và để thử thách bản thân
- Họ phân tích ngược ứng dụng di động của máy giặt để nghiên cứu API và cơ chế mã hóa
- Sau khi tìm ra khóa mã hóa XOR, họ triển khai cách đọc và giải mã dữ liệu trạng thái máy giặt theo thời gian thực
- Họ tạo một bot thông báo tự động hóa trạng thái hoạt động và cảnh báo hoàn tất của máy giặt bằng webhook Discord
- Trong tương lai, họ dự định áp dụng kiểu tự động hóa nhà thông minh tương tự cho các thiết bị gia dụng “ngu ngốc” khác
Giới thiệu
- Tác giả đã thực hiện dự án hack máy giặt cùng một người bạn tại ngôi nhà mới chuyển đến
- Mục tiêu không hẳn là tính thực dụng mà là niềm vui và thử thách kỹ thuật
- Điểm khởi đầu là sự tò mò muốn kết nối máy giặt và các thiết bị gia dụng khác vào hệ thống nhà thông minh
- Trải nghiệm tự tay hack cũng giúp ích cho việc luyện tập reverse engineering thực chiến
Bối cảnh
- Trong nhà có sẵn một máy giặt thông minh hỗ trợ Wi‑Fi
- Máy giặt này có thể nhận thông báo tiến trình qua ứng dụng di động
- Chỉ một người có thể liên kết với ứng dụng tại một thời điểm nên việc chia sẻ khá bất tiện
- Xem đây là cơ hội, tác giả quyết định làm sao để nhiều người cùng nhận được thông báo trạng thái mà không bị giới hạn bởi ứng dụng
Trường hợp chuông cửa
- Chuông cửa trong nhà là hệ thống gửi thông báo bằng tín hiệu không dây 433MHz
- Người bạn đã tạo một hệ thống phát hiện tín hiệu chuông cửa rồi gửi thông báo lên máy chủ Discord
- Nó được dùng cùng với tiếng chuông cửa thực tế, đồng thời là thông báo dự phòng
- Sau thành công này, họ thử kết nối thông báo tự động cho máy giặt theo cách tương tự
Kế hoạch và chuẩn bị
- Tác giả quyết định reverse engineer ứng dụng di động để nắm cách API hoạt động
- Họ dùng router OpenWRT để bắt trực tiếp lưu lượng mạng từ máy giặt thông minh
- Bằng cách kết nối máy giặt vào một Wi‑Fi tạm thời, họ thử phân tích mẫu giao tiếp bằng packet capture
Phân tích lưu lượng của máy giặt
- Máy giặt gửi nhận lưu lượng qua nhiều đường như IP của chính nó, 255.255.255.255 (broadcast), máy chủ bên ngoài (HTTP API, lưu lượng mã hóa), và giao tiếp HTTP trực tiếp với ứng dụng (cổng 80)
- Họ đặc biệt chú ý đến phần giao tiếp trực tiếp với ứng dụng di động và tập trung phân tích khu vực này
Reverse engineering API của máy giặt
- Ứng dụng lặp đi lặp lại việc dùng hai endpoint: /http-read.json?encrypted=1 (đọc trạng thái) và /http-write.json?encrypted=1 (gửi lệnh)
- Mục tiêu quan tâm là endpoint đọc, nhưng dữ liệu phản hồi được mã hóa (HEX, kiểu HTML)
- Kể cả khi thêm query parameter
encrypted=0, kết quả vẫn chỉ là không giải mã được hoặc lỗi 400
Phân tích mã hóa và tìm khóa
- Họ suy đoán đây là kiểu mã hóa đơn giản dựa trên XOR và thử bruteforce bằng các công cụ trực tuyến như CyberChef
- Từ dự án tham chiếu (CandySimplyFi-tool), họ tìm thấy đoạn mã đã trích xuất khóa thành công, và dùng nó để khôi phục khóa và giải mã dữ liệu chỉ trong vài giây
- Để hiểu thêm schema dữ liệu, họ tiếp tục tham khảo mã nguồn mở ofalvai/home-assistant-candy
Thử nghiệm các giá trị trạng thái của máy giặt
- Họ kiểm tra sự thay đổi dữ liệu khi thao tác vật lý trên máy giặt như đổi chương trình, chỉnh nhiệt độ và tốc độ, chạy/dừng/kết thúc
- Các trường trạng thái chính:
- Pr: trạng thái núm chọn chương trình
- PrPh: chu trình giặt đang chạy
- Temp: nhiệt độ đã cài đặt
- SpinSp: tốc độ quay đã cài đặt
- RemTime: thời gian còn lại (phút, đôi khi bị cố định ở 10 phút)
- Nhược điểm: một số giá trị (ví dụ SpinSp) có thể khác với giá trị thực tế
Phát triển script tự động hóa thông báo
- Họ đã hoàn thiện toàn bộ từ schema API của máy giặt, khóa mã hóa, việc đọc và giải mã dữ liệu, cho đến xác định trạng thái
- Sau đó họ tạo script bot thông báo dùng webhook Discord
- Trình tự hoạt động chính:
- Polling máy giặt
- Nếu không có thay đổi trạng thái thì sleep rồi lặp lại
- Khi phát hiện thay đổi thì cập nhật tin nhắn cuối hoặc gửi tin nhắn mới
- Lặp lại
Kết thúc và kế hoạch tiếp theo
- Họ đã thành công với tự động hóa thông báo cho chuông cửa và máy giặt
- Tiếp theo, họ dự định áp dụng tự động hóa tương tự cho máy rửa chén, máy sấy, TV bằng các cách như ổ cắm thông minh, cảm biến rung, IR blaster
- Họ cũng định thử nghiệm một hệ thống an ninh đơn giản dùng webcam
Kết luận
- Qua dự án này, tác giả đã học được nền tảng của reverse engineering IoT thực chiến và hack nhà thông minh ở mức đơn giản
- Đây là một trường hợp vừa thực dụng vừa thú vị
1 bình luận
Ý kiến trên Hacker News
Trước hết xin nói rõ đây không phải là lời chỉ trích bài gốc; tôi nghĩ tác giả đã giới thiệu rất hay về quá trình phân tích một thiết bị thực sự thú vị.
Nếu thiết bị giao tiếp với ứng dụng Android, tôi khuyên dùng apk-mitm.
Công cụ này loại bỏ gần như mọi kiểu certificate pinning đã biết khỏi apk và còn viết lại manifest để có thể dùng chứng chỉ cục bộ mà không cần root.
Chỉ cần gỡ ứng dụng gốc rồi sideload bản đầu ra của apk-mitm là có thể dùng mitmproxy trên thiết bị stock bình thường.
Một điểm quan trọng nữa là nếu ứng dụng gửi dữ liệu đã mã hóa và chính ứng dụng giải mã rồi hiển thị, thì khóa chắc chắn nằm đâu đó trong ứng dụng hoặc sẽ được lấy từ nơi nào đó.
Phân tích apk bằng jadx thì gần như có thể xem dưới dạng mã Java, nên đôi khi còn tìm được cả khóa.
Tuy vậy, có nhà sản xuất chuyển phần xử lý mã hóa sang native code, và khi đó phải reverse engineering bằng Ghidra hoặc công cụ tương tự.
Quá trình này có thể cực kỳ tẻ nhạt nhưng cũng có thể cực kỳ vui.
Dù tác giả có dựa trên kết quả nghiên cứu trước đó của người khác, tôi vẫn nghĩ ngay cả những việc chưa ai từng làm cũng rất đáng để không bỏ cuộc và thử đến cùng.
Cuối cùng, bạn sẽ học được rất nhiều khi làm sáng tỏ cách thiết bị mình sở hữu thực sự hoạt động.
Rồi đến một lúc nó bị chặn kết nối máy chủ; tình cờ biết đến certificate pinning nên tôi thử dùng repo này và nó giải quyết rất gọn.
Có lẽ vì là URL quảng cáo cũ nên quảng cáo cũng biến mất luôn.
Phía nhà phát triển cũng chỉ ngày càng làm hỏng ứng dụng hơn nên tôi chẳng thấy tiếc gì.
Tôi thì đang tận dụng máy giặt Bosch để theo dõi tiến trình giặt từ đầu bên kia ngôi nhà, khác với bài gốc.
Nhờ Bosch API, tôi có thể biết chu trình giặt đã kết thúc chưa và cửa máy đã mở hay chưa.
Hiện tại tôi đang dùng phiên bản API mặc định, nhưng PoC đã xong nên sắp tới sẽ chuyển sang tùy chọn self-hosted cục bộ.
Với Home Assistant, nếu chu trình đã kết thúc mà cửa vẫn chưa mở thì có nghĩa là vẫn còn đồ giặt ướt bên trong.
Vì vậy tôi thiết lập để cứ mỗi 15 phút gửi nhắc nhở đến điện thoại của tôi và điện thoại của vợ, nhưng chỉ khi cô ấy đang ở nhà.
Rất đơn giản mà hoạt động hoàn hảo.
Máy giặt nhà tôi là mẫu cổ từ thập niên 90 nên chạy theo núm hẹn giờ.
Không có máy tính hay cảm biến gì cả, ngoài việc có thêm phát hiện giai đoạn cấp nước.
Lúc nào cũng chỉ cần đặt 40 phút là xong, lại còn có cả chức năng tắt báo thức nên không thể đơn giản hơn được nữa.
Tôi cũng đang định làm thứ tương tự cho một lò nướng nhỏ.
Nó không có API hay kết nối gì, nhưng tôi sẽ cắm qua smart plug để đo điện năng tiêu thụ, từ đó theo dõi và thông báo trạng thái chờ/đang hoạt động.
Tôi khá hay chạy máy giặt trước khi đi ngủ rồi để sang ngày hôm sau mới lấy ra, nhưng máy của tôi có tính năng kiểu như "extended tumble" giúp giữ đồ giặt tươi qua đêm.
Nó tốn thêm một chút nước, nhưng cứu cả thói quen buổi tối của tôi và cũng hữu ích khi dùng điện vào ban đêm.
Tôi rất thích chiếc Electrolux của mình; chắc các hãng khác cũng có tính năng tương tự.
Tôi đã dùng đồng hồ G-Shock 5600 hơn 15 năm để báo hẹn giờ máy giặt.
Khi bắt đầu giặt, tôi đặt tổng thời gian vào timer của đồng hồ rồi khởi động máy; đến lúc xong nó sẽ kêu bíp báo.
Dù có API hay không, bất kể hãng nào cũng dùng được.
Một giải pháp thực sự thanh lịch.
Logic rất đơn giản nhưng cải thiện đời sống hằng ngày rất rõ rệt.
Tôi đang hack phần cứng một chiếc tủ lạnh.
Không phải phần mềm, mà là một chiếc tủ lạnh đắt tiền dành cho xe cắm trại, hỗ trợ gas/12v/220v.
Khối điều khiển điện tử bị cháy gây hỏng dây cáp và phần bên trong, nhưng bản thân tủ lạnh vẫn ổn.
Vì đằng nào cũng phải thay hết linh kiện nên thay vì bỏ 250 đô để mua bo điều khiển mới, tôi định ghép các linh kiện từ nồi hơi gas cũ để thay bằng một hệ thống mới.
Bo mạch chủ của nồi hơi đã có sẵn bộ đánh lửa, nên nếu viết logic và cơ chế an toàn cẩn thận thì có lẽ sẽ dùng được cho chế độ chạy bằng gas.
Như vậy khỏi phải mua tủ lạnh mới, lại còn là một dự án hay để dạy điện tử cho cậu con trai 9 tuổi của tôi.
Tất nhiên vì liên quan đến gas nên có thể nguy hiểm, nhưng suy cho cùng nó vẫn luôn rất vui và sau khi hack xong thì mọi lời chỉ trích cũng biến mất.
Nếu mọi người tò mò về quá trình, tôi có thể viết thành một bài đầy đủ.
Tôi gắn cảm biến rung Zigbee lên máy giặt/máy sấy rồi kết nối vào Home Assistant để dùng.
Tôi chưa từng nghĩ đến cách giám sát dòng điện/điện áp bằng ổ cắm thông minh, thấy đây là một ý tưởng hay.
Với vài điều kiện trigger đơn giản, việc cập nhật dashboard và gửi email thông báo lúc máy giặt bắt đầu/kết thúc đều được tự động hóa.
Máy cũng có ứng dụng và Bluetooth, nhưng ứng dụng lại đòi quyền truy cập camera, audio và danh bạ trên điện thoại của tôi nên tôi không định dùng.
Có vẻ việc tích hợp với HA cũng đang được làm ở link bên dưới.
https://github.com/home-assistant-HomeWhiz/home-assistant-HomeWhiz/blob/main/README.md
Tôi nghĩ những bài như thế này mới đúng là tinh hoa của Hacker News.
Tôi ước có nhiều bài kiểu này hơn, kiểu hack thực sự theo nghĩa sửa đổi như một thú vui; dạo này tôi thấy toàn là chuyện AI/LLM.
Nếu bạn thích kiểu hardware hacking này thì cũng rất khuyên xem https://hackaday.com/.
Việc cài chứng chỉ cá nhân trên Android chưa root khá phiền.
Chỉ có thể thêm vào system certificate store, và thường phải cần module Magisk.
Cách dễ hơn là chạy một Android emulator cũ trên PC, cài chứng chỉ vào đó rồi chuyển lưu lượng sang Burpsuite hoặc mitmproxy.
Không cần phải đổi thiết bị.
Nếu phân tích mã ứng dụng bằng APKLab hoặc Jadx thì có lẽ sẽ tìm được thuật toán suy dẫn khóa.
Tôi tò mò không biết ứng dụng và máy giặt có bắt buộc phải cùng một mạng mới hoạt động hay không, vì điểm đó tôi thấy khá hay.
Tôi ngạc nhiên nên hỏi về chuyện chu trình giặt "3 tiếng" mà thực tế là 4~5 tiếng.
Máy giặt của tôi ở chế độ eco thông thường còn chưa tới 30 phút, và khi xong thì phát âm báo rất to.
Nhờ chu trình ngắn cộng với thông báo sẵn có nên không cần đến giải pháp kỹ thuật phức tạp nào khác.
Có lẽ người bình luận ở Mỹ.
Máy giặt ở châu Âu mất lâu hơn vì yêu cầu dùng ít nước/điện hơn.
Thiết bị trong bài có vẻ còn là loại giặt-sấy kết hợp nên càng lâu hơn.
Nhà tôi thì ngay cả chế độ thường cũng là 104 phút, mà nếu nhồi quá nhiều có thể lên tới 3 tiếng.
Chu trình dài giúp việc diệt vi sinh vật hiệu quả hơn nếu dùng chất tẩy enzyme và các thành phần tẩy trắng gốc oxy hoạt tính.
Chế độ 30 phút chỉ ở mức "xả qua" quần áo mà thôi.
https://pubmed.ncbi.nlm.nih.gov/25207988/
Máy sấy của tôi là loại không có ống thoát khí, gần như một lời than phiền, nên mất tới 3 tiếng.
Từ giặt đến sấy xong tổng cộng tốn 4,5 tiếng.
Đây là món gia dụng khiến tôi không hài lòng nhất trong số những thứ từng dùng.
Đôi khi nó còn sấy không khô hẳn.
Có người chỉ ra rằng họ không thấy phần mã hóa nào cả.
Họ phân tích dữ liệu trong cửa sổ input của ảnh chụp màn hình đầu tiên (cyberchef.avif) thực ra chỉ là hex ASCII không mã hóa.
Ví dụ, 7D là {, 0D0A là CRLF, 09 là TAB, 22 là ", v.v.
Nói cách khác, đó là plaintext đã được giải mã, nên họ cảm thấy phần mô tả về mã hóa XOR không khớp.
Họ còn phân tích rằng giá trị khóa trong ảnh chụp màn hình cũng không khớp về căn chỉnh biên byte và khoảng trống của dữ liệu đầu vào thực tế.
Vì vậy họ nghi ngờ ảnh chụp màn hình có thể đã bị thao tác hoặc chỉnh sửa.
Họ nói muốn biết lý do là gì và chuyện gì đang xảy ra.
Có người báo rằng liên kết ảnh có dòng “For now, I plugged this key into CyberChef, and was able to decrypt the data.” đang bị hỏng.
Họ còn nêu chi tiết cả phần tử HTML cụ thể và liên kết liên quan.
Về đoạn “máy giặt giao tiếp với chính nó rất nhiều”, có người chỉ ra rằng có vẻ người thiết kế network stack không hiểu khái niệm loopback interface.
Thiết bị đã gửi rất nhiều gói tới chính IP của mình, và còn gửi gói đến 255.255.255.255 mỗi giây, nhưng bản thân người đó nói mình không quá bận tâm.
Tôi thường thấy hành vi như vậy ở các thiết bị IoT, đôi khi chúng dùng nó để phát hiện xung đột IP hoặc thay đổi IP.
Tôi cũng nghĩ tương tự.