Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Whisper_Bully — 3단계 Bluetooth BDADDR 추출, Fast Pair 장치에 대한 DoS 및 하이재킹; CVE-2025-36911 범위 밖의 패치되지 않은 프리미티브 (Ubertooth 불필요) | Kitploit
도구/GitHubGitHub/ymsniper/whisper_bully
ReconnaissanceBluetooth SecurityExploitationInformation GatheringWireless SecurityPenetration TestingRed Teaming
GitHubymsniper/whisper_bully

Whisper_Bully

3단계 Bluetooth BDADDR 추출, Fast Pair 장치에 대한 DoS 및 하이재킹; CVE-2025-36911 범위 밖의 패치되지 않은 프리미티브 (Ubertooth 불필요)

저장소 보기
34131개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Whisper Bully

블루투스 BDADDR 추출, 서비스 거부 및 하이재킹 연구 도구

© 2026 @Ymsniper — 승인된 보안 연구 전용입니다.


개요

Whisper Bully는 Google Fast Pair(서비스 UUID fe2c)를 광고하는 장치를 대상으로 하는 3단계 블루투스 보안 연구 도구입니다. 이 도구는 CVE-2025-36911 펌웨어 패치의 범위를 벗어나는 두 가지 미패치 공격 프리미티브를 시연합니다.

  • 패치되지 않은 BDADDR 누출 — 일반 BLE 연결을 통해 영구 식별 주소가 공개되며, GATT 상호작용이 필요 없고, 완전히 패치된 장치에서도 작동
  • 리셋 윈도우를 통한 SMP 인증 우회 — L2CAP 플러드 후 BT 스택 복구 중 표준 SMP Just Works를 통해 지속적인 본드가 설정되며, Fast Pair GATT 핸드셰이크가 필요하지 않음

⚠️ 이 도구는 Whisper Pair(Fast Pair GATT) 프로토콜을 구현하지 않습니다. Key-Based Pairing 특성(UUID 1236) 또는 Account Key 특성(UUID 1238)에 절대 쓰지 않습니다. 여기에 설명된 공격 표면은 CVE-2025-36911 페어링 모드 검사 패치와는 별개이며 해당 패치로 해결되지 않습니다.


https://github.com/user-attachments/assets/67f2bcb6-38ad-4ba0-80c5-36dbb54f3f11

공격 단계

1단계 — BDADDR 추출 (패치되지 않은 정보 노출)

근본 원인: BLE 연결이 설정되면 Linux BlueZ 호스트 스택은 LL_CONNECTION_COMPLETE 이벤트를 처리하고 장치의 해결 가능한 개인 주소(RPA)를 영구 식별 주소로 확인하여 BlueZ 장치 테이블에 캐시합니다. 이는 GATT 서비스 상호작용 전에 링크 계층/HCI 수준에서 발생합니다. Fast Pair 프로토콜은 관여하지 않습니다.

코드가 실제로 수행하는 작업:

  1. Fast Pair 서비스 UUID fe2c를 광고하는 장치에 대해 활성 BLE 스캔(BleakScanner)을 수행합니다. 대상 식별에만 사용되며 프로토콜 상호작용은 없습니다.
  2. BleakClient.connect()를 통해 일반 BLE 연결을 설정합니다. 어떤 종류의 GATT 쓰기도 없습니다.
  3. 4단계를 준비하기 위해 BlueZ 에이전트를 NoInputNoOutput으로 설정합니다.
  4. 대상에 Fast Pair GATT 서비스가 있는지 확인합니다. 이 확인은 권고 사항일 뿐이며, 결과에 관계없이 도구는 계속 진행됩니다(wb.py의 452행).
  5. bluetoothctl pair <rpa_addr>를 실행합니다. 표준 블루투스 SMP 페어링 시도이며, Fast Pair가 아닙니다.
  6. bluetoothctl의 표준 출력에서 Bonded: yes 출력을 모니터링합니다. 이 출력에는 본딩된 주소가 포함될 수 있습니다.
  7. 기본 대체 방법: bluetoothctl devices를 호출하고 초기 RPA와 비교합니다. 동일한 장치 이름을 가지지만 주소가 다른 항목이 있다면, 이는 2단계에서 BlueZ에 의해 유출된 영구 식별 주소입니다.

