2 คะแนน โดย GN⁺ 2025-07-28 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • นักศึกษา ด้านความปลอดภัยไซเบอร์ สองคนลอง แฮ็กเครื่องซักผ้า เพื่อความสนุกและความท้าทาย
  • พวกเขาวิเคราะห์ แอปมือถือของเครื่องซักผ้า ด้วยการทำรีเวิร์สเอนจิเนียริง เพื่อศึกษา API และวิธีการเข้ารหัส
  • หลังค้นพบคีย์เข้ารหัสแบบ XOR ก็สามารถสร้างวิธี อ่านและถอดรหัส ข้อมูลสถานะของเครื่องซักผ้าแบบ เรียลไทม์ ได้
  • พวกเขาสร้าง บอตแจ้งเตือน ที่ใช้ Discord webhook เพื่อทำระบบแจ้งสถานะการทำงานและการซักเสร็จของเครื่องซักผ้าแบบอัตโนมัติ
  • ในอนาคตมีแผนจะนำ ระบบอัตโนมัติสมาร์ตโฮม ลักษณะเดียวกันไปใช้กับเครื่องใช้ไฟฟ้า "โง่ ๆ" อื่น ๆ ด้วย

บทนำ

  • ผู้เขียนย้ายเข้าบ้านใหม่และทำโปรเจ็กต์ แฮ็กเครื่องซักผ้า ร่วมกับเพื่อน
  • เป้าหมายหลักไม่ใช่ประโยชน์ใช้สอยล้วน ๆ แต่เป็น ความสนุกและความท้าทายทางเทคนิค
  • จุดเริ่มต้นมาจากความอยากรู้ว่าเครื่องซักผ้าและเครื่องใช้ไฟฟ้าอื่น ๆ จะเชื่อมต่อเข้ากับ ระบบสมาร์ตโฮม ได้อย่างไร
  • ประสบการณ์จากการแฮ็กด้วยตัวเองยังช่วยในการฝึก รีเวิร์สเอนจิเนียริงเชิงปฏิบัติ อีกด้วย

ข้อมูลพื้นหลัง

  • ภายในบ้านมี เครื่องซักผ้าอัจฉริยะที่รองรับ 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 parameter encrypted=0 ก็ยัง ถอดรหัสไม่สำเร็จหรือได้เพียงข้อผิดพลาด 400

การวิเคราะห์การเข้ารหัสและการหาคีย์

  • เริ่มจากสมมติฐานว่าน่าจะเป็นการเข้ารหัสแบบ XOR อย่างง่าย และลอง แฮ็กแบบ brute force ด้วยเครื่องมือออนไลน์อย่าง CyberChef
  • จาก โปรเจ็กต์อ้างอิง (CandySimplyFi-tool) พบโค้ดที่ดึงคีย์ออกมาได้อยู่แล้ว จึงนำมาใช้และ กู้คืนคีย์พร้อมถอดรหัสข้อมูลได้สำเร็จในไม่กี่วินาที
  • เพื่อทำความเข้าใจ สคีมาของข้อมูล เพิ่มเติม ยังอ้างอิงโค้ดโอเพนซอร์ส ofalvai/home-assistant-candy

ทดลองดูค่าต่าง ๆ ของสถานะเครื่องซักผ้า

  • ตรวจสอบการเปลี่ยนแปลงของข้อมูลเมื่อมีการกดใช้งานจริงกับเครื่อง เช่น เปลี่ยนโปรแกรม ปรับอุณหภูมิและความเร็ว เริ่มทำงาน หยุด และสิ้นสุดการทำงาน
  • ฟิลด์สำคัญของค่าสถานะ:
    • Pr: สถานะปุ่มหมุนเลือกโปรแกรม
    • PrPh: รอบการซักที่กำลังดำเนินอยู่
    • Temp: อุณหภูมิที่ตั้งไว้
    • SpinSp: ความเร็วรอบปั่นที่ตั้งไว้
    • RemTime: เวลาที่เหลือ (นาที และบางครั้งอาจค้างอยู่ที่ 10 นาที)
  • ข้อเสียคือบางค่า (เช่น SpinSp) อาจไม่ตรงกับค่าจริง

พัฒนาสคริปต์ระบบแจ้งเตือนอัตโนมัติ

  • ดำเนินการได้ครบตั้งแต่สคีมา API ของเครื่องซักผ้า คีย์เข้ารหัส การอ่านและถอดรหัสข้อมูล ไปจนถึงการตัดสินสถานะ
  • จากนั้นจึงสร้าง สคริปต์บอตแจ้งเตือนที่ใช้ Discord webhook
  • ลำดับการทำงานหลัก:
    1. โพลสถานะเครื่องซักผ้า
    2. ถ้าไม่มีการเปลี่ยนแปลง ให้พักแล้ววนซ้ำ
    3. ถ้าตรวจพบการเปลี่ยนแปลง ให้อัปเดตข้อความล่าสุดหรือส่งข้อความใหม่
    4. วนซ้ำ

ปิดท้ายและแผนในอนาคต

  • ตอนนี้ทำระบบ แจ้งเตือนอัตโนมัติสำหรับกริ่งประตูและเครื่องซักผ้า ได้แล้ว
  • ต่อไปมีแผนจะนำแนวทางคล้ายกันไปใช้กับ เครื่องล้างจาน เครื่องอบผ้า และทีวี ผ่านอุปกรณ์อย่างสมาร์ตปลั๊ก เซ็นเซอร์สั่นสะเทือน และ IR blaster
  • ยังมีแผนทดลอง ระบบความปลอดภัยแบบง่าย ๆ ที่ใช้เว็บแคมด้วย

บทสรุป

  • โปรเจ็กต์นี้ช่วยให้ได้เรียนรู้ทั้ง รีเวิร์สเอนจิเนียริง IoT ในสถานการณ์จริง และพื้นฐานของ การแฮ็กสมาร์ตโฮม
  • เป็นกรณีศึกษาที่ได้ทั้งประโยชน์ใช้สอยและความสนุก

