2 puan yazan GN⁺ 2023-12-16 | 1 yorum | WhatsApp'ta paylaş
  • Ucuz bir Bluetooth LE LED aydınlatmayı Home Assistant’a bağlamak için yapılan tersine mühendislik sürecinde, 10 m adreslenebilir LED dizisinin gizli efekt değerleri denenirken kontrolcü çalışmaz hâle geldi
  • Android’in Bluetooth HCI snoop özelliği ve Wireshark/tshark ile uygulamanın aydınlatmaya yazdığı BLE paketleri yakalandı; btatt.opcode.method==0x12 yazma isteklerinde kontrol baytları izlendi
  • iDeal LED uygulamasının paketleri basit on/off değerleri gibi görünmüyordu; APK decompile işlemi ve mevcut analiz yazılarının ardından libAES.so içindeki sabit AES anahtarı ile şifresi çözüldü
  • Şifresi çözülen on/off paketleri, sabit bir başlık ve 5. bayttaki 1/0 farkı şeklinde düzenlendi; renk, parlaklık ve efekt işlevleri tekrar tekrar çalıştırılarak bayt desenleri kaydedildi
  • RGB için uygulamanın kullandığı 5 bitlik 0x1F aralığının ötesinde 8 bit değerler gönderilince daha parlak renkler mümkün oldu; ancak efekt numarası 12 gönderildiği anda aydınlatma kapandı ve Bluetooth reklamları da kayboldu

Ucuz BLE aydınlatmayı ev otomasyonuna bağlamanın başlangıç noktası

  • Bluetooth LE ile iletişim kuran ve özel uygulaması olan cihazların ev otomasyon sistemlerine entegre edilebileceği varsayımıyla çeşitli ucuz LED şeritler üzerinde tersine mühendislik yapıldı
  • Daha önce £2,38’lik Bluetooth LE kontrollü 5 m adreslenemeyen LED şerit birkaç saat içinde Home Assistant’a bağlanmıştı; ilgili kod bj_led üzerinde yayımlandı
  • LEDnetWF kontrolcüsünün BLE tersine mühendislik çalışması da lednetwf_ble içinde yer alıyor
  • Bu seferki hedef, masanın üzerinde duran 10 m adreslenebilir LED dizisiydi ve “iDeal LED” uygulamasıyla kontrol ediliyordu
    • Uygulamanın çok sayıda işlevi var ve nispeten iyi çalışıyor
    • LED’lerin WS2812 veya benzeri bir ürün olma olasılığı var
    • Ürün AliExpress’ten satın alınmış bir aydınlatma

Uygulamanın gönderdiği BLE baytlarını yakalama

  • Cihazı kendi yazılımıyla kontrol etmek için önce uygulamanın Bluetooth üzerinden cihaza gönderdiği bayt dizisini görmek gerekiyor
  • Tipik bir aydınlatma protokolü; bir başlık, on/off veya renk değiştirme gibi bir komut baytı ve sağlama toplamı olabilecek bir kuyruktan oluşabilir
  • Android’de yakalama şu sırayla yapıldı
    • Geliştirici modu açıldı
    • Aydınlatma uygulaması kuruldu
    • Geliştirici ayarlarında Bluetooth HCI snoop etkinleştirildi
    • Uygulamada aydınlatmayı açıp kapatma gibi işlemler yapıldı
    • adb pull sdcard/btsnoop_hci.log . ile günlük bilgisayara kopyalandı
  • Günlük Wireshark’ta açıldığında aydınlatmaya gönderilen baytlar görülebilir
    • Filtre örneği: bluetooth.dst == ff:ff:ff:ff:ff:ff && btatt.opcode.method==0x12
    • MAC adresi gerçek aydınlatmanın MAC adresiyle değiştirilmelidir
    • btatt.opcode.method==0x12, Android cihazdan aydınlatmaya bir yazma işlemi gerçekleştiği anlamına gelir
  • tshark kullanıldığında paket değerleri doğrudan terminalden çıkarılabilir
    • tshark -r <filename> -T fields -e btatt.value, LED kontrolcüsüne yazılan payload’u çıktılar

Basit replay’in yetmediği iDeal LED protokolü

  • Bazı aydınlatmalarda on/off işlemlerinde neredeyse doğrudan okunabilen desenler görülür
    • Örnek olarak 69 96 02 01 01 ve 69 96 02 01 00 dizilerinin tekrar ettiği bir biçim verilebilir
    • Son bayt 1 ve 0 olarak değişerek açma/kapamayı gösterir
  • Bu iDeal LED aydınlatmada çok daha uzun bayt dizileri tekrarlanıyordu; on/off’a karşılık gelen iki paket türü ayırt edilebiliyordu ama değerler gürültü gibi görünüyordu
  • Amaç yalnızca açıp kapatmaksa yakalanan bayt dizisini aynen yeniden gönderen replay yeterli olabilir
    • gatttool ile BLE cihazına bağlanıp bayt gönderilebilir
    • Gönderilecek handle Wireshark’ta kontrol edilmelidir
  • Daha fazla kontrol için paket yapısını anlamak gerekiyordu; bu yüzden Android uygulamasının kendisini analiz etme aşamasına geçildi

APK decompile işlemi ve AES anahtarını bulma

  • APK indirilip jadx ile açıldı ve uygulama kodu incelendi
  • Kaynak içinde AES referansları görüldüğünden protokolün şifrelenmiş olabileceği ihtimali ortaya çıktı
  • Şifreli veriler için şu koşullar varsayıldı
    • Aynı işlemin şifreli metni her seferinde değişmediği için tutarlı bir anahtar olabilir
    • Düşük güç tüketimli bir MCU’da hızlı çözme gerektiğinden kısa anahtar avantajlıdır
    • Anahtar cihaz başına benzersiz değil, sabit bir anahtar olabilir
  • Uygulamada libAES.so adlı derlenmiş bir AES kütüphanesi vardı ve yalnızca jadx ile analiz edilemiyordu
  • Başka birinin ida free ile AES kütüphanesini decompile edip gömülü anahtarı bulduğu bir analiz yazısı bulundu ve bu anahtar denendi
  • Crypto.Cipher içindeki AES ECB modu ile şifre çözülünce on/off paketleri anlamlı bir biçime dönüştü
    • Şifresi çözülmüş değerler 05 54 55 52 4E 01 ... ve 05 54 55 52 4E 00 ... gibi görünüyordu
    • Sabit başlığın ardından 5. bayt 1 veya 0 olarak değişiyor ve on/off durumunu gösteriyordu
    • Kalan kısım sıfırlarla dolduruluyordu
  • Bu aşamadan itibaren uygulamanın gönderdiği paketlerin şifresi çözülebilir ve aynı kontrol kendi kodunda yeniden üretilebilir hâle geldi

İşlevlere göre bayt desenlerini kaydetme

  • Uygulamanın tüm işlevleri tek tek çalıştırılarak gönderilen baytlar kaydedildi ve protokolün kapsamı genişletildi
  • Her işlem birkaç kez tekrarlandı; bölümleri ayırmak için araya aydınlatmayı kapatıp açma deseni eklendi
    • Renk birkaç kez red, green, blue sırasıyla değiştirildi
    • Parlaklık 100%, 50%, 10%, 50%, 100% olarak değiştirildi
    • Yakalama günlüklerinde sınırları daha kolay bulmak için her bloğun arasına off/on eklendi
  • Bu yöntemle işleme göre hangi baytların değiştiği görüldü ve kaydedilen işlemler yakalanan paketlerle eşleştirilebildi

Kontrolcüyü brick eden efekt numarası 12

  • Renk değiştirmeyi incelerken uygulamanın red, green, blue değerleri için 0x1F değerinden büyük değerler göndermediği görüldü
    • 0x1F, 5 bitlik aralıktır
    • Doğrudan 8 bit değerler gönderildiğinde daha parlak renkler çalıştı
  • Uygulamanın kullandığı 10 efekt dışında ek efektler olup olmadığını kontrol etmek için range(20) döngüsü çalıştırılıp efekt numaraları sırayla gönderildi
    • 1’den 10’a kadar normal ilerledi
    • 11’de gizli mod gibi görünen bir davranış bulundu
    • 12’ye geçildiğinde aydınlatma kapandı
  • Sonrasında aydınlatma bir daha açılmadı
    • Artık Bluetooth reklamı yapmıyordu
    • Bağlantı da kurulamıyordu
    • Güç verilirken düğmeye basılı tutmak da kurtarmadı
    • Gece boyunca fişi çekili bırakmak da geri getirmedi
  • Bir buffer overflow nedeniyle firmware’in zarar görmüş olabileceği tahmin edildi, ancak neden kesinleşmedi
  • LED’lerin kendisi standart adreslenebilir LED olduğundan dizi başka bir mikrodenetleyiciye bağlanarak yeniden kullanılabilir

