Noel Işıklarını Bozan Olay
(whizzy.org)- 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==0x12yazma 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.soiçindeki sabit AES anahtarı ile şifresi çözüldü - Şifresi çözülen on/off paketleri, sabit bir başlık ve 5. bayttaki
1/0farkı ş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
0x1Faralığı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 snoopetkinleş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
- Filtre örneği:
- 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 01ve69 96 02 01 00dizilerinin tekrar ettiği bir biçim verilebilir - Son bayt
1ve0olarak değişerek açma/kapamayı gösterir
- Örnek olarak
- 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
gatttoolile 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.soadlı derlenmiş bir AES kütüphanesi vardı ve yalnızcajadxile analiz edilemiyordu - Başka birinin
ida freeile AES kütüphanesini decompile edip gömülü anahtarı bulduğu bir analiz yazısı bulundu ve bu anahtar denendi Crypto.Cipheriç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 ...ve05 54 55 52 4E 00 ...gibi görünüyordu - Sabit başlığın ardından 5. bayt
1veya0olarak değişiyor ve on/off durumunu gösteriyordu - Kalan kısım sıfırlarla dolduruluyordu
- Şifresi çözülmüş değerler
- 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
0x1Fdeğ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
Hacker News yorumları
FTA’nın “sabit başlığından” ziyade bunun bir uzunluk baytı olduğu anlaşılıyor (“komut 5 bayt”);
TURNkomutu, 0/1 argümanı var ve geri kalanı 16 bayta kadar 0’larla doldurulmuş gibi görünüyor54 55 52 4Ebüyük harfliTURNolarak hemen göze çarpıyorRakamların
0x30, büyük harflerin0x41, küçük harflerin de0x61ile başladığını bilirsen, hex dump içinde alfasayısal desenleri bulmak kolaylaşırKısa dizgilerde bu bilgi faydalıdır ama paket ya da bellek dökümü incelerken standart hexdump biçimi en iyisidir
0x54 55 52 4Egerçekten deT U R Nuintolma ihtimali daha yüksekBu 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
0x1file 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ırKurtaramasan 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
12V, kırmızı, yeşil, mavi olmak üzere dört kablo varTek 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
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
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
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
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”
Eşleştirme yöntemi böyle çalışıyor. Uygulama
255.255.255.255adresine paketleri körlemesine broadcast ediyor, hedef cihaz da (ampul, priz vb.) promiscuous modda bekliyorPaket 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
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
0000ile 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 olabilirBen 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
T5olsun, RGB ve programlanabilir olsun ki Noel'de kırmızı/yeşil, Cadılar Bayramı'nda mor/turuncu gibi mevsime göre kullanabileyimBu 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...
Ö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
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
#projectsve#showcasekanallarına bakabilirsiniz. Araçlara RGB LED aydınlatma takılmış pek çok proje varAma 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