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
ipv6_frag_escape — Linux LPE - Affidabile evasione da Jail/Container | Kitploit
Strumenti/GitHubGitHub/sgkdev/ipv6_frag_escape
Escalation di PrivilegiExploitPost-ExploitPenetration TestingRed TeamingEscape dal ContainerBinary Exploitation
GitHubsgkdev/ipv6_frag_escape

ipv6_frag_escape

Linux LPE - Affidabile evasione da Jail/Container

Vedi Repository
53141 mese faRevisionato da Kitploit

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

IPV6_FRAG_ESCAPE

Una prova di concetto affidabile di evasione da container/jail senza privilegi per CentOS / RHEL 10.

Sfrutta un bug di frammentazione IPv6 ora corretto in __ip6_append_data() (chiuso upstream da 38becddc, nessun CVE), un overflow lineare in-slab in skb_shared_info alla coda dell'oggetto head di un pacchetto. Questo README documenta solo la catena di sfruttamento. Non copre il trigger.

Ambito

  • Target: CentOS / RHEL 10 (kernel 6.12.x, ad es. 6.12.0-242.el10).
  • Inizio: un processo senza privilegi all'interno di un container isolato in rete, con accesso a namespace utente senza privilegi.
  • Risultato: una shell root interattiva nei namespace iniziali e nel filesystem root dell'host.

Note

Questa è una prova di concetto, deliberatamente non un'arma chiavi in mano. L'impalcatura di affidabilità è stata volutamente omessa: nessun grooming PCP per-CPU, nessun armoring SLUB cross-cache, e la testa skb è posizionata in una cache condivisa, non così silenziosa. Quello che viene fornito spara abbastanza spesso per dimostrare la catena, e non molto di più. È limitato a CentOS / RHEL 10.

Requisiti

  • CONFIG_INIT_ON_ALLOC_DEFAULT_ON disattivato, l'impostazione predefinita di RHEL / CentOS. Questa PoC impianta un puntatore obsoleto in byte slab non inizializzati; con init_on_alloc=1 quello slot viene azzerato e questa particolare tecnica causa solo il crash del kernel (un NULL deref). Questo è un limite della tecnica, non del bug: un exploit completo che copra anche quei kernel, con una tecnica diversa, seguirà una volta che la correzione e il CVE saranno pubblici.
  • Paginazione a 5 livelli (LA57, indirizzi lineari a 57 bit). Il page table walk è predisposto per cinque livelli e un controllo all'avvio rifiuta di eseguire senza di esso. Una CPU a 4 livelli avrebbe bisogno di un refactoring del walk.
  • /sys/kernel/btf/vmlinux presente e leggibile da tutti (predefinito su RHEL / CentOS).

Kernel testati

DistribuzioneKernelRisultato
CentOS Stream 106.12.0-242.el10root, evasione dal container
RHEL 106.12.0-228.el10evasione dal contesto httpd_t

Catena di sfruttamento

  1. Overflow in-slab verso un self-UAF. Il bug fornisce il controllo del singolo byte nr_frags in skb_shared_info. Il percorso di rilascio (skb_release_data()) scansiona frags[0 .. nr_frags) e chiama put_page() su ciascuna voce, e frags[] non viene mai inizializzato. Pre-posizioniamo un struct page * per una pagina di pipe buffer in quello slot slab attraverso un riutilizzo controllato della cache, poi impostiamo nr_frags a 1, così la distruzione rilascia un riferimento su una pagina che possediamo ancora. L'overflow lineare diventa un use-after-free di pagina. L'overflow non tocca mai frags[0], quindi non deve essere temporizzato rispetto allo spray, che è ciò che lo rende tollerante.

  2. Da UAF di pagina a Dirty-Pagetable. La pagina pipe liberata viene reclamata come tabella delle pagine di ultimo livello tramite il fault di un nuovo mapping anonimo. Una pagina fisica è ora sia una tabella delle pagine foglia attiva che la pagina che la pipe legge e scrive ancora. Scrivere otto byte nella pipe installa una PTE contraffatta; leggere la pipe restituisce la tabella. Questo è un accesso fisico arbitrario limitato in lettura/scrittura, dell'ordine di 460 finestre PTE per tabella.

  3. Sconfiggere KASLR. Con la lettura fisica scansioniamo la tabella delle pagine del trampolino SMP a bassa memoria fissa, che KASLR non sposta mai; la sua metà kernel punta a , la base fisica del kernel. Da lì (riconoscibile dal suo auto-riferimento alla voce 511) è un traduttore universale da virtuale a fisico, recuperando la base virtuale del kernel e collegando il nostro spazio di indirizzi alla memoria fisica.

Scarica lo strumento
level4_kernel_pgt
init_top_pgt
  • Da lettura/scrittura limitata a illimitata. Forgiamo una PTE nella tabella foglia che punta all'indirizzo fisico della tabella stessa. La finestra virtuale corrispondente crea quindi un alias della tabella delle pagine stessa, quindi le PTE diventano semplice memoria: lettura/scrittura kernel ad accesso casuale illimitato, senza pipe nel loop. La coerenza TLB del Ring 3 viene gestita forzando un flush completo di mm con un mprotect() sovradimensionato.

  • Risolvere offset e ottenere le credenziali. Gli offset dei membri delle struct vengono letti a runtime da /sys/kernel/btf/vmlinux, non incorporati. Localizziamo la nostra task_struct attraverso il vmemmap struct page walk e mm_struct.owner, azzeriamo gli ID delle credenziali e riempiamo tutti i set di capacità su cred e real_cred. Gli indirizzi dei simboli provengono da un risolutore interno che analizza le tabelle kallsyms del kernel tramite la nostra lettura arbitraria; solo se questo fallisce ricorriamo al puntare cred.user_ns a init_user_ns (così CAP_SYSLOG vale nel namespace iniziale) e leggere gli indirizzi reali da /proc/kallsyms.

  • Disabilitare SELinux senza modificare enforcing. Sovrascriviamo il prologo di avc_denied() con uno stub xor eax, eax ; ret (saltando endbr64 sotto IBT). Ogni negazione ora restituisce concessa, a livello di processo, mentre getenforce segnala ancora Enforcing. Questo è anche un prerequisito per l'evasione: il re-exec cross-dominio del gestore di core-dump sarebbe altrimenti negato.

  • Evasione tramite core_pattern. Sovrascriviamo il core_pattern globale con un handler con prefisso | che punta al nostro stesso binario tramite /proc/<PID>/root (il chroot del container del task in crash), poi facciamo crashare un figlio. Il kernel esegue l'handler come usermodehelper, root nei namespace iniziali, e trasmettiamo una shell root interattiva su un socket Unix collegato all'interno del container. L'handler nasce all'interno dei namespace init, quindi non è necessaria alcuna manipolazione dei namespace in loco, né i pericoli di namespace PID.