
Stack-basierter Pufferüberlauf in MiniShare 1.4.1, erreichbar durch eine einzelne HTTP-PUT-Anfrage.
Stack-basierter Pufferüberlauf in MiniShare 1.4.1, der über eine einzige HTTP-PUT-Anfrage ausgelöst werden kann.
Dieses Repository ist Teil des Materials, das ich beim Unterrichten von Speicherkorruptions-Ausnutzung verwende (neben meiner regulären Arbeit unterrichte ich auch in verschiedenen Cybersicherheitskursen, wo ich helfe, die nächste Generation von Reverse Engineers auszubilden).
CVE-2020-13768 ist ein Fall, den ich verwende, wenn ich zeigen möchte, wie einfache netzwerkorientierte Server klassische stack-basierte Pufferüberläufe über Standardprotokollmethoden offenlegen können. Der angreifbare Endpunkt erfordert keine Authentifizierung, der Überlauf ist eine direkte EIP-Überschreibung, und der Ausnutzungspfad ist sauber und klar definiert. Es ist ein idealer Fall, um die vollständige Ausnutzungsmethodik in einem realistischen, nicht authentifizierten Remote-Szenario zu erlernen.
Was diesen Fall als Übungsbeispiel ebenfalls interessant macht, ist, dass dieselbe Grundursache – unbereinigte Eingabe, die in einen Stack-Puffer fester Größe kopiert wird – in mehreren CVE-Einträgen für dieselbe Binärdatei auftritt. CVE-2018-19861, CVE-2018-19862 und CVE-2019-17601 beschreiben alle dieselbe Art von Schwachstelle, die nur von verschiedenen Forschern über unterschiedliche HTTP-Methoden oder Endpunkte gemeldet wurden. Dies lehrt die Studierenden, auf Grundursachen zu achten, nicht nur auf CVE-Nummern.
Diese Schwachstelle betrifft MiniShare 1.4.1, einen eingestellten, leichten Windows-HTTP-Server, der für einfaches lokales Datei-Sharing entwickelt wurde. Die Software wurde ohne moderne Sicherheitspraktiken geschrieben. Was diesen Fall aus didaktischer Sicht besonders interessant macht, ist die Kombination der beteiligten Faktoren:
Diese Kombination macht CVE-2020-13768 zu einem hervorragenden Fall, um die Grundlagen der netzwerkbasierten Pufferüberlauf-Ausnutzung in einem realistischen, nicht authentifizierten Szenario zu lehren.
MiniShare ist ein minimaler Windows-HTTP-Server, der ursprünglich für schnelles lokales Datei-Sharing über ein LAN entwickelt wurde. Er lauscht auf TCP-Port 80 und verarbeitet eine kleine Teilmenge von HTTP-Methoden, einschließlich GET und PUT. Der PUT-Handler verarbeitet eingehende Anfragen und kopiert den URI-Pfad in einen Stack-Puffer fester Größe, ohne dessen Länge zu validieren.
Wichtige technische Details:
MiniShare verarbeitet eingehende HTTP-Anfragen und leitet sie basierend auf der Methode an den entsprechenden Handler weiter. Der PUT-Handler extrahiert den URI-Pfad aus der Anfrage und kopiert ihn ohne Längenprüfung in einen Stack-Puffer fester Größe.
Eine vereinfachte Version der anfälligen Logik sieht folgendermaßen aus:
char path_buffer[256];
strcpy(path_buffer, uri_path);
Da der Zielpuffer eine feste Größe hat und die Eingabelänge nicht validiert wird, führt das Senden eines ausreichend langen URI in der PUT-Anfrage dazu, dass die Kopie über das Ende des Puffers hinaus schreibt und schließlich die gespeicherte Rücksprungadresse (EIP) auf dem Stack erreicht und überschreibt.
Wenn die anfällige Funktion zurückkehrt, lädt die CPU den vom Angreifer kontrollierten Wert vom Stack in das EIP-Register und springt dorthin. Wenn diese Adresse auf vom Angreifer kontrollierte Daten mit Shellcode zeigt, wird eine beliebige Codeausführung erreicht.
Der Absturz kann durch Senden eines übermäßig langen URI in einer HTTP-PUT-Anfrage reproduziert werden. Es ist keine Authentifizierung erforderlich. Beispiel mit Python:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 3000
request = (
b"PUT /" + payload + b" HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Connection: close\r\n"
b"\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
Wenn er unter einem Debugger ausgeführt wird, zeigt der Absturz EIP mit benutzergesteuerten Daten überschrieben:
EIP = 41414141
Dies bestätigt, dass die gespeicherte Rücksprungadresse durch den Überlauf beschädigt wurde.
Das Ziel dieses Repositorys ist nicht nur, den Absturz zu demonstrieren, sondern auch den vollständigen Ausnutzungsprozess Schritt für Schritt durchzugehen, gemäß der Methodik, die bei der Entwicklung echter Stack-basierter Exploits verwendet wird.
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 Arbeitsablauf, der zur Ausnutzung dieser CVE verwendet wurde, einschließlich: