Bluetooth Low Energy ( BLE ) - Part 1

eybisi

Üye

Bluetooth Low Enegy - Temel BIlgiler ( Part 1 )​

Bu seride Bluetooth Low Energy hakkında öğrendiğim ne varsa anlatmaya çalışacağım. İlk olarak protokoldeki temel kavramları anlatıp ardından bu kavramları uygulamalı olarak pekiştirebileceğimiz BLECTF 2 'in çözümlerinden bahsedeceğim. Sonraki yazımda da BLE cihazların güvenliğine ve saldırı tekniklerine değineceğim.

Bluetooth vs BLE​

Bluetooth Low Energy yani BLE. İlk olarak Bluetooth 4.0 ile 2011’de karşımıza çıktı. Klasik Bluetooth ile BLE’nin farklarını bir tabloya dökecek olursak;

ÖzellikBluetoothBLE
Network/TopologyScatternetStar Bus
Enerji TüketimiAz (< 30mA)Çok az ( <15mA)
Hız700 Kbps1 Mbps
Menzil< 30m50 metre.Açık alanda 150
RF Frekansı2400 MHz2400 MHz
Frekans kanalları79 kanal40 kanal (3 advertising)
Gecikme100ms3ms
Klasik Bluetooth devamlı veri akışı için tasarlanmıştı. BLE ise uzun aralıklarla ani (burst) veri akışı için tasarlanmış. Mesela arabadaki müzik çalara Bluetooth ile bağlanıp müzik aktarırken sürekli bir veri akışı var ancak bluetoothla çalışan bir lamba butonu siz aç/kapa komutu gönderdiğiniz süre boyunca çalışmakta.

BLE sayesinde IOT cihazlardaki enerji tüketimi hatrı sayılır bir şekilde azaldı. Bu yüzden IOT cihazlarda klasik Bluetooth yerine BLE kullanılmakta.

Tüm BLE cihazlar GATT (Generic Attribute Profile) kullanmakta. GATT’ta karşımıza çıkan terimlerden bahsedecek olursak:

  • Client : GATT komutlarını ve isteklerini başlatan, isteklere gelen cevapları kabul eden cihaz. Telefon, Bilgisayar gibi
  • Server : GATT komutlarını ve isteklerini alan, cevapları yollayan cihazlar. Isı sensörü gibi
  • Characteristic : Client ve Server arasında aktarılan data değeri. Pildeki voltaj miktarı
  • Properties : Her karakteriğin özellikleri vardır. READ, WRITE, NOTIFY gibi gibi
  • Service : Benzer karakteristiklerin toplu hali. Mesela termometre service’i, ısı değerini ve ölçümler arasındaki zamana ait karakteristiği tutabilir.
  • Descriptor : Karakteristik hakkında bilgi. Isı değeri olarak Celcius kullanılacaksa o karakteristikteki descriptora Celcius yazılabilir.
  • Identifier : Services, descriptors, ve karakteristiklerin hepsinin bir UUID’si vardır. Bu UUID’lere identifier denir.

BLECTF​

Bu kadar teori yeter biraz elimizi kirletme vakti geldi. Github 2 adresinde hoşmu hoş bir CTF tarzı olayımız var. BLE’ye başlamak için birebir.

Bir adet ESP32 ile ile CTF’e başlayabiliyoruz. Türkiyede biraz 2 pahalıya denk geliyor. Ben şu 3 adresteki cihazı satın aldım. Birde 20-30 lira arasında bir Bluetooth dongle almanızı öneririm.


3f1087ef768be67c3639ccf4f1a08cc4b290d3a0.png



CTFte sadece 1 flagi almak için mac adresini değiştirmemiz gerekiyor. Bilgisayarınızla gelen Bluetooth chiplerinin mac adresini genelde değiştiremiyorsunuz. Denemek isterseniz :
Önce hciconfig yazıp sisteminizdeki bluetoothları listeleyin. Benim dongle da takılı olduğu için 2 cihaz gözüküyor.

hciconfig


Ardından denemek istediğiniz cihazı hciconfig hciX up ile çalışır hale getirin ve
bdaddr -i hciX 11:22:33:44:55:66 ile mac adresini değiştirmeye çalışın. Eğer benim gibi hata alıyorsanız mac adresi değişmiyor demektir :(

rfunblock


BLE hackingle uğraşıcaksanız mac adresini değiştirmeniz çok işinize yarıyacak, özellikle Man in the Middle saldırısı yaparken :)

Rom Flashing​

esp32yi flashlamadan önce bilgisayarınıza esp toolcahini kurmanız gerekiyor.
Şu adresten 1 ortamınıza göre instructionlara takip ederek toolchaini kurun

Ardından ctfi hazırlayan abimizin github’ını clonelayın. git clone https://github.com/hackgnar/ble_ctf/ . Klonladıktan sonra sırayla:

  • cd ble_ctf
  • make menuconfig
  • make
  • Bir sonraki adımdan önce esp32yi usb ile bilgisayarınıza bağlayın
  • make flash

Gelsin Flagler​

CLI toolları olarak hcitool, bleah, bluetoothctl ve gatttool kullanıcaz. Kendi linux dağıtımınıza göre bu toolları kurmaya çalışın.
ESP32mizle iletişim kurabilmemiz için öncelikle MAC adresini bulmamız gerekiyor. Bunun için hcitool scan değil hcitool lescan komutunu kullanıyoruz. Çünkü esp32miz BLE kullanıyor.

hcitool


Gördüğünüz üzere esp32miz BLECTF diyerek advertising yapmakta. Mac adresini kopyaladıktan sonra sudo bleah -b "30:AE:A4:05:4F:E6"-e ile şu ekran görüntüsünü alabiliyoruz.

8767344026ecf5306fc7fcc829b31274e14b6aeb.png



Bu ekranda yazının ilk kısmında bahsettiğimiz service, karakteristik ve descriptorları görebilirsiniz. Skorumuz 0x2a handlelı karakteristiğimizde tutuluyor. Eğer o karakteristiği gatttool ile okumak istiyorsak :
gatttool -b 30:AE:A4:05:4F:E6 --char-read -a 0x002a|awk -F':' '{print $2}'|tr -d ' '|xxd -r -p;printf '\n' ile okuyabiliyoruz.

gatttool help ile toolumuzun parametreleri hakkında bilgi edinebilirsiniz. --char-read'i okuma , --char-write'ı da yazma işleri için kullanıcaz.
Flagleri 0x2c numaralı handle’a 20 karakter uzunlugunda yolluyoruz.

Github sayfasında ilk flagimiz için hint bırakmış abimiz.

İlk flagimizi girmek için gatttool -b 30:AE:A4:05:4F:E6 --char-write-req -a 0x002c -n $(echo -n "12345678901234567890"|xxd -ps) komutunu giriyoruz.

Tekrar flag sayacımızı okudugumuzda : Score:1 /20 olduğunu görüyoruz YEY

Girdiğimiz komutların çoğunu tekrar tekrar kullanıcağımız için bash scripti yazmamız çok hoş olur.
Default handle olarak score’un handle’ını kullanan, parametre verdiğimizde ise verdiğimiz handle’ı kullanan bir bash scripti yazalım.

gatttool -b 30:AE:A4:05:4F:E6 --char-read -a ${1:-0x2a}|awk -F':' '{print $2}'|tr -d ' '|xxd -r -p;printf '\n'

read.sh olarak kaydettim.

read


Süper. Birde bunu write için yapalım. İlk parametremiz yazılacak değeri, ikinci parametre de hangi handle’a yazılacağını belirlesin. Eğer 2. parametreye değer girmezsek flag girdiğimiz handle’a yazsın.

gatttool -b 30:AE:A4:05:4F:E6 --char-write-req -a ${2:-0x2c} -n $(echo -n $1 |xxd -ps)

bunu da write.sh olarak kaydettim.

0x2e de zaten 20 karakterlik md5 gözükmekte. Hemen onu flag olarak yazıyoruz.

first


3.flagimiz device adının md5i.


6cf9d36bb5dac1aea9f344b01fcde2648ae5fee3.png



4.flagimiz, 0x32 handle’ına bir değer yazdığımızda handle’a geliyor.

4


5.flag 0x16 handle’ında saklı. Baştan 20 karakteri flag handle’imiza yolluyoruz.

5


6.flag için 0x34 handle’ına “yo” yazıyoruz.

6


7 biraz tricky. 0x36 handle’ına 0x7 değerini yazmamızı istiyor.

7


8 de 7’ye benzer şekilde

8


9da 0x3c handle’ini 0x0 dan 0xff e kadar bruteforcelamamız isteniyor.


06294968988049dadc4e244f338e32b8174a8281.png



256 deneme bitince flagi giriyoruz

9_2


0x3e handle’imiz bize 1000 kere beni oku diyor.

10


1-2 Dakika sonra flagimizi veriyor

10_2


Bu sefer farklı bir istek çıkıyor karşımıza listen for single notification. 0x40 handle’ında NOTIFY şeklinde bir property var. Bu property cihaza subscribe olan clientlara notification yollaması demek. GATTtool aracında --listen parametresini write komutumuza eklersek bu işi yapmış oluyoruz.



11



12de farklı bir handle’in indication’ını dinliyoruz. Indication ve notification nerdeyse aynı şey demek, çok farkları yok.



12



13 ve 14’te multi-indication ve notification için dinleme yapıyoruz. Flagimizi ilk notificationda değilde ikincide veriyor.



13

3cba7dbf570f738130c433a0e350156064b9550d.png



15 Bluetooth mac adresimizi değiştirmemizi istiyor.
15


16 Bağlantımızdaki MTU değerimizi değiştirmemizi istiyor. Bunu da gatttool’un interface’i içinde yapıyoruz.

16


17.flagimiz için handle bize write+resp hello diyor. Bunu cli gatttool ile yapamadım. Kısa bir python scripti ile halloluyor.
50


import pygatt
adapter = pygatt.GATTToolBackend()

try :
adapter.start()
device = adapter.connect("30:AE:A4:05:4F:E6")
value = device.char_read_handle("0x0050")
print(str(value))
x = device.char_write("0000ff14-0000-1000-8000-00805f9b34fb",bytearray([ord('h'),ord('e'),ord('l'),ord('l'),ord('o')]),True)
print(x)
finally:
adapter.stop()

17


  1. flag ilginç birşey öğretiyor bize. Karakteristik bize propertilerini verirken NOTIFY yok bende dese de, aslında NOTIFY yapabiliyormuş.

8f193694d2195f217cdab817742210e6bd333a8c.png



0x54 numaralı handle’ımızda tüm propertieslerimiz var

19_prop


Hepsini deneyerek flagimizin parçalarını toplayıp birleştiriyoruz. 0x54 numaralı handle’ımıza herhangi birşey yazdığımızda handle’a atanan yeni değeri ilk parçamız. Notification olarak bize yolladığı da ikinci parçamız oluyor.



579ae618584c663a9a12b5a96b88332865b1bdc5.png



Veee son flagimizi de giriyoruz.

20


Buraya kadar okuyarak geldiyseniz BLE’nin az çok ne yaptığını anlamışsınızdır diye umuyorum. Serinin sonraki yazısında BLE cihazlara yapılabilcek saldırılardan bahsedeceğim, görüşmek üzere.
 
Moderatör tarafında düzenlendi:
Üst