Hacking Xiaomi XiaoYi CCTV

Tempo hari, saya membeli kamera CCTV yang relatif murah dan ada nightvision-nya, yaitu Xiaomi XiaoYi CCTV.

Overall, gambarnya cukup bagus untuk kamera CCTV. Namun, untuk mengakses kameranya, perlu menginstal aplikasi MiHome.

Di aplikasi MiHome ini, kamu bisa melihat rekaman, dan ada timeline untuk mencari kapan motion sensor-nya aktif. Dan yang kerennya adalah, ada push notification ketika ada gerakan yang terdeteksi oleh kamera.

Namun, hal itu tidak berlangsung lama sampai pada suatu hari, aplikasi MiHome-nya tidak bisa digunakan. Saya ngubek-ngubek google, ngga nemu APK yang jalan buat ngeliat kamera CCTV.

Lalu, saya-pun menemukan Yi-Hack untuk menjadikan kamera Xiaomi ini menjadi IPCam yang bisa stream RTSP >> https://github.com/fritz-smh/yi-hack/

Sayapun ngubek seharian kode-nya gak jalan-jalan. Berikut ini perjalanannya:

  • Pertama kali copy file ke sd, kamera tetap pada warna kuning. Padahal, harusnya jadi biru.
  • Saya-pun mencoba revert ke versi ini >>> https://github.com/fritz-smh/yi-hack/tree/81f5dbf3dd2117c87deb50f1b3df5498dc6da889 dan hasilnya, bisa nyala jadi biru. Tapi, HTTP dan RTSP tidak jalan
  • Saya pun mencoba telnet ke kamera Yi. Lalu mencoba nge-start service http dan rtsp-nya. Ternyata, ada masalah segmentation fault
  • Lalu saya cari-cari issue tentang segmentation fault di¬†https://github.com/fritz-smh/yi-hack/issues . Ada 2 thread, yang satu bilang ‘gak ada file home’, yang satu lagi bahasa portugal gak jelas ūüėÄ (pake translate pun masih gak jelas)
  • Lalu saya membuka satu link dari thread di sana >>¬†http://xiaoyi.querex.be/ dan membaca, suruh coba image M
  • Tetap gak bisa…
  • Lalu saya coba image A. Dan ternyata bisa nyala
  • Tapi, beberapa kali saya jalankan, malah gak bisa di-ping. Seolah-olah TCP/IP nya gak jalan
  • Setelah diselidiki, ternyata HTTP server-nya error
  • Saya coba disable HTTP servernya di startup equip-test.sh. Lalu, jalanin manual via telnet, dan BISA
  • Akhirnya, script equip-test.sh saya utak-atik agar semua service nya menyala secara otomatis.

Ini file hasil ulikan saya. Barangkali bermanfaat >> http://kamil.web.id/files/yi-hack-2.rar

*BTW, katanya ada yang bilang camera xiaomi bisa di-crack (atau istilah limrah¬†dihack. Sebenernya¬†banyak orang yang salah kaprah antara arti ‘hack’ dan ‘crack’) Jadi, opsi menjadikan Xiaomi XiaoYi CCTV sebagai IPcam bisa mengindari risiko diatas.

(String) Password for Authentication

Manakah yang lebih baik:

  • naruh hashed password di server dan minta plain text dari client, atau
  • minta hashed password dari client dan di-cek dengan plain text pada server ?

Kalau kita breakdown lagi, ada beberapa cara pengiriman-penyimpanan untuk verifikasi password dalam bentuk string:

  • Client side
    1. Kirim plain text
    2. Kirim encrypted text
    3. Kirim standard hash, hanya md5(password) saja
    4. Kirim private salted hash, md5(private salt + password)
    5. Kirim random salted hash, md5(random salt + password)
  • Server side
    1. Simpan plain text
    2. Simpan encrypted text
    3. Simpan standard hash, hanya md5(password) saja
    4. Simpan private salted hash, md5(private salt + password)
    5. Simpan random salted hash, md5(random salt + password)

Kombinasi-kombinasi diatas bisa dipasangkan sesuka hati, hanya saja kalau pake random salted hash, pasangannya tidak boleh hash lagi (karena tidak bisa di-cek passwordnya). Dan private salted hash hanya bisa dengan private salted hash lagi / plaintext.

Menurut saya

Metode Komentar
1. Plain Text Sangat berbahaya. Kalau client ngirim plaintext mudah sekali diintercept oleh eavesdropper. Selain itu, kalo entri password kehack, sangat berbahaya ketika password semua user ketauan. Bisa2 merembet ke semua akun pengguna selain akun sistem terkompromi.
2. Encrypted Text Di sisi client bisa diasumsikan aman, apabila menggunakan SSL (walaupun tidak bisa juga dibilang 100% aman. tapi harusnya sih aman). Kalau di sisi server agak berbahaya ketika key decryptionnya dapet. Bisa-bisa terekspose seperti plaintext.
3. Standard Hash Ada bahayanya. Bisa kena attack rainbow table. Banyak situs di internet yang bisa reverse dari kode hashed md5 / sha1 ke plaintext.
4. Private Salted Hash Jauh lebih aman daripada standard hash karena ada key rahasia untuk pembuatan kode md5 nya. Hanya saja, kalau key diketahui, hanya butuh waktu untuk membuat rainbow table nya untuk membobol semua user.
5. Random Salted Hash Sedikit modifikasi dari private salted hash, dengan hash unik untuk setiap passwordnya. Bisa dibilang best practice nya pakai metode ini. Kalaupun ada yang punya salted-hash nya, perlu brute force yang lebih berat karena harus membuat rainbow table untuk setiap password. Exhaustive brute force….

Kalau situs besar sepert Facebook, Google, dlsb, biasanya menggunakan metode Client=2 (menggunakan SSL) server=(4&5) (kayaknya)

Framework PHP seperti laravel by default menggunakan Client=1(HTTP)/2(HTTPS) Server=5

Biasanya situs-situs atau aplikasi yang tidak memikirkan security menggunakan metode Client=1 server=1

Jadi, kalo kata saya sih paling aman pakai metode Client=2 dan server=(4&5). Aman dari eavesdroper dan kalo hashed passwordnya ketauan, tetep perlu cari private key nya dan brute force.