Pufferüberlauf-Schwachstelle

Inhaltsverzeichnis

In diesem Tutorial werden wir über Pufferüberlauf sprechen (Pufferüberlauf), ein seit langem bestehender Fehler tritt auf, wenn die Daten, die in einen (zuvor reservierten) Speicherbereich kopiert werden, nicht korrekt geprüft werden, kann es sein, dass die Anwendung korrekt funktioniert, wenn der Benutzer Daten mit a . einfügt ausreichende Größe, aber wenn wir 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 dazu führen, dass unser Programm hängen bleibt, aber es kann auch viel schlimmer sein, ein Benutzer mit böswilligen 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 von Befehlen ). Auch wenn das Programm mit erhöhten Rechten läuft, haben wir eine ernsthafte Sicherheitslücke. Ein weiterer Angriff, der den Betrieb einer Anwendung verändern oder Code einschleusen kann, ist XSS.

NotizDie Ausführungen, die Sie in diesem Tutorial sehen werden, wurden im 32-Bit-Betriebssystem Ubuntu 16.04 ausgeführt.

Mal sehen Einfaches Beispiel für C-Code, der für diesen Angriff anfällig ist, beim Starten des Programms müssen wir einen Parameter übergeben, die Anwendung erwarten, dass Sie eine Zeichenfolge mit nicht mehr als 15 Zeichen erhalten, wenn es die erwartete Zeichenfolge ist, ist es ein erfolgreicher Zugriff, wenn nicht, wird er "verweigert". Der Code ist wie unten gezeigt:

 #include #include #define Passwort "Test" void test (char * str) {char buffer [15]; intn = 0; strcpy (Puffer, str); if (strcmp (Puffer, Passwort) == 0) {n = 1; } if (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"); Ausgang (-1); } testen (argv [1]); }
Das Programm ist benannt nach überlauf.c, und zum Kompilieren wurde Folgendes verwendet:
 gcc overflow.c -o overflow -fno-stack-protector
Der letzte Teil: -fno-stack-protector Es wird verwendet, damit der Compiler keinen Schutz bietet und wir das Beispiel zeigen können. Wenn der Benutzer korrekte Daten eingibt, die eine Zeichenfolge von maximal 15 Zeichen sind, funktioniert das Programm gut, wenn wir ein falsches "Passwort" eingeben, wird es uns angezeigt Zugriff abgelehnt, und wenn wir setzen "Prüfen”Werde uns setzen Erfolg. Sehen wir uns ein Capture an, das das Programm 2 Mal ausführt, einmal mit falschem Zugriff und ein anderes mit dem richtigen String:

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

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

 strcpy (Puffer, str);
Durch folgendes:
 strncpy (Puffer, str, 15);
Ja wir führen den Code mit 20 Buchstaben A . aus, wir haben folgende Ausgabe:

Sie können auch sehen, dass wir von strcmp, stattdessen sollten wir verwenden strncmp, also kontrollieren wir auch die Größe. Wir haben kontrolliert, dass nur maximal 15 Zeichen kopiert werden können, so dass es unser Programm nicht beeinflusst, wenn sie mehr einfügen. Wenn nach Anzeige der Meldung Erfolg wir führen einen Systembefehl aus (in diesem Fall Wer bin ich), erhalten wir die Informationen:

Oben sind wir nicht root, aber wenn wir es mit sudo ausführen, erhalten wir Folgendes:

Das einzige, was wir hinzugefügt haben, ist eine Zeile im Code, die wir oben gesehen haben, unterhalb der Codezeile:

 printf ("Erfolg \ n");
Wir haben gesetzt:
 System ("whoami");
Um ein bisschen zu verstehen, was passiert ist, werde ich das Programm ändern, um die 2 Variablen anzuzeigen, die wir haben (Puffer Ja n) ob es richtig ist oder nicht, und unten ist die Ausgabe, als erstes fügen wir einen String ein, der als richtig behandelt wird ("Prüfen”), dann ein falsches, das die Länge nicht überschreitet und schließlich das 20 Buchstaben A:

Wir sehen, dass es sich in der ersten Ausführung lohnt 1 Die Variable n, denn die übergebene Kette ist die richtige, in der zweiten lohnt es sich 0, weil es falsch ist, aber im letzten lohnt es sich 1094795585, was dazu führt, dass die von uns gestellte Bedingung übersprungen wird wenn (n), ist es wahr, solange n von 0 verschieden ist. Dies ist keine gute Bedingung, obwohl es nicht fehlschlagen müsste, wenn der Rest des Codes korrekt wäre. Wenn wir setzen 16 Buchstaben A Als Parameter werden wir sehen, dass der Wert der Variablen n es ist 65:

Wenn wir uns den ASCII-Code ansehen, ist die Zahl 65 entspricht dem Buchstaben ZU, wir haben gesehen, dass der Speicher der Variablen n versehentlich von uns berührt wurde, dass dieser zusätzliche Buchstabe, den wir als Parameter übergeben haben, an die Variable gegangen ist n. Wir hätten den Speicher wie folgt:

Wenn wir über die Zeichen hinausgehen, kann es sein, dass es uns eine Segmentverletzungsnachricht sendet (wenn wir die Ausfahrt (0) was haben wir in der wenn (n)), können wir es im folgenden Bild sehen:

Diese Warnung beruht auf dem Versuch, auf einen Speicherbereich zuzugreifen, der außerhalb der Grenzen des vom Betriebssystem der Anwendung zugewiesenen Bereichs liegt. Wenn wir das Beispiel wie folgt kompiliert haben:

 gcc overflow.c -o overflow -fstack-protector
Oder einfach entfernen -fno-stack-protector Aus der Kompilierung, die wir das erste Mal gesehen haben und den Code mit Überlauf ausführen, erhalten wir folgendes Ergebnis:

Ein zusätzlicher Schutz, den gcc uns bietet.

NotizWenn wir einen Code ausführen wollten (Shellcode) müssten wir die Rücksprungadresse mit der unseres Shellcodes überschreiben, sie ist etwas komplexer als das Beispiel im Tutorial und erfordert daher mehr Arbeit.

Wenn es jemandem gelingt, diese Schwachstelle auszunutzen, kann Ihnen das viel Schaden zufügen. Vermeiden Sie diese Art von Fehlern und dass ein böswilliger Benutzer dies ausnutzen kann, ist sehr einfach, programmieren Sie richtig, Sie müssen die verwendete Programmiersprache gut kennen, wissen, welche Funktionen Sie verwenden und welche nicht, testen Sie die Anwendung Nun, nicht nur mit korrekten Daten, es muss auch richtig funktionieren, wenn wir mit unvorhergesehenen Daten umgehen.

Andere Angriffe, die Sie überprüfen und beachten können, damit sie Sie nicht beeinträchtigen oder ihre Risiken minimieren, sind: DoS und Brute Force. Und vergessen Sie nicht, die CVE-Seite auf Schwachstellen zu überprüfen.

Hat dir dieses Tutorial gefallen und geholfen?Sie können den Autor belohnen, indem Sie diesen Knopf drücken, um ihm einen positiven Punkt zu geben

Sie werden die Entwicklung der Website helfen, die Seite mit Ihren Freunden teilen

wave wave wave wave wave