
CVE-2022-23093 FreeBSD - Débordement de pile
⚠️ Le shellcode utilisé par défaut est FreeBSD/x86-64 - execve - 28 bytes from Gitsnik modifiez-le et mettez le vôtre pour démarrer ⚠️
L'utilitaire ping, utilisé pour solliciter une réponse ECHO_RESPONSE ICMP d'un hôte ou d'une passerelle, est invoqué avec une cible IPv4, soit un hôte IPv4, soit un groupe de multidiffusion IPv4, via le datagramme obligatoire ECHO_REQUEST du protocole ICMP. Le datagramme ECHO_REQUEST se compose d'un en-tête IP et ICMP, suivi d'un "struct timeval" et d'un nombre variable d'octets de "bourrage" pour remplir le paquet.
Selon l'avis de sécurité du projet FreeBSD, l'utilitaire ping récupère les paquets IP bruts du réseau pour traiter les réponses dans la fonction pr_pack(). Lors du traitement des réponses, ping reconstruit l'en-tête IP, l'en-tête ICMP et, le cas échéant, un "paquet cité" représentant le paquet à l'origine de l'erreur ICMP. Le paquet cité comprend également un en-tête IP et un en-tête ICMP.
La fonction pr_pack() copie les en-têtes IP et ICMP reçus dans des tampons de pile pour un traitement ultérieur. Cependant, elle ne tient pas compte de la possibilité que des en-têtes d'options IP suivent l'en-tête IP dans la réponse ou le paquet cité. En présence d'options IP, pr_pack() provoque un débordement du tampon de destination pouvant atteindre 40 octets.
L'utilitaire ping s'exécute dans l'espace utilisateur, et lors de l'appel de la commande ping, le binaire situé dans /sbin/ping est exécuté. Le code source de l'utilitaire est disponible publiquement sur la source FreeBSD. La fonction vulnérable, pr_pack(), affiche les informations de réponse du paquet ICMP sur stdout dans un format de chaîne, par exemple "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."
✔️ Le paquet ICMP, tant dans la requête que dans la réponse, comprend des en-têtes IP avec un champ Options facultatif, comme illustré dans le diagramme ci-dessus. Dans une attaque malveillante, ces options IP sont activées et remplies d'octets non nuls. ✔️
Si un paquet ICMP est mal formé ou délibérément altéré en route vers l'hôte de destination, et que les options IP sont activées dans la demande d'écho d'origine, la fonction pr_pack() ne parvient pas à allouer suffisamment d'espace sur la pile pour prendre en compte la présence des options IP, ce qui entraîne un débordement de pile.
🤝 Dans ces cas d'erreur, la réponse de l'hôte de destination peut également inclure un "paquet cité" dans la section de données, identifiant le paquet spécifique qui a provoqué l'erreur ICMP. La fonction pr_pack() provoque un débordement de la pile lorsque le paquet cité comprend des en-têtes ICMP. 🤝