TCP Hijacking - O variantă a atacului Man -in-the-Middle, în care un atacator este capabil să spioneze pachetele membrilor rețelei și să trimită propriile pachete în rețea. Atacul folosește caracteristicile de stabilire a conexiunii ale protocolului TCP și poate fi efectuat atât în timpul unei „strângeri de mână triple”, cât și în timpul unei conexiuni stabilite.
Problema posibilei falsificare a mesajelor TCP este importantă, întrucât analiza protocoalelor FTP și TELNET implementate pe baza protocolului TCP a arătat că problema identificării pachetelor FTP și TELNET este în întregime atribuită de aceste protocoale nivelului de transport, adică , la TCP.
Pentru a identifica un pachet TCP în antetul TCP, există doi identificatori pe 32 de biți care joacă, de asemenea, rolul unui contor de pachete - Numărul de secvență și Numărul de confirmare. În cazul în care gazda A dorește să stabilească o conexiune TCP cu gazda B, așa-numita. „strângere de mână triplă”, în timpul căreia gazdele schimbă următoarele pachete:
Acest pachet finalizează configurarea conexiunii, astfel încât în următorul pachet gazda A trimite informații utile gazdei B
Având în vedere schema de configurare a conexiunii descrisă mai sus, puteți vedea că singurii identificatori prin care gazda finală poate distinge între abonații TCP și conexiunile TCP sunt câmpurile Număr de secvență și Număr de confirmare. Astfel, dacă un atacator determină valorile ISSa și ISSb pentru o anumită conexiune, atunci el poate genera un pachet TCP fals care va fi acceptat și procesat de gazda finală.
Un tip de atac implică faptul că atacatorul încorporează bitul de control RST (Resetare) în pachetul TCP. Conform RFC 793 , acest flag îi spune gazdei țintă să renunțe la conexiunea fără alte comunicații. Pe baza câmpului Număr de secvență, gazda țintă determină dacă să proceseze sau să ignore comanda de resetare, iar țintei îi este interzis să trimită un răspuns cu bitul RST setat. Este important de reținut că gazda țintă autentifică doar cererea RST în raport cu numărul de secvență și închide conexiunea dacă se încadrează în fereastra TCP curentă. Și în timp ce gazda țintă poate calcula numărul de confirmare, nu este necesar să facă acest lucru, iar majoritatea stivelor TCP pur și simplu ignoră acest pas.
Un pachet RST primit va termina întotdeauna conexiunea. Conexiunile pe termen lung, cum ar fi conexiunile BGP între routere, sunt extrem de vulnerabile la astfel de atacuri. În primul rând, atacatorul va avea suficient timp pentru a implementa un pachet atent planificat și, pe de altă parte, DoS va provoca pierderi uriașe . Routerele trebuie să reconfigureze tabelul vecin, ceea ce poate dura câteva minute în viața reală.
Mai puțin evident este faptul că și steag-ul SYN poate bloca conexiunea. Conform RFC 793 , atunci când steag-ul SYN este setat atunci când se stabilește o conexiune, câmpul Număr de secvență conține o valoare inițială care va fi utilizată mai târziu. Dacă un pachet SYN este primit ulterior pe această conexiune, RFC 793 va trata acest lucru ca pe o eroare. Ca urmare, destinatarul va trebui să anuleze conexiunea prin trimiterea unui pachet RST. Spre deosebire de un pachet RST, gazda va răspunde la un pachet SYN prin trimiterea unui pachet RST. Acest lucru deschide posibilitatea unui alt atac DoS. Atacatorul poate folosi ulterior lățimea de bandă a victimei. Acest atac are succes în special pe liniile ADSL .
În timp ce atacurile RST și SYN nu folosesc încărcătura utilă a unei datagrame IP , o a treia tehnică injectează datele într-o conexiune existentă. Atacatorul poate introduce orice date care vor determina întreruperea conexiunii sau poate crea cu atenție date care vor duce la o stare de eroare sau poate îndeplini o anumită funcție în beneficiul atacatorului. Este posibil ca victima să nu observe aceste manipulări. De exemplu, protocoalele FTP și TelNET nu verifică adresa IP a expeditorului și, prin urmare, dacă o solicitare TCP falsă este generată cu succes, vor răspunde la adresa IP reală a atacatorului, care va intercepta complet conexiunea.
Deci, pentru a efectua un atac, trebuie să cunoașteți doi parametri de conexiune TCP. În cazul în care un atacator poate asculta direct canalul de comunicație dintre gazdele A și B, acești parametri sunt determinați printr-o simplă analiză a traficului. În caz contrar, trebuie să apelezi la metode mai complexe.
Această metodă se bazează pe presupunerea că alegerea parametrilor inițiali ISSa și ISSb (așa-numitul ISN - Initial Sequence Number) atunci când se stabilește o conexiune depinde într-un fel de timp. Cel mai bine ar fi din punct de vedere al securității să alegeți un ISN complet arbitrar, ceea ce ar face predicția practic inaplicabilă, totuși, în descrierea protocolului TCP din RFC 793, se recomandă creșterea valorii acestui contor. cu 1 la fiecare 4 microsecunde, ceea ce face ca predicția acestei valori să fie banală. În practică, analiza codului sursă al nucleelor Linux mai vechi , precum și comportamentul sistemului de operare Windows NT 4.0 și versiuni anterioare, confirmă dependența funcțională a valorii ISN alese la timp.
În cazul general, dacă o astfel de dependență există, aceasta va fi exprimată printr-o formulă de forma ISN = F(mcsec), unde mcsec este numărul de microsecunde în funcție de ceasul hardware al sistemului de operare studiat.
Astfel, atacatorul trebuie să efectueze o analiză a funcției valorii ISN atribuite în funcție de timp. Pentru a face acest lucru, o serie de solicitări obișnuite pentru a crea o conexiune TCP sunt trimise către sistemul de operare al rețelei în studiu și se primește numărul corespunzător de răspunsuri cu valorile curente ale ISN-ului sistemului de operare în fiecare moment. În același timp, se măsoară intervalele de timp (în microsecunde) pentru sosirea răspunsurilor la cereri. Construind un tabel al dependenței ISN-urilor obținute de timpul t care a trecut de la începutul experimentului și aproximându-l cu orice instrumente matematice, obținem, cu o eroare comparabilă cu eroarea datelor inițiale, un continuu funcţie de modificarea ISN din t, valabilă pentru un interval de timp dat: ISN(t) = F (t);
Această formulă ne va permite să folosim valoarea ISN anterioară, prin măsurarea timpului scurs de la numirea acestuia, pentru a obține valoarea ISN curentă la momentul dat.
În viitor, atacatorul trebuie doar să monitorizeze comportamentul gazdelor investigate și, după ce a calculat momentul creării conexiunii, să estimeze aproximativ intervalul de valori ale valorilor ISSa și ISSb alese de gazde. Deoarece această metodă este aproximativă, o anumită enumerare nu poate fi evitată, totuși, modelarea matematică permite multe ordine de mărime (de la ~ la ~ ) pentru a reduce numărul de pachete necesare unui atacator pentru a efectua un atac cu succes.
Cu toate acestea, nu este întotdeauna posibil să se facă o evaluare matematică preliminară a valorilor ISN. De asemenea, în unele cazuri, valoarea este aleasă să fie mai mult sau mai puțin independentă de timp și, prin urmare, evaluarea matematică este dificilă sau imposibilă. În acest caz, trebuie să recurgem la metode mai brute, cum ar fi enumerarea tuturor valorilor posibile ale acestor parametri. Cu toate acestea, după un studiu atent al standardului RFC 793 , situația este oarecum simplificată.
Primul lucru de menționat este mecanismul de ferestre din protocolul TCP. Pachetele se pot depăși reciproc atunci când sunt distribuite pe Internet. Pentru a nu pierde pachetele sosite mai devreme decât predecesorii, destinatarul stabilește o așa-numită fereastră în care poate restabili ordinea pachetelor. Astfel, dacă valoarea câmpului Număr de secvență se află în fereastra receptorului, TCP va accepta și procesa acest pachet. Acest lucru reduce foarte mult numărul de încercări pe care atacatorul trebuie să le facă: scade de la la .
În funcție de sistemul de operare, dimensiunea ferestrei poate varia între octeți ( Windows XP cu SP2 ) și 5840 octeți ( kernel Linux 2.4 și 2.6).
Fereastra va reduce numărul de numere de secvență pe care atacatorul trebuie să le folosească. În cazul Windows XP, acest număr scade la . Cu alte cuvinte, atacatorul ar trebui doar să genereze pachete de atac pentru a injecta pachetul RST și astfel să blocheze conexiunea. Acesta este un număr foarte mic.
Lucrurile se înrăutățesc și dacă participanții la conexiune acceptă o fereastră redimensionabilă. Această caracteristică TCP crește probabilitatea de a găsi un număr de secvență adecvat într-un timp scurt. Redimensionarea ferestrei este destinată conexiunilor care necesită o fereastră mai mare din cauza latenței mari sau a lățimii de bandă ocupate. Pentru a permite tuturor să transmită fără suprapuneri, această tehnologie extinde dimensiunea ferestrei la 14 biți (Microsoft Windows), adică la .
Cu toate acestea, atacatorul va trebui să depășească încă un obstacol: adresa IP/ port quad sursă și destinație . Adresa IP nu este o problemă – atacatorul știe de obicei pe cine vizează; portul de destinație este de asemenea ușor de determinat. Este puțin mai dificil să determinați portul sursă, care teoretic poate varia de la 0 la 65535. În practică, porturile sub 1024 și peste pragul determinat de sistemul de operare sunt rezervate pentru sarcini speciale.
Linux cu versiunea de nucleu 2.4 sau 2.6 utilizează numere de la până la ca port de expeditor .
Spre plăcerea atacatorului, opțiunile rămase nu sunt distribuite aleatoriu; nucleul le distribuie după o schemă specifică. Astfel, atacatorul nu va avea prea multe probleme în a prezice portul sursă. Există doar câteva excepții, cum ar fi OpenBSD , care le alocă în mod arbitrar. De exemplu, Windows XP pornește la portul pentru prima conexiune și crește portul cu 1 pentru fiecare conexiune ulterioară. Linux ( Fedora Core 3 cu nucleul 2.6.9 în special) cu creșteri din nou în ordine. Sistemele Cisco măresc valoarea portului cu 512 pentru fiecare nouă conexiune, dar acest lucru nu face mecanismul mai sigur.
Un atacator nu trebuie să ghicească numărul portului dacă este cunoscut numărul de conexiuni de pe computerul victimei. Tot ce trebuie să facă un atacator este să înceapă cu prima valoare și să încerce, să zicem, 50 de porturi. De asemenea, nu este dificil pentru un atacator să afle sistemul de operare al victimei. Deci, de fapt, definirea portului nu este un obstacol serios.