2 poin oleh GN⁺ 2023-12-16 | 1 komentar | Bagikan ke WhatsApp
  • Dalam proses rekayasa balik untuk menghubungkan lampu LED Bluetooth LE murah ke Home Assistant, pengontrol menjadi tidak berfungsi saat menguji nilai efek tersembunyi pada string LED addressable 10M
  • Dengan Bluetooth HCI snoop di Android dan Wireshark/tshark, paket BLE yang ditulis aplikasi ke lampu ditangkap, lalu byte kontrol dilacak dari permintaan tulis btatt.opcode.method==0x12
  • Paket dari aplikasi iDeal LED tidak tampak seperti nilai on/off sederhana, sehingga setelah mendekompilasi APK dan menelusuri tulisan analisis yang sudah ada, paket tersebut didekripsi menggunakan kunci AES tetap di dalam libAES.so
  • Paket on/off yang sudah didekripsi diringkas sebagai header tetap dan perbedaan 1/0 pada byte ke-5, lalu pola byte untuk fungsi warna, kecerahan, dan efek dicatat dengan menjalankannya berulang kali
  • Saat nilai 8-bit dikirim melebihi rentang 5-bit 0x1F yang digunakan aplikasi untuk RGB, warna yang lebih terang menjadi mungkin, tetapi ketika nomor efek 12 dikirim, lampu mati dan iklan Bluetooth juga menghilang

Titik awal menghubungkan lampu BLE murah ke otomasi rumah

  • Dengan asumsi bahwa perangkat yang berkomunikasi lewat Bluetooth LE dan memiliki aplikasi khusus bisa diintegrasikan ke sistem otomasi rumah, beberapa strip LED murah direkayasa balik
  • Sebelumnya, strip LED 5M non-addressable dengan kontrol Bluetooth LE seharga £2.38 berhasil dihubungkan ke Home Assistant hanya dalam beberapa jam, dan kode terkait dipublikasikan di bj_led
  • Pekerjaan rekayasa balik BLE untuk pengontrol LEDnetWF juga tersedia di lednetwf_ble
  • Target kali ini adalah string LED addressable 10M yang ada di atas meja dan dikendalikan dengan aplikasi “iDeal LED”
    • Aplikasinya punya banyak fitur dan bekerja cukup baik
    • LED-nya kemungkinan WS2812 atau produk serupa
    • Produk ini adalah lampu yang dibeli dari AliExpress

Menangkap byte BLE yang dikirim aplikasi

  • Untuk mengendalikan perangkat dengan perangkat lunak sendiri, pertama-tama perlu melihat rangkaian byte yang dikirim aplikasi ke perangkat lewat Bluetooth
  • Protokol lampu pada umumnya bisa terdiri dari header, byte perintah seperti on/off atau perubahan warna, dan footer yang mungkin berupa checksum
  • Di Android, penangkapannya dilakukan dengan urutan berikut
    • Mengaktifkan mode pengembang
    • Memasang aplikasi lampu
    • Mengaktifkan Bluetooth HCI snoop di pengaturan pengembang
    • Menjalankan aksi seperti menyalakan dan mematikan lampu di aplikasi
    • Menyalin log ke komputer dengan adb pull sdcard/btsnoop_hci.log .
  • Saat log dibuka di Wireshark, byte yang dikirim ke lampu bisa dilihat
    • Contoh filternya adalah bluetooth.dst == ff:ff:ff:ff:ff:ff && btatt.opcode.method==0x12
    • Alamat MAC harus diganti dengan MAC lampu yang sebenarnya
    • btatt.opcode.method==0x12 berarti ada operasi tulis dari perangkat Android ke lampu
  • Dengan tshark, nilai paket bisa langsung diambil dari terminal
    • tshark -r <filename> -T fields -e btatt.value akan menampilkan payload yang ditulis ke pengontrol LED

