
CVE-2022-23093 Desbordamiento basado en pila en FreeBSD
⚠️ El shellcode que se usa por defecto es FreeBSD/x86-64 - execve - 28 bytes de Gitsnik, cámbialo y pon el tuyo propio para empezar ⚠️
La utilidad ping, utilizada para solicitar un ICMP ECHO_RESPONSE de un host o gateway, se invoca con un objetivo IPv4, ya sea un host IPv4 o un grupo de multidifusión IPv4 (IPv4-mcast-group), mediante el datagrama ECHO_REQUEST obligatorio del protocolo ICMP. El datagrama ECHO_REQUEST consta de una cabecera IP y una cabecera ICMP, seguidas de un "struct timeval" y un número variable de bytes "pad" para completar el paquete.
Según el aviso de seguridad del Proyecto FreeBSD, la utilidad ping recupera paquetes IP brutos de la red para procesar las respuestas dentro de la función pr_pack(). En el procesamiento de respuestas, ping reconstruye la cabecera IP, la cabecera ICMP y, si está presente, un "paquete citado" que representa el paquete que causó el error ICMP. El paquete citado también incluye una cabecera IP y una cabecera ICMP.
La función pr_pack() copia las cabeceras IP e ICMP recibidas en búferes de pila para su posterior procesamiento. Sin embargo, no tiene en cuenta la posibilidad de que haya cabeceras de opciones IP después de la cabecera IP, ya sea en la respuesta o en el paquete citado. En presencia de opciones IP, pr_pack() desborda el búfer de destino hasta en 40 bytes.
La utilidad ping se ejecuta en el espacio de usuario y, al invocar el comando ping, se ejecuta el binario ubicado en /sbin/ping. El código fuente de la utilidad está disponible públicamente en el código fuente de FreeBSD. La función vulnerable, pr_pack(), imprime la información de respuesta del paquete ICMP en stdout en un formato de cadena, como "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."
✔️ El paquete ICMP, tanto en la solicitud como en la respuesta, comprende cabeceras IP con un campo de Opciones opcional, como se ilustra en el diagrama anterior. En un ataque malicioso, estas Opciones IP se habilitan y se rellenan con bytes no nulos. ✔️
Si un paquete ICMP está malformado o es manipulado deliberadamente en ruta hacia el host de destino, y las Opciones IP están habilitadas en la solicitud de eco original, la función pr_pack() no asigna suficiente espacio en la pila para acomodar la presencia de las Opciones IP, lo que resulta en un desbordamiento de pila.
🤝 En estos casos de error, la respuesta del host de destino también puede incluir un "paquete citado" en la sección de datos, que identifica el paquete específico que causó el error ICMP. La función pr_pack() desborda la pila cuando el paquete citado incluye cabeceras ICMP. 🤝