
Der FreeBSD ICMP Pufferüberlauf, freebsd Pufferüberlauf poc
Der standardmäßig verwendete Shellcode ist FreeBSD/x86-64 - execve - 28 Bytes von Gitsnik. Ändern Sie ihn und setzen Sie Ihren eigenen ein, um zu starten.
Das Ping-Dienstprogramm, das zum Anfordern einer ICMP ECHO_RESPONSE von einem Host oder Gateway verwendet wird, wird mit einem IPv4-Ziel aufgerufen, entweder IPv4-Host oder IPv4-Multicast-Gruppe, durch das obligatorische ECHO_REQUEST-Datagramm des ICMP-Protokolls. Das ECHO_REQUEST-Datagramm besteht aus einem IP- und ICMP-Header, gefolgt von einem "struct timeval" und einer variablen Anzahl von "Pad"-Bytes, um das Paket zu füllen.
Gemäß dem Sicherheitshinweis des FreeBSD-Projekts ruft das Ping-Dienstprogramm rohe IP-Pakete aus dem Netzwerk ab, um Antworten innerhalb der Funktion pr_pack() zu verarbeiten. Bei der Antwortverarbeitung rekonstruiert Ping den IP-Header, ICMP-Header und, falls vorhanden, ein "quoted packet", das das Paket darstellt, das den ICMP-Fehler verursacht hat. Das quoted packet enthält ebenfalls einen IP-Header und einen ICMP-Header.
Die Funktion pr_pack() kopiert die empfangenen IP- und ICMP-Header in Stack-Puffer zur weiteren Verarbeitung. Sie berücksichtigt jedoch nicht die Möglichkeit von IP-Options-Headern nach dem IP-Header in der Antwort oder im quoted packet. Bei Vorhandensein von IP-Optionen überläuft pr_pack() den Zielpuffer um bis zu 40 Bytes.
Das Ping-Dienstprogramm läuft im Userspace, und beim Aufruf des Ping-Befehls wird die Binärdatei unter /sbin/ping ausgeführt. Der Quellcode des Dienstprogramms ist öffentlich im FreeBSD-Quellcode verfügbar. Die anfällige Funktion pr_pack() gibt die Antwortinformationen des ICMP-Pakets in einer Zeichenfolge auf stdout aus, z.B. "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."

Das ICMP-Paket besteht sowohl in der Anfrage als auch in der Antwort aus IP-Headern mit einem optionalen Optionsfeld, wie im obigen Diagramm dargestellt. Bei einem böswilligen Angriff werden diese IP-Optionen aktiviert und mit Nicht-Null-Bytes gefüllt.
Wenn ein ICMP-Paket auf dem Weg zum Zielhost fehlerhaft oder absichtlich manipuliert wird und im ursprünglichen Echo-Request IP-Optionen aktiviert sind, kann die Funktion pr_pack() nicht genügend Platz auf dem Stack zuweisen, um die IP-Optionen zu berücksichtigen, was zu einem Stack-Überlauf führt.
In diesen Fehlerfällen kann die Antwort des Zielhosts auch ein "quoted packet" im Datenbereich enthalten, das das spezifische Paket identifiziert, das den ICMP-Fehler verursacht hat. Die Funktion pr_pack() überläuft den Stack, wenn das quoted packet ICMP-Header enthält.