패치가 이 문제를 해결하지 못하는 이유:

CVE-2025-36911 펌웨어 수정은 액세서리의 Fast Pair GATT Key-Based Pairing 특성 핸들러에 페어링 모드 검사를 추가합니다. 이 도구는 해당 특성에 절대 쓰지 않습니다. 식별 주소 누출은 공격자의 Linux 호스트에서 BlueZ 자체 장치 캐시를 통해 발생하며, 이는 전적으로 액세서리 펌웨어 외부에서 일어납니다.

주요 동작 참고 사항:

  • bluetoothctl pair 단계가 실패하거나 시간 초과되더라도 추출은 성공할 수 있습니다.
  • 4단계의 FP GATT 서비스 존재 여부 확인은 공격을 제한하지 않습니다.
  • PIN 확인 창이 나타나지 않습니다. NoInputNoOutput은 Just Works에 대해 양쪽에서 사용자 상호작용이 없음을 의미합니다.

2단계 — L2CAP 플러딩 (EMP 버스트-재연결 모드)

영구 주소가 알려지면, 수정된 버전의 l2flood를 사용하여 지속적인 L2CAP 서비스 거부를 선택적으로 실행할 수 있습니다.

도구 전체에서 두 가지 모드가 사용됩니다:

-R 플래그 — EMP 모드 (2단계 플러드) 무음 발사 후 망각(fire-and-forget) 버스트-재연결 방식입니다. 모든 스레드는 연결 → 버스트 → 강제 종료 주기를 동기화하여 대상이 흡수할 수 있는 지연된 L2CAP 채널 셔플링 대신 주기적인 전체 ACL 해체를 받도록 합니다. 모든 종료 시 즉각적인 RST 해체를 위해 SO_LINGER {1,0}을 사용합니다. 정상 작동 중에는 표준 출력이 생성되지 않습니다. 연결 오류는 stderr로 억제되고 주기적으로만 출력됩니다.

일반 모드 (3단계 하이재킹 프로브) -R 없이 사용하여 대상이 여전히 응답하는지 프로브합니다. 이 모드도 개선되었습니다. 이제 자동으로 재연결을 처리하며 대상이 응답을 중단하면 no response from <addr>: id N을 출력합니다. wb.py는 이 출력을 모니터링하여 하이재킹을 트리거합니다.

결과: 플러드가 활성화된 동안 대상 장치는 정상 연결 시도에 응답하지 않게 됩니다. 공격이 중단되면 장치는 완전히 복구되며 영구적인 손상은 없습니다.

멀티스레드 동작:

  • 각 버스트 주기 후 스레드가 동기화되어 압력이 대상에 동시에 가해집니다.
  • 일반 하드웨어에서 약 16개 스레드까지 효과적이며, 그 이상에서는 수익이 감소합니다.
  • 압력을 높이기 위해 여러 HCI 어댑터를 동시에 사용할 수 있습니다.

3단계 — 리셋 윈도우 중 SMP Just Works를 통한 하이재킹 (패치되지 않은 인증 우회)

근본 원인: 지속적인 L2CAP 플러드는 대상 장치의 블루투스 스택을 충돌시키거나 리셋시킵니다. 복구 윈도우 동안 — Fast Pair GATT 서비스가 다시 등록되기 전, 그리고 보안 관리자가 완전히 다시 초기화되기 전 — 장치는 일반적으로 본드를 제어하는 Fast Pair GATT 핸드셰이크 없이 NoInputNoOutput으로부터 표준 SMP Just Works 본드를 수락합니다. 결과 본드는 지속적입니다. BT 어댑터 리셋을 견디며 bluetoothctl info에서 Paired: yes / Bonded: yes를 보여줍니다.

왜 이것이 CVE-2025-36911과 별개의 발견인가:

CVE-2025-36911 패치는 FP GATT Key-Based Pairing 특성 핸들러에 페어링 모드 검사를 시행합니다. 3단계는 해당 특성을 절대 건드리지 않습니다. 본드는 FP GATT 서버가 재초기화되지 않은 윈도우 동안 SMP 계층에서 설정되므로 Fast Pair 보안 게이트에 도달조차 하지 않습니다. 완전히 패치된 장치도 이에 취약한 상태로 남아 있는데, 이는 패치가 스택 복구 중 SMP 계층에 대한 가시성이 없기 때문입니다.

