
블루투스 저에너지 스위스 군용 칼
BtleJack: Bluetooth Low Energy를 위한 새로운 만능 도구 #####################################################
Btlejack은 Bluetooth Low Energy 장치를 스니핑, 재밍, 하이재킹하는 데 필요한 모든 것을 제공합니다. 하나 이상의 BBC Micro:Bit <http://microbit.org/>_ 장치에 전용 펌웨어를 실행하여 작동합니다. 또한 Adafruit의 Bluefruit LE 스니퍼 <https://www.adafruit.com/product/2269>_ 또는 nRF51822 Eval Kit <https://www.waveshare.com/wiki/BLE400>_를 사용할 수도 있습니다. 이 장치들에 대한 지원이 추가되었습니다.
현재 버전(2.0)은 BLE 4.x 및 5.x를 지원합니다. BLE 5.x 지원은 제한적이며, 1Mbps Uncoded PHY만 지원하고 채널 맵 업데이트는 지원하지 않습니다.
UNIX 기반 시스템(예: Raspberry Pi)이 필요합니다. BBC Micro:Bit를 사용하는 경우 1~3개의 Micro:Bit 장치(3개 권장)가 필요하며, 각 장치마다 하나의 USB 포트가 필요합니다. Micro:Bit의 전력 소비는 상당히 낮으므로, 단일 USB 포트와 수동 허브를 사용하여 권장되는 3개의 장치에 전원을 공급할 수 있습니다.
컴퓨터에 3개의 microbit를 동시에 연결하면 Btlejack이 모든 광고 채널에서 스니핑할 수 있으며 연결 요청을 캡처할 확률이 훨씬 높아집니다.
먼저, Pip을 사용하여 btlejack Python3 클라이언트 소프트웨어를 설치하십시오:
::
$ sudo pip3 install btlejack
그런 다음, USB 케이블을 사용하여 Micro:Bit 장치를 컴퓨터에 연결하고, 관련 대용량 저장 장치를 마운트한 후(마운트 지점에 MICROBIT이 포함되어야 함), 다음 명령을 실행하십시오:
::
$ btlejack -i
이 명령은 컴퓨터에 연결된 모든 Micro:Bit 장치를 프로그래밍하여 Btlejack과 함께 사용할 수 있도록 준비합니다. 현재 클라이언트 소프트웨어에 맞는 올바른 펌웨어 버전을 사용하므로 Btlejack을 업데이트할 때마다 이 펌웨어 설치 절차를 수행하는 것이 좋습니다.
Bluefruit LE 스니퍼 또는 nRF51822 Eval Kit를 사용하는 경우, 외부 SWD 프로그래머를 사용하여 이 펌웨어 <https://github.com/virtualabs/btlejack-firmware/raw/master/dist/btlejack-firmware-ble400.hex>_를 장치에 플래시하십시오.
장치를 연결된 상태로 유지하면 모든 준비가 완료됩니다!
참고 이는 POSIX 호환 시스템에서만 작동합니다.
Btlejack 사용은 매우 쉽습니다. Btlejack은 다음을 할 수 있습니다:
Btlejack은 일반적으로 연결된 호환 장치(현재는 Micro:Bit만)를 자동 감지하여 사용하려고 하지만, 펌웨어를 해킹하거나 수정하여 다른 nRF51822 기반 보드에서 작동하도록 할 수 있으므로, 이러한 장치와의 호환성을 허용하는 특정 옵션을 제공합니다.
-d 옵션을 사용하면 Btlejack과 함께 사용할 하나 이상의 장치를 지정할 수 있습니다. 이 옵션은 자동 장치 감지를 비활성화하며, 필요한 만큼 많은 장치를 추가해야 합니다:
::
$ btlejack -d /dev/ttyACM0 -d /dev/ttyACM2 -s
먼저, btlejack으로 대상 기존 연결을 찾으십시오:
::
$ btlejack -s BtleJack version 1.1
[i] Enumerating existing connections ... [ - 54 dBm] 0xcd91d517 | pkts: 1 [ - 46 dBm] 0xcd91d517 | pkts: 2
첫 번째 값(dBm)은 신호의 세기를 나타내며, 이 값이 클수록 스니핑된 연결의 품질이 좋습니다.
두 번째 값(16진수)은 관련 액세스 주소로, 두 Bluetooth Low Energy 호환 장치 간의 링크를 식별하는 32비트 값입니다.
마지막 값은 이 액세스 주소로 본 패킷 수입니다. 이 값이 높을수록 해당 액세스 주소가 사용 중일 가능성이 높습니다.
그런 다음, -f 옵션을 사용하여 특정 연결을 따라가십시오:
::
$ btlejack -f 0xdda4845e BtleJack version 1.1
[i] Detected sniffers:
Sniffer #0: fw version 1.1
[i] Synchronizing with connection 0xdda4845e ... ✓ CRCInit: 0x2a035e ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 39 ✓ Hop increment = 15 [i] Synchronized, packet capture in progress ... LL Data: 02 07 03 00 04 00 0a 03 00 LL Data: 0a 08 04 00 04 00 0b 5a 69 70 LL Data: 02 07 03 00 04 00 0a 03 00 LL Data: 0a 08 04 00 04 00 0b 5a 69 70
1개 이상의 microbit를 사용하는 경우, Btlejack은 연결 매개변수 복구 속도를 높이기 위해 일부 스니핑 작업을 병렬화합니다!
btlejack에서 지원하는 -c 옵션을 사용하면 대상 BD 주소를 지정하거나 any를 사용하여 생성된 모든 새 연결을 캡처할 수 있습니다:
::
$ btlejack -c any BtleJack version 1.1
[i] Detected sniffers:
Sniffer #0: version 1.1 Sniffer #1: version 1.1 LL Data: 05 22 df b4 6f 95 c5 55 c0 0a f6 99 23 40 1d 7b 2f 0a 9a f4 93 01 12 00 27 00 00 00 d0 07 ff ff ff ff 1f 0b [i] Got CONNECT_REQ packet from 55:c5:95:6f:b4:df to 40:23:99:f6:0a:c0 |-- Access Address: 0x0a2f7b1d |-- CRC Init value: 0x93f49a |-- Hop interval: 39 |-- Hop increment: 11 |-- Channel Map: 1fffffffff |-- Timeout: 20000 ms
LL Data: 03 09 08 0f 00 00 00 00 00 00 00 LL Data: 03 09 08 0f 00 00 00 00 00 00 00 LL Data: 0b 06 0c 08 0f 00 09 41 LL Data: 03 06 0c 07 1d 00 d3 07
또는 대상 BD 주소를 지정할 수도 있습니다:
::
$ btlejack -c 03:e1:f0:00:11:22
일단 액세스 주소로 식별된 연결이 있으면 -j 옵션을 사용하여 해당 연결을 재밍할 수 있습니다:
::
$ btlejack -f 0x129f3244 -j̀
Btlejack은 기존 연결을 하이재킹할 수도 있으며, -t 옵션을 사용하여 수행할 수 있습니다. 하이재킹되면 Btlejack이 프롬프트를 제공하여 하이재킹된 장치와 상호 작용할 수 있습니다.
먼저, 기존 연결을 하이재킹하십시오:
::
$ btlejack -f 0x9c68fd30 -t -m 0x1fffffffff BtleJack version 1.1
[i] Using cached parameters (created on 2018-08-11 01:48:24) [i] Detected sniffers:
Sniffer #0: fw version 1.1
[i] Synchronizing with connection 0x9c68fd30 ... ✓ CRCInit: 0x81f733 ✓ Channel map is provided: 0x1fffffffff ✓ Hop interval = 39 ✓ Hop increment = 9 [i] Synchronized, hijacking in progress ... [i] Connection successfully hijacked, it is all yours \o/ btlejack>
그런 다음 다음 명령을 사용하여 장치와 상호 작용하십시오:
discover 명령 ^^^^^^^^^^^^^^^^^^
discover 명령은 Bluetooth LE 패킷을 송수신하고 모든 서비스 UUID 및 매개변수, 그리고 특성 UUID 및 매개변수를 검색합니다:
::
btlejack> discover start: 0001 end: 0005 start: 0014 end: 001a start: 0028 end: ffff Discovered services: Service UUID: 1801 Characteristic UUID: 2a05 | handle: 0002 | properties: indicate (20) \ value handle: 0003
Service UUID: 1800 Characteristic UUID: 2a04 | handle: 0019 | properties: read (02) \ value handle: 001a
Characteristic UUID: 2a00 | handle: 0015 | properties: read (02) \ value handle: 0016
Characteristic UUID: 2a01 | handle: 0017 | properties: read (02) \ value handle: 0018
Service UUID: 1824 Characteristic UUID: 2abc | handle: 0029 | properties: write indicate (28) \ value handle: 002a
read 명령 ^^^^^^^^^^^^^^
read 명령은 단일 매개변수, 즉 읽고자 하는 특성에 해당하는 값 핸들을 받습니다:
::
btlejack> read 0x16 read>> 4c 47 20 77 65 62 4f 53 20 54 56
write 명령 ^^^^^^^^^^^^^^^
write 명령은 세 개의 매개변수를 받습니다:
::
btlejack> write
지원되는 데이터 형식:
hex: 16진수 데이터 (예: "414261")str: 텍스트 문자열, 큰따옴표로 묶을 수 있음ll 명령 ^^^^^^^^^^^^
이 마지막 명령은 Bluetooth Low Energy 링크 계층 PDU를 16진수 형태로 전송할 수 있게 하며, 이는 Volume 6, Part B, Chapter 2.4에 명시된 대로입니다.
Btlejack의 흥미로운 기능 중 하나는 캡처된 데이터를 PCAP 파일로 내보내는 기능입니다.
Btlejack은 다음 DLT 형식을 지원합니다:
출력 파일은 -o 옵션으로 지정할 수 있으며, 출력 형식은 -x 옵션으로 지정할 수 있습니다. 유효한 형식 값은 ll_phdr, nordic, 또는 pcap(기본값)입니다.
::
$ btlejack -f 0xac56bc12 -x nordic -o capture.nordic.pcap
ll_phdr 내보내기 유형은 암호화된 연결을 스니핑할 때 유용하며, crackle <https://github.com/mikeryan/crackle>_에서도 지원됩니다. 따라서 암호화된 연결을 스니핑하고 해독하려면 이 방법을 사용하는 것이 좋습니다.
또한 -s 옵션을 사용하여 crackle에 특정 해독 전략을 알려야 할 수도 있습니다:
::
$ crackle -i some.pcap -s 1
Btlejack은 연결 캐시를 사용하여 연결 관련 값을 저장하여 작업 속도를 높입니다. 이 연결 캐시는 특히 액세스 주소가 이전에 보였던 경우 문제를 일으킬 수 있습니다.
이 캐시는 -z 옵션을 사용하여 플러시할 수 있습니다:
::
$ btlejack -z
Btlejack 2.0은 패킷 실시간 분석을 위해 FIFO 경로(기존 또는 신규)를 지정할 수 있는 새로운 -w 옵션을 도입했습니다:
::
$ btlejack -c any -w /tmp/blepipe
FIFO와 출력 파일을 동시에 사용할 수도 있습니다:
::
$ btlejack -c any -w /tmp/blepipe -o blepackets.pcap
이전에 USB를 통한 가상 이더넷(RNDIS)을 활성화한 경우(예: USB를 통해 Raspberry Pi Zero W를 설정), 이를 다시 비활성화해야 합니다(즉, boot/config.txt에서 dtoverlay=dwc2를 제거하고 boot/cmdline.txt에서 modules-load=dwc2,g_ether를 제거한 다음 sudo reboot를 실행). 그렇지 않으면 스니퍼의 USB 연결에 간섭이 발생할 수 있습니다.
이 버전은 Bluetooth Low Energy 버전 5 및 5.1을 지원하며, 특히 버전 5에 도입된 새로운 채널 선택 알고리즘(CSA #2)을 지원합니다. 그러나 사용된 하드웨어가 버전 5부터 추가된 두 가지 새로운 PHY를 지원하지 않으므로, 1Mbps uncoded PHY를 사용하는 연결만 스니핑, 재밍, 그리고 아마도 하이재킹할 수 있을 것입니다.
또한 현재 Btlejack에 포함된 CSA #2 구현은 현재 채널 맵 업데이트를 지원하지 않습니다.
Btlejack은 사용된 채널 선택 알고리즘을 자동으로 감지하므로 걱정할 필요 없이 평소처럼 패킷을 캡처하면 됩니다.
기존 BLE 5 연결(1Mbps uncoded PHY, 그리고 이 PHY만 사용)을 스니핑하는 것은 그리 어렵지 않습니다. 먼저, -5 옵션을 사용하여 BLE 5 연결을 대상으로 지정해야 합니다. 기존 연결이 CSA #2 또는 CSA #1을 사용하는지 알 수 있는 방법이 없으므로, 하나가 작동할 때까지 두 기술을 모두 시도해야 합니다.
::
$ btlejack -f 0x11223344 -5
그러면 Btlejack이 사용된 채널 맵과 홉 간격 값을 복구합니다:
::
$ btlejack -f 0x11223344 -5 [i] Synchronizing with connection 0x11223344 ... ✓ CRCInit: 0x40d64f ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 160
그런 다음 이 연결의 PRNG 카운터 값을 복구하려고 시도합니다:
::
$ btlejack -f 0x11223344 -5 [i] Synchronizing with connection 0x11223344 ... ✓ CRCInit: 0x40d64f ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 160 ✓ CSA2 PRNG counter = 5137 [i] Synchronized, packet capture in progress ...
완료되면 Btlejack이 이 연결과 동기화되어 평소처럼 패킷을 처리합니다.
여기서 새로운 것은 없으며, -5 옵션을 사용하여 BLE 5 연결을 공격하고 있음을 지정해야 한다는 점입니다.
-m 및 -p 플래그를 각각 사용하여 사용할 채널 맵과 홉 간격 값을 지정하면 이 공격을 최적화할 수 있습니다. 두 값 모두 제공되어야 하며, 그렇지 않으면 작동하지 않습니다.
현재로서는 BLE 5 연결을 하이재킹하는 데 성공하지 못했습니다. 이 공격은 시간에 민감합니다. 제 BLE 5 장치는 대기 시간이 0이므로 지연이 허용되지 않아 이 공격이 실패합니다.
합법적인 BLE 5 장치를 몇 개 손에 넣으면 이 부분을 개선할 예정입니다.