Et kig på udnyttelse af sårbarheder

Da jeg glædede mig til at fortsætte med at diskutere dette emne, lad mig fortælle dig lidt historie, teori og praksis om sårbarheder. Vi har alle hørt nu, at sikkerhedsfejl kan koste meget, vi ved alle, at vi skal holde vores software opdateret, vi ved alle, at mange opdateringer er forårsaget af sikkerhedsfejl. Men i dag vil jeg fortælle dig lidt om, hvordan disse fejl findes og udnyttes 🙂 Men inden dette skal vi afklare et par detaljer for at få et bedre overblik.

Før du starter

Først vil jeg fortælle dig, at vi vil fokusere på den første sårbarhed, som jeg lærte at udnytte, den kendte Bufferoverløb, i denne sårbarhed drager vi fordel af manglende hukommelsesverifikation til at gøre sjove ting 🙂 Men lad os afklare lidt mere om det.

Dette bliver ikke et virkeligt verdensscenarie

Jeg har ikke råd til at lære dem at bryde ethvert program, de ser - først fordi det er farligt for deres computere, for det andet fordi det ville tage mere end min sædvanlige ordkvote.

Vi tager på en tur til 80'erne

Hvad jeg skal vise dig, kan jeg gøre på min bærbare computer, men det betyder ikke, at det kan gøres i dag på en enkel måde 🙂 mange af disse begreber er allerede blevet udnyttet så mange gange, at nye beskyttelsesmetoder og nye metoder til at undgå dem er dukket op 😛 men det returnerer os til det samme sted, der er ikke plads til at kunne fortælle alt det 🙂

Det fungerer muligvis ikke på din processor

Selvom jeg skal bruge et meget simpelt eksempel, vil jeg have det helt klart fra begyndelsen, at detaljerne i dette er så mange og så varierede, at ligesom det kan komme ud på samme måde som mig, hvis du vil prøve det , den ønskede effekt kan muligvis heller ikke opnås 🙂 Men du kan forestille dig, at jeg ikke kan forklare det i dette rum, især fordi jeg med denne introduktion allerede har taget mere end 300 ord, så vi kommer lige til vores punkt.

Hvad er en Bufferoverløb

For at besvare dette skal vi først forstå den første halvdel af denne kombination.

Buffere

Da alt handler om hukommelse på en computer, er det logisk, at der skal være en slags informationsbeholder. Når vi taler om indgange udgange, kommer vi direkte til begrebet buffere. For at holde det kort, a buffer Det er et hukommelsesrum af defineret størrelse, hvor vi skal gemme en mængde information, simpel 🙂

Overløb opstår, som navnet antyder, når en buffer fylder med mere information, end den kan håndtere. Men hvorfor er dette vigtigt?

Stak

Også kendt som stakke, de er en abstrakt datatype, som vi kan stak information, deres vigtigste egenskab er, at de har en ordre LIFO (Last In First Out). Lad os tænke et sekund på en stak plader, vi lægger dem ovenpå en efter en, og så tager vi dem ud en efter en fra toppen, dette gør den sidste plade, vi har lagt (den der er øverst ) er den første plade, vi skal tage ud, selvfølgelig hvis vi kun kan tage en plade ad gangen, og vi beslutter at gøre det i den rækkefølge: P.

Nu hvor du kender disse to koncepter, er vi nødt til at sætte dem i orden. Stakke er vigtige, fordi hvert program, vi kører, har sit eget udførelsesstak. Men denne stak har en særlig egenskabvokser ned. Det eneste du skal vide om dette er, at mens et program kører, når en funktion kaldes, går stakken fra et tal X i hukommelsen til et nummer (Xn). Men for at fortsætte skal vi forstå endnu et koncept.

Markører

Dette er et koncept, der gør mange programmerere vanvittige, når de starter i C's verden, faktisk skyldes den store kraft ved C-programmering delvis brugen af ​​pegepinde. For at holde det enkelt, en markør peger på en hukommelsesadresse. Dette lyder komplekst, men det er ikke komplekst, vi har alle RAM i vores maskiner, ikke? Nå, dette kan defineres som en fortløbende arrangement af blokke, udtrykkes disse placeringer normalt i hexadecimale tal (fra 0 til 9 og derefter fra A til F, såsom 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Her som en nysgerrig note, 0x10 INGEN er lig med 10 😛 hvis vi konverterer det til decimalrækkefølge, ville det være det samme som at sige 15. Dette er noget, der også forvirrer mere end en i starten, men lad os komme ned til det.

Records

Processorer arbejder med et antal registros, der arbejder for at overføre placeringer fra fysisk hukommelse til processoren, for arkitekturer, der bruger 64-bit, er antallet af registre stort og svært at beskrive her, men for at få ideen er registre som pegepinde, de angiver blandt andet , et hukommelsesrum (placering).

Øv dig nu

Jeg ved, at det har været meget information at behandle indtil nu, men i virkeligheden er det noget komplekse spørgsmål, som jeg forsøger at forklare på en meget enkel måde, vi vil se et lille program, der bruger buffere, og vi skal bryde det for at forstå dette om overløb, dette er naturligvis ikke Det er et rigtigt program, og vi vil "undgå" mange af de modforanstaltninger, der bruges i dag, bare for at vise, hvordan ting blev gjort før 🙂 og fordi nogle af disse principper er nødvendige for at kunne lære mere komplekse ting complex

GDB

Et godt program, der utvivlsomt er et af de mest anvendte af C. programmører. Blandt dets mange dyder har vi det faktum, at det giver os mulighed for at se alt dette, som vi hidtil har talt om, registre, stakken, buffere osv. 🙂 Lad os se det program, som vi skal bruge til vores eksempel.

retinput.c

Egen. Christopher Diaz Riveros

Dette er et ret simpelt program, vi skal bruge biblioteket stdio.h for at kunne få information og vise dem i en terminal. Vi kan se en funktion kaldet return_input som genererer en buffer kaldet matrix, som har en længde på 30 bytes (char-datatypen er 1 byte lang).

Funktionen gets(array); anmode om information efter konsol og funktion printf() returnerer arrayets indhold og viser det på skærmen.

Hvert program skrevet i C begynder med funktionen main(), dette vil kun være ansvarlig for at kalde return_input, nu skal vi kompilere programmet.

Egen. Christopher Diaz Riveros

Lad os tage lidt af det, jeg lige har gjort. Muligheden -ggdb fortæller gcc at kompilere programmet med information til gdb for at kunne fejle korrekt. -fno-stack-protector Det er en mulighed, som vi naturligvis ikke skal bruge, men som vi skal bruge, fordi det ellers ville være muligt at generere bufferoverløbet i stakken. Til sidst har jeg testet resultatet. ./a.out det kører bare det, jeg lige har kompileret, det beder om information og returnerer det. Løb 🙂

advarsler

En anden note her. Kan du se advarslerne? klart det er noget at tage i betragtning, når vi arbejder med kode eller kompilering, dette er lidt indlysende, og der er få programmer, der i dag har funktionen gets() I koden. En fordel ved Gentoo er, at ved at sammensætte hvert program kan jeg se, hvad der kan være galt, et "ideelt" program burde ikke have dem, men du vil blive overrasket over, hvor mange store programmer der har disse advarsler, fordi de bare er MEGET store, og det er svært at holde styr på dem. farlige funktioner, når der er mange advarsler på samme tid. Nu hvis vi fortsætter

Fejlfinding af programmet

Egen. Christopher Diaz Riveros

Nu kan denne del være lidt forvirrende, men da jeg allerede har skrevet nok, har jeg ikke råd til at forklare alt, så undskyld, hvis du ser, at jeg går for hurtigt 🙂

Frakobling af koden

Lad os starte med at se på vores kompilerede maskinsprogsprogram.

Egen. Christopher Diaz Riveros

Dette er koden for vores hovedfunktion i Assembly, dette er hvad vores processor forstår, linjen til venstre er den fysiske adresse i hukommelsen <+ n> er kendt som offset, dybest set afstanden fra begyndelsen af ​​funktionen (hoved) til denne erklæring (kendt som opcode). Derefter ser vi typen instruktion (push / mov / callq ...) og et eller flere registre. Sammenfattet kan vi sige, at det er indikationen efterfulgt af kilde / oprindelse og destination. <return_input> refererer til vores anden funktion, lad os tage et kig.

return_input

Egen. Christopher Diaz Riveros

Dette er lidt mere komplekst, men jeg vil bare have dig til at kontrollere et par ting, der er et mærke kaldet <gets@plt> og en sidste opkode kaldet retq angiver slutningen af ​​funktionen. Vi vil sætte et par breakpoints, en i funktionen gets og en anden i retq.

Egen. Christopher Diaz Riveros

Kør

Nu skal vi køre programmet for at se, hvordan handlingen begynder.

Egen. Christopher Diaz Riveros

Vi kan se, at der vises en lille pil, der indikerer opkoden, hvor vi er, jeg vil have dem til at tage højde for retningen 0x000055555555469b, dette er adressen efter opkaldet til return_input i funktion main , dette er vigtigt, da det er her, programmet skal vende tilbage, når du er færdig med at modtage indgang, lad os komme ind i funktionen. Nu skal vi kontrollere hukommelsen, inden vi går ind i funktionen gets.

Egen. Christopher Diaz Riveros

Jeg har sat hovedfunktionen tilbage til dig, og jeg har fremhævet den kode, jeg henviste til, som du kan se på grund af endighed er blevet opdelt i to segmenter, vil jeg have dig til at tage hensyn til retningen 0x7fffffffdbf0 (den første fra venstre efter kommandoen x/20x $rsp) da dette er det sted, vi skal bruge til at kontrollere get-resultatet, lad os fortsætte:

Bryder programmet

Egen. Christopher Diaz Riveros

Jeg har fremhævet dem 0x44444444fordi de er repræsentationen af ​​vores D'er 🙂 nu er vi begyndt at tilføje indgang til programmet, og som du kan se, er vi kun to linjer fra vores ønskede adresse, vi skal udfylde det, indtil vi er lige før adresserne, som vi fremhævede i det forrige trin.

Ændring af returstien

Nu hvor det er lykkedes os at indtaste dette afsnit af koden, hvor det angiver funktionens returnering, lad os se, hvad der sker, hvis vi ændrer adressen 🙂 i stedet for at gå til placeringen af ​​opkoden, der følger den, vi havde for et øjeblik siden, hvad synes du, hvis vi går tilbage til return_input? Men til dette er det nødvendigt at skrive den adresse, vi ønsker i binær, vi skal gøre det med funktionen printf fra bash 🙂

Egen. Christopher Diaz Riveros

Nu har vi modtaget oplysningerne to gange 😀 programmet var bestemt ikke lavet til det, men det er lykkedes os at bryde koden og få den til at gentage noget, som det ikke skulle gøre.

Refleksioner

Denne enkle ændring kan betragtes som en udnytte meget grundlæggende 🙂 han har formået at bryde programmet og gøre noget, vi vil have ham til at gøre.

Dette er bare det første trin i en næsten uendelig liste over ting at se og tilføje, der er måder at tilføje flere ting end blot at gentage en ordre, men denne gang har jeg skrevet meget og alt relateret til skalkodning Det er et emne at skrive mere end artikler, komplette bøger, vil jeg sige. Beklager, hvis jeg ikke har været i stand til at fordybe mig lidt mere i emner, som jeg gerne ville have, men der vil helt sikkert være en chance 🙂 Hilsner og tak for, at du er kommet her.