코드가 실제로 수행하는 작업:

  1. L2CAP 프로브(l2flood -c -1 -t 2)를 보내 장치가 응답하지 않는지 확인합니다. 출력에서 no response from <addr>: id N을 찾습니다.
  2. 응답하지 않는 상태가 확인되면 재시도 루프에서 bluetoothctl connect <permanent_addr>를 실행합니다.
  3. SMP가 NoInputNoOutput / NoInputNoOutput을 협상 → Just Works 연관 모델 → 본드 완료
  4. bluetoothctl connect가 성공 시 종료 코드 0을 반환합니다.
  5. 공격 중단 후에도 본드는 지속됩니다.

장치 상태별 성공 확률:

장치 상태예상 결과
플러드 활성 / 응답 없음가장 높은 성공 — 복구 중 스택이 저하된 상태
플러드에서 복구 중높은 성공 — 일시적인 SM 재초기화 윈도우
완전히 복구됨낮은 성공 — 정상 보안 복원됨
전원 꺼짐실패

CVE-2025-36911과의 관계


⚠️ 법적 경고

이것은 서비스 거부 및 무단 접근 연구 도구입니다.

소유하지 않거나 명시적인 서면 승인 없이 이 도구를 장치에 사용하는 것은 연방 범죄이며, 컴퓨터 사기 및 남용 법률(18 U.S.C. § 1030) 및 기타 관할권의 동등한 법령에 따라 징역 및 벌금에 처해질 수 있습니다.

다음 장치에서만 이 도구를 사용할 수 있습니다:

  • 개인적으로 소유한 장치
  • 소유자로부터 보안 테스트를 수행할 명시적인 서면 승인을 받은 장치

요구 사항

  • Linux (tested on Ubuntu 20.04+)
  • 루트 권한 (bluetoothctl 및 원시 BLE 접근에 필요)
  • bluetoothctl / BlueZ installed and functional
  • Python 3.7+
  • 2/3단계: OpenMP 지원 l2flood — kovmir/l2flood 참조

설치

시스템 종속성

Ubuntu / Debian:

root@kitploit:~
sudo apt update
sudo apt install -y python3 python3-pip libdbus-1-dev libglib2.0-dev bluez

Fedora / RHEL / CentOS:

root@kitploit:~
sudo dnf install -y python3 python3-pip dbus-devel glib2-devel bluez

Arch Linux:

root@kitploit:~
sudo pacman -S python python-pip dbus glib bluez

Alpine Linux:

root@kitploit:~
apk add --no-cache python3 py3-pip dbus-dev glib-dev bluez bluez-openrc

openSUSE:

root@kitploit:~
sudo zypper install -y python3 python3-pip dbus-1-devel glib2-devel bluez

Void Linux:

root@kitploit:~
sudo xbps-install -S python3 python3-pip dbus-devel glib-devel bluez

클론 및 설치

root@kitploit:~
git clone https://github.com/Ymsniper/Whisper_Bully.git
cd Whisper_Bully
pip3 install -r requirements.txt
# Required for Stage 2/3 only:
make
sudo make install

사용법

1단계: BDADDR 추출

root@kitploit:~
# Auto-detect and extract all nearby Fast Pair devices
sudo python3 wb.py

# 20 second scan, save results
sudo python3 wb.py -s 20 -o targets.json

# 30 second scan, custom output file
sudo python3 wb.py -s 30 -o extracted.json

참고: 장치가 이 도구나 수동으로 이전에 연결 또는 페어링된 경우, BlueZ는 이미 해당 장치의 식별 주소를 알고 있습니다. 추출이 깔끔하게 실행되도록 먼저 제거하세요:

root@kitploit:~
sudo bluetoothctl remove <address>

2단계: L2CAP 플러딩 (선택 사항)

방법 1 — 대화형 (추출 후 프롬프트)

root@kitploit:~
sudo python3 wb.py -s 20 -o targets.json
# At completion: "Run aggressive L2CAP test... (yes/no)" → yes

방법 2 — 플래그 (프롬프트 생략)

root@kitploit:~
# Stage 1 + Stage 2 only
sudo python3 wb.py -s 20 -o targets.json --aggressive

# Stage 1 + Stage 2 + Stage 3
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack

# With duration and thread count
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120 -t 8

방법 3 — 독립 실행형 플러드 스크립트

root@kitploit:~
# Flood from extracted targets file for 120 seconds
sudo python3 aggressive_test.py -f targets.json -d 120 -t 4

# Flood a single known address for 60 seconds
sudo python3 aggressive_test.py AA:BB:CC:DD:EE:FF -d 60

# Flood forever (Ctrl+C to stop)
sudo python3 aggressive_test.py AA:BB:CC:DD:EE:FF -f

3단계: 하이재킹 (선택 사항)

root@kitploit:~
# Integrated — extract, flood, then hijack
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120

# Manual standalone hijack on known address
sudo python3 wb.py -H AA:BB:CC:DD:EE:FF

전체 3단계 실행 (단일 명령)

root@kitploit:~
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120 -t 4

실행 흐름:

  1. Fast Pair 장치를 20초 동안 스캔
  2. 각 대상에서 영구 BDADDR 추출
  3. 4개 스레드를 사용하여 120초 동안 모든 대상 플러딩
  4. 응답하지 않는 상태 모니터링
  5. 복구 윈도우 중 각 대상에 하이재킹 시도
  6. 결과를 targets.json에 저장

다중 어댑터 공격

root@kitploit:~
# Terminal 1
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -i hci0 -d 120 -t 4 &

# Terminal 2
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -i hci1 -d 120 -t 4

DoS 압력을 두 배로 높이고 복구 윈도우 중 하이재킹 성공 확률을 증가시킵니다.


명령줄 플래그


기술 세부 사항

1단계 — GATT 상호작용 없이 추출이 작동하는 이유

Fast Pair FE2C 서비스 UUID는 후보 대상을 식별하기 위한 스캔 필터로만 사용됩니다. BLE 연결이 설정되면:

  • 링크 계층이 연결 핸드셰이크를 완료하고 LL_CONNECTION_COMPLETE를 호스트에 전송합니다.
  • BlueZ가 이 이벤트를 처리하고, 장치가 해결 가능한 개인 주소(RPA)를 사용하는 경우 IRK 캐시를 통해 해결하거나 연결 매개변수에서 식별 주소를 단순히 등록합니다.
  • 식별 주소는 BlueZ 내부 장치 테이블에 캐시됩니다.
  • bluetoothctl devices는 원래 RPA와 새로 등록된 식별 주소를 모두 표시합니다. 동일한 장치 이름, 다른 주소입니다.
  • 도구는 원래 RPA와 비교하여 새 항목을 영구 BDADDR로 반환합니다.

동시에 실행되는 bluetoothctl pair 호출은 성공할 수도 있고 실패할 수도 있습니다. 일반적으로 pair 명령이 완료되거나 실패할 때쯤이면 BDADDR은 이미 테이블에 있습니다.

2단계 — EMP 모드 (l2flood -R)

이 수정된 l2flood는 의도된 단계에 따라 두 가지 모드를 가집니다.

-R 플래그 — EMP 모드 (DoS 전용, 하이재킹 없음) 3단계로 진행하지 않고 2단계를 단독으로 실행할 때 사용합니다. 무음 발사 후 망각 버스트-재연결 — 모든 스레드는 연결 → 버스트 → 강제 종료 주기를 동기화하여 주기적인 전체 ACL 해체를 보장합니다. 정상 작동 중 표준 출력을 생성하지 않습니다.

일반 모드 (DoS + 하이재킹 프로브) 3단계가 의도될 때 사용합니다. 일반 모드는 자동 재연결을 처리하도록 개선되었으며, 대상이 응답을 중단하면 no response from <addr>: id N을 출력합니다. 이것이 wb.py가 하이재킹 시도를 트리거하기 위해 모니터링하는 신호입니다.

3단계 — 본드가 지속되는 이유

결과 본드는 일시적인 연결이 아닙니다. BlueZ에 저장된 완전한 SMP 본드입니다.

  • bluetoothctl info <addr> shows Paired: yes, Bonded: yes, Trusted: no
  • 본드는 bluetoothctl power off/on 주기를 견딥니다.
  • 본드는 공격자 머신 재부팅을 견딥니다(/var/lib/bluetooth/에 저장됨).
  • 장치는 재페어링 없이 공격자 어댑터의 후속 연결을 수락합니다.

알려진 제한 사항

1단계

  • BlueZ / bluetoothctl이 있는 Linux 필요
  • 대상이 RPA로 BlueZ 장치 테이블에 이미 있으면 안 됨 (필요시 먼저 제거)
  • 연결 윈도우 중 주소 롤링으로 인해 타이밍 문제가 발생할 수 있음 — 추출 실패 시 재실행

2단계

  • 영구 주소를 알아야 함 (1단계 또는 다른 방법으로)
  • 대상이 켜져 있고 범위 내에 있어야 함
  • 플러드 중단 시 장치 완전 복구 — 지속 효과 없음

3단계

  • 장치가 응답하지 않는 상태에 들어가야 함 (2단계 의존성)
  • 성공은 타이밍에 의존 — 하이재킹은 복구 윈도우 중에 이루어져야 함
  • 플러드 중 장치 전원이 꺼지면 작동하지 않음

문제 해결

장치를 찾을 수 없음

  • bluetoothctl이 작동하는지 확인: sudo bluetoothctl list
  • 스캔 시간 증가: -s 30

BLE 연결 실패 / 추출 실패

  • BlueZ에서 장치를 먼저 제거: sudo bluetoothctl remove <addr>
  • 재실행 — RPA 롤링으로 인해 타이밍 문제가 발생할 수 있음

플러드 효과 없음

  • 스레드 수 증가: -t 16
  • 여러 어댑터 동시 사용
  • 영구 주소(RPA가 아님)가 대상이 맞는지 확인

권한 거부됨

  • sudo로 실행
  • 사용자가 bluetooth 그룹에 속해 있는지 확인하거나 root로 실행

bleak 임포트 오류

  • Debian/Ubuntu: sudo apt install libdbus-1-dev libglib2.0-dev
  • Fedora: sudo dnf install dbus-devel glib2-devel
  • Arch: sudo pacman -S dbus glib

D-Bus 오류

  • sudo systemctl start dbus && sudo systemctl start bluetooth

크레딧

  • @kovmir for l2flood
  • 원본 WhisperPair / CVE-2025-36911 연구에 대한 KU Leuven COSIC 감사

라이선스

MIT. 자세한 내용은 LICENSE를 참조하세요.

면책 조항

이 도구는 승인된 보안 테스트 및 방어 연구 전용입니다. 블루투스 장치에 대한 무단 접근은 불법입니다. 소유하거나 명시적인 서면 테스트 허가를 받은 장치에만 사용하세요. 저자는 무단 또는 불법 사용에 대한 책임을 지지 않습니다.

도구 다운로드
CVE-2025-36911 (WhisperPair)이 도구
사용된 프로토콜Fast Pair GATT KBP (UUID 1236 write)없음 — 일반 BLE 연결만
BDADDR 누출 경로암호화된 KBP 알림 (BR/EDR 주소)BlueZ RPA 해석 (LL_CONNECTION_COMPLETE 시)
인증 우회 경로FP 페어링 모드 검사 누락BT 스택 복구 윈도우 중 SMP Just Works
36911 수정으로 패치됨?예아니요
패치된 장치에서 작동?아니요예
CWECWE-287CWE-200 (1단계) + CWE-362/CWE-287 (3단계)
플래그설명
-s, --scan-timeBLE 스캔 시간(초) (기본값: 10)
-o, --output추출된 주소를 JSON 파일로 저장
--aggressive프롬프트 생략, 2단계 즉시 실행 (사전 서면 승인 필요)
-H, --hijack2단계 후 3단계 하이재킹 시도 (--aggressive 또는 대화형 예 필요)
-d, --duration플러드 시간(초) (기본값: 60) 또는 f는 무한
-t, --threads병렬 L2CAP 플러드 스레드 (기본값: CPU 코어 수)
-i, --hci사용할 HCI 어댑터 (예: hci0, hci1)