Skip to content
KitploitKITPLOIT
StrumentiBlog
Log in
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-2024-38063 — CVE-2024-38063 - Sfruttamento remoto del kernel tramite IPv6 | Kitploit
Strumenti/GitHubGitHub/faizan-khanx/cve-2024-38063
Memory ForensicsAnalisi delle VulnerabilitàExploitReverse EngineeringSicurezza di RetePaper e RicercaApprendimento e FormazioneBinary Exploitation
GitHubfaizan-khanx/cve-2024-38063

CVE-2024-38063

CVE-2024-38063 - Sfruttamento remoto del kernel tramite IPv6

Vedi Repository
1142 anni 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-2024-38063 - Sfruttamento remoto del kernel via IPv6

  • Dato che l'ultimo aggiornamento di Windows è uscito il 13 agosto, mi sono immerso a fondo in tcpip.sys (il driver del kernel responsabile della gestione dei pacchetti TCP/IP). Una vulnerabilità con punteggio CVSS 9.8 nella parte più facilmente raggiungibile del kernel di Windows era qualcosa a cui non potevo assolutamente rinunciare. Non avevo mai guardato IPv6 prima d'ora (né i driver che lo parsano), quindi sapevo che cercare di fare reverse engineering di questa vulnerabilità sarebbe stato estremamente impegnativo, ma una buona esperienza di apprendimento.

L'analisi della patch più semplice di sempre

  • Di solito, anche solo fare reverse engineering della patch per capire quale modifica al codice corrisponde alla vulnerabilità può richiedere giorni o addirittura settimane, ma in questo caso è stato immediato. È stato così facile che diverse persone sui social media mi hanno detto che mi sbagliavo e che il bug era da un'altra parte. Ho davvero dato loro ascolto e poi sprecato un'intera giornata a fare reverse engineering del driver sbagliato? Potremmo non saperlo mai.

C'era esattamente una modifica in tutto il file del driver, che a quanto pare era effettivamente il bug. image Una panoramica bindiff di tcpip.sys prima e dopo l'installazione della patch.

È stata modificata una sola funzione nell'intero driver. Di solito potrei passare un'intera giornata a esaminare oltre 20 modifiche di funzioni diverse solo per capire quale sia quella giusta, ma non questa volta. image

Ipv6pProcessOptions() prima della patch.

image Ipv6pProcessOptions() . Dopo la patch.

Non è stata cambiata solo una singola funzione, ma una singola riga di codice.

  • La funzione dal nome estremamente lungo Feature_2660322619__private_IsEnabledDeviceUsage_3() è qualcosa che Microsoft a volte aggiunge per consentire rollback parziali delle patch. La chiamata verifica la presenza di un flag globale o di un'impostazione di registro che, se impostata, fa sì che la funzione restituisca false, con il risultato che viene eseguito il codice originale invece della versione patchata.

  • Il motivo per cui Microsoft fa questo è che le patch di sicurezza a volte rompono accidentalmente delle cose, quindi questa impostazione consente a un amministratore di annullare la patch di una singola vulnerabilità, senza disinstallare l'intero pacchetto di aggiornamento mensile e indebolire drasticamente la sicurezza del sistema.

  • Tenendo questo in considerazione, è chiaro che tutta questa patch fa è sostituire una chiamata a IppSendErrorList() con IppSendError(), dandoci un indizio che il problema riguarda una sorta di lista. Il diff di patch più semplice di sempre (o così pensavo)

Vulnerabilità facoltative, sfruttamento obbligatorio

  • Fare reverse engineering della patch per trovare il codice modificato è solo metà della sfida (o in questo caso meno dello 0,1%). Il resto del processo consiste nel fare reverse engineering abbastanza della base di codice da capire cosa sta succedendo, capire che tipo di vulnerabilità è stata patchata, come costruire una richiesta per raggiungere il codice target e quale stato porta a una condizione sfruttabile.

  • La prima parte è abbastanza facile. La modifica è in Ipv6pProcessOptions(), il che ci dice che si tratta di IPv6 e che coinvolge l'elaborazione delle opzioni. Quindi, una rapida occhiata all'RFC ci dice esattamente cos'è un'opzione IPv6 e dove possiamo trovarne una.

