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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
RustyInjector — Marc Newlin의 키스트로크 주입 개념 증명(CVE-2023-45866)의 Rust 구현. | Kitploit
도구/GitHubGitHub/xg3nesis/rustyinjector
Bluetooth SecurityExploitationWireless SecurityPenetration TestingLearning & Education
GitHubxg3nesis/rustyinjector

RustyInjector

Marc Newlin의 키스트로크 주입 개념 증명(CVE-2023-45866)의 Rust 구현.

저장소 보기
111년 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

⚠️ 면책 조항: 연구 및 교육 목적으로만 사용
이 프로젝트는 Bluetooth 키 입력 주입을 시연하는 개념 증명(PoC)이며 Rust로 재구현되었습니다. 교육 및 보안 연구 목적으로만 사용해야 합니다.

  • 명시적인 승인 없이 이 코드를 사용하여 시스템을 손상시키지 마십시오.
  • 이 프로젝트의 무단, 불법 또는 비윤리적인 사용은 엄격히 금지됩니다.
  • 저자는 이 코드로 인한 오용 또는 손해에 대해 책임을 지지 않습니다.

이 코드를 다운로드, 복제 또는 사용함으로써 귀하는 책임감 있게 그리고 모든 관련 법률 및 규정을 준수하여 사용하는 데 동의합니다.


🦀 Rusty Injector !

Rust Injector 로고.

Rusty Injector에 오신 것을 환영합니다. Marc Newlin의 Bluetooth 키 입력 주입 PoC에서 영감을 받은 Rust 구현체로, CVE-2023-45866, CVE-2024-21306 및 CVE-2024-0230과 연관되어 있습니다.

현재 이 저장소는 Linux 운영 체제의 BlueZ에서 키 입력 주입 취약점을 악용하는 CVE-2023-45866만 구현합니다.

다음은 CVSS 점수를 포함한 NIST 설명의 스크린샷입니다 :

CVE-2023-45866의 NIST 설명

캡처 1 : CVE-2023-45866의 NIST 설명.

다른 CVE인 CVE-2024-21306 및 CVE-2024-0230은 제가 직접 구현할 계획은 없지만, 기여는 언제나 환영합니다.

1. 어떻게 동작하나요 ?

자세한 내용을 살펴보기 전에, NullCon 2024 컨퍼런스에서 열린 Marc Newlin의 프레젠테이션을 시청하시기를 권장합니다. 이 취약점들에 대한 명확하고 철저한 설명을 제공합니다 : Hi, My Name Is keyboard by Marc Newlin..
*또한 이 취약점을 대중화하는 영상도 제공했습니다. 바로 여기에서 확인하실 수 있습니다 : How a Simple Bluetooth Hack Can Hijack Your Device - Hi, my name is keyboard.

📌 아래 설명에서 빠진 부분, 더 단순화할 수 있는 부분, 또는 잠재적인 오류를 발견하시면 자유롭게 수정하고 병합 요청을 제출해 주세요. 기여를 검토하고 저장소에 반영하게 되어 기쁘게 생각합니다.

우리는 Linux 운영 체제에 해당하는 CVE-2023-45866 취약점만 다루었으므로, BlueZ 라이브러리를 대상으로 한 이 특정 악용에 도달하는 과정만 설명하겠습니다.

우선, 이 취약점은 이 기술 위에 있는 HID 프로필을 대상으로 하기 때문에 Bluetooth BR/EDR에서만 악용 가능하다는 점을 이해해야 합니다. 블루투스 아키텍처 구현은 이더넷 프로토콜의 OSI 모델과 같이 여러 계층으로 나뉜다는 것을 알고 계실 텐데, 아래의 개략도에서 확인할 수 있습니다.

Bluetooth 스택 HID

다이어그램 1 : 단순화된 Bluetooth BR/EDR(Basic Rate - Enhanced Data Rate) 스택. 스택의 가장 낮은 계층은 전용 안테나가 있는 물리 계층을 나타내며, 더 높은 수준은 애플리케이션 계층 또는 때때로 운영 체제라고도 부르는 수준을 나타냅니다. 두 기기가 서로 통신하려면 발신 패킷의 경우 위에서 아래로, 수신 블루투스 패킷의 경우 아래에서 위로 이러한 여러 계층을 거칩니다.

조회(inquiry) 과정 후, 기기들이 연결을 설정하려는 것으로 결정하면 페어링 과정을 진행합니다. 이 과정을 통해 기기 간 상호 인증과 암호화 키 설정이 가능해지며, 이 키는 이후 통신을 보호하는 데 사용됩니다.