Protokol iDeal LED yang tidak cukup hanya dengan replay sederhana

  • Beberapa lampu menunjukkan pola yang hampir bisa dibaca langsung pada aksi on/off
    • Contohnya berupa pengulangan 69 96 02 01 01 dan 69 96 02 01 00
    • Byte terakhir berubah antara 1 dan 0 untuk menandakan nyala dan mati
  • Lampu iDeal LED kali ini memiliki rangkaian byte yang jauh lebih panjang dan berulang, dan meskipun dua jenis paket untuk on/off bisa dibedakan, nilainya tampak seperti noise
  • Jika tujuannya hanya menyalakan dan mematikan, replay dengan mengirim ulang rangkaian byte yang ditangkap apa adanya mungkin sudah cukup
    • gatttool bisa digunakan untuk terhubung ke perangkat BLE dan mengirim byte
    • Handle tujuan pengiriman harus diperiksa di Wireshark
  • Untuk kontrol yang lebih luas, struktur paket harus dipahami, sehingga analisis berlanjut ke aplikasi Android itu sendiri

Mendekompilasi APK dan menemukan kunci AES

  • APK diunduh lalu dibuka dengan jadx untuk memeriksa kode aplikasinya
  • Referensi AES terlihat di dalam sumber, sehingga muncul kemungkinan bahwa protokolnya terenkripsi
  • Untuk data terenkripsi tersebut, diasumsikan beberapa hal berikut
    • Ciphertext untuk aksi yang sama tidak berubah setiap saat, sehingga mungkin ada kunci yang konsisten
    • Karena harus didekripsi cepat pada MCU berdaya rendah, kunci pendek akan menguntungkan
    • Kuncinya mungkin bukan unik per perangkat, melainkan kunci tetap
  • Aplikasi menyertakan pustaka AES terkompilasi bernama libAES.so, dan ini tidak bisa dianalisis hanya dengan jadx
  • Ditemukan tulisan analisis dari orang lain yang mendekompilasi pustaka AES dengan ida free dan menemukan kunci tertanam, lalu kunci itu diuji
  • Saat didekripsi dengan mode AES ECB dari Crypto.Cipher, paket on/off berubah menjadi bentuk yang bermakna
    • Nilai hasil dekripsi muncul seperti 05 54 55 52 4E 01 ... dan 05 54 55 52 4E 00 ...
    • Setelah header tetap, byte ke-5 berubah antara 1 dan 0 untuk menunjukkan on/off
    • Sisanya diisi nol
  • Mulai tahap ini, paket yang dikirim aplikasi bisa didekripsi dan kontrol yang sama bisa direproduksi di kode buatan sendiri

Mencatat pola byte untuk tiap fungsi

  • Cakupan protokol diperluas dengan menjalankan semua fungsi aplikasi satu per satu dan mencatat byte yang dikirim
  • Setiap aksi diulang beberapa kali, dan pola mematikan/menyalakan lampu disisipkan untuk menandai batas antarbagian
    • Warna diubah ke red, green, blue beberapa kali berturut-turut
    • Kecerahan diubah ke 100%, 50%, 10%, 50%, 100%
    • Di antara tiap kelompok, off/on dimasukkan agar batasnya mudah ditemukan di log tangkapan
  • Dengan cara ini, bisa diketahui byte mana yang berubah sesuai aksi, lalu aksi yang dicatat dapat dicocokkan dengan paket yang tertangkap

Nomor efek 12 yang membuat pengontrol brick

  • Saat menyelidiki perubahan warna, ditemukan bahwa aplikasi tidak pernah mengirim nilai lebih besar dari 0x1F untuk nilai red, green, blue
    • 0x1F adalah rentang 5-bit
    • Saat nilai 8-bit dikirim langsung, warna yang lebih terang bisa berfungsi
  • Untuk memeriksa apakah ada efek tambahan di luar 10 efek yang digunakan aplikasi, loop range(20) dijalankan untuk mengirim nomor efek secara berurutan
    • Dari 1 sampai 10 semuanya berjalan normal
    • Di 11 ditemukan perilaku yang tampak seperti mode tersembunyi
    • Saat berlanjut ke 12, lampu mati
  • Setelah itu lampu tidak bisa menyala lagi
    • Tidak lagi menyiarkan iklan Bluetooth
    • Juga tidak bisa dihubungkan
    • Menahan tombol saat menyalakan daya pun tidak memulihkannya
    • Bahkan setelah dicabut semalaman, perangkat tidak kembali normal
  • Diduga firmware rusak karena buffer overflow, tetapi penyebab pastinya belum dipastikan
  • LED itu sendiri adalah LED addressable standar, jadi string-nya masih bisa dipakai ulang dengan menghubungkannya ke mikrokontroler lain