14 kommentarer, lad dine

Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   2p2 sagde han

    Vær mere direkte. Skriv mindre og fokuser på det der betyder noget

    1.    ChrisADR sagde han

      Hej, tak for kommentaren.

      For at fortælle sandheden har jeg skåret en god del af idéer, men alligevel syntes det mig, at jeg forlod minimumet, så nogen, der ikke har programmeringskendskab, kan få en idé.

      hilsen

      1.    Anonymous sagde han

        Problemet er, at de, der ikke har programmeringsviden, ikke finder ud af noget, fordi det er for komplekst til at begynde med, men de, der ved, hvordan man programmerer, sætter pris på at være mere direkte.

        Jeg antager, at du ikke kan nå ud til alle, du skal vælge, og i dette tilfælde har du syndet for at dække meget.

        Forresten, jeg fortæller dig som en konstruktiv kritik, jeg elsker disse emner, og jeg vil gerne have, at du fortsætter med at skrive artikler, tillykke!

    2.    Anonymous sagde han

      Jeg synes det samme.

      1.    ChrisADR sagde han

        Mange tak til begge dele !! det er bestemt svært at forstå, hvordan man når ud til målgruppen, når sandheden er, at antallet af personer med et avanceret programmeringsniveau, der læser disse artikler, er lille (i det mindste kan man udlede på baggrund af kommentarerne)

        Jeg har bestemt syndet fra at ville forenkle noget, der kræver en bred videnbase for at blive forstået. Jeg håber, du forstår, at da jeg lige er begyndt at blogge, har jeg endnu ikke opdaget det nøjagtige punkt, hvor mine læsere kender og forstår, hvad jeg siger. Det ville gøre det meget lettere at fortælle sandheden 🙂

        Jeg vil prøve at være kortere, når det fortjener uden at personalisere formatet, da det er lidt mere kompliceret at adskille skrivemåden fra indholdet, end man måske forestiller sig, jeg har dem i det mindste ret sammenkædede, men jeg formoder, at jeg i sidste ende vil være i stand til for at tilføje linjer i stedet for at skære indhold.

        hilsen

  2.   Mario sagde han

    Hvor kunne du vide mere om emnet? Enhver anbefalet bog?

    1.    ChrisADR sagde han

      Eksemplet, jeg fik fra The Shellcoder's Handbook af Chris Anley, John Heasman, Felix Linder og Gerardo Richarte, men for at udføre 64-bit oversættelsen måtte jeg lære mere om min arkitektur, Intel-udviklerhåndbogen, bind 2 og 3 er en ret pålidelig kilde til det. Det er også godt at læse GDB-dokumentationen, der kommer med kommandoen 'info gdb'. For at lære samling og C er der mange meget gode bøger, bortset fra at forsamlingsbøgerne er lidt gamle, så der er et hul at udfylde med en anden type dokumentation.

      Selve shellkoden er ikke længere så effektiv i disse dage af forskellige årsager, men det er stadig interessant at lære nye teknikker.

      Håber det hjælper lidt 🙂 Hilsner

  3.   Franz sagde han

    Buen artículo, el viejo blog desdelinux ha vuelto a renacer =)
    Når du siger, at fjernskal ikke er så effektiv, mener du modforanstaltninger designet til at afbøde angreb, de kalder det stødende sikkerhed.
    Hilsen og fortsæt det

    1.    ChrisADR sagde han

      Mange tak Franz 🙂 meget venlige ord, faktisk mente jeg, at Shellcoding i dag er meget mere kompleks end det, vi ser her. Vi har ASLR (tilfældig hukommelsesplaceringsgenerator) stakbeskytteren, de forskellige tiltag og modforanstaltninger, der begrænser antallet af opkoder, der kan injiceres i et program, og det er kun begyndelsen.

      Regards,

  4.   Free Software sagde han

    Hej, vil du gøre en anden del, der udvider emnet? Det er interessant

    1.    ChrisADR sagde han

      Hej, emnet er bestemt ganske interessant, men det kompleksitetsniveau, som vi ville tage, ville blive meget højt og sandsynligvis involvere et stort antal indlæg for at forklare de forskellige forudsætninger for at forstå det andet. Jeg vil sandsynligvis skrive om det, men det vil ikke være følgende indlæg, jeg vil skrive et par emner inden jeg fortsætter med dette.

      Hilsner og tak for deling

  5.   kaktus sagde han

    Meget god che! Du bidrager med gode indlæg! Et spørgsmål, jeg starter denne IT-sikkerhed ved at læse en bog kaldet "Sikre sikkerhed ved pen-test." Anbefales denne bog? Hvordan foreslår du, at jeg begynder at forhøre mig om disse problemer?

    1.    ChrisADR sagde han

      Hej kaktus, det er et helt univers om sårbarheder og andre, for at sige sandheden afhænger det meget af, hvad der fanger din opmærksomhed, og de behov, du har, en it-manager behøver ikke at kende det samme som en pen-tester, Eller en forsker i sårbarhed eller en retsmedicinsk analytiker, et katastrofegendannelsesteam har et meget andet sæt færdigheder. Det er klart, at hver af dem kræver et andet niveau af teknisk viden, jeg anbefaler, at du begynder at opdage, hvad du kan lide, og begynder at fortære bøger, artikler og andre, og vigtigst af alt, øve alt, hvad du læser, selvom det er forældet, det vil gøre en forskel i sidste ende.
      Regards,

  6.   Eizen sagde han

    Hej.
    Mange tak for at forklare dette emne samt kommentere, at vi har "The Shellcoder's Handbook" for ekstra information. Jeg har allerede afventet læsning 😉