Bluetooth Low Energy ( BLE ) - Part 2 : MITM

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. https://developer.apple.com/documentation/corebluetooth adresinden class isimlerini bulup, bu fonksiyonları Frida ile hooklayarak yarım bir başarı elde ettim ancak tatmin edici olmadı.

Android için bluetooth ve ble cihazlarla iletişim kurabileceğimiz, nRF Connect adında uygulama bulunmakta. Kurmanızı öneririm.

Bunların dışında yapabileceğimiz saldırı tekniklerini kabaca 3’e ayırabiliriz:

  • Man in the middle (MITM)
  • Sniffing
  • Firmware dump

Ne için kullanacağımızı kısaca açıklarsak:

  • 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 :slight_smile:

Bu yazıda MITM, gelecek yazılarda da diğer teknikleri anlatmaya çalışacağım.
Her teknik için ufak ekipmanlar gerekecek :slight_smile:

MITM

Gereksinimler:

  • ESP32
  • Raspberry Pi
  • Bluetooth dongle ( MAC adresimizi degistirebilmemiz lazim )

Bu teknik için 2 adet Bluetooth kullanan cihaza ihtiyacımız var. Kendi bilgisyarımız ve bir adet Raspberry Pi. Bluetooth MAC adresinizi değiştirebiliyorsanız dongle almanıza gerek yok. RPI lazım çünkü bir bilgisayarda iki adet bluetooth client’ı çalıştırmak neredeyse imkansız.

Temel olarak saldırı topolojimiz şu şekilde:

topoloji

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. 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.
pi

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.

kali

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.

kali_browser

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 linki takip edebilirsiniz.

Kod olarak şunu kullandım.

#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 :

arduino

Devreyi de kurduktan sonra geriye datayı intercept etmek kalıyor :slight_smile:

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.

ble

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.
nrf

Ş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 :slight_smile:

mitm
Giden datayı intercept edebiliriz. Doğru şifre girildiği halde bunu yanlışa çevirebiliriz.

intercept

Real life örneklerden biri : https://blog.attify.com/btlejuice-mitm-attack-smart-bulb/

Bir sonraki yazida gorusmek uzere.

9 Likes

Güzel yazı olmuş eline sağlık. İleride ki BLE yazında DoS ve Fuzzing saldırılarını konu alabilirsin. Kolay gelsin.

1 Like

@blacknbunny dediği gibi bir de fuzzing muhabbeti vs. olsa tadından yenmez, çalışma çok özgün ve özel yeni yazılarını bekliyor olacağız.

1 Like