Bluetooth 사양은 다양한 수준의 인증 및 보안을 제공합니다. 사용되는 인증 메커니즘에 따라 통신의 보안 수준이 달라질 수 있습니다. 기기는 보유한 입력 및 출력 주변 장치를 기반으로 인증할 수 있으며, 이를 연관 모델(association models)이라고 합니다. 두 기기를 페어링할 때 다른 기기에 표시된 PIN 코드를 입력하라는 요청을 받는 등의 방식으로 이 개념을 접해보셨을 것입니다.

기기의 I/O(입력/출력) 기능에 따라 결정되는 네 가지 페어링 연관 모델이 있습니다:

  • Just Works (비인증)
  • Numeric Comparison (인증됨)
  • Passkey Entry (인증됨)
  • Out of Band (인증됨) – 페어링 과정을 돕기 위해 다른 기술에 의존합니다.

다음은 IoT 기기의 기능에 따라 어떤 연관 모델이 사용되는지 보여주는 표입니다.

Bluetooth 연관 모델.

다이어그램 2 : Bluetooth Core Specification v5.3 - 2.3.5.1 Selecting key generation method Table 2.8 : Mapping of IO cacpabilities to key generation method (page 1573)에서 영감을 얻은 Bluetooth BR/EDR 연관 모델을 보여주는 표입니다. 보안 모드 및 연관 모델에 대한 자세한 내용은 Thyrasec이 게시한 이 흥미로운 블로그 게시물을 확인하세요 : Bluetooth Security : Classic & BLE !

'Just Works' 방식에 흥미를 느끼셨을 것이라 확신합니다. 바로 우리의 취약점이 있는 곳입니다. 문제는 다음과 같습니다: 이 방식은 사용자 확인이나 상호 작용을 요구하지 않고 페어링을 설정하므로, 페어링 기기의 신뢰성을 검증할 방법이 없습니다. Linux 시스템에서 BlueZ 스택은 기본적으로 NoInputNoOutput으로 분류된 기기의 수신 페어링 요청을 수락했습니다(하위 호환성을 위해). 정말 "훌륭한" 설계 선택이죠, 그렇지 않나요?

Linux 기본 구성 업데이트.

캡처 2 : bluetooth 보안을 활성화하고 CVE-2023-45866를 패치하기 위한 blueZ 기본 구성 업데이트.

대상 기기와 페어링한 후, 우리 시스템은 L2CAP 계층의 포트 1을 통해 SDP(Service Discovery Protocol)에 연결을 설정합니다. 다이어그램 1에서 볼 수 있듯이 L2CAP 계층은 하위 및 상위 서비스 계층 사이의 중개자 역할을 하며, 데이터 패킷의 분할, 다중화 및 재조립을 제공합니다. SDP 연결을 통해 대상 기기에서 사용 가능한 모든 서비스를 식별하고 HID(Human Interface Profile) 서비스에 연결합니다. HID 프로필은 운영 체제가 Bluetooth 키보드 및 마우스의 입력을 처리하는 데 사용하며, L2CAP 계층의 포트 17(HID Control)과 19(HID Interrupt)를 통해 작동합니다. HID 프로필에 접근하는 데는 인증이 필요하지 않으며, L2CAP의 포트 17과 19에 연결된 모든 기기는 HID 기기로 인식됩니다.

공격자는 Bluetooth 무선 키보드의 서비스 및 기기 클래스를 가장하고, 'NoInputNoOutput' 기능을 지정하여 'Just Works' 연관 모델을 악용한 다음 대상 기기에 무단 키 입력을 주입할 수 있습니다.

2. 어떻게 구현되었나요 ?

솔직히 말하면, 유일한 목표는 이 익스플로잇의 통찰력을 더 깊이 이해하기 위해 개념 증명을 Rust로 재구현하는 것이었습니다. 그래서 이 첫 번째 반복에서 전체 아키텍처는 Marc Newlin의 Python PoC에서 영감을 받았습니다 : Github "hi_my_name_is_keyboard". 향후 재작업에서는 더 Rust스러운 방식으로 구현될 수 있습니다.

이 구현 중에 사용된 크레이트(= Rust 라이브러리) :

root@kitploit:~
[dependencies]
bluer = { version = "0.17.3", features = ["l2cap", "bluetoothd", "id", "rfcomm"] }
tokio = "1.42.0"
regex = "1.11.1"
clap = { version = "4.5.23", features = ["derive"] }

제 프로젝트의 핵심 의존성은 BlueZ C 라이브러리 위에 구축된 Rust API인 'BlueR'였습니다. 여기에서 그들의 작업을 확인할 수 있습니다 : GitHub BlueR. 또한 BlueR 라이브러리에서 제공하는 async 함수를 사용할 수 있도록 Tokio를 통합했습니다. 추가로 명령줄 인수 파서인 Clap과 Rust에서 정규 표현식을 구현하는 크레이트인 Regex를 사용하여 'bt_addr'(Bluetooth 주소)에 대한 사용자 입력의 유효성을 검사했습니다.

Marc Newlin의 구현을 관찰한 후, 동일한 기능을 재현하기 위해 아키텍처를 여러 단계로 분해했습니다 :

  1. 사용자 인수를 구문 분석하여 다음을 얻습니다 :
    • --iface 또는 -i는 사용할 블루투스 인터페이스/어댑터를 나타냅니다. 이 인수는 선택 사항이며, 아무것도 지정하지 않으면 기본 인터페이스를 사용하려고 시도합니다.
    • --target 또는 -t는 필수이며 대상의 블루투스 주소를 지정합니다.
  2. 대상 기기와의 연결 중 "Just Works" 페어링 방식에 접근할 수 있도록 NoInputNoOutput 기능을 가진 블루투스 에이전트를 배포합니다.
  3. HID 키보드 서비스가 있는 프로필을 등록하고 클래스 0x002540를 등록하여 키보드를 가장합니다.
  4. 입력을 HID 패킷으로 전송할 올바른 HID 바이트로 변환하는 모든 열거형과 함수를 생성합니다.
  5. L2CAP 계층의 올바른 포트(포트 1 - SDP, 포트 17 - HID Control 및 포트 19 - HID Interrupt)에 대한 연결을 시작하고 비인가된 키 입력을 주입합니다.

코드에 가능한 한 많은 주석을 달려고 노력했습니다. 코드를 살펴보면 이 모든 단계를 쉽게 알아볼 수 있습니다. 더 우아하게 만들기 위해 다음 단계에서는 더 Rust스럽게 만들고, 정상적으로 종료되도록 하며, 키보드 스크립트(준비된 페이로드)를 구문 분석하는 기능이나 그래픽 사용자 인터페이스와 같은 몇 가지 다른 기능을 추가하는 것입니다. 다시 말하지만, 이는 교육 목적으로만 만들어졌으며, 이 프로그램의 다른 반복 작업을 진행할지는 확실하지 않습니다. 그러나 다시 한번, 기여는 언제나 환영합니다. 궁금한 점이 있으면 주저하지 말고 문의하세요.

3. 사용 방법 ?

가장 먼저 알아야 할 사항 : 이 도구는 Ubuntu 24.04에서 개발 및 테스트되었습니다.

이 도구를 사용하려면 BlueZ가 등록한 기본 HID 서비스를 비활성화해야 합니다. 그래야 익스플로잇을 실행할 때 다시 등록할 수 있습니다. 다음 단계를 따르십시오:

  • /etc/systemd/system/bluetooth.target.wants/bluetooth.service 구성 파일을 편집합니다.
  • 줄을 수정합니다 : ExecStart=/usr/libexec/bluetooth/bluetoothd 다음 줄로 바꿉니다 : ExecStart=/usr/libexec/bluetooth/bluetoothd --noplugin=input
  • 파일을 수정한 후 변경 사항을 적용하려면 systemd 구성을 다시 로드하고 Bluetooth 서비스를 다시 시작해야 합니다. sudo systemctl daemon-reload sudo systemctl restart bluetooth

이제 프로젝트를 가져와서 cargo build로 빌드하거나 인수를 지정하여 직접 실행하기만 하면 됩니다 : cargo run -- -i [BT_INTERFACE] -t [BT_TARGET].

Rusty Injector의 명령줄 인터페이스

캡처 3 : Rusty Injector의 명령줄 인터페이스.

예시는 다음과 같습니다 : cargo run -- -i hci0 -t AA:BB:CC:DD:EE:FF

또 한 가지 알아두어야 할 점은 코드를 수정하고 Configuration 트레이트를 통해 "set_address" 함수를 사용하려면 bdaddr 도구를 설치해야 한다는 것입니다 :

root@kitploit:~
# build bdaddr from the bluez source
cd ~/
git clone --depth=1 https://github.com/bluez/bluez.git
gcc -o bdaddr ~/bluez/tools/bdaddr.c ~/bluez/src/oui.c -I ~/bluez -lbluetooth
sudo cp bdaddr /usr/local/bin/

참고로 블루투스 인터페이스를 지정하지 않으면 기본 인터페이스를 사용하려고 시도합니다. 그리고 당연히, Ubuntu 운영 체제에 블루투스 인터페이스를 연결하는 것을 잊지 마세요.🙃


모든 것을 다 다룬 것 같습니다. 이제 Rusty Injector를 최대한 활용할 준비가 되었습니다! 문제가 발생하거나 의견이나 피드백이 있으면 언제든지 이슈를 열어 주세요. 즐거운 경험 되시고 해킹 즐기세요! 🚀

도구 다운로드