Sicherheitsanfälligkeit durch Pufferüberlauf

In diesem Tutorial werden wir über den Pufferüberlauf ( Buffer Overflow ) sprechen, einen Fehler, der schon seit langer Zeit besteht und auftritt, wenn die Daten, die in einen zuvor reservierten Speicherbereich kopiert wurden, nicht korrekt überprüft werden. Sei es, dass die Anwendung korrekt funktioniert, wenn der Benutzer Daten mit einer angemessenen Größe einfügt. Wenn wir jedoch Speicher für 15 Zeichen reservieren und der Benutzer 20 einfügt, wirkt sich dies auf einen anderen Speicherbereich aus, der reserviert sein kann oder nicht.

Dies kann zum Absturz unseres Programms führen, aber es kann auch viel schlimmer sein, ein Benutzer mit schlechten Absichten kann diesen Fehler ausnutzen und den Betrieb der Anwendung beeinflussen oder beliebigen Code auf einem Computer ausführen (normalerweise öffnet dieser Code einen Interpreter für Befehle). Auch wenn das Programm mit erhöhten Rechten ausgeführt wird, liegt ein schwerwiegender Sicherheitsfehler vor. Ein weiterer Angriff, mit dem Sie den Betrieb einer Anwendung ändern oder Code einfügen können, ist XSS .

Hinweis
Die Ausführungen, die Sie in diesem Tutorial sehen werden, wurden unter dem Betriebssystem Ubuntu 16.04 mit 32 Bit ausgeführt.

Sehen wir uns ein einfaches Beispiel für C-Code an, der für diesen Angriff anfällig ist. Wenn Sie das Programm starten und einen Parameter übergeben müssen, erwartet die Anwendung einen String mit nicht mehr als 15 Zeichen , wenn der erwartete String ein erfolgreicher Zugriff ist es wird “verweigert”. Der Code ist der unten gezeigte:

 #include <stdlib.h> #include <stdio.h> #Passwort festlegen "Test" Ungültigkeitstest (char * str) { char buffer [15]; int n = 0; strcpy (buffer, str); if (strcmp (Puffer, Passwort) == 0) { n = 1; } wenn (n) { printf ("Erfolg  n"); Ausfahrt (0); } else { printf ("Zugriff verweigert  n"); } } int main (int argc, char * argv []) { if (argc <2) { printf ("Die App benötigt einen Parameter  n"); Ausfahrt (-1); } Test (argv [1]); } 

Das Programm hat den Namen overflow.c , und zum Kompilieren wurde Folgendes verwendet:

 gcc overflow.c -o overflow -fno-stack-protector 

Der letzte Teil: -fno-stack-protector wird verwendet, damit der Compiler keinen Schutz bietet und wir das Beispiel zeigen können. Wenn der Benutzer die korrekten Daten eingibt, dh eine Zeichenfolge mit maximal 15 Zeichen, funktioniert das Programm einwandfrei. Wenn wir ein falsches “Passwort” eingeben, wird ” Zugriff verweigert ” angezeigt, und wenn wir ” Test ” eingeben, erhalten wir ” Erfolg” . Sehen wir uns einen Screenshot an, auf dem das Programm zweimal ausgeführt wird, einmal mit falschem Zugriff und einmal mit der richtigen Zeichenfolge:

See also  Verwendung von Swatchdog zur Überwachung von Protokollen unter Linux

buffer-overflow-1.jpg

Wir sehen, dass alles richtig funktioniert. Aber wenn wir eine obere Kette einfügen, wollen wir sehen, was passiert:

buffer-overflow-2.jpg

Wir haben das Programm mit 20 Buchstaben A gestartet und es zeigt Erfolg . In dieser Anwendung haben wir nichts, wir beenden einfach die Anwendung, aber wir haben auf einen eingeschränkten Bereich zugegriffen, ohne das Passwort zu kennen. Wenn wir die folgende Funktion ersetzen:

 strcpy (buffer, str); 

Für folgendes:

 strncpy (buffer, str, 15); 

Und wir führen den Code mit 20 Buchstaben A aus , wir haben die folgende Ausgabe:

buffer-overflow-3.jpg

Sie können auch sehen, dass wir strcmp verwenden , stattdessen sollten wir strncmp verwenden , damit wir auch die Größe steuern. Wir haben festgelegt, dass nur maximal 15 Zeichen kopiert werden können, daher hat es keinen Einfluss auf unser Programm, dass sie mehr einfügen. Wenn wir nach der Anzeige der Erfolgsmeldung einen Systembefehl ausführen (in diesem Fall whoami ), erhalten wir die folgenden Informationen:

buffer-overflow-4.jpg

Bis wir nicht root sind, aber wenn wir es mit sudo ausführen, bekommen wir folgendes:

buffer-overflow-5.jpg

Das einzige, was wir hinzugefügt haben, ist eine Zeile in dem Code, den wir oberhalb und unterhalb der Codezeile gesehen haben:

 printf ("Erfolg  n"); 

Wir haben gesetzt:

 System ("whoami"); 

Um ein wenig zu verstehen, was passiert ist, werde ich das Programm modifizieren, um die 2 Variablen anzuzeigen, die wir haben ( buffer und n ), ob sie korrekt sind oder nicht, und dann gibt es die Ausgabe. Zuerst fügen wir einen String ein, der als korrekt behandelt wird (” Test “), dann ein falscher, der in der Länge nicht bestanden wird und schließlich die 20 Buchstaben A :

See also  4 Gefahren bei der Verwendung veralteter MFA-Methoden

buffer-overflow-6.jpg

Wir sehen, dass in der ersten Ausführung die Variable n 1 ist , weil der letzte String der richtige ist, in der zweiten 0 ist , weil er falsch ist, aber im letzten Wert 1094795585 , was uns veranlasst, die Bedingung zu überspringen, die wir setzen, wenn (n) , es wird wahr sein, solange n von 0 verschieden ist. Es ist keine gute Bedingung, obwohl es nicht fehlschlagen müsste, wenn der Rest des Codes korrekt wäre. Wenn wir dem Parameter 16 Buchstaben hinzufügen, sehen wir, dass der Wert der Variablen n 65 ist :

buffer-overflow-7.jpg

Wenn wir uns den ASCII- Code ansehen, entspricht die Zahl 65 dem Buchstaben A , wir haben gesehen, dass der Speicher der Variablen n berührt wurde, ohne uns zu wollen, dass der Buchstabe von mehr, als wir als Parameter übergeben haben, in die Variable n übergegangen ist. Wir hätten die Erinnerung wie folgt:

memory-overflowed.jpg

Wenn wir Zeichen übergeben, die möglicherweise eine Segmentverletzungsnachricht auslösen (wenn wir den Exit (0) entfernen, den wir in if (n) haben ), können wir dies in der folgenden Abbildung sehen:

Verletzung-des-Segments-8.jpg

Diese Warnung ist auf den Versuch zurückzuführen, auf einen Speicherbereich zuzugreifen, der außerhalb der vom Betriebssystem der Anwendung zugewiesenen Grenzen liegt. Wenn wir das Beispiel folgendermaßen kompilieren:

 gcc overflow.c -o overflow -fstack-protector 

Oder entfernen Sie einfach den -fno-stack-protector aus der Kompilierung, die wir zum ersten Mal gesehen haben, und führen Sie den Code mit Überlauf aus.

Schutz-gcc-Puffer-Überlauf-9.jpg

Ein zusätzlicher Schutz, den uns gcc bietet.

Hinweis
Wenn wir einen Code ( Shellcode ) ausführen wollten, mussten wir die Absenderadresse mit der unseres Shellcodes überschreiben. Dies ist etwas komplexer als das im Tutorial gezeigte Beispiel und erfordert daher mehr Arbeit.

Wenn jemand diese Sicherheitsanfälligkeit ausnutzt, kann dies großen Schaden anrichten. Vermeiden, dass diese Art von Fehler auftritt und dass ein böswilliger Benutzer dies ausnutzt, ist sehr einfach. Richtig programmieren. Sie müssen die verwendete Programmiersprache gut kennen, wissen, welche Funktionen zu verwenden sind und welche nicht. Testen Sie die Anwendung gut , nicht nur mit korrekten Daten, sondern auch mit unvorhergesehenen Daten.

See also  So löschen Sie das vollständige Verzeichnis in Linux

Andere Angriffe, die Sie überprüfen und berücksichtigen können, um Sie nicht zu beeinträchtigen oder deren Risiken zu minimieren, sind: DoS und Brute Force . Vergessen Sie nicht, die CVE- Seite zu überprüfen, um sich über die Sicherheitsanfälligkeiten zu informieren.

administrator

Leave a Reply

Your email address will not be published. Required fields are marked *