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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
blackpill — 자체 제작한 타입 2 하이퍼바이저와 eBPF XDP 및 TC 프로그램을 사용하는 Rust 기반 Linux 커널 루트킷 | Kitploit
도구/GitHubGitHub/shard77/blackpill
Privilege EscalationPersistence MechanismsIDS/IPS EvasionLateral MovementShellcodePost-ExploitationCommand and ControlRed TeamingPayload DevelopmentBinary ExploitationArchived
GitHub
340455개월 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
shard77/blackpill

blackpill

자체 제작한 타입 2 하이퍼바이저와 eBPF XDP 및 TC 프로그램을 사용하는 Rust 기반 Linux 커널 루트킷

저장소 보기

BlackPill

BlackPill은 Rust로 만들어진 은밀한 Linux 루트킷입니다.

Open issues Commit activity License

특징

루트킷은 여러 모듈로 구성되어 있습니다 (커널 모듈이 아닌 Rust 모듈을 의미합니다):

  • 방어 회피: 파일, 프로세스, 네트워크 연결 등을 숨깁니다.
  • 후킹: 시스템 콜과 IDT를 후킹합니다.
  • 하이퍼바이저: 악성 코드를 실행하기 위한 가상 머신을 생성합니다.
  • 지속성: 재부팅 후에도 루트킷이 지속되고 억제에 저항하도록 만듭니다.
  • 유틸리티: 다양한 유틸리티

아키텍처는 다음과 같습니다:

Rootkit simple architecture schema

그리고 다음은 C2에서 VM 게스트로 악성 코드가 실행되는 방식입니다:

Rootkit code execution sequence diagram

C2는 조작된 x86_64 어셈블리 니모닉을 루트킷으로 보내고, 루트킷은 이를 VM 게스트로 보내 실행합니다. VM 게스트는 호스트와 분리되어 있으며 악성 코드를 실행하는 데 사용될 수 있습니다.

커널은 유입되는 악성 패킷을 볼 수 없습니다. eBPF XDP 프로그램이 이를 필터링하여 LKM 모듈로 보내고, 유출되는 패킷은 eBPF TC 프로그램에 의해 수정되기 때문입니다.

[!IMPORTANT]
이 프로젝트는 아직 진행 중입니다. 모든 기능이 작동하는 것은 아닙니다!
이슈나 풀 리퀘스트를 자유롭게 제출해 주세요.

후킹

후킹은 루트킷의 기본 기능으로, Linux 커널의 kprobes를 사용하여 구현됩니다. 이 기술은 시스템 함수의 실행을 가로채고 리디렉션하여 동작을 모니터링하거나 수정합니다. 이 루트킷의 맥락에서 kprobes는 소스 코드를 직접 변경하지 않고 커널 함수와 상호 작용할 수 있는 강력한 메커니즘을 제공합니다.

방어 회피

