Bluetooth Low Energy ( BLE ) - Part 2 : MITM
Serimizin ilk yazısında BLE’nin temellerini öğrendiğimize göre artık BLE kullanan cihazlara yapılabilecek saldırı tekniklerinden bahsebiliriz. Bir BLE cihazımız olsun. Bu cihazımızla genellikle telefona veya bilgisayara yüklediğimiz uygulamalar ile konuşuruz.- Android için telefonun kurduğu bağlantılardaki bluetooth trafiğini loglayabilmek için Bluetooth HCI gözetleme günlüğü özelliğini açabilirsiniz.
- iOS için bu işlem biraz zor. Araştırmama rağmen cihazdaki bluetooth trafiğini dumplayabilceğim bi araç bulamadım. Eğer bilen varsa yorum kısmını yeşillendirebilir. Apple Developer Documentation 1 adresinden class isimlerini bulup, bu fonksiyonları Frida ile hooklayarak yarım bir başarı elde ettim ancak tatmin edici olmadı.
Bunların dışında yapabileceğimiz saldırı tekniklerini kabaca 3’e ayırabiliriz:
- Man in the middle (MITM)
- Sniffing
- Firmware dump
- MITM’ı BLE link layer’da encryption kullanmayan cihazlara karşı kullanabiliriz.
- Sniffing’i encryption yapmış cihazlara karşı kullanabiliriz.
- Firmware dump ile hedef cihazımızın BLE katmani icin kullandigi kodu bulabiliriz. Özellikle gizli, dokumante edilmemiş kod parcalarini
Her teknik için ufak ekipmanlar gerekecek
MITM
Gereksinimler:- ESP32
- Raspberry Pi
- Bluetooth dongle ( MAC adresimizi degistirebilmemiz lazim )
Temel olarak saldırı topolojimiz şu şekilde:
Hedef cihazımız raspberry pi’ye bağlandığı için advertisement yapmayacak. Biz de bundan faydalanıp o cihazmışız gibi advertisement yapıcaz. Kullanıcı hedef cihaza bağlandığını düşünerek bizim kurduğumuz sahte cihaza bağlanıcak.
Kali’de kurduğumuz sahte BLE, hedef cihazdaki tüm özelliklerin aynısını taşıyacak, hatta cihazla aynı MAC adresini de. Dışardan bakan biri için sahte cihazımız ve gerçek cihaz arasında bir fark olmayacak. Kullanıcının yolladığı tüm datayı kali’den raspberry pi’ye yollayacağız. Raspberry pi da gelen datayı hedef cihazımıza yollayacak. Hedef cihazdan dönen data da aynı şekilde kullanıcıya geri dönecek. Böylece kimse farkına varmadan aradan geçen tüm datayı inceleme fırsatını elde etmiş olacağız.
Tüm bu işlemleri yapan halihazırda geliştirilmiş 2 toolumuz bulunmakta. GATTacker ve btlejuice 1. GATTacker komple komut satırında çalışmakta. Btlejuice ise web arayüzünde çalışmakta. GATTacker’ı bir cihaz üstünde başarıyla kullandım. Ancak BLECTF için kullandığım ESP32’de işe yaramadı.
Btlejuice ise her iki cihazda da çalıştı. O yüzden bu yazıda btlejuice kullanacağız.
Raspberry
microSD kartıma raspian imajı atıp raspberry pi’yi ayağa kaldırdım. SSH ile bağlanabilmek için imajın içine boş bir txt dosyası koyup adını ssh yaptım. Raspberry pi’yi ethernet kablosu ile modeme bağlayıp, ip’sini bulduktan sonra ssh ile bağlandım. Default pi:raspberry credleri ile cihaza girdim. VNC server başlatıp, servera bağlandım. Raspberry pi’yi proxy olarak kullanacağız. Bir klasor oluşturup sudo npm install -g btlejuice ile btlejuice’i yükledim. (eğer npmde sıkıntı yaşarsanız npm 8 kurun şu linkten)Proxy’i node node_modules/btlejuice/bin/cmd_btlejuice_proxy.js ile başlatıyoruz.
Host Makina
Aynı şekilde btlejuice’i kurup bu sefer sudo node node_modules/btlejuice/bin/cmd_btlejuice.js -u <Raspberry IP address> -w komutunu çalıştırıyoruz.Ardından browser açıp localhost:8080’e gidiyoruz. Sağ üstten bluetooth işaretine bastığımızda cihazları şekilde listeliyorsa işlem tamam demektir. İşaretlediğim cihaz ayarlayacağımız ESP32mizin ismi olacak.
ESP32
Önceki yazıda kullandığım ESP32’ye yeni kod yükleyip, ufak bir sistem kurdum. Bu sefer kod yüklemek için Arduino IDE kullandım. ESP32’nin c kütüphanesini cpp’ye aktarıp Arduinoya geçirmiş abilerimiz. Arduino’ya esp32 kütüphanelerini eklemek için şu 1 linki takip edebilirsiniz.Kod olarak şunu kullandım.
Kod:
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
if (value.length() > 0) {
int ledPin;
if(value == "Secr3tP4ssw0rd") ledPin = 4;
else ledPin = 5;
digitalWrite (ledPin, HIGH);
delay(500);
digitalWrite (ledPin, LOW);
}
pCharacteristic->setValue("MITM my value");
}
};
void setup() {
Serial.begin(9400);
pinMode (5, OUTPUT);
pinMode (4, OUTPUT);
BLEDevice::init("MITMMe");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::pROPERTY_READ |
BLECharacteristic::pROPERTY_WRITE
);
pCharacteristic->setCallbacks(new MyCallbacks());
pCharacteristic->setValue("MITM my value");
pService->start();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
}
void loop() {
delay(2000);
}
Kodumuz karakteristiğimize şifre olarak Secr3tP4ssw0rd gönderdiğimizde 4 numaralı pini, farklı bir şifre gönderdiğimizde 5 numaralı pini 500 milisaniye boyunca yakmakta. Arduino IDE ile esp32mize kodu yüklüyoruz.
Devre şemamızda şu şekilde :
Devreyi de kurduktan sonra geriye datayı intercept etmek kalıyor
ATIL KURT
Tüm setup’ı kurduktan sonra btlejuice arayüzünde en sağdaki seçeneğe tıklayıp tikleri kaldırın yoksa handlelarımızı karıştırıyor biraz. Ardından bluetooth işaretine tıklayın. Komut satırımızda şunları gördüyseniz tamamdır.Eğer tikleri kaldırmazsanız işaretlediğim yer yerine bi üst infodaki Fixing Bleno handles mesajını görürsünüz ve nRF Connect tüm handleları göremez.
Ardından telefonunzdan nrf connect uygulamasını açıp MITMME cihazına bağlanının.
Şimdi handle’ımıza yanlış şifre girip kırmızı ışığın yandığını görün. Bir de doğru şifreyi yollayıp sarı ışığı yakın.
Son olarakta btljuice arayüzüne baktığınızda karşınızda gönderdiğiniz dataları görüceksiniz
Giden datayı intercept edebiliriz. Doğru şifre girildiği halde bunu yanlışa çevirebiliriz.
Real life örneklerden biri : Exploiting a BLE smart bulb using BtleJuice by a MiTM attack 6
Bir sonraki yazida gorusmek uzere.
Moderatör tarafında düzenlendi: