BLE'nin ABCsi : 1 - Basics

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 https://github.com/hackgnar/ble_ctf BLECTF ‘in çözümlerinden bahsedeceğim. Sonraki yazımda da BLE cihazların güvenliğine ve saldırı tekniklerine değineceğim.

Temel Bilgiler

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;

| Özellik | Bluetooth | BLE |
| :— | :—: | :—: |
| Network/Topology | Scatternet | Star Bus |
| Enerji Tüketimi | Az (< 30mA) | Çok az ( <15mA) |
| Hız | 700 Kbps | 1 Mbps |
| Menzil | < 30m | 50 metre.Açık alanda 150 |
| RF Frekansı | 2400 MHz | 2400 MHz |
| Frekans kanalları | 79 kanal | 40 kanal (3 advertising) |
| Gecikme | 100ms | 3ms |

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. https://github.com/hackgnar/ble_ctf 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 pahalıya denk geliyor. Ben şu adresteki cihazı satın aldım. Birde 20-30 lira arasında bir Bluetooth dongle almanızı öneririm.

device

CTFte sadece 1 flagi almak için mac adresini değiştirmemiz gerekiyor. Bilgisayarınızda 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.
hcilist

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

hci

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

ROM Flashing

esp32yi flashlamadan önce bilgisayarınıza esp toolcahini kurmanız gerekiyor.
http://esp-idf.readthedocs.io/en/latest/get-started/#setup-toolchain adresinde 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.

ble

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

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 https://github.com/hackgnar/ble_ctf/blob/master/docs/hints/flag1.md 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.

3

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.

9

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
14

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

18

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.

19

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.