은밀성을 보장하기 위해 루트킷은 두 가지 주요 탐지 방지 메커니즘을 사용합니다:

  1. 커널 모듈 목록에서 모듈 제거
    커널 모듈이 로드되면 커널의 모듈 목록에 추가되며 lsmod나 /proc/modules 같은 도구로 볼 수 있습니다. 탐지를 방지하려면:

    • 루트킷이 수동으로 이 목록에서 자신을 제거합니다.
    • 목록에서 제거되었음에도 불구하고 모듈은 계속 작동하여 기능을 계속 실행할 수 있습니다.
  2. 특정 디렉터리를 숨기기 위한 filldir64 함수 후킹
    루트킷이 사용하는 파일을 숨기기 위해 filldir64 함수에 후크가 구현됩니다. 이 함수는 프로세스가 디렉터리 내용을 읽을 때(예: getdents 또는 readdir 시스템 콜을 통해) 호출됩니다.

    • 후킹 프로세스:
      • 루트킷은 kprobes를 사용하여 filldir64 함수를 가로챕니다.
      • 실행 중에 핸들러는 사용자에게 반환되는 디렉터리 항목을 검사합니다.
      • 항목이 /BLACKPILL-BLACKPILL 디렉터리(중요한 루트킷 파일을 저장하는 데 사용됨)와 일치하면 필터링되어 사용자에게 반환되지 않습니다.
      • 다른 모든 디렉터리 항목은 정상적으로 반환되어 사용자 공간 도구에 투명성을 보장합니다.
  3. eBPF XDP 및 TC 프로그램을 사용하여 인그레스 및 이그레스 네트워크 트래픽 수정
    악성 네트워크 통신을 정상화하기 위해 eBPF XDP(eXpress Data Path) 및 TC(Traffic Control) 프로그램을 사용합니다. 이를 통해 다음을 수행할 수 있습니다:

    • XDP 프로그램을 사용하여 가장 낮은 네트워크 수준에서 C2로부터 수신된 조작된 TCP 페이로드 시그니처를 매칭하여 특정 수신(인그레스) 패킷을 가로챈 다음, VM/LKM 처리를 위해 사용자 정의 BPF 맵으로 리디렉션합니다.
    • TC 프로그램을 사용하여 VM/LKM이 생성한 TCP 패킷을 매칭하여 특정 발신(이그레스) 패킷을 가로챈 다음, 페이로드를 C2 응답 데이터로 덮어써 수정합니다. 원래 패킷은 TCP에 의해 자동으로 재전송되어 합법적인 트래픽처럼 보이게 유지합니다.

하이퍼바이저

우리의 간단한 하이퍼바이저는 다음을 따라 구현되었습니다:

  1. 초기 시스템 구성

    • BIOS/UEFI에서 하드웨어 가상화 확장(Intel VT-x 또는 AMD-V)을 활성화합니다 (루트킷이 이 작업을 수행하지 않으며, 미리 활성화되어 있어야 합니다).
    • VMX(Virtual Machine Extensions (Intel)) 또는 SVM(Secure Virtual Machine (AMD)) 모드로 전환하기 위해 제어 레지스터(CR0, CR4 및 IA32_EFER)를 구성합니다.
  2. VMX 또는 SVM 모드 진입

    • 가상화 전용 데이터 구조(Intel의 경우 VMCS, AMD의 경우 VMCB)를 초기화합니다.
    • 게스트와 호스트 간의 상호 작용을 처리하기 위해 VM exit와 같은 프로세서 기능을 프로그래밍합니다.
  3. 호스트와 게스트 간 전환 관리

    • 가상 머신의 진입 및 종료 지점(VM entry/exit)을 구성합니다.
    • 게스트가 수행하는 중요한 시스템 콜을 가로채고 그 효과를 분석하는 로직을 구현합니다.
  4. 게스트 시스템 생성

    • 게스트를 위한 메모리를 할당하고 리소스(레지스터, 스택 등)를 초기화합니다.
  5. 통신

    • 루트킷과 하이퍼바이저 사이에 명령이나 데이터를 전송하기 위한 통신 채널을 사용합니다.

지속성

지속성은 모든 루트킷의 중요한 기능으로, 재부팅 후에도 대상 시스템에 대한 제어를 유지할 수 있게 합니다.
현재 구현에서 지속성 메커니즘은 /bin/touch 명령을 사용하여 파일 시스템에 테스트 파일을 생성함으로써 그 기능을 시연합니다. 이 임시 작업은 루트킷이 권한 있는 작업을 실행할 수 있는 능력을 보여주며, 더 고급 지속성 전략을 구현하도록 확장될 수 있습니다.

APT급 루트킷을 만드는 것이 우리의 우선순위가 아니므로 지금은 쓸모가 없지만, 덜 알려진 개념에 대한 더 많은 연구가 필요합니다.

개발 환경 설정

루트킷을 컴파일하기 전에 여러 단계를 수행해야 합니다. 개발 환경은 다음으로 구성됩니다:

  • 필수 도구를 제공하는 Alpine Linux 이미지
  • Rust가 활성화된 맞춤 컴파일 커널
  • KVM으로 가속되는 QEMU 가상 머신

저장소와 얕은 서브모듈을 클론하는 것으로 시작합니다:

root@kitploit:~
git clone [email protected]:DualHorizon/blackpill.git --recursive --depth 1

주요 의존성

Arch 기반 배포판에서:

root@kitploit:~
sudo pacman -S qemu-base qemu-desktop docker grub

Linux 커널

Arch 기반 Linux 배포판에서 Rust 및 기타 의존성을 설치합니다:

root@kitploit:~
sudo pacman -S rust rust-src rust-bindgen
sudo pacman -S clang lld llvm

그런 다음 Rust 소스와 bindgen이 필요합니다:

root@kitploit:~
rustup component add rust-src clippy rustfmt
cargo install --locked bindgen-cli

linux/ 폴더에서 다음을 실행하여 커널을 Rust로 컴파일할 수 있는지 확인합니다:

root@kitploit:~
$ cd blackpill
$ pushd linux
$ make LLVM=1 rustavailable
Rust is available!
$ popd

커널을 구성하고 컴파일하는 첫 번째 설정 작업을 실행합니다:

root@kitploit:~
make first-time-setup

[!IMPORTANT]
옵션 사용자 지정을 요청받으면 매번 Enter를 누르십시오.

루트킷

다음 명령으로 Rust 커널 모듈(out-of-tree)을 컴파일할 수 있습니다:

root@kitploit:~
make

다음 명령으로 VM을 실행합니다:

root@kitploit:~
make vm

VM 내부에서는 자동으로 root로 로그인됩니다. 모듈을 활성화할 수 있습니다:

root@kitploit:~
$ modprobe blackpill
# 커널 로그는 다음으로 확인할 수 있습니다
$ dmesg

사용법

로컬 권한 상승

VM이 시작되면 위의 명령을 사용하여 권한을 상승시킬 수 있습니다:

root@kitploit:~
mkdir ImFeelingRootNow_<PID>

<PID>를 권한을 상승시키려는 프로세스의 프로세스 ID로 바꾸십시오.

C2

설명

이 간단한 C2는 UDP를 통해 감염된 머신에 x86-64 opcode를 보내고 TCP 패킷을 수신합니다. 그 기능은 현재 머신과의 저수준 상호 작용으로 제한되어 있지만, 더 많은 래퍼를 사용하면 많은 실제 사용이 가능할 수 있습니다.

사용법

Python 클라이언트를 설정합니다:

root@kitploit:~
cd blackpill-c2
poetry install
poetry shell
python client.py

인수([ip] [port])와 함께 클라이언트를 실행하면 다음을 얻을 수 있습니다:

root@kitploit:~
$ python client.py 0.0.0.0 1339
Connected to rootkit!

그런 다음 help 명령을 사용하여 사용 가능한 명령을 표시할 수 있습니다:

root@kitploit:~
blackpill: help
Available Commands
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Command                             ┃ Description                                             ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ read_virt_memory <address>          │ Read 4 bytes (32 bits) memory at 'address'              │
│ write_virt_memory <address> <value> │ Write 4 bytes (32 bits) memory at 'address'             │
│ launch_userland_binary <path>       │ Launch a userland binary at 'path'                      │
│ change_msr <msr> <value>            │ Change the value of a Model Specific Register (MSR)     │
│ read_phys_memory <address> <value>  │ Read 4 bytes (32 bits) of physical memory at 'address'  │
│ write_phys_memory <address> <value> │ Write 4 bytes (32 bits) of physical memory at 'address' │
│ stop_execution                      │ Stop the execution of the guest VM                      │
│ change_vmcs_field <field> <value>   │ Change a VMCS field to 'value'                          │
│ help                                │ Show this help message                                  │
└─────────────────────────────────────┴─────────────────────────────────────────────────────────┘

크레딧

환경 설정:

  • Setting Up an Environment for Writing Linux Kernel Modules in Rust - The Linux Foundation
  • Kernel config qemu-busybox-min.config patch
  • Rust out-of-tree module
도구 다운로드