În acest tutorial vom vorbi despre depășirea bufferului (Buffer Overflow), un eșec care a existat de mult timp, apare atunci când datele copiate într-o zonă de memorie (care a fost rezervată anterior) nu sunt verificate corect, poate că aplicația funcționează corect dacă utilizatorul introduce date cu un dimensiune adecvată, dar dacă rezervăm memorie pentru 15 caractere și utilizatorul introduce 20, aceasta va afecta o altă zonă de memorie, care poate fi sau nu rezervată.
Acest lucru poate face ca programul nostru să se blocheze, dar poate fi și mai rău, un utilizator cu intenții rău intenționate poate profita de această eroare și poate influența funcționarea aplicației sau poate executa cod arbitrar pe un computer (în mod normal, acest cod va deschide un interpret de comenzi ). De asemenea, dacă programul rulează cu privilegii ridicate, avem o eroare gravă de securitate. Un alt atac care poate modifica funcționarea unei aplicații sau poate injecta cod este XSS.
NotăExecuțiile pe care le veți vedea de-a lungul acestui tutorial au fost efectuate în sistemul de operare Ubuntu 16.04 pe 32 de biți.
Să vedem un Exemplu simplu de cod C care este vulnerabil la acest atac, la lansarea programului trebuie să trecem un parametru, aplicația așteptați să primiți un șir de maximum 15 caractere, dacă este șirul așteptat, va fi un acces reușit, dacă nu, va fi „refuzat”. Codul este așa cum se arată mai jos:
#include #include #define password "Test" void test (char * str) {char buffer [15]; int n = 0; strcpy (tampon, str); if (strcmp (tampon, parolă) == 0) {n = 1; } if (n) {printf ("Succes \ n"); ieșire (0); } else {printf ("Acces refuzat \ n"); }} int main (int argc, char * argv []) {if (argc <2) {printf ("Aplicația necesită un parametru \ n"); ieșire (-1); } test (argv [1]); }Programul poartă numele debordare.c, și pentru a compila următoarele au fost utilizate:
gcc overflow.c -o overflow -fno-stack-protectorUltima parte: -fno-stack-protector Se folosește astfel încât compilatorul să nu pună protecție și putem arăta exemplul. Dacă utilizatorul introduce date corecte, care este un șir de maximum 15 caractere, programul funcționează bine, dacă introducem o „parolă” incorectă ne va arăta Acces interzisși dacă punem „Test”Ne va pune Succes. Să vedem o captură care execută programul de 2 ori, o dată cu acces incorect și alta cu șirul corect:
Vedem că totul funcționează corect. Dar dacă introducem un șir superior, să vedem ce se întâmplă:
Am lansat programul cu 20 de litere A., și ne arată Succes. În această aplicație nu avem nimic, pur și simplu ieșim din aplicație, dar am accesat o zonă restricționată fără să știm parola. Dacă înlocuim următoarea funcție:
strcpy (tampon, str);Prin următoarele:
strncpy (tampon, str, 15);Da executăm codul cu 20 de litere A, avem următoarea ieșire:
De asemenea, puteți vedea că folosim strcmp, în schimb, ar trebui să folosim strncmp, deci controlăm și dimensiunea. Am controlat că numai maximum 15 caractere pot fi copiate, deci nu afectează programul nostru dacă inserează mai multe. Dacă după afișarea mesajului Succes executăm o comandă de sistem (în acest caz cine sunt), obținem informațiile:
Mai sus nu suntem root, dar dacă îl executăm cu sudo, obținem următoarele:
Singurul lucru pe care l-am adăugat este o linie din cod pe care am văzut-o mai sus, sub linia de cod:
printf ("Succes \ n");Am pus:
sistem ("whoami");Pentru a înțelege puțin ce s-a întâmplat, voi modifica programul pentru a afișa cele 2 variabile pe care le avem (tampon Da n) dacă este corect sau nu, iar mai jos este rezultatul, primul inserăm un șir care va fi tratat ca fiind corect („Test”), Apoi una incorectă care nu depășește lungimea și în cele din urmă 20 litere A.:
Vedem că în prima execuție merită 1 Variabila n, deoarece lanțul trecut este cel corect, în al doilea merită 0, pentru că este greșit, dar în ultimul merită 1094795585, ceea ce face ca sări peste condiția pe care o punem dacă (n), va fi adevărat atâta timp cât n este diferit de 0. Nu este o stare bună, deși nu ar trebui să eșueze dacă restul codului ar fi corect. Dacă punem 16 litere A. ca parametru vom vedea că valoarea variabilei n este 65:
Dacă ne uităm la codul ASCII, numărul 65 corespunde literei LA, am văzut că memoria variabilei n a fost atinsă accidental de noi, acea literă suplimentară pe care am trecut-o ca parametru a trecut la variabilă n. Am avea memoria după cum urmează:
Dacă depășim caracterele, este posibil să ne trimită un mesaj de încălcare a segmentului (dacă eliminăm ieșire (0) ce avem în dacă (n)), o putem vedea în următoarea imagine:
Acest avertisment se datorează unei încercări de a accesa o zonă de memorie care se află în afara limitelor celei atribuite de sistemul de operare aplicației. Dacă am compilat exemplul după cum urmează:
gcc overflow.c -o overflow -fstack-protectorSau doar eliminarea -fno-stack-protector Din compilația pe care am văzut-o prima dată și executăm codul cu overflow, obținem următorul rezultat:
O protecție suplimentară pe care ne-o oferă gcc.
NotăDacă am vrea să executăm un cod (shellcode) ar trebui să suprascriem adresa de returnare cu cea a shellcode-ului nostru, este ceva mai complexă decât exemplul văzut în tutorial și, prin urmare, necesită mai multă muncă.
Dacă cineva reușește să profite de această vulnerabilitate, aceasta vă poate provoca multe daune. Evitați să aveți acest tip de eșec și că un utilizator rău intenționat poate profita de acest lucru este foarte ușor, programați corect, trebuie să știți bine limbajul de programare care este utilizat, să știți ce funcții să utilizați și ce să nu utilizați, testați aplicația Ei bine, nu numai cu date corecte, ci trebuie să funcționeze corect și atunci când avem de-a face cu date neprevăzute.
Alte atacuri pe care le puteți revizui și conștientiza astfel încât să nu vă afecteze sau să-și minimizeze riscurile sunt: DoS și Brute Force. Și nu uitați să verificați pagina CVE pentru vulnerabilități.
V-a plăcut și ați ajutat acest tutorial?Puteți recompensa autorul apăsând acest buton pentru a-i oferi un punct pozitiv