image Il layout dell'header delle opzioni di destinazione da Wikipedia.

Ok, bello. Quello che stiamo cercando sembra essere l'header delle opzioni di destinazione, che si trova subito dopo l'header IPv6 principale. Usiamo la libreria Python 'scapy' per creare un pacchetto IPv6 di test.

Nota: per mitigare gli attacchi DDoS che utilizzano indirizzi IP spoofati, Windows limita la possibilità di costruire pacchetti IP grezzi. Per questo motivo ho scelto di usare Linux per sviluppare la mia proof-of-concept. Sebbene Linux consenta agli utenti di costruire e inviare pacchetti grezzi di livello 2 e 3, richiede che lo script Python venga eseguito come root.

import sys
import struct
from scapy.all import *


def send_ipv6_option_packet(dest_ip):
	ethernet_header = Ether()
	ip_header = IPv6(dst=dest_ip)
	options_header = IPv6ExtHdrDestOpt()
	sendp(ethernet_header / ip_header / options_header)
	
	
if len(sys.argv) < 2:
	print('Use: python3 script.py <target_ipv6_address>')
	exit(-1)

send_ipv6_option_packet(sys.argv[1])
  • Dopo aver impostato un breakpoint su tcpip!Ipv6pProcessOptions e aver eseguito lo script, era chiaro che tutto ciò che serviva per raggiungere la funzione vulnerabile era inviare un pacchetto IPv6 con una struttura di opzioni vuota. Ho poi provato ad aggiungere alcune opzioni non valide alla struttura per vedere se potevo raggiungere la chiamata a IppSendErrorList().

Una breve revisione del codice ha indicato che quasi qualsiasi formato di opzione non valido poteva innescare la chiamata a IppSendErrorList. Quindi, ho deciso di usare l'opzione Jumbo Packet con una lunghezza non valida (inferiore a 65535 byte).

options_header = IPv6ExtHdrDestOpt(options=[Jumbo(jumboplen=0x1337)])

  • Quindi, cosa fa effettivamente IppSendErrorList()? Beh, il codice è piuttosto semplice. image L'intera funzione IppSendErrorList.

  • Il codice itera una lista collegata e chiama IppSendError() su ogni elemento della lista. Ancora una volta le stelle si sono allineate e finora le cose sono state facili. Se IppSendErrorList chiama semplicemente IppSendError per ogni elemento di una lista, e la patch sostituisce la chiamata a IppSendErrorList con IppSendError, allora il problema si verifica quando IppSendError viene chiamata su un elemento della lista diverso dal primo.

Sta facendo una lista, la controlla 52,567 volte

  • Qui è dove le cose sono passate dall'ovvio all'eccezionalmente difficile, anche se penso che una buona parte sia dovuta al fatto che una delle mie due cellule cerebrali disponibili era impegnata a combattere una brutta infezione da covid. Ho perso un paio di giorni cercando di capire parti del codice, addormentandomi e poi dimenticando ciò che avevo capito. L'intero processo ha richiesto oltre una settimana di reverse engineering di parti di tcpip.sys per capire cosa stesse succedendo. Ma il post sul blog di Axel è stato estremamente utile.

  • Guardando le funzioni e la struttura che Axel ha fatto reverse engineering, e a quali altre funzioni vengono passate, è chiaro che l'unico e solo argomento passato a Ipv6pProcessOptions() è la stessa struttura packet_t definita nell'articolo. In sostanza, il puntatore passato a Ipv6pProcessOptions e iterato da IppSendErrorList è una lista concatenata di pacchetti.

  • Quindi, ho impostato un breakpoint su Ipv6pProcessOptions() e ho ispezionato la lista.

image

L'elemento list->Next è NULL.

Scarica lo strumento