- ซื้อ กล้อง Tapo มาเพื่อสังเกตสุนัขในบ้าน แต่สุดท้ายกลับกลายเป็นการอธิบายย้อนกลับถึง หลักการทำงานของอุปกรณ์และแอปของ TP-Link โดยไม่คาดคิด
- ใช้เทคนิคหลากหลาย เช่น MITM, การ decompile APK, การสร้างสคริปต์ถอดรหัส เพื่อวิเคราะห์ กระบวนการ onboarding และโครงสร้างการสื่อสารของ API ที่เข้ารหัส
- จากการค้นพบ รหัสผ่านผู้ดูแลระบบเริ่มต้น และกระบวนการ derive session key จึงสามารถถอดรหัสข้อความที่เข้ารหัสได้ และพบปัญหาการซิงก์ที่ไม่น่าเชื่อถือระหว่างอุปกรณ์กับบัญชีคลาวด์
- วิเคราะห์ ลำดับขั้น onboarding ทั้งหมด แล้วทำขั้นตอนเรียกใช้ API สำคัญ การสร้างบัญชี การเปลี่ยนรหัสผ่าน และการเชื่อมต่อ Wi-Fi ให้เป็นอัตโนมัติด้วยสคริปต์ Bash
- ชี้ให้เห็น ช่องโหว่ของการออกแบบความปลอดภัยในเฟิร์มแวร์ Tapo, การทำ encryption ที่ไม่ประณีตนัก, การซิงก์บัญชีที่ไม่สม่ำเสมอ ซึ่งเป็นลักษณะที่พบได้ในอุปกรณ์ IoT ราคาประหยัด
ภาพรวมของโปรเจกต์
- ผู้เขียนซื้อ กล้อง Tapo ราคาประหยัด มาใช้เพื่อดูสุนัขภายในบ้าน
- ระหว่างใช้งาน ด้วย ความยุ่งยากในการตั้งค่า และข้อมูลออนไลน์ที่มีอยู่น้อย จึงเกิดแรงจูงใจให้ขุดลึกถึงหลักการทำงานของผลิตภัณฑ์
- เมื่อเจอปัญหาที่ไม่คาดคิดกับการเชื่อมต่อ frigate และการเปิดใช้งาน 2way audio จึงเริ่มสนใจวิธี onboarding โดยตรง ที่ไม่ต้องพึ่งการเชื่อมต่อคลาวด์
การวิเคราะห์โครงสร้าง onboarding และการยืนยันตัวตน
- เพื่อวิเคราะห์ขั้นตอนการเชื่อมต่อของกล้อง Tapo ผู้เขียนใช้ MITM proxy และเครื่องมือ dynamic hooking อย่าง frida เพื่อดักทราฟฟิกระหว่างแอปกับกล้อง
- แอปเวอร์ชันใหม่มักมีความสามารถต้านการหลบเลี่ยง เช่น การไม่ใช้พร็อกซีและ certificate pinning ดังนั้นวิธีที่ใช้เครื่องมือแบบ dynamic จึงได้ผล
- หลังตั้งค่าสภาพแวดล้อมสำหรับ bypass เหล่านี้แล้ว ก็สามารถยืนยันขั้นตอน การล็อกอินด้วยบัญชีผู้ดูแลระบบเริ่มต้น ใน flow การ onboarding ของกล้องได้อย่างชัดเจน
- พบว่า API สำหรับล็อกอินเริ่มต้น ทำงานด้วย รหัสผ่านเริ่มต้น เฉพาะของอุปกรณ์ ซึ่งแยกจากรหัสผ่านของบัญชีคลาวด์
โครงสร้างการเข้ารหัสและการค้นหารหัสผ่านเริ่มต้น
- จากการ decompile APK (ใช้ JADX) และวิเคราะห์โค้ด ทำให้ได้ รหัสผ่านเริ่มต้น ของบัญชี
admin (TPL075526460603)
- แม้จะเปลี่ยนรหัสผ่านคลาวด์แล้ว แต่กล้องที่เชื่อมต่ออยู่ก่อนหน้านี้กลับไม่รับรู้การเปลี่ยนแปลง จึงยืนยันได้ว่าการ ซิงก์รหัสผ่านระหว่างแอปกับกล้องไม่แม่นยำ
- เมื่อทราบรหัสผ่านเริ่มต้นแล้ว ผู้เขียนจึง implement logic สำหรับ derive session key (
lsk, ivb) เพื่อให้สามารถถอดรหัส ข้อความ API ที่เข้ารหัส ได้แบบเรียลไทม์
การทำสคริปต์ mitmproxy และการวิเคราะห์ API
- อ้างอิงจากโปรเจกต์โอเพนซอร์ส PyTapo แล้ววิเคราะห์ ลำดับ API ของขั้นตอน onboarding ของ Tapo จริงอย่างละเอียด
- ผ่านสคริปต์
tapo_decrypt_pretty.py สามารถทำสิ่งต่อไปนี้ได้
- ตรวจจับ login handshake
- ดึง session key
- ถอดรหัส API ที่เข้ารหัส พร้อมแสดงผลให้อ่านง่ายและบันทึกเป็น JSON
- จากรายการเรียกใช้ API ทั้งหมดใน onboarding ได้คัดเฉพาะขั้นตอนสำคัญที่มีความหมายมาสร้างเป็น workflow อัตโนมัติ
- ดึงรายการ Wi-Fi (
scanApList)
- เปิดใช้งานบัญชี RTSP/ONVIF
- เปลี่ยนรหัสผ่านผู้ดูแลระบบ
- เชื่อมต่อ Wi-Fi
การทำงานอัตโนมัติและผลลัพธ์
- จัดทำสคริปต์ Bash (
tapo_onboard.sh) ให้รันขั้นตอน onboarding ทั้งหมดข้างต้น โดยอัตโนมัติ
- ล็อกอินด้วย admin เริ่มต้น
- เลือกและเชื่อมต่อ Wi-Fi
- ลบโลโก้ออกจากฟีดกล้อง
- อนุญาตการใช้งาน RTSP/ONVIF
- รีเซ็ตรหัสผ่านผู้ดูแลระบบ
- จากโครงสร้างเฟิร์มแวร์ของกล้อง พบลักษณะและช่องโหว่ต่อไปนี้
- บาง API ใช้ แฮช SHA-256 แต่บางส่วนยังคงใช้วิธีเข้ารหัสแบบเก่าอย่าง MD5
- มี public key อยู่ 2 ชุด และไม่ชัดเจนว่าควรใช้คีย์ใดในสถานการณ์ไหน
- การ ซิงก์รหัสผ่าน ระหว่างแอปกับอุปกรณ์ไม่มีเสถียรภาพอย่างมาก
บทสรุปและความเห็น
- โครงสร้างความปลอดภัยของเฟิร์มแวร์และ API ของกล้อง Tapo ให้ความรู้สึกว่าเป็น การออกแบบแบบแก้ขัดและยังไม่ประณีต
- เป็นประสบการณ์ที่ทำให้ได้สัมผัสทางอ้อมถึง ช่องโหว่ด้านความปลอดภัย และความไม่สมบูรณ์ของระบบ onboarding ในอุปกรณ์ IoT ราคาประหยัด
- ส่วนเป้าหมายสูงสุดของโปรเจกต์อย่างการเช็กดูสุนัขนั้นสำเร็จ โดยพบว่าสุนัขมักนอนอยู่บนโซฟาหรือไม่ก็บนเตียง
ยังไม่มีความคิดเห็น