1 ความคิดเห็น

 
GN⁺ 2025-07-28
ความคิดเห็นจาก Hacker News
  • ก่อนอื่นขอบอกไว้ว่า นี่ไม่ใช่การวิจารณ์บทความต้นฉบับนะ คิดว่าเขาอธิบายกระบวนการวิเคราะห์อุปกรณ์ที่น่าทึ่งนี้ได้ดีมาก
    ถ้าอุปกรณ์สื่อสารกับแอป Android ขอแนะนำ apk-mitm
    เครื่องมือนี้ลบ certificate pinning ที่รู้จักกันแทบทั้งหมดออกจาก apk ได้ และยังเขียน manifest ใหม่เพื่อให้ใช้ local certificate ได้โดยไม่ต้อง root
    ลบแอปต้นฉบับออกแล้ว sideload ผลลัพธ์จาก apk-mitm เข้าไป ก็จะใช้ mitmproxy บนอุปกรณ์สต็อกทั่วไปได้
    อีกจุดสำคัญคือ ถ้าแอปส่งข้อมูลที่เข้ารหัสมาแล้วแอปเป็นฝ่ายถอดรหัสให้ดู แปลว่าคีย์ต้องอยู่ในแอปสักแห่ง หรือไม่ก็ต้องไปรับมาจากที่ไหนสักที่
    ถ้าวิเคราะห์ apk ด้วย jadx ก็จะเห็นออกมาเกือบเป็นโค้ด Java ทำให้บางครั้งหา key เจอได้
    แต่ผู้ผลิตบางรายย้ายส่วนการเข้ารหัสไปไว้ใน native code แบบนั้นก็ต้องไป reverse engineer ด้วย Ghidra หรือเครื่องมือคล้ายกัน
    กระบวนการแบบนี้อาจน่าเบื่อมาก หรือสนุกมากก็ได้
    แม้ว่าผู้เขียนจะอาศัยผลการวิจัยของคนอื่นมาก่อน แต่ต่อให้เป็นงานที่ยังไม่เคยมีใครทำมาก่อน ก็คิดว่ายังคุ้มค่าที่จะไม่ยอมแพ้และลองทำดู
    ท้ายที่สุดแล้ว เราจะได้เรียนรู้อะไรมากมายจากการทำความเข้าใจว่าอุปกรณ์ที่เราครอบครองนั้นทำงานอย่างไร

    • ไม่ได้เฉพาะเจาะจงกับอุปกรณ์นี้ แต่ฉันเองก็เคยมีปัญหากับแอป เลยปิด auto update แล้วถอยกลับไปใช้เวอร์ชันเก่า
      สุดท้ายวันหนึ่งมันก็เชื่อมต่อเซิร์ฟเวอร์ไม่ได้ แล้วฉันบังเอิญไปเจอ certificate pinning เลยลองใช้ repo นี้ ปรากฏว่าแก้ปัญหาได้เรียบร้อยมาก
      แถมโฆษณาก็หายไปด้วย น่าจะเพราะเป็น URL โฆษณาเก่า
      ฝั่งผู้พัฒนาเองก็ดูเหมือนจะตั้งหน้าตั้งตาทำให้แอปแย่ลงเรื่อย ๆ อยู่แล้ว เลยไม่เสียดายอะไร
  • ผมใช้เครื่องซักผ้า Bosch อยู่ต่างจากบทความต้นฉบับ โดยเอาไว้คอยดูสถานะความคืบหน้าของเครื่องซักผ้าที่อยู่อีกฟากของบ้าน
    ด้วย Bosch API ผมรู้ได้ว่ารอบซักเสร็จหรือยัง และประตูถูกเปิดหรือยัง
    ตอนนี้ยังใช้ API เวอร์ชันพื้นฐานอยู่ แต่ PoC เสร็จแล้ว ดังนั้นต่อไปคงย้ายไปใช้ตัวเลือก local hosting
    ถ้าใน Home Assistant รอบซักเสร็จแล้วแต่ประตูยังไม่เปิด นั่นแปลว่ายังมีผ้าชื้นค้างอยู่
    ผมเลยตั้งให้มีการแจ้งเตือนเรื่องผ้าซักทุก ๆ 15 นาทีไปที่มือถือผม และไปที่มือถือภรรยาเฉพาะตอนที่เธออยู่บ้าน
    มันเรียบง่ายมากและทำงานได้สมบูรณ์แบบ

    • เครื่องซักผ้าของผมเป็นรุ่นเก่าจากยุค 90 เลยทำงานตามปุ่มหมุนตั้งเวลา
      ไม่มีคอมพิวเตอร์หรือเซ็นเซอร์ มีแค่ตรวจจับขั้นตอนเติมน้ำเพิ่มเท่านั้น
      ตั้งเวลาไว้ 40 นาทีเสมอแล้วก็จบ แถมยังมีปุ่มปิดเสียงเตือนอีก เรียบง่ายกว่านี้ไม่ได้แล้ว

    • ผมก็วางแผนจะทำอะไรคล้าย ๆ กันกับเตาอบเล็กอยู่เหมือนกัน
      มันไม่มี API หรือการเชื่อมต่ออะไร แต่จะเสียบผ่าน smart plug แล้ววัดการใช้ไฟเพื่อดูสถานะ idle/กำลังทำงาน แล้วค่อยแจ้งเตือน

    • ฉันมักจะเปิดเครื่องซักผ้าก่อนนอน แล้วก็ผัดไปเป็นวันถัดไปบ่อย ๆ แต่เครื่องของฉันมีฟีเจอร์คล้าย "extended tumble" ที่ช่วยให้ผ้าสดใหม่ข้ามคืนได้
      มันใช้น้ำเพิ่มอีกนิด แต่ช่วยชีวิตกิจวัตรตอนเย็นไว้ได้ และยังช่วยให้ใช้ไฟในช่วงกลางคืนด้วย
      ฉันชอบ Electrolux ของฉันมาก และคิดว่ายี่ห้ออื่นก็น่าจะมีฟีเจอร์คล้ายกัน

    • ผมใช้時計 G-Shock 5600 เป็นตัวเตือนเวลาเครื่องซักผ้ามากว่า 15 ปีแล้ว
      ตอนเริ่มซักก็ตั้งตัวจับเวลาบนนาฬิกาตามเวลารวมทั้งหมด แล้วพอมันเสร็จก็มีเสียงปี๊บเตือน
      ใช้ได้โดยไม่สนว่าจะมี API หรือไม่ และไม่ขึ้นกับยี่ห้อด้วย

    • เป็นวิธีแก้ปัญหาที่ elegant มาก
      ตรรกะง่าย ๆ แต่ช่วยชีวิตจริงได้ชัดเจน

  • ผมกำลังแฮ็กฮาร์ดแวร์ตู้เย็นอยู่
    ไม่ใช่ซอฟต์แวร์นะ เป็นตู้เย็นราคาแพงสำหรับรถแคมป์ รองรับแก๊ส/12v/220v
    ส่วนควบคุมอิเล็กทรอนิกส์เกิดไฟไหม้จนสายและภายในเสียหาย แต่ตัวตู้เย็นเองยังโอเค
    ดังนั้นในเมื่อยังไงก็ต้องเปลี่ยนชิ้นส่วนทั้งหมดอยู่แล้ว แทนที่จะซื้อคอนโทรลบอร์ดใหม่ราคา 250 ดอลลาร์ ผมเลยคิดจะเอาชิ้นส่วนจากหม้อต้มแก๊สรุ่นเก่ามาประกอบเป็นระบบใหม่แทน
    บนเมนบอร์ดของหม้อต้มมีชุดจุดระเบิดมาครบอยู่แล้ว ถ้าออกแบบ logic กับระบบความปลอดภัยให้ดี ก็น่าจะใช้ในโหมดแก๊สได้
    จะได้ไม่ต้องซื้อตู้เย็นใหม่ และยังเป็นโปรเจกต์ดี ๆ สำหรับสอนอิเล็กทรอนิกส์ให้ลูกชายวัย 9 ขวบด้วย
    แน่นอนว่าแก๊สมีความเสี่ยง แต่สุดท้ายมันก็สนุกเสมอ และพอแฮ็กเสร็จเสียงวิจารณ์ก็มักจะหายไป
    ถ้าใครสนใจกระบวนการ ผมอาจเขียนเป็นโพสต์เต็ม ๆ ก็ได้

  • ผมติด Zigbee vibration sensor ไว้กับเครื่องซักผ้า/เครื่องอบผ้า แล้วเชื่อมเข้ากับ Home Assistant ใช้งานอยู่
    ไม่เคยนึกถึงวิธีเฝ้าดูกระแส/แรงดันผ่าน smart plug มาก่อน รู้สึกว่าเป็นไอเดียที่ดี

    • ที่บ้านเราเสียบ smart plug เข้ากับเครื่องซักผ้า/เครื่องอบผ้า แล้วส่งค่าการใช้พลังงานผ่าน MQTT ไปที่ Node-RED
      ด้วย trigger condition ง่าย ๆ ก็ทำให้ระบบอัปเดตแดชบอร์ดและส่งอีเมลแจ้งเตือนตอนเริ่ม/จบรอบซักได้อัตโนมัติ
      ตัวเครื่องมีทั้งแอปและฟังก์ชัน Bluetooth แต่แอปดันขอสิทธิ์เข้าถึงกล้อง เสียง และรายชื่อติดต่อในมือถือผม เลยไม่คิดจะใช้
      ดูเหมือนว่าจะมีงานทำเรื่องการเชื่อมกับ HA อยู่ในลิงก์ด้านล่างนี้ด้วย
      https://github.com/home-assistant-HomeWhiz/home-assistant-HomeWhiz/blob/main/README.md
  • ผมคิดว่านี่แหละคือแก่นแท้ของ Hacker News

    • อยากเห็นโพสต์แบบนี้เพิ่มขึ้นเรื่อย ๆ แบบการแฮ็กจริง ๆ ในความหมายของงานอดิเรกดัดแปลง ช่วงนี้รู้สึกว่ามีแต่เรื่อง AI/LLM เต็มไปหมด

    • ถ้าชอบงานแฮ็กฮาร์ดแวร์แนวนี้ ขอแนะนำ https://hackaday.com/ มาก ๆ

  • การติดตั้ง certificate ส่วนตัวบน Android ที่ไม่ได้ root ค่อนข้างยุ่งยาก
    เพิ่มเข้าไปได้แค่ใน system certificate store และโดยมากต้องใช้ Magisk module
    วิธีที่ง่ายกว่าคือรัน Android emulator รุ่นเก่าบนพีซี ใส่ certificate เข้าไป แล้วส่งทราฟฟิกไปยัง Burpsuite หรือ mitmproxy
    ไม่ต้องเปลี่ยนอุปกรณ์ด้วย
    ถ้าวิเคราะห์โค้ดแอปด้วย APKLab หรือ Jadx ก็น่าจะหาอัลกอริทึม derivation ของ key ได้ประมาณหนึ่ง
    สงสัยเหมือนกันว่าแอปกับเครื่องซักผ้าจำเป็นต้องอยู่ในเครือข่ายเดียวกันถึงจะทำงานได้หรือเปล่า ซึ่งผมชอบประเด็นนี้

  • ผมสะดุดกับคำว่า รอบซัก "3 ชั่วโมง" ทั้งที่จริงอาจ 4~5 ชั่วโมง เลยขอถามหน่อย
    เครื่องของผมโหมด eco ปกติใช้เวลาไม่ถึง 30 นาที และพอเสร็จก็ส่งเสียงเตือนดังมาก
    ด้วยการรวมกันของรอบซักสั้นกับเสียงเตือน เลยไม่จำเป็นต้องมีวิธีแก้ปัญหาทางเทคนิคที่ซับซ้อนแยกต่างหาก

    • คนคอมเมนต์น่าจะอยู่สหรัฐฯ
      เครื่องซักผ้าในยุโรปใช้เวลานานกว่าเพราะข้อกำหนดด้านการใช้น้ำ/ไฟที่ต่ำกว่า
      อุปกรณ์ในบทความนั้นน่าจะเป็นเครื่องซักและอบในตัว เลยยิ่งใช้เวลานาน
      ที่บ้านเราโหมดธรรมดาก็ 104 นาทีแล้ว และถ้าใส่ผ้าแน่นเกินไปก็อาจกินเวลาถึง 3 ชั่วโมง

    • รอบซักที่ยาวกว่าจะช่วยให้ส่วนผสมอย่างเอนไซม์กับสารฟอกขาวชนิด oxygen-based ฆ่าเชื้อจุลินทรีย์ได้มีประสิทธิภาพกว่า
      คอร์ส 30 นาทีแทบจะเป็นแค่การ "ล้าง" ผ้าเท่านั้น
      https://pubmed.ncbi.nlm.nih.gov/25207988/

    • เครื่องอบผ้าของฉันเป็นรุ่นไร้ท่อระบาย อันที่จริงคืออยากบ่นมากกว่า เลยใช้เวลาถึง 3 ชั่วโมง
      ตั้งแต่ซักจนอบเสร็จก็กินไป 4.5 ชั่วโมง
      เป็นเครื่องใช้ไฟฟ้าที่น่าผิดหวังที่สุดเท่าที่ฉันเคยใช้มา
      บางครั้งยังอบไม่แห้งสนิทด้วยซ้ำ

  • มีคนชี้ว่าเหมือนไม่เห็นการเข้ารหัสเลย
    เขาวิเคราะห์ว่าข้อมูลในหน้าต่าง input ของภาพหน้าจอแรก (cyberchef.avif) เป็นแค่ unencrypted hex ASCII ธรรมดา
    ยกตัวอย่างเช่น 7D คือ {, 0D0A คือ CRLF, 09 คือ TAB, 22 คือ " เป็นต้น
    ดังนั้นมันน่าจะเป็น plaintext ที่ถูก decode แล้ว และคำอธิบายเรื่อง XOR encryption ก็ดูไม่ตรง
    เขายังวิเคราะห์ต่อว่าค่า key ที่อยู่ในภาพหน้าจอก็ไม่ตรงทั้งกับ byte boundary และ alignment รวมถึงไม่ตรงกับช่องว่างใน input จริงด้วย
    เลยสงสัยว่าภาพหน้าจอนั้นถูกดัดแปลงหรือแก้ไขมาหรือไม่
    เขาบอกว่าอยากรู้ว่าเหตุผลคืออะไร และเกิดอะไรขึ้นกันแน่

  • มีคนแจ้งว่าลิงก์รูปภาพที่ระบุข้อความ “For now, I plugged this key into CyberChef, and was able to decrypt the data.” เสียอยู่
    พร้อมระบุถึง HTML element ที่เกี่ยวข้องและลิงก์นั้นอย่างละเอียด

  • สำหรับประโยคที่ว่า "เครื่องซักผ้าสื่อสารกับตัวเองอย่างหนักมาก" มีคนชี้ว่าน่าจะเกิดจากผู้ออกแบบ network stack ไม่เข้าใจแนวคิดของ loopback interface
    มีการส่งแพ็กเก็ตจำนวนมากไปยัง IP ของตัวเอง และยังส่งแพ็กเก็ตไปที่ 255.255.255.255 ทุกวินาทีด้วย แต่เจ้าตัวบอกว่าไม่ได้ใส่ใจมากนัก

    • มันอาจดูเหมือนไม่จำเป็น แต่ก็น่าจะเป็นทราฟฟิกที่เกี่ยวกับ ARP
      ผมเห็นพฤติกรรมแบบนี้บ่อยในอุปกรณ์ IoT และมันอาจถูกใช้เพื่อตรวจจับการชนกันของ IP หรือการเปลี่ยน IP ได้
      ผมก็คิดคล้าย ๆ กัน