Hasil yang tersisa dan hal yang perlu diwaspadai

  • Meski gagal, sebagian besar protokol berhasil didokumentasikan, dan dibuat proyek GitHub yang mencakup komponen kustom Home Assistant
  • Komponen tersebut berfungsi, tetapi eksperimen dengan cara yang sama bisa merusak pengontrol lampu, jadi semuanya harus dilakukan dengan risiko masing-masing

1 komentar

 
GN⁺ 2023-12-16
Komentar Hacker News
  • Tampaknya bukan “header tetap” FTA, melainkan byte panjang (“perintahnya 5 byte”), dengan perintah TURN, argumen 0/1, lalu sisanya diisi 0 sampai 16 byte

    • 54 55 52 4E langsung terlihat sebagai alfabet kapital TURN
      Kalau tahu bahwa angka dimulai dari 0x30, huruf kapital dari 0x41, dan huruf kecil dari 0x61, lebih mudah menemukan pola alfanumerik dalam dump heksadesimal
      Pengetahuan seperti ini berguna untuk string pendek, tetapi saat melihat paket atau dump memori, format hexdump standar adalah yang terbaik
    • Tepat sekali. 0x54 55 52 4E memang T U R N
    • Temuan bagus. Saya akan memeriksa perintah lain untuk melihat apakah hipotesis byte panjang ini benar, dan tampaknya masuk akal
    • Kemungkinan besar itu bukan padding, melainkan sekadar uint
    • Dalam kasus ini, berdasarkan panjang dan titik awal, headernya bisa dianggap tetap
  • Bisa jadi ini masalah catu daya. Seri WS281x bisa dinyalakan sangat terang, dan kalau banyak digabung, konsumsi arusnya luar biasa besar
    Untuk strip berisi 100 LED, catu daya 12V 3A hanya cukup pas-pasan untuk menyalakan semuanya putih pada kecerahan maksimum, dan itu sangat menyilaukan
    Jadi saya mungkin akan memeriksa sekring yang putus terlebih dahulu. Fakta bahwa firmware hanya memakai hingga 31 dari kecerahan maksimum 255 juga merupakan petunjuk

    • Saat melihat kecerahan dibatasi ke 0x1f, saya juga awalnya berpikir begitu. Kalau beruntung, catu dayanya punya sekring dan hanya sekringnya yang putus
      Kalaupun tidak bisa diselamatkan, rangkaian LED WS281x standar bisa dihubungkan ke Raspberry Pi, dan pengontrol LED beralamat open source saya juga bisa dipakai :) https://github.com/mbevand/ledthemfight
      Ada efek bawaan, dan dibuat sangat modular untuk DIY sehingga cukup dua baris Python untuk membuat modul efek LED kustom sederhana. Demonya di sini: https://youtu.be/qpd2rILsnM4
    • Ide bagus. Saya akan mengeluarkan multimeter
    • Ini tidak terlihat seperti WS2812. Dari tautan Ali yang diposting, stripnya punya empat kabel: 12V, merah, hijau, biru
      Sepertinya ini strip RGB analog, bukan beralamat individual, sehingga seluruh strip menyala dengan warna yang sama
      https://www.aliexpress.com/item/1005005485885067.html
      Siapa pun yang ingin mengutak-atik lampu LED wajib melihat WLED. Efek bawaannya banyak, ada GUI web, memakai ESP32 atau ESP8266 yang sangat murah sebagai pengontrol, dan bisa juga bereaksi terhadap suara. Saat ini saya menjalankan WLED pada lampu Natal dalam ruangan, dan hasilnya terlihat sangat bagus
    • Terima kasih atas tipnya. Saya memperbarui kode dengan menggesernya 3 bit ke kanan agar kembali menjadi angka 5-bit
      Itu cara yang rapi untuk membatasi penggunaan daya
  • Tulisan yang bagus. Saya ingat pernah mencoba melakukan rekayasa balik pada lampu yang saya punya, lalu mengetahui bahwa lampu itu terenkripsi
    Salah satunya amaran 60d dan sisanya beberapa lampu LED baterai SmallRig RM75; saya ingin menyalakan dan mematikan semuanya dengan satu skrip tanpa harus membuka dua aplikasi terpisah
    Saya menghabiskan cukup banyak waktu merekayasa balik aplikasi dan protokolnya, dan tampaknya kedua lampu memakai prosedur negosiasi yang sama tetapi diimplementasikan dengan pustaka yang berbeda
    Saya mencoba meniru pertukaran kunci Diffie-Hellman yang dilakukan saat koneksi, tetapi akhirnya menyerah. Seingat saya, setelah itu masih ada satu atau dua tahap lagi, dan setelah mengirim kunci pertama, perangkat mengirim angka lain yang tampak acak (kunci lain?) tetapi saya tidak berhasil mencari tahu apa yang diinginkannya
    Membaca tulisan ini membuat saya berpikir untuk mencoba memasukkan saja kunci yang di-hardcode dan melihat apakah itu berfungsi

    • Akan sangat bagus kalau berhasil pada lampu Amaran. Mungkin itu bisa mengarah ke rekayasa balik seluruh lini produk Aputure
      Kalau ada integrasi open source untuk Elgato Stream Deck atau Home Assistant, itu akan menjadi kisah sukses besar. Bagi orang-orang YouTube yang merekam video talking head di meja, itu akan jauh lebih baik daripada mengontrol lampu lewat aplikasi ponsel
  • Saya mencoba mengotomatiskan lampu Natal yang terhubung lewat BLE, lalu menciptakan limbah elektronik. Sekarang Anda juga bisa melakukannya

    • Entah bagaimana caranya, tetapi saya pernah melihat sebagian SmartTrash seperti ini bisa di-hard reset dengan urutan ajaib seperti mematikan dan menyalakannya cepat 5 kali
    • Kalau ingin sniffing paket BLE yang lebih berfokus GUI, coba aplikasi nRF Connect
      Saya tidak tahu di iPhone, tetapi di Android, kalau dibiarkan berjalan di latar belakang, ia bisa menangkap aktivitas BLE dalam GUI ponsel yang rapi. Saya memakainya setiap hari
    • Kalau pengontrolnya dilewati, lampunya masih bisa dipakai sebagai lampu bodoh/klasik
  • Ini mengingatkan saya pada MCU keyboard yang menjadi brick saat menerima perintah pencahayaan tertentu
    OpenRGB akhirnya harus menonaktifkan modul itu agar tidak dijalankan otomatis pada perangkat keras tersebut. Kadang perangkat lunak dari produsennya sendiri juga memicu bug yang sama
    Sayangnya, untuk masuk ke mode pemrograman dalam sistem biasanya perlu mengirim laporan USB HID, sementara perangkat yang terdampak bahkan tidak lagi terenumerasi
    Apakah itu benar-benar kerusakan firmware, atau perangkat kerasnya rusak karena perilaku tak terdefinisi lain, itu persoalan terpisah

  • “Mengirim plaintext lewat nirkabel itu tidak aman, kan?”
    “Tenang, kami sudah menambahkan enkripsi AES

    • Tuya benar-benar lucu dalam hal ini. Protokolnya sebenarnya hanya TLS di atas TCP, tetapi setiap kali aplikasi menambahkan perangkat baru, ia menebarkan kata sandi Wi-Fi ke semua STA di sekitar
      Karena memang begitu metode pairing-nya. Aplikasi membroadcast paket secara membabi buta ke 255.255.255.255, dan perangkat target (bohlam, stopkontak, dll.) menunggu dalam mode promiscuous
      Isi paket dilindungi oleh WPA2 dan semacamnya, tetapi panjang paket tidak dilindungi, jadi aplikasi mengirim sangat banyak paket mungil dengan panjang masing-masing paket disetel ke nilai byte ASCII dari karakter berikutnya dalam handshake konfigurasi. Mungkin dikirim berulang kali
      Itulah sebabnya pairing memakan waktu 2 menit lalu selalu tiba-tiba berhenti sebelum penghitung mencapai 0
    • Sepertinya enkripsi terhadap udara
  • Ini yang benar-benar saya khawatirkan tahun lalu saat melakukan rekayasa balik pada BLE controller perapian saya
    Terutama karena perintah “Set password” menerima input byte mentah, sementara aplikasi OEM hanya mengirim data numerik dengan batas panjang
    Untungnya, sepertinya jika daya terputus sebentar, perangkat itu melupakan semua yang pernah terjadi sebelumnya
    Jadi sebagian besar BLE controller dari merek yang sama tampaknya tetap memakai kata sandi bawaan 0000. Begitu listrik padam sekali, akhirnya kembali ke kondisi itu. Kalau benar-benar sedang iseng, ini bisa jadi bahan BLE wardriving yang lumayan menarik
    Saya juga mengubah hasil rekayasa balik itu menjadi integrasi Home Assistant (https://github.com/kaechele/napoleon-efire), dan juga menulis dokumentasi sistem serta protokolnya (https://bonaparte.readthedocs.io/en/latest/index.html)

  • Saya sedang mencari lampu yang fleksibel dan kuat untuk dipasang di roof rack mobil
    Harus bertenaga baterai dan cocok untuk luar ruangan/segala cuaca, dan akan bagus kalau kotak baterainya bisa mudah ditempelkan ke permukaan dengan cable tie
    Kalau bisa, saya ingin form factor T5 “mini”, RGB dan bisa diprogram, supaya bisa dipakai sesuai musim: merah/hijau untuk Natal, ungu/oranye untuk Halloween, dan seterusnya
    Saya penasaran apakah ada yang tahu produk yang memenuhi syarat ini. Tiga syarat pertama bisa ditemukan di Walmart atau Home Depot, tapi sulit menemukan yang memenuhi syarat terakhir
    Hasil pencarian hanya penuh noise
    [1] https://cdn.christmaslightsetc.com/images/CategoryDetail/788...

    • Arah solusinya sepertinya akan bergantung pada seberapa jauh Anda mau DIY
      Misalnya, LED strip 12V dengan waterproof IP67 (model yang dimasukkan ke dalam tabung silikon) mudah didapat [0], dan jumlah LED-nya jauh lebih banyak daripada string seperti lampu Natal, jadi efeknya juga akan lebih kuat
      Namun Anda harus membeli dan memprogram mikrokontroler seperti Arduino, ESP32, atau ESP8266, lalu menyelesaikan sendiri cara mengambil daya dari aki mobil [1]
      Komponen elektroniknya bisa ditaruh di dalam mobil dan hanya kabelnya yang dikeluarkan lewat bagasi, sehingga Anda mungkin bisa mengandalkan seal bagasi yang ada untuk kedap air
      [0] https://www.aliexpress.com/item/1005004289391906.html
      [1] https://www.aliexpress.com/item/1005005977505151.html
    • Anda juga bisa melihat WS2811 bergaya “bullet string”. Kalau akan dihubungkan ke 12V mobil, ini native 12V, biasanya tersedia sebagai produk waterproof dengan pigtail xConnect, mudah dipasang, dan fleksibel
      Juga mudah disolder ulang dengan kabel ekstensi atau disambung berantai
      https://www.aliexpress.com/item/4000105913323.html
      Dari yang saya baca, produk seperti ini atau lampu 5V serupa tampaknya dipakai seperti standar dalam pertunjukan lampu Natal outdoor
    • Masuk saja ke Discord WLED dan lihat kanal #projects serta #showcase. Ada banyak proyek pemasangan lampu RGB LED di kendaraan
      Tapi hati-hati, bidang ini mudah sekali membuat ketagihan
      Link undangan: https://discord.gg/eVhhh2Wh
  • Bisakah kita melihat pembongkaran lampu Natal yang rusak itu?
    Kalau tahu chip apa yang ada di dalamnya, itu bisa memberi petunjuk apakah ada memori flash dan apakah mudah untuk di-dump