Kalan çıktılar ve dikkat edilmesi gerekenler

  • Başarısızlığa rağmen protokolün büyük bölümü belgelendi ve Home Assistant özel bileşeni içeren bir GitHub projesi oluşturuldu
  • Bileşen çalışıyor; ancak aynı tür deneyler aydınlatma kontrolcüsünü bozabileceğinden herkes kendi sorumluluğunda ilerlemelidir

1 yorum

 
GN⁺ 2023-12-16
Hacker News yorumları
  • FTA’nın “sabit başlığından” ziyade bunun bir uzunluk baytı olduğu anlaşılıyor (“komut 5 bayt”); TURN komutu, 0/1 argümanı var ve geri kalanı 16 bayta kadar 0’larla doldurulmuş gibi görünüyor

    • 54 55 52 4E büyük harfli TURN olarak hemen göze çarpıyor
      Rakamların 0x30, büyük harflerin 0x41, küçük harflerin de 0x61 ile başladığını bilirsen, hex dump içinde alfasayısal desenleri bulmak kolaylaşır
      Kısa dizgilerde bu bilgi faydalıdır ama paket ya da bellek dökümü incelerken standart hexdump biçimi en iyisidir
    • Güzel yakalamışsın. 0x54 55 52 4E gerçekten de T U R N
    • İyi bulgu. Uzunluk baytı hipotezinin doğru olup olmadığını görmek için diğer komutlara da bakacağım; olası görünüyor
    • Padding değil de sadece uint olma ihtimali daha yüksek
    • Bu durumda uzunluk ve başlangıç noktası açısından başlık fiilen sabit sayılır
  • Bu bir güç kaynağı sorunu olabilir. WS281x ailesi çok parlak yanabiliyor ve birkaçını bir araya getirince ciddi akım çekiyor
    100’lü bir şerit için 12V 3A güç adaptörü, tümünü tam parlak beyazda ancak çalıştırmaya yetecek kadardır ve aşırı parlak olur
    O yüzden önce atmış bir sigortaya bakardım. Firmware’in maksimum parlaklık 255 yerine yalnızca 31 kullanması da bir ipucu

    • Parlaklığın 0x1f ile sınırlandığını görünce ben de önce bunu düşünmüştüm. Şanslıysan güç kaynağında sigorta vardır ve sadece sigorta atmıştır
      Kurtaramasan bile standart bir WS281x LED dizisini Raspberry Pi’ye bağlayabilir, benim açık kaynak adreslenebilir LED denetleyicimi de kullanabilirsin :) https://github.com/mbevand/ledthemfight
      Yerleşik efektler var ve DIY için çok modüler tasarlandı; Python’da iki satırla basit bir özel LED efekt modülü yazabiliyorsun. Demo burada: https://youtu.be/qpd2rILsnM4
    • İyi fikir. Multimetreyi çıkaracağım
    • Bu, WS2812 gibi görünmüyor. Paylaştığın Ali bağlantısına bakınca şeritte 12V, kırmızı, yeşil, mavi olmak üzere dört kablo var
      Tek tek adreslenebilir değil; tüm şeridin aynı renkte yandığı analog bir RGB şerit gibi görünüyor
      https://www.aliexpress.com/item/1005005485885067.html
      LED aydınlatmayla oynamak isteyen herkesin WLED’e bakması gerek. Çok sayıda yerleşik efekt, web GUI, denetleyici olarak çok ucuz ESP32 veya ESP8266 kullanımı ve ses tepkisi desteği var. Şu anda iç mekân Noel ışıklarımda WLED çalıştırıyorum ve harika görünüyor
    • İpucu için teşekkürler. Kodu 3 bit sağa kaydırıp tekrar 5 bitlik sayı haline getirecek şekilde güncelledim
      Güç tüketimini sınırlamanın temiz bir yolu
  • Güzel yazı. Sahip olduğum ışıkları reverse engineer etmeye çalışırken aslında şifreli olduklarını fark ettiğim zamanı hatırlattı
    Biri amaran 60d, diğerleri de birkaç SmallRig RM75 pilli LED ışıktı; iki ayrı uygulamayla uğraşmadan hepsini tek bir script ile açıp kapatmak istemiştim
    Uygulamaları ve protokolü reverse engineer etmek için epey zaman harcadım; iki ışık da aynı müzakere sürecini kullanıyor gibiydi ama sanki farklı kütüphanelerle uygulanmıştı
    Bağlantı sırasında yapılan Diffie-Hellman anahtar değişimini taklit etmeye çalıştım ama sonunda vazgeçtim. Hatırladığım kadarıyla sonrasında bir iki adım daha vardı ve ilk anahtarı gönderdikten sonra bir de rastgele gibi görünen sayılar (başka bir anahtar mı?) gönderiyordu; onun ne istediğini çözemedim
    Bu yazıyı görünce, belki de sabit kodlanmış bir anahtar deneyip çalışıyor mu diye bakmam gerektiğini düşündüm

    • Amaran ışıklarda başarırsan gerçekten harika olur. O zaman muhtemelen tüm Aputure ürün ailesinin reverse engineer edilmesine de yol açabilir
      Elgato Stream Deck veya Home Assistant için açık kaynak entegrasyon çıkarsa büyük bir başarı hikâyesi olur. Masasında talking-head videosu çeken YouTube kitlesi için bu, ışıkları telefon uygulamasıyla kontrol etmekten çok daha iyi olur
  • BLE bağlantılı Noel ışıklarını otomatikleştirmeye çalışırken e-atık ürettim. Artık siz de yapabilirsiniz

    • Nasıl yaptığını bilmiyorum ama bu tür SmartTrash cihazlarının bazılarının art arda 5 kez kapatıp açma gibi büyülü bir sırayla hard reset olduğunu gördüm
    • BLE paketlerini daha GUI ağırlıklı şekilde sniff etmek istiyorsan nRF Connect uygulamasını kullanabilirsin
      iPhone tarafını bilmiyorum ama Android’de arka planda açık bırakırsan telefonun düzgün GUI’si üzerinden BLE etkinliğini yakalayabiliyor. Her gün kullanıyorum
    • Denetleyiciyi atlayarak yine de bunları basit/klasik ışıklar olarak kullanabilirsin
  • Bazı aydınlatma komutlarını alınca brick olan klavye MCU’larını hatırlattı
    OpenRGB sonunda ilgili donanımda o modülün otomatik çalışmasını engellemek için devre dışı bırakmak zorunda kaldı. Bazen üreticinin yazılımı da aynı hatayı tetikliyordu
    Ne yazık ki sistem içi programlama moduna girmek için genellikle USB HID raporu göndermek gerekiyordu ama etkilenen cihazlar artık enumerate bile olmuyordu
    Gerçekten firmware bozulması mı olduğu, yoksa tanımsız başka bir davranış yüzünden donanımın bozulup bozulmadığı ise ayrı mesele

  • “Düz metni kablosuz gönderirsen güvenli olmaz ya”
    “Merak etme, AES şifreleme ekledim”

    • Tuya bu konuda gerçekten komik. Protokol aslında TCP üstünde TLS ama uygulama, her yeni cihaz eklenişinde yakındaki tüm STA’lara Wi‑Fi şifresini saçıyor
      Eşleştirme yöntemi böyle çalışıyor. Uygulama 255.255.255.255 adresine paketleri körlemesine broadcast ediyor, hedef cihaz da (ampul, priz vb.) promiscuous modda bekliyor
      Paket içeriği WPA2 vb. ile korunuyor ama paket uzunluğu korunmuyor; bu yüzden kurulum handshake’inin sıradaki karakterinin ASCII bayt değerini her paketin uzunluğu yapan çok küçük paketlerden çok sayıda gönderiyor. Muhtemelen bunu defalarca tekrarlıyor
      Bu yüzden eşleştirme 2 dakika sürüyor ama sayaç 0’a gelmeden hemen önce hep birden duruyor
    • Sanki havaya karşı yapılmış bir şifreleme gibi
  • Geçen yıl şöminemdeki BLE denetleyicisini tersine mühendislikle incelerken gerçekten en çok bundan endişelenmiştim
    Özellikle “Set password” komutu ham bayt girdisi alıyordu, ama OEM uygulaması yalnızca uzunluğu sınırlı sayısal veri gönderiyordu
    Neyse ki güç kısa süreli kesilince daha önce olan her şeyi tamamen unutuyor gibi görünüyordu
    Bu yüzden aynı markanın çoğu BLE denetleyicisi varsayılan parola 0000 ile kalıyor gibi görünüyor. Bir elektrik kesintisi olduğunda eninde sonunda yine o duruma dönüyor. Gerçekten çok sıkılırsanız BLE wardriving için epey iyi bir malzeme olabilir
    Ben de tersine mühendislik sonuçlarımla bir Home Assistant entegrasyonu yaptım(https://github.com/kaechele/napoleon-efire) ve sistemle protokolün belgelerini de yazdım(https://bonaparte.readthedocs.io/en/latest/index.html)

  • Aracın tavan sepetine takmak için esnek ve dayanıklı bir aydınlatma arıyorum
    Pille çalışmalı, dış mekân/tüm hava koşullarına uygun olmalı ve pil kutusunu kablo bağıyla bir yüzeye kolayca sabitleyebilmek güzel olurdu
    Mümkünse “mini” form faktöründe T5 olsun, RGB ve programlanabilir olsun ki Noel'de kırmızı/yeşil, Cadılar Bayramı'nda mor/turuncu gibi mevsime göre kullanabileyim
    Bu koşullara uyan bir ürün bilen var mı merak ediyorum. İlk üç koşulu Walmart ya da Home Depot'ta bulabiliyorum ama son koşulu karşılayan bir şey bulmak zor oldu
    Arama yapınca tonla gürültü çıkıyor
    [1] https://cdn.christmaslightsetc.com/images/CategoryDetail/788...

    • Ne kadar DIY yapmak istediğinize göre yön değişir gibi görünüyor
      Örneğin IP67 su geçirmez 12V LED şeritler (silikon tüp içinde olan tip) kolayca bulunabiliyor [0] ve Noel ışıkları gibi dizilimlerden çok daha fazla LED içerdiği için etkisi de çok daha güçlü olur
      Ama Arduino, ESP32, ESP8266 gibi bir mikrodenetleyici satın alıp programlamanız ve gücü araç aküsünden nasıl alacağınızı kendiniz çözmeniz gerekir [1]
      Elektronik parçaları aracın içine koyup sadece kabloyu bagaj dışına çıkarırsanız, mevcut bagaj contasının su geçirmezlik sağlamasını da umabilirsiniz
      [0] https://www.aliexpress.com/item/1005004289391906.html
      [1] https://www.aliexpress.com/item/1005005977505151.html
    • “bullet string” tarzı WS2811 ürünlere de bakabilirsiniz. Aracın 12V hattına bağlayacaksanız doğal olarak 12V'tur, genelde xConnect pigtail'li su geçirmez ürünler olarak gelir, yapıştırması kolaydır ve esnektir
      Uzatma için yeniden lehimlemek ya da zincirleme bağlamak da kolaydır
      https://www.aliexpress.com/item/4000105913323.html
      Okuduklarıma göre bu tür ürünler ya da benzer 5V aydınlatmalar dış mekân Noel ışık gösterilerinde fiilî standart gibi kullanılıyor
    • WLED Discord'una girip #projects ve #showcase kanallarına bakabilirsiniz. Araçlara RGB LED aydınlatma takılmış pek çok proje var
      Ama bu işin içine kaptırmak kolay, dikkatli olun
      Davet bağlantısı: https://discord.gg/eVhhh2Wh
  • Bozuk Noel ışıklarının sökülmüş hâlini görebilir miyiz?
    İçinde hangi çiplerin olduğunu bilmek, flash belleğin olup olmadığına ve dump almanın ne kadar kolay olabileceğine dair ipucu verebilir