
Klassischer stack-basierter Pufferüberlauf in SLMail 5.1, der zeigt, wie frühe Mailserver durch übergroße SMTP- und POP3-Befehle kompromittiert werden konnten.
Klassischer Stack-basierter Pufferüberlauf in SLMail 5.5, der zeigt, wie frühe Mailserver durch überdimensionierte SMTP- und POP3-Befehle kompromittiert werden konnten.
Dieses Repository ist Teil des Materials, das ich beim Unterrichten der Ausnutzung von Speicherfehlern verwende (neben meiner regulären Arbeit unterrichte ich auch in verschiedenen Cybersicherheitskursen, wo ich helfe, die nächste Generation von Reverse Engineers auszubilden).
CVE-2003-0264 ist einer der ersten Fälle, die ich vorstelle, wenn ich die Ausnutzung von einfachen Stack-basierten Pufferüberläufen über ein Netzwerkprotokoll unterrichte. Er ist sauber, gut dokumentiert, und der Ausnutzungspfad ist direkt, ohne SEH, ohne Egghunter, ohne Platzbeschränkungen. Der Student sendet eine Nutzlast, überschreibt EIP, landet auf einem JMP ESP-Gadget und erhält eine Shell. Diese Klarheit ist genau das, was ihn als Ausgangspunkt nützlich macht.
SLMail 5.5 ist ein veralteter Windows-Mailserver. Die Schwachstelle befindet sich im POP3-Dienst, genauer gesagt im PASS-Befehls-Handler, der die Benutzereingabe ohne Längenprüfung direkt in einen Stack-Puffer fester Größe kopiert. Was diesen Fall für den Unterricht besonders nützlich macht, ist die geringe Anzahl an beweglichen Teilen:
Diese Kombination – netzwerkerreichbar, nicht authentifiziert, direkte EIP-Überschreibung, keine modernen Schutzmaßnahmen – macht CVE-2003-0264 zu einem der saubersten realen Beispiele eines einfachen Stack-Überlaufs, der noch auf modernen Windows-Versionen läuft.
SLMail ist ein Windows-Mailserver, der SMTP-, POP3- und Verwaltungsdienste bereitstellt. Der POP3-Dienst lauscht auf TCP-Port 110 und verarbeitet Standardbefehle zum Abrufen von E-Mails. Die Schwachstelle befindet sich im PASS-Befehls-Handler, der das von einem verbindenden Client gesendete Passwortargument verarbeitet.
Wichtige technische Details:
Der POP3-Dienst von SLMail verarbeitet den PASS-Befehl, indem er das gelieferte Passwortargument mit einer unsicheren Funktion ohne Längenprüfung in einen Stack-Puffer fester Größe kopiert. Eine vereinfachte Version der anfälligen Logik sieht so aus:
char password_buffer[256];
strcpy(password_buffer, pass_argument);
Das Senden einer ausreichend langen Zeichenkette als PASS-Argument führt dazu, dass die Kopie über das Ende des Puffers hinaus schreibt, den Stack beeinträchtigt und schließlich die gespeicherte Rücksprungadresse überschreibt. Wenn die Funktion zurückkehrt, lädt die CPU den vom Angreifer kontrollierten Wert vom Stack in EIP und springt dorthin.
Der Absturz kann reproduziert werden, indem ein übermäßig großes PASS-Argument über POP3 gesendet wird. Es sind keine gültigen Anmeldedaten erforderlich. Beispiel mit Python:
import socket
HOST = '127.0.0.1'
PORT = 110
payload = b"A" * 3000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.recv(1024)
s.send(b"USER username\r\n")
s.recv(1024)
s.send(b"PASS " + payload + b"\r\n")
s.close()
Wenn unter einem Debugger ausgeführt, zeigt der Absturz eine mit vom Benutzer kontrollierten Daten überschriebene EIP:
EIP = 41414141
was bestätigt, dass die gespeicherte Rücksprungadresse durch den Überlauf beschädigt wurde.
Das Ziel dieses Repositorys ist es nicht nur, den Absturz zu demonstrieren, sondern den gesamten Ausnutzungsprozess Schritt für Schritt durchzugehen, vom Fuzzing bis zu einer funktionierenden Reverse-Shell.
Um die Haupt-README sauber zu halten, befinden sich die detaillierten Ausnutzungsnotizen, Skripte und Debugger-Schritte im Ordner Vulnerability 📂 dieses Repositorys.
Dort finden Sie den vollständigen Workflow, der zur Ausnutzung dieser CVE verwendet wurde, einschließlich: