Buffer Overflow-kwetsbaarheid

Inhoudsopgave

In deze tutorial gaan we het hebben over buffer overflow (Bufferoverloop), een al lang bestaande storing, treedt op wanneer de gegevens die zijn gekopieerd in een geheugengebied (dat eerder is gereserveerd) niet correct worden gecontroleerd, kan het zijn dat de applicatie correct werkt als de gebruiker gegevens invoert met een voldoende groot, maar als we geheugen reserveren voor 15 tekens en de gebruiker voegt er 20 in, heeft dit invloed op een ander geheugengebied, dat al dan niet gereserveerd is.

Hierdoor kan ons programma vastlopen, maar het kan ook veel erger zijn, een gebruiker met kwade bedoelingen kan misbruik maken van deze fout en de werking van de applicatie beïnvloeden of willekeurige code op een computer uitvoeren (normaal opent die code een interpreter van opdrachten ). Ook als het programma met verhoogde privileges draait, hebben we een ernstige beveiligingsfout. Een andere aanval die de werking van een applicatie kan veranderen of code kan injecteren, is XSS.

OpmerkingDe uitvoeringen die u in deze zelfstudie zult zien, zijn uitgevoerd in het 32-bits Ubuntu 16.04-besturingssysteem.

Laten we eens kijken Eenvoudig voorbeeld van C-code die kwetsbaar is voor deze aanval, bij het starten van het programma moeten we een parameter doorgeven, de applicatie verwacht een tekenreeks te ontvangen die niet langer is dan 15 tekens, als het de verwachte string is, zal het een succesvolle toegang zijn, zo niet, dan wordt het "geweigerd". De code is zoals hieronder weergegeven:

 #include #include #define wachtwoord "Test" ongeldige test (char * str) {char buffer [15]; int n = 0; strcpy (buffer, str); if (strcmp (buffer, wachtwoord) == 0) {n = 1; } if (n) {printf ("Succes \ n"); uitgang (0); } else {printf ("Toegang geweigerd \ n"); }} int main (int argc, char * argv []) {if (argc <2) {printf ("De app vereist een parameter \ n"); uitgang (-1); } testen (argv [1]); }
Het programma is vernoemd naar overloop.c, en voor het compileren is het volgende gebruikt:
 gcc overflow.c -o overflow -fno-stack-protector
Het laatste deel: -fno-stack-beschermer Het wordt gebruikt zodat de compiler geen bescherming biedt en we kunnen het voorbeeld laten zien. Als de gebruiker de juiste gegevens invoert, dat wil zeggen een string van maximaal 15 tekens, werkt het programma goed, als we een onjuist "wachtwoord" invoeren, zal het ons laten zien Toegang geweigerd, en als we "Toets"Zal ons zetten" Succes. Laten we een opname zien die het programma 2 keer uitvoert, een keer met onjuiste toegang en een andere met de juiste tekenreeks:

We zien dat alles naar behoren werkt. Maar wat als we een bovenste tekenreeks invoegen, laten we eens kijken wat er gebeurt:

We hebben het programma gelanceerd met 20 letters A, en laat ons zien Succes. In deze applicatie hebben we niets, we sluiten gewoon de applicatie af, maar we hebben toegang gekregen tot een beperkt gebied zonder het wachtwoord te kennen. Als we de volgende functie vervangen:

 strcpy (buffer, str);
Door het volgende:
 strncpy (buffer, str, 15);
Y we voeren de code uit met 20 letters A, hebben we de volgende uitvoer:

U kunt ook zien dat wij gebruik maken van strcmp, in plaats daarvan zouden we moeten gebruiken strncmp, dus we controleren ook de grootte. We hebben gecontroleerd dat er maximaal 15 tekens kunnen worden gekopieerd, dus het heeft geen invloed op ons programma als ze meer invoegen. Als na het weergeven van het bericht Succes we voeren een systeemopdracht uit (in dit geval: wie ben ik), verkrijgen we de informatie:

Hierboven zijn we geen root, maar als we het uitvoeren met sudo, krijgen we het volgende:

Het enige dat we hebben toegevoegd is een regel in de code die we hierboven zagen, onder de regel code:

 printf ("Succes \ n");
We hebben gezet:
 systeem ("whoami");
Om een ​​beetje te begrijpen wat er is gebeurd, ga ik het programma aanpassen om de 2 variabelen te tonen die we hebben (buffer Y N) of het correct is of niet, en hieronder is de uitvoer, de eerste die we invoegen een string die als correct zal worden behandeld ("Toets”), dan een verkeerde die de lengte niet overschrijdt en tot slot de 20 letters A:

We zien dat het in de eerste uitvoering de moeite waard is 1 de variabele N, omdat de doorgegeven ketting de juiste is, in de tweede is het de moeite waard 0, omdat het verkeerd is, maar in de laatste is het de moeite waard 1094795585, waardoor de voorwaarde wordt overgeslagen die we stellen als (n), zal het waar zijn zolang n anders is dan 0. Het is geen goede voorwaarde, hoewel het niet zou hoeven mislukken als de rest van de code correct was. Als we zetten 16 letters A als parameter zullen we zien dat de waarde van de variabele N het is 65:

Als we kijken naar de ASCII-code, het nummer 65 komt overeen met de letter TOT, hebben we gezien dat het geheugen van de variabele n per ongeluk door ons is aangeraakt, die extra letter die we als parameter hebben doorgegeven is naar de variabele gegaan N. We zouden het geheugen als volgt hebben:

Als we verder gaan dan tekens, kan het zijn dat het ons een segmentovertredingsbericht stuurt (als we de uitgang (0) wat hebben we in de als (n)), kunnen we het zien in de volgende afbeelding:

Deze waarschuwing is het gevolg van een poging om toegang te krijgen tot een geheugengebied dat buiten de limieten valt van het gebied dat door het besturingssysteem aan de toepassing is toegewezen. Als we het voorbeeld als volgt hebben samengesteld:

 gcc overflow.c -o overflow -fstack-protector
Of gewoon verwijderen -fno-stack-beschermer Uit de compilatie die we de eerste keer zagen, en we voeren de code uit met overflow, krijgen we het volgende resultaat:

Een extra bescherming die gcc ons biedt.

OpmerkingAls we een code willen uitvoeren (shellcode) zouden we het retouradres moeten overschrijven met dat van onze shellcode, het is iets complexer dan het voorbeeld in de tutorial en vereist daarom meer werk.

Als iemand misbruik weet te maken van deze kwetsbaarheid, kan dit je veel schade aanrichten. Voorkom dit soort storingen en dat een kwaadwillende gebruiker hiervan kan profiteren is heel eenvoudig, programmeer correct, u moet de programmeertaal die wordt gebruikt goed kennen, weten welke functies u wel en niet moet gebruiken, test de applicatie nou ja, niet alleen met correcte data, het moet ook correct werken als we te maken hebben met onvoorziene data.

Andere aanvallen die u kunt bekijken en waarvan u op de hoogte bent, zodat ze u niet beïnvloeden of hun risico's minimaliseren, zijn: DoS en Brute Force. En vergeet niet de CVE-pagina te controleren op kwetsbaarheden.

Vond je deze Tutorial leuk en heb je eraan geholpen?Je kunt de auteur belonen door op deze knop te drukken om hem een ​​positief punt te geven
wave wave wave wave wave