Arka plan
Yakın zamanda (oldukça pahalı) bir akıllı lamba satın aldım. Bilinen bir üreticiden değil, nispeten küçük bir şirket ama MQTT'yi oldukça ciddi bir şekilde hayata geçirmiş görünüyorlar.İlk analiz
Paket incelemesi yoluyla, lamba ile sunucu arasında alınıp verilen aşağıdaki ilgili MQTT mesajlarını çıkardım.- Kimlik doğrulama: Şifre karma hale getirildi, ancak kullanıcı adı açık: diyelim ki öyle 123456789012&randString(evet, kullanıcı adı hesap numaramdan ve görünüşe göre rastgele bir dizeden oluşuyor)
- MQTT komisyoncu adresi: diyelim ki öyle randString.server.inchina.com(randString, kullanıcı adındaki adresle eşleşiyor)
- Lambanın yükü açılır, kapanır, renk değişir, parlaklık değişir vb.
- MQTT konusu: diyelim ki öyle /randString/123456789012/user/devices/pese/sub(RandString kullanıcı adındaki ile eşleşiyor ve 12 karakterli numara benim hesap numaram)
Soruna ilk yaklaşım
Lambayla MQTT aracılığıyla iletişim kurmak için yaptığım şey şu:- Mqtt aracımı şu adreste kur:my.mqtt.broker
- Tüm trafiğin yönlendirileceği dnsmasqşekilde openWRT yönlendiricime bir kural eklendirandString.server.inchina.commy.mqtt.broker
- mosquitto auth_pluginİstemcilerin yalnızca kimlik doğrulaması yapmasına izin veren username123ancak herhangi bir şifreyi kullanabileceği C dilinde bir yazdım (evet çok güvenli)
Kurulumu test etme
Her şeyi test ettim ve lambaya (belirli) yükler gönderirsem yanıt verir (mesaj tuhaf değerler içeriyorsa bazen bir hata mesajıyla birlikte).Şimdi, lambayı açıp kapatmak için kokladığım yükün aynısını göndermeye çalıştım, durumunu (RSSI vb. gibi) göndererek cevap veriyor ama hiçbir şey olmuyor.
İşte ışığı açtığımda kokladığım payload (kullanıcı adı ve konu düzeltildi, gerekirse bir pastbin bağlantısı yayınlayacağım ki daha sonra silebileyim ve bilgilerimi içerdiği için mümkün olduğunca az yayabileyim) Kullanıcı adı).
{"id":49,"jsonrpc":"2.0","method":"SetOrControlDevices","params":{"data":[{"data":{"dps":{"1":true},"time":{"1":2}},"node_id":17,"sn":33333}],"frame_status":0,"from_account":"123456789012","md5":"F8CC42572A96E337034CB982282C91BA","rand":"D8SN8R6J","time":"1702424815396"}}
Sorun
Hızlı bir araştırma sonrasında bu alanların salt estetik amaçlı olmadığını md5fark ettim . randBunlar, DIGEST-MD5 aracılığıyla MQTT geliştirilmiş kimlik doğrulamasının uygulandığının kanıtıdır. İstemci ile sunucu arasındaki iletişimi güvence altına almak için MD5 karmasını ve sorgulama-yanıt mekanizmasını kullanan bir kimlik doğrulama yöntemidir. Bu yöntem, şifrelerin ağ üzerinden düz metin olarak iletilmesini önler. Bir istemci erişim istediğinde, sunucu bir sorgulama gönderir ve istemci, hash edilmiş bir sonuçla yanıt verir. Sunucunun beklenen sonucu istemcinin yanıtıyla eşleşirse, kimlik doğrulama başarılı olur ve parolanın açığa çıkmasına ve yeniden oynatma saldırılarına karşı güvenlik artar.Soru
Şimdi sorum şu: Bu yeni MQTT kimlik doğrulama türüne nasıl yaklaşabilirim (ve muhtemelen "hackleyebilirim")?Dikkate alınacak diğer seçenekler
Aşağıdaki gibi diğer seçenekleri de değerlendirdim:- Donanım yazılımında tersine mühendislik: Bununla birlikte, klasik (hala Çince) ESP32 veya ESP8266 ve benzeri değil, çok çok tuhaf bir Çin (ihraç edilmemiş gibi görünüyor) mikroçip kullanıyor.
- Karma şifrenin "şifresini çözmek" (bu doğru kelime mi?): Ancak bu kişiler ne yaptıklarını açıkça biliyorlar ve bu yaygın olarak bilinen bir şifre değil. Üstelik bu, Şartlar ve Koşulları ihlal edecek ve muhtemelen işlemek istemediğim bir tür suçun yapılandırılmasına neden olacaktır.
- Çok kaba... ehmm boşver. Bir seçenek değil.
- MITM saldırısı mı? Zaten denediğim şey bir MITM değil mi? Başka yollar var mı?