Cum să verificați un port folosind wireshark. Wireshark: un clasic pentru analiza pachetelor de rețea. Alte exemple de filtre

Original: Miros de rețea
Autor: Paul Cobbaut
Data publicării: 12 martie 2015
Traducere: A. Panin
Data transferului: 1 aprilie 2015

Capitolul 23. Interceptarea traficului de rețea

Administratorul de rețea trebuie să poată folosi un sniffer, cum ar fi wireshark sau tcpdump, pentru a diagnostica problemele de rețea.

De asemenea, elevul va trebui adesea să recurgă la utilizarea unui sniffer pentru a înțelege principiile funcționării rețelei. Acest capitol descrie tehnici adecvate pentru interceptarea traficului de rețea.

23.1. aplicația wireshark

23.1.1. Instalarea wireshark

Acest exemplu oferă o comandă pentru a instala aplicația wireshark pe distribuțiile care utilizează pachete software cu extensia .deb (inclusiv Debian, Mint, Xubuntu și alte distribuții).

Root@debian8:~# Citiți listele de pachete Terminat Construiți arborele de dependențe Citiți informațiile de stare Terminat... (ieșire scurtată)

Distribuțiile care utilizează pachete software .rpm, cum ar fi CentOS, RHEL și Fedora, pot folosi utilitarul yum pentru a instala aplicația wireshark.

# yum instalează wireshark Pluginuri încărcate: fastestmirror Vitezele de încărcare în oglindă din fișierul gazdă stocat în cache... (ieșire scurtată)

23.1.2. Selectarea unei interfețe de rețea

Când lansați aplicația wireshark pentru prima dată, va trebui să selectați interfața de rețea. Veți vedea un dialog care arată similar cu ilustrația de mai jos.

Este probabil ca pur și simplu să nu existe interfețe de rețea disponibile, deoarece în unele distribuții traficul de rețea poate fi interceptat exclusiv de utilizatorul root. În acest caz, va trebui să rulați aplicația wireshark ca root folosind comanda sudo wireshark.

Sau puteți urma recomandările generale și utilizați utilitarul tcpdump sau un alt instrument pentru a intercepta traficul și a scrie datele într-un fișier. Orice date interceptate pot fi analizate ulterior folosind aplicația wireshark.

23.1.3. Minimizarea traficului

În timpul procesului de interceptare a traficului de rețea, mii de pachete pot fi generate pe perioade foarte scurte de timp. Evident, un astfel de volum de date va complica analiza traficului. Încercați să ieșiți din această situație izolându-vă sniffer-ul în rețea. Opțiunea preferată este să interceptați traficul care trece prin interfața de rețea a unei rețele virtuale izolate care se află sub controlul dvs. deplin.

Dacă căutați instrumente pentru a intercepta traficul de rețea acasă, poate fi util să închideți orice aplicație de rețea care rulează pe computerul dvs. și să vă deconectați computerul de la alte computere și dispozitive, cum ar fi smartphone-uri și tablete, pentru a minimiza traficul.

Cu toate acestea, un instrument mai important pentru minimizarea traficului sunt filtrele, care vor fi discutate în secțiunea următoare.

23.1.4. Interceptarea traficului generat de utilitarul ping

Am rulat sniffer-ul și am capturat toate pachetele trimise prin rețea ca urmare a trei comenzi ping (nu are sens să rulez aceste comenzi ca root):

Root@debian7:~# ping -c2 ns1.paul.local PING ns1.paul.local (10.104.33.30) 56(84) octeți de date. 64 octeți din 10.104.33.30: icmp_req=1 ttl=64 timp=0,010 ms 64 octeți din 10.104.33.30: icmp_req=2 ttl=64 timp=0,023 ms --- ns1.paul. , 2 primite, 0% pierdere de pachete, timp 1001 ms rtt min/avg/max/mdev = 0,010/0,016/0,023/0,007 ms root@debian7:~# ping -c3 linux-training.be PING linux-training.be (188.93.155.87) 56(84) octeți de date. 64 de octeți de la antares.ginsys.net (188.93.155.87): icmp_req=1 ttl=56 timp=15,6 ms 64 de octeți de la antares.ginsys.net (188.93.155.87): icmp_req=2 ttl=58 ms de timp=64 de octeți = 64 de octeți de la antares.ginsys.net (188.93.155.87): icmp_req=3 ttl=56 time=14.7 ms --- linux-training.be statistics ping --- 3 pachete transmise, 3 primite, 0% pierdere de pachete, timp 2003ms rtt min/avg/max/mdev = 14.756/16.110/17.881/1.309 ms root@debian7:~# ping -c1 centos7.paul.local PING centos7.paul.local (10.104.33.31) 56(84) octeți de date. 64 de octeți din 10.104.33.31: icmp_req=1 ttl=64 time=0.590 ms --- centos7.paul.local statistics ping --- 1 pachet transmis, 1 primit, 0% pierdere pachet, timp 0 ms rtt min/avg/max /mdev = 0,590/0,590/0,590/0,000 ms

În total, peste 200 de pachete au fost capturate din rețea. Totul va deveni mult mai evident dacă introduceți șirul icmp în câmpul de filtrare și faceți clic pe butonul „Aplicați”.

23.1.5. Interceptarea traficului generat de utilitarul ping și clientul dns

Lucrând cu aceeași sesiune de captare a datelor, putem aplica un filtru diferit. Dorim să monitorizăm traficul legat atât de protocolul dns, cât și de protocolul icmp, așa că va trebui să introducem numele celor două protocoale menționate în câmpul de filtrare.

Pentru a capta date legate de cele două protocoale în cauză, în câmpul de filtrare trebuie introdus șirul „dns sau icmp”. Dacă introduceți linia „dns și icmp”, nu vor fi afișate informații despre niciun pachet, deoarece nu există pachete legate de ambele protocoale menționate.

Privind ilustrația de mai sus, veți observa că pachetele 25 și 26 au adrese IP sursă și destinație de 10.104.33.30. Acest lucru se datorează faptului că clientul DNS rulează pe același computer cu serverul DNS.

O situație similară se observă și în cazul pachetelor 31 și 32, deoarece utilitarul ping este folosit pentru a trimite pachete către sistemul de lucru pe care rulează acest utilitar.

23.1.6. Adresă IP specifică

În acest caz, sunt filtrate pachetele legate de protocolul DNS și care conțin o anumită adresă IP. Șirul „ip.addr==10.104.33.30 și dns” este folosit ca filtru. Directiva și îi spune aplicației să imprime informații despre fiecare pachet care îndeplinește două condiții.

Pachetul 93 conține o interogare DNS care vizează obținerea înregistrării de tip A a domeniului linux-training.be. Pachetul 98 conține răspunsul de la serverul DNS. Ce credeți că s-a întâmplat după ce pachetul 93 a fost trimis și înainte ca pachetul 98 să fie primit? Încercați să răspundeți la această întrebare înainte de a citi secțiunea următoare (când lucrați cu sisteme diferite, este întotdeauna util să încercați să preziceți evenimentele viitoare și să verificați corectitudinea predicțiilor dvs.).

23.1.7. Filtrare bazată pe cadre

Termenul corect folosit pentru a se referi la un pachet interceptat este termenul cadru (datorită faptului că interceptăm pachetele la nivelul 2 al modelului de rețea OSI). Astfel, pentru a afișa informații despre pachetele cu numere specifice, ar trebui să utilizați directiva frame.number în câmpul de filtru.

23.1.8. Examinarea conținutului pachetului

Panoul din mijloc al ferestrei sniffer poate fi extins. Când selectați o linie în cadrul acestui panou, puteți vedea valorile octeților corespunzătoare în câmpul panoului inferior.

Ilustrația de mai jos arată panoul din mijloc al ferestrei sniffer cu adresa selectată a laptopului meu.

Rețineți că tehnica descrisă mai sus funcționează excelent atunci când interceptați traficul transmis printr-o singură interfață de rețea. Dacă capturați trafic, de exemplu, folosind comanda tcpdump -i orice, veți întâlni metoda de captare a pachetelor „Linux cooked capture”.

23.1.9. Alte exemple de filtre

Puteți combina cele două descrieri de protocol utilizând directiva logică sau operator plasată între ele. Ilustrația de mai jos arată cum să capturați numai pachetele legate de protocoalele ARP și BOOTP (sau DHCP).

Iar următoarea ilustrație arată o metodă de interceptare a pachetelor legate de protocolul DNS și care conțin o anumită adresă IP.

23.2. utilitarul tcpdump

Dacă lucrați cu interfața de linie de comandă a sistemului, interceptarea pachetelor poate fi efectuată folosind utilitarul tcpdump. Mai jos sunt câteva exemple de utilizare a acestuia.

Utilizarea comenzii tcpdump host $ip va afișa informații despre tot traficul legat de o anumită gazdă (în acest caz, adresa IP 192.168.1.38).

Root@ubuntu910:~# gazdă tcpdump 192.168.1.38 tcpdump: ieșire verbosă suprimată, utilizați -v sau -vv pentru ascultarea completă a decodării protocolului pe eth0, tip link EN10MB (Ethernet), dimensiunea capturii 96 de octeți

Interceptarea traficului legat exclusiv de protocolul ssh (protocol TCP, portul 22) poate fi efectuată folosind comanda tcpdump tcp port $port. Lungimea liniilor de ieșire a fost redusă la 76 de caractere pentru o citire mai ușoară.

Root@deb503:~# tcpdump tcp port 22 tcpdump: ieșire verbosă suprimată, utilizați -v sau -vv pentru ascultarea completă a decodării protocolului pe eth1, tip link EN10MB (Ethernet), dimensiunea capturii 96 octeți 14:22:20.716313 IP deb503. local.37973 > rhel53.local.ssh: P 666050963:66605 14:22:20.719936 IP rhel53.local.ssh > deb503.local.37973: P 1:49(48) ack 48 14: local. .ssh > deb503.local.37973: P 49:113(64) ack 14:22:20.721321 IP rhel53.local.ssh > deb503.local.37973: P 113:161(48) ack 14:221320. IP de 221:820. .local.37973 > rhel53.local.ssh: . ack 161 win 200 14:22:20.722492 IP rhel53.local.ssh > deb503.local.37973: P 161:225(64) ack 14:22:20.760602 IP deb503.local.37973.local >. ACK 225 WIN 200 14: 22: 23.108106 IP DEB503.LOCAL.54424> UBUNTU910.LOCAL.SSH: P 467252637: 46 14: 22: 23.116804 IP Ubuntu910.Local.ssh> Deb503.Local.54424: P 1:81 (80 ) ack 14:22:23.116844 IP deb503.local.54424 > ubuntu910.local.ssh: . ack 81 win 2 ^C 10 pachete capturate 10 pachete primite de filtru 0 pachete aruncate de kernel

Aceeași operație, dar scrierea datelor capturate într-un fișier, se poate face folosind comanda tcpdump -w $filename.

Root@ubuntu910:~# tcpdump -w sshdump.tcpdump tcp port 22 tcpdump: ascultare pe eth0, tip link EN10MB (Ethernet), dimensiune captură 96 octeți ^C 17 pachete capturate 17 pachete primite de filtru 0 pachete aruncate de kernel

Comanda tcpdump -r $filename poate tipări conținutul fișierului creat în exemplul anterior.

Root@ubuntu910:~# tcpdump -r sshdump.tcpdump

Multe alte exemple de utilizare a utilitarului în cauză pot fi găsite în pagina de manual tcpdump.

23.3. Sarcină practică: interceptarea traficului de rețea

23.4. Procedura corectă pentru îndeplinirea unei sarcini practice: interceptarea traficului de rețea

1. Instalați aplicația wireshark pe sistemul dvs. (nu rulează într-o mașină virtuală).

Pe distribuțiile Debain/Ubuntu: aptitude instalează wireshark

Pe distribuțiile Red Hat/Mandriva/Fedora: yum install wireshark

2. Utilizați utilitarul ping pentru a genera trafic între computerul dvs. și alt computer.

Ping $ip_address

3. Începeți să interceptați traficul de rețea.

(sudo)wireshark

Selectați interfața de rețea (probabil eth0)

4. Folosind filtrul, afișați informații numai despre acele pachete care conțin răspunsuri la solicitările de la utilitarul ping.

Introduceți „icmp” (fără ghilimele) în câmpul de filtru și faceți clic pe butonul „Aplicați”.

5. Acum transmiteți utilitarului ping un nume de domeniu (cum ar fi www.linux-training.be) și încercați să capturați pachetele de solicitare și răspuns DNS. Ce server DNS a fost folosit? A fost folosit TCP sau UDP pentru a transmite cererea și răspunsul?

Mai întâi de toate, lansați sniffer-ul.

Introduceți „dns” în câmpul de filtru și faceți clic pe butonul „Aplicați”.

Root@ubuntu910:~# ping www.linux-training.be PING www.linux-training.be (88.151.243.8) 56(84) octeți de date. 64 de octeți de la fosfor.openminds.be (88.151.243.8): icmp_seq=1 ttl=58 timp=14,9 ms 64 de octeți de la fosfor.openminds.be (88.151.243.8): icmp_seq=2 ttl=58 de timp ^=C16.08 ms --- www.linux-training.be Statistici ping --- 2 pachete transmise, 2 primite, 0% pierdere de pachete, timp 1002ms rtt min/avg/max/mdev = 14.984/15.539/16.095/0.569 ms

Fereastra aplicației wireshark ar trebui să arate similar.

Pe baza informațiilor din fereastra aplicației wireshark, putem concluziona că solicitarea DNS a fost transmisă folosind un pachet UDP, după care este ușor să răspundem la întrebările puse.

6. Găsiți un site web privat care are un formular de solicitare a parolei. Încercați să vă conectați folosind numele de utilizator „paul” și parola „hunter2” în timp ce snifferul rulează. Acum încercați să găsiți numele de utilizator și parola introduse în datele capturate de sniffer.

Fiecare membru al echipei ][ are propriile preferințe în ceea ce privește software-ul și utilitățile pentru
test de stilou. În urma consultării, am aflat că alegerea variază atât de mult încât este posibil
creați un adevărat set de programe dovedite. Asta este
hotărât. Pentru a nu face un amestec, am împărțit întreaga listă în subiecte - și în
De data aceasta, vom atinge utilitățile pentru adulmecarea și manipularea pachetelor. Folosește-l pe
sănătate.

Wireshark

Netcat

Dacă vorbim despre interceptarea datelor, atunci Network Miner va fi scos din aer
(sau dintr-un dump pre-preparat în format PCAP) fișiere, certificate,
imagini și alte medii, precum și parole și alte informații pentru autorizare.
O caracteristică utilă este să căutați acele secțiuni de date care conțin cuvinte cheie
(de exemplu, autentificarea utilizatorului).

Scapy

Site:
www.secdev.org/projects/scapy

Un must-have pentru orice hacker, este un instrument puternic pentru
manipularea interactivă a pachetelor. Primiți și decodați cele mai multe pachete
diferite protocoale, răspunde la cerere, injectează modificată și
un pachet creat de tine - totul este ușor! Cu ajutorul lui, puteți realiza un întreg
o serie de sarcini clasice, cum ar fi scanarea, tracuritatea, atacurile și detectarea
infrastructura de retea. Într-o sticlă primim un înlocuitor pentru astfel de utilități populare,
cum ar fi: hping, nmap, arpspoof, arp-sk, arping, tcpdump, tetheral, p0f etc. La asta
era timpul Scapy vă permite să îndepliniți orice sarcină, chiar și cea mai specifică
o sarcină care nu poate fi realizată niciodată de un alt dezvoltator deja creat
mijloace. În loc să scrieți un întreg munte de linii în C, astfel încât, de exemplu,
generarea unui pachet greșit și fuzzing-ul unui daemon este suficient
introduceți câteva rânduri de cod folosind Scapy! Programul nu are
interfață grafică, iar interactivitatea se realizează prin intermediul interpretului
Piton. Odată ce ați înțeles, nu vă va costa nimic să creați incorect
pachete, injectează cadrele 802.11 necesare, combină abordări diferite în atacuri
(să zicem, otrăvirea cache-ului ARP și saltul VLAN), etc. Dezvoltatorii înșiși insistă
pentru a se asigura că capacitățile lui Scapy sunt utilizate în alte proiecte. Conectându-l
ca modul, este ușor să creați un utilitar pentru diferite tipuri de cercetare în zonă,
căutarea vulnerabilităților, injecție Wi-Fi, execuție automată a anumitor
sarcini, etc.

pachet

Site:
Platformă: *nix, există un port pentru Windows

O dezvoltare interesantă care permite, pe de o parte, să genereze oricare
pachet Ethernet și, pe de altă parte, trimite secvențe de pachete cu scopul
verificări ale lățimii de bandă. Spre deosebire de alte instrumente similare, pachet
are o interfață grafică, permițându-vă să creați pachete în cel mai simplu mod
formă. Mai departe - mai mult. Crearea și trimiterea sunt deosebit de elaborate
secvențe de pachete. Puteți seta întârzieri între trimitere,
trimite pachete la viteza maximă pentru a testa debitul
secțiunea rețelei (da, aici se vor depune) și, ceea ce este și mai interesant -
modificarea dinamică a parametrilor în pachete (de exemplu, adresa IP sau MAC).


Această lecție descrie tehnologiile de hacking în rețea bazate pe interceptarea pachetelor de rețea. Hackerii folosesc astfel de tehnologii pentru a asculta traficul de rețea pentru a fura informații valoroase, pentru a organiza interceptarea datelor în scopul unui atac de tip om-in-the-middle, pentru a intercepta conexiunile TCP, permițând, de exemplu, falsificarea datelor și pentru a efectua alte actiuni la fel de interesante. Din păcate, majoritatea acestor atacuri în practică sunt implementate doar pentru rețelele Unix, pentru care hackerii pot folosi atât utilități speciale, cât și instrumente de sistem Unix. Rețelele Windows, aparent, au fost ignorate de hackeri și suntem forțați să ne limităm descrierea instrumentelor de interceptare a datelor la programele de sniffer concepute pentru ascultarea trivială a pachetelor de rețea. Cu toate acestea, cel puțin o descriere teoretică a unor astfel de atacuri nu trebuie neglijată, în special pentru anti-hackeri, deoarece cunoașterea tehnologiilor de hacking utilizate va ajuta la prevenirea multor probleme.

Mirosirea rețelei

Pentru a mirosi rețelele Ethernet, se folosesc de obicei plăcile de rețea setate în modul de ascultare. Ascultarea la o rețea Ethernet necesită conectarea unui computer care rulează un program sniffer la un segment de rețea, după care tot traficul de rețea trimis și primit de computerele din acel segment de rețea devine disponibil pentru hacker. Este și mai ușor să interceptați traficul din rețelele radio care folosesc intermediari de rețele wireless - în acest caz, nici nu trebuie să căutați un loc pentru a vă conecta la cablu. Sau un atacator se poate conecta la linia telefonică care conectează computerul la serverul de Internet, găsind un loc convenabil pentru aceasta (liniile telefonice sunt de obicei așezate în subsoluri și în alte locuri rar vizitate fără nicio protecție).

Pentru a demonstra tehnologia de sniffer, vom folosi un program de sniffer foarte popular SpyNet, care poate fi găsit pe multe site-uri Web. Site-ul oficial al programului SpyNet situat la http://members.xoom.com/layrentiu2/, de unde puteți descărca o versiune demo a programului.

Program SpyNet constă din două componente - CaptureNetŞi PipeNet. Program CaptureNet vă permite să interceptați pachete transmise prin rețeaua Ethernet la nivel de rețea, adică sub formă de cadre Ethernet. Program PipeNet vă permite să asamblați cadre Ethernet în pachete de nivel de aplicație, restabilind, de exemplu, mesaje de e-mail, mesaje HTTP (schimb de informații cu un server Web) și să efectuați alte funcții.

Din păcate, în versiunea demo SpyNet posibilităților PipeNet sunt limitate la demonstrația de compilare a pachetului HTTP, așa că nu vom putea demonstra cum funcționează SpyNetîn întregime. Cu toate acestea, vom demonstra capabilitățile de adulmecare a rețelei SpyNet folosind rețeaua noastră experimentală ca exemplu, transferând un fișier text de la gazdă Sabie-2000 a gazdui Alex-Z folosind Windows Explorer obișnuit. Simultan pe computer A1ex-1 vom lansa programul CaptureNet, care va intercepta pachetele transmise și va permite ca conținutul fișierului transmis să fie citit în cadre Ethernet. În fig. 1 arată textul mesajului secret din fișier secret.txt; vom încerca să găsim acest text în cadrele Ethernet capturate.

Orez. 1. Textul mesajului secret în fereastra Notepad

Pentru a captura cadre Ethernet, urmați acești pași:

Pe computer Alex-Z rulați programul CaptureNet. În fereastra de lucru afișată a programului, selectați comanda de meniu Captură * Începe(Capture * Start) și începeți procesul de captare a cadrelor de rețea.

Folosind Windows Explorer, copiați fișierul security.txt de pe computer Sabie-2000 pe A1ex-3.

După transferul fișierului secret.txt, selectați comanda de meniu Captură * Stop(Capture * Stop) și opriți procesul de capturare.

Cadrele Ethernet capturate vor fi afișate în partea dreaptă a ferestrei de lucru a programului CaptureNet(Figura 2), cu fiecare rând din lista de sus reprezentând un cadru Ethernet, iar sub listă conținutul cadrului selectat.

Orez. 2. Cadrul Ethernet conține textul mesajului secret

După ce am căutat prin lista de cadre interceptate, îl putem găsi cu ușurință pe cel care conține textul „Acesta este un foarte mare secret” pe care l-am transmis.

Subliniem că acesta este cel mai simplu exemplu, când a fost înregistrat tot traficul de rețea interceptat. Program CaptureNet vă permite să interceptați pachete trimise prin anumite protocoale și către anumite porturi gazdă, să selectați mesaje cu conținut specific și să acumulați datele interceptate într-un fișier. Tehnica pentru efectuarea unor astfel de acțiuni este simplă și poate fi stăpânită folosind sistemul de ajutor al programului SpyNet.

Pe lângă interceptarea primitivă a rețelei, hackerii au acces la mijloace mai sofisticate de interceptare a datelor. Mai jos este o scurtă prezentare a acestor metode, deși din punct de vedere teoretic. Motivul este că pentru rețelele Windows, implementarea practică a atacurilor de interceptare a datelor este extrem de limitată, iar setul de utilități de încredere pentru atacurile de interceptare este destul de slab.

Metode de interceptare a traficului de rețea

Ascultarea în rețea folosind programe de analiză de rețea precum cel de mai sus CaptureNet, este primul și cel mai simplu mod de a intercepta date. Cu excepţia SpyNet Pentru sniffing-ul rețelei, sunt utilizate multe instrumente, dezvoltate inițial în scopul analizei activității rețelei, diagnosticării rețelelor, selectării traficului conform criteriilor specificate și altor sarcini de administrare a rețelei. Un exemplu de astfel de program este tcpdump (http://www.tcpdump.org), care vă permite să înregistrați traficul de rețea într-un jurnal special pentru analiză ulterioară.

Pentru a proteja împotriva interceptării rețelei, se folosesc programe speciale, de exemplu, AntiSniff (http://www.securitysoftwaretech.com/antisniff), care sunt capabile să identifice computerele din rețea care ascultă traficul de rețea. Pentru a-și rezolva problemele, programele antisniffer folosesc un semn special al prezenței dispozitivelor de ascultare în rețea - placa de rețea a computerului sniffer trebuie să fie într-un mod special de ascultare. În modul de ascultare, computerele din rețea reacționează într-un mod special la datagramele IP trimise gazdei care este testată. De exemplu, gazdele care ascultă procesează de obicei tot traficul de intrare, nu doar datagramele trimise la adresa gazdei. Există și alte semne care indică un comportament suspect al gazdei pe care programul le poate recunoaște AntiSniff.

Fără îndoială, interceptarea este foarte utilă din punctul de vedere al unui atacator, deoarece permite obținerea unei mulțimi de informații utile - parole transmise prin rețea, adrese ale calculatoarelor din rețea, date confidențiale, scrisori etc. Cu toate acestea, interceptarea simplă nu permite unui hacker să interfereze cu comunicarea în rețea dintre două gazde pentru a modifica și a corupe datele. Pentru a rezolva o astfel de problemă, este necesară o tehnologie mai complexă.

Cereri ARP false

Pentru a intercepta și prelua procesul de interacțiune a rețelei dintre două gazde A și B, un atacator poate înlocui adresele IP ale gazdelor care interacționează cu propria sa adresă IP, trimițând mesaje ARP (Address Resolution Protocol) falsificate către gazdele A și B. Puteți face cunoștință cu protocolul ARP din Anexa D, care descrie procedura de rezolvare (conversie) a adresei IP a gazdei la adresa mașinii (adresa MAC) codificată pe placa de rețea a gazdei. Să vedem cum un hacker poate folosi ARP pentru a intercepta comunicațiile de rețea dintre gazdele A și B.

Pentru a intercepta traficul de rețea între gazdele A și B, hackerul își impune adresa IP acestor gazde, astfel încât A și B să folosească această adresă IP falsificată atunci când schimbă mesaje. Pentru a-și impune adresa IP, hackerul efectuează următoarele operațiuni.

Atacatorul determină adresele MAC ale gazdelor A și B, de exemplu, folosind comanda nbtstat din pachet W2RK.

Atacatorul trimite mesaje către adresele MAC identificate ale gazdelor A și B, care sunt răspunsuri ARP falsificate la solicitările de a rezolva adresele IP ale gazdei la adresele MAC ale computerului. Gazda A este informată că adresa IP a gazdei B corespunde adresei MAC a computerului atacatorului; gazda B este informată că adresa IP a gazdei A corespunde, de asemenea, adresei MAC a computerului atacatorului.

Gazdele A și B stochează adresele MAC primite în memoria cache ARP și apoi le folosesc pentru a trimite mesaje unul altuia. Deoarece adresele IP A și B corespund adresei MAC a computerului atacatorului, gazdele A și B comunică fără bănuială printr-un intermediar care poate face orice cu mesajele lor.

Pentru a se proteja împotriva unor astfel de atacuri, administratorii de rețea trebuie să mențină o bază de date cu un tabel de corespondență între adresele MAC și adresele IP ale computerelor din rețea. În plus, folosind software-ul special, de exemplu, utilitarul arpwatch (ftp://ftp.ee.lbl.gov/arpwatch-2.lab.tar.gz) puteți supraveghea periodic rețeaua și puteți identifica inconsecvențele.

Pe rețelele UNIX, acest tip de atac de solicitare ARP falsificat poate fi implementat folosind utilitare de sistem pentru monitorizarea și gestionarea traficului de rețea, de exemplu, arpredirect. Din păcate, astfel de utilitare de încredere nu par să fie implementate pe rețelele Windows 2000/XP. De exemplu, pe site-ul web NTsecurity ( http://www.ntsecurity.nu) puteți descărca utilitarul GrabitAII, prezentat ca un mijloc de redirecționare a traficului între gazdele rețelei. Cu toate acestea, o verificare de bază a funcționalității utilitarului GrabitAII arată că succesul complet în implementarea funcțiilor sale este încă departe.

Dirijare falsă

Pentru a intercepta traficul de rețea, un atacator poate falsifica adresa IP reală a unui router de rețea cu propria sa adresă IP, făcând acest lucru, de exemplu, folosind mesaje de redirecționare ICMP falsificate. Gazda A trebuie, conform RFC-1122, să perceapă mesajul de redirecționare primit ca un răspuns la o datagramă trimisă către o altă gazdă, de exemplu, B. Gazda A își determină acțiunile asupra mesajului de redirecționare pe baza conținutului mesajului de redirecționare primit, iar dacă redirecționarea datagramei este specificată în Redirecționare de la A la B de-a lungul unei noi rute, aceasta este exact ceea ce va face gazda A.

Pentru a efectua rutarea falsă, atacatorul trebuie să cunoască câteva detalii despre organizarea rețelei locale în care se află gazda A, în special, adresa IP a routerului prin care se trimite traficul de la gazda A la B. Știind acest lucru, atacatorul va genera o datagramă IP în care IP - adresa expeditorului este definită ca adresa IP a routerului, iar destinatarul este gazda A. De asemenea, în datagramă este inclus un mesaj de redirecționare ICMP cu câmpul adresei noului router setat la adresa IP a routerului. computerul atacatorului. După ce a primit un astfel de mesaj, gazda A va trimite toate mesajele la adresa IP a computerului atacatorului.

Pentru a vă proteja împotriva unui astfel de atac, ar trebui să dezactivați (de exemplu, folosind un firewall) procesarea mesajelor de redirecționare ICMP pe gazda A, iar comanda poate dezvălui adresa IP a computerului atacatorului. tracert(pe Unix aceasta este comanda tracerout). Aceste utilitare sunt capabile să găsească o rută suplimentară care a apărut în rețeaua locală care nu a fost prevăzută în timpul instalării, cu excepția cazului în care, desigur, administratorul de rețea este vigilent.

Exemplele de mai sus de interceptări (la care capacitățile atacatorilor sunt departe de a fi limitate) convin de necesitatea de a proteja datele transmise prin rețea dacă datele conțin informații confidențiale. Singura metodă de protecție împotriva interceptărilor traficului de rețea este utilizarea programelor care implementează algoritmi criptografici și protocoale de criptare și împiedică dezvăluirea și înlocuirea informațiilor secrete. Pentru a rezolva astfel de probleme, criptografia oferă instrumente pentru criptarea, semnarea și verificarea autenticității mesajelor transmise prin protocoale securizate

Implementarea practică a tuturor metodelor criptografice pentru protejarea schimbului de informații descrise în Capitolul 4 este asigurată de rețele VPN (Virtual Private Network). O scurtă prezentare generală a principiilor și tehnicilor de securitate criptografică poate fi găsită în Anexa E, iar o descriere detaliată a caracteristicilor de securitate criptografică furnizate de aplicație este furnizată în Anexa E. PGP Desktop Security (http://www.pgp.com).

Interceptarea conexiunii TCP

Cel mai sofisticat atac de interceptare a traficului de rețea ar trebui considerat captura de conexiune TCP (deturnarea TCP), atunci când un hacker întrerupe sesiunea curentă de comunicare cu gazda generând și trimițând pachete TCP către gazda atacată. Apoi, folosind capacitatea protocolului TCP de a restabili o conexiune TCP întreruptă, hackerul interceptează sesiunea de comunicare întreruptă și o continuă în locul clientului deconectat.

Au fost create mai multe utilitare eficiente pentru a efectua atacuri de deturnare a conexiunii TCP, dar toate sunt implementate pentru platforma Unix, iar pe site-urile Web aceste utilitare sunt prezentate doar sub formă de cod sursă. Astfel, ca practicanți convinși de cauza nobilă a hackingului, atacurile care folosesc metoda de interceptare a conexiunii TCP nu ne sunt de mare folos. (Cei cărora le place să înțeleagă codul programului altor persoane se pot referi la site http://www.cri.cz/~kra/index.html, de unde puteți descărca codul sursă al binecunoscutului utilitar de interceptare a conexiunii TCP Vânătoare de la Pavel Krauz).

În ciuda lipsei de instrumente practice, nu putem ignora un subiect atât de interesant precum interceptarea conexiunilor TCP și ne vom opri asupra unor aspecte ale unor astfel de atacuri. Câteva informații despre structura unui pachet TCP și procedura de stabilire a conexiunilor TCP sunt date în Anexa D a acestei cărți, dar aici ne vom concentra pe întrebarea ce permite exact hackerilor să efectueze atacuri de interceptare a conexiunii TCP? Să luăm în considerare acest subiect mai detaliat, bazându-ne în principal pe discuția din și.

Protocolul TCP (Transmission Control Protocol) este unul dintre protocoalele de bază ale stratului de transport OSI care vă permite să stabiliți conexiuni logice pe un canal de comunicație virtual. Pe acest canal, pachetele sunt transmise și recepționate cu secvența lor înregistrată, fluxul de pachete este controlat, retransmisia pachetelor distorsionate este organizată, iar la sfârșitul sesiunii canalul de comunicație este întrerupt. Protocolul TCP este singurul protocol de bază din familia TCP/IP care are un sistem avansat de identificare și conectare a mesajelor.

Pentru a identifica un pachet TCP, există doi identificatori pe 32 de biți în antetul TCP, care acționează și ca contoare de pachete, numite număr de secvență și număr de confirmare. Vom fi interesați și de încă un câmp al pachetului TCP, numit biți de control. Acest câmp de 6 biți include următorii biți de control (în ordine de la stânga la dreapta):

URG - steag de urgență;

ACK - steag de confirmare;

PSH - steag de transport;

RST - flag de restabilire a conexiunii;

SYN - steag de sincronizare;

FIN - flag de terminare a conexiunii.

Să ne uităm la procedura pentru crearea unei conexiuni TCP.

1. Dacă gazda A trebuie să creeze o conexiune TCP cu gazda B, atunci gazda A trimite următorul mesaj către gazda B:

A -> B: SYN, ISa

Aceasta înseamnă că mesajul trimis de gazda A are marcajul SYN (Synchronize sequence number) setat, iar câmpul numărului de secvență este setat la valoarea inițială de 32 de biți ISSa (Initial Sequence Number).

2. Ca răspuns la cererea primită de la gazda A, gazda B răspunde cu un mesaj în care bitul SYN este setat și bitul ACK este setat. În câmpul cu numărul de secvență, gazda B își stabilește valoarea inițială a contorului - ISSb; câmpul de număr de confirmare va conține apoi valoarea ISSa primită în primul pachet de la gazda A, mărită cu unu. Deci gazda B răspunde cu acest mesaj:

B -> A: SYN, ACK, ISSb, ACK(ISSa+1)

3. În cele din urmă, gazda A trimite un mesaj către gazda B în care: bitul este setat ÎNTREBĂ; câmpul cu numărul de secvență conține valoarea ISsa + 1; Câmpul pentru numărul de confirmare conține valoarea ISSb + 1. După această conexiune TCP între gazde OŞi ÎN se considera stabilit:

A -> B: ACK, ISSa+1, ACK(ISSb+1)

4. Acum gazda O poate trimite pachete de date către gazdă ÎN peste canalul virtual TCP nou creat:

A -> B: ACK, ISSa+1, ACK(ISSb+1); DATE

Aici DATE reprezintă date.

Din algoritmul pentru crearea unei conexiuni TCP discutat mai sus, se poate observa că singurii identificatori ai abonaților TCP și o conexiune TCP sunt doi parametri de 32 de biți ai numărului de secvență și a numărului de confirmare - ISSaŞi ISSb. Prin urmare, dacă un hacker reușește să afle valorile câmpului curent ISSaŞi ISSb, atunci nimic nu îl va împiedica să genereze un pachet TCP falsificat. Aceasta înseamnă că un hacker trebuie doar să selecteze valorile curente ale parametrilor ISSaŞi ISSb Pachetul TCP pentru o anumită conexiune TCP, trimiteți pachetul de la orice gazdă de Internet în numele clientului acestei conexiuni TCP și acest pachet va fi acceptat ca valid!

Pericolul unui astfel de spoofing de pachete TCP este de asemenea important deoarece protocoalele de nivel înalt FTP și TELNET sunt implementate pe baza protocolului TCP, iar identificarea clienților de pachete FTP și TELNET se bazează în întregime pe protocolul TCP.

În plus, deoarece protocoalele FTP și TELNET nu verifică adresele IP ale expeditorilor de mesaje, după primirea unui pachet falsificat, serverele FTP sau TELNET vor trimite un mesaj de răspuns la adresa IP a gazdei hackerului specificată în pachetul fals. După aceasta, gazda hackerului va începe să lucreze cu serverul FTP sau TELNET de la adresa sa IP, dar cu drepturile unui utilizator conectat legal, care, la rândul său, va pierde contactul cu serverul din cauza nepotrivirii contoarelor.

Astfel, pentru a efectua atacul descris mai sus, o condiție necesară și suficientă este cunoașterea celor doi parametri actuali pe 32 de biți ISSaŞi ISSb, identificând conexiunea TCP. Să luăm în considerare modalitățile posibile de a le obține. În cazul în care gazda hackerului este conectată la segmentul de rețea atacat, sarcina de a obține valorile ISSaŞi ISSb este banal și poate fi rezolvat prin analiza traficului de rețea. Prin urmare, trebuie să se înțeleagă clar că protocolul TCP permite, în principiu, să se protejeze o conexiune numai dacă este imposibil ca un atacator să intercepteze mesajele transmise prin această conexiune, adică doar dacă gazda hackerului este conectată la un segment de rețea. diferit de segmentul de abonat al conexiunii TCP.

Prin urmare, atacurile intersegmentare prezintă cel mai mare interes pentru un hacker, atunci când atacatorul și ținta sa se află în diferite segmente de rețea. În acest caz, sarcina de a obține valori ISSaŞi ISSb nu este banal. Pentru a rezolva această problemă, acum au fost inventate doar două metode.

Predicția matematică a valorii inițiale a parametrilor conexiunii TCP prin extrapolarea valorilor anterioare ISSaŞi ISSb.

Exploatarea vulnerabilităților în identificarea abonaților conexiunii TCP pe serverele Unix rsh.

Prima problemă este rezolvată prin studii aprofundate ale implementării protocolului TCP în diverse sisteme de operare și are acum o semnificație pur teoretică. A doua problemă este rezolvată prin utilizarea vulnerabilităților sistemului Unix pentru a identifica gazde de încredere. (Această gazdă are încredere O numit gazdă de rețea ÎN al cărui utilizator se poate conecta la gazdă O fără autentificare folosind host r-service O). Prin manipularea parametrilor pachetelor TCP, un hacker poate încerca să uzurpare identitatea unei gazde de încredere și să intercepteze o conexiune TCP cu gazda atacată.

Toate acestea sunt foarte interesante, dar rezultatele practice ale acestui gen de cercetare nu sunt încă vizibile. Prin urmare, sfătuim pe toți cei care doresc să aprofundeze acest subiect să apeleze la carte, de unde au fost preluate în principal informațiile prezentate mai sus.

Concluzie

Interceptarea datelor din rețea este cea mai eficientă metodă de hacking în rețea, permițând unui hacker să obțină aproape toate informațiile care circulă în rețea. Cea mai mare dezvoltare practică a fost obținută prin instrumentele de sniffing, de ex. ascultarea rețelelor; Totuși, nu putem ignora metodele de interceptare a datelor din rețea, efectuate prin interferarea cu funcționarea normală a rețelei pentru a redirecționa traficul către o gazdă hacker, în special metodele de interceptare a conexiunilor TCP. Cu toate acestea, în practică, ultimele metode menționate nu au primit încă o dezvoltare suficientă și trebuie îmbunătățite.

Un anti-hacker ar trebui să știe că singura salvare de la interceptarea datelor este criptarea acestora, adică. metode de protecție criptografică. Când trimiteți un mesaj prin rețea, ar trebui să presupuneți în prealabil că sistemul de cablu al rețelei este absolut vulnerabil și orice hacker conectat la rețea va putea prinde toate mesajele secrete transmise de la acesta. Există două tehnologii pentru a rezolva această problemă - crearea unei rețele VPN și criptarea mesajelor în sine. Toate aceste sarcini sunt foarte ușor de rezolvat folosind un pachet software PGP Desktop Security(descrierea acestuia poate fi găsită, de exemplu, în).

Uneori, atunci când utilizați Internetul, apar situații în care apar scurgeri de trafic sau consum neașteptat de resurse de sistem. Pentru a analiza și detecta rapid sursa problemei, se folosesc instrumente speciale de rețea. Unul dintre ei, WireShark, va fi discutat în articol.

Informații generale

Înainte de a utiliza WireShark, trebuie să vă familiarizați cu domeniul de aplicare, funcționalitatea și capabilitățile sale. Pe scurt: programul vă permite să capturați pachete în timp real în conexiuni de rețea cu fir și fără fir. Folosit în Ethernet, IEEE 802.11, PPP și protocoale similare. De asemenea, puteți utiliza interceptarea traficului de apeluri VoIP.

Programul este distribuit sub licența GNU GPL, ceea ce înseamnă că este gratuit și open source. Îl puteți rula pe multe distribuții Linux, MacOS și există și o versiune pentru sistemul de operare Windows.

Cum se utilizează WireShark?

În primul rând, ar trebui să îl instalați mai întâi pe sistem. Deoarece una dintre cele mai frecvent utilizate distribuții Linux este Ubuntu, toate exemplele vor fi afișate în ea.

Pentru a instala, trebuie doar să tastați comanda în consolă:

sudo apt-get install wireshark

După aceasta, programul va apărea în meniul principal. Îl poți lansa de acolo. Dar este mai bine să faci asta de la terminal, deoarece are nevoie de drepturi de superutilizator. Acest lucru se poate face astfel:

Aspect

Programul are o interfață grafică convenabilă. Utilizatorul va vedea o fereastră prietenoasă împărțită în 3 părți. Prima este direct legată de captură, a doua se referă la deschiderea fișierelor și a mostrelor, iar a treia este ajutor și suport.

Blocul Captură conține o listă de interfețe de rețea disponibile pentru capturare. Când selectați, de exemplu, eth0 și faceți clic pe butonul Start, procesul de interceptare va începe.

Fereastra cu datele interceptate este, de asemenea, împărțită logic în mai multe părți. În partea de sus se află un panou de control cu ​​diverse elemente. Urmează o listă de pachete. Este prezentat sub forma unui tabel. Aici puteți vedea numărul de ordine al coletului, ora la care a fost interceptat, adresa de expediere și de primire. De asemenea, puteți elimina date despre protocoalele utilizate, lungime și alte informații utile.

Sub listă se află o fereastră cu conținutul datelor tehnice ale pachetului selectat. Și chiar mai jos este un afișaj în formă hexazecimală.

Fiecare vizualizare poate fi extinsă într-o fereastră mai mare pentru citirea mai ușoară a datelor.

Aplicarea filtrelor

În timp ce programul rulează, zeci sau chiar sute de pachete vor trece întotdeauna în fața utilizatorului. Îndepărtarea lor manuală este destul de dificilă și necesită timp. Prin urmare, instrucțiunile oficiale WireShark recomandă utilizarea filtrelor.

Există un câmp special pentru ei în fereastra programului - Filtru. Pentru a configura filtrul mai precis, există un buton Expresie.

Dar pentru majoritatea cazurilor, un set standard de filtre va fi suficient:

  • ip.dst — adresa IP de destinație a pachetului;
  • ip.src — adresa expeditorului;
  • ip.addr - orice ip;
  • ip.proto - protocol.

Utilizarea filtrelor în WireShark - instrucțiuni

Pentru a încerca cum funcționează programul cu filtre, trebuie să introduceți o anumită comandă. De exemplu, un astfel de set - ip.dst == 172.217.23.131 - va afișa toate pachetele zburătoare pe site-ul web Google. Pentru a vizualiza tot traficul - atât de intrare cât și de ieșire - puteți combina două formule - ip.dst == 172.217.23.131 || ip.src == 172.217.23.131. Astfel, s-a dovedit că folosește două condiții într-o singură linie deodată.

Puteți utiliza alte condiții, de exemplu ip.ttl< 10. Данная команда выведет все пакеты с длительностью жизни меньше 10. Чтобы выбрать данные по их размеру, можно применить такой подход — http.content_length > 5000.

Caracteristici suplimentare

Pentru comoditate, WireShark are o modalitate de a selecta rapid parametrii pachetului ca câmp de analizat. De exemplu, într-un câmp cu date tehnice, puteți face clic dreapta pe obiectul dorit și selectați Aplicați ca coloană. Ce înseamnă să-l transferi în zona câmpului ca o coloană.

În mod similar, puteți selecta orice parametru ca filtru. Pentru a face acest lucru, există un element Aplicare ca filtru în meniul contextual.

Sesiune separată

Puteți utiliza WireShark ca monitor între două noduri de rețea, de exemplu, un utilizator și un server. Pentru a face acest lucru, selectați pachetul care vă interesează, apelați meniul contextual și faceți clic pe Urmăriți fluxul TCP. O nouă fereastră va afișa întregul jurnal al schimbului dintre cele două noduri.

Diagnosticare

WireShark are un instrument separat pentru analiza problemelor de rețea. Se numește Instrumente Expert. Îl găsiți în colțul din stânga jos, sub forma unei pictograme rotunde. Făcând clic pe el, se va deschide o nouă fereastră cu mai multe file - Erori, Avertismente și altele. Cu ajutorul lor, puteți analiza în ce noduri apar defecțiuni, pachetele nu ajung și puteți detecta alte probleme cu rețeaua.

Traficul vocal

După cum am menționat deja, WireShark poate intercepta și traficul vocal. Un întreg meniu Telefonie este dedicat acestui lucru. Acest lucru poate fi folosit pentru a găsi probleme în VoIP și pentru a le rezolva rapid.

Elementul Apeluri VoIP din meniul Telefonie vă va permite să vizualizați apelurile finalizate și să le ascultați.

Exportarea obiectelor

Aceasta este probabil cea mai interesantă funcționalitate a programului. Vă permite să utilizați WireShark ca interceptor al fișierelor transmise prin rețea. Pentru a face acest lucru, trebuie să opriți procesul de interceptare și să exportați obiecte HTTP în meniul Fișier. Fereastra care se deschide va afișa o listă cu toate fișierele transferate în timpul sesiunii, care pot fi salvate într-o locație convenabilă.

În concluzie

Din păcate, va fi dificil să găsiți versiunea actuală a WireShark în limba rusă pe Internet. Cel mai accesibil și mai des folosit este în limba engleză.

Același lucru este valabil și cu instrucțiuni detaliate pentru WireShark în rusă. Cel oficial de la dezvoltator este prezentat în limba engleză. Există multe tutoriale scurte și scurte WireShark online pentru începători.

Cu toate acestea, pentru cei care lucrează de mult timp în domeniul IT, înțelegerea programului nu va prezenta dificultăți deosebite. Și oportunitățile mari și funcționalitatea bogată vor lumina toate dificultățile de învățare.

Este demn de remarcat faptul că, în unele țări, utilizarea unui sniffer precum WireShark poate fi ilegală.

Schema generala

Secvența de pași pe care trebuie să-i efectueze un program care utilizează biblioteca pcap (de la PacketCAPture) pentru a-și îndeplini sarcina este următoarea:

  • Definiți interfața de rețea care va fi ascultată. (Pe Linux, acesta ar putea fi eth0, pe BSD xl1).
  • Inițializați pcap. În acest caz, biblioteca este informată pe ce interfață vom asculta datele. Este posibil să ascultați mai multe interfețe simultan (în sesiuni diferite).
  • Dacă este necesar să creați un filtru (de exemplu, ne interesează doar pachetele TCP care sosesc pe portul 23), „compilați” acest filtru și aplicați-l unei anumite sesiuni.
  • Accesați ciclul de primire a pachetelor. După aceasta, de fiecare dată când sosește un alt pachet și trece prin filtrul specificat, este apelată o funcție care trebuie definită în prealabil. Această funcție poate efectua orice acțiune dorim. Poate analiza pachetul și îl poate da utilizatorului, îl poate salva pe disc sau nu poate face nimic.
  • Când ați terminat, trebuie să închideți toate sesiunile deschise.

Să luăm în considerare pașii enumerați în detaliu.

Definiția interfeței

Pentru a determina interfața pe care să ascultați, puteți utiliza două metode.

Primul este că numele interfeței este specificat de utilizator. Luați în considerare următorul program:

#include #include Int main(int argc, char *argv) ( char *dev = argv; printf("Dispozitiv: %s\n", dev); return(0); )

Utilizatorul specifică interfața pasând numele acesteia ca prim argument programului nostru. Desigur, interfața specificată de utilizator trebuie să existe.

A doua modalitate este să aflați numele interfeței din biblioteca însăși:

#include #include Int main() ( char *dev, errbuf; dev = pcap_lookupdev(errbuf); printf("Dispozitiv: %s\n", dev); return(0); )

În acest caz, pcap ne oferă numele interfeței pe care o deține. Linia errbuf va conține o descriere a erorii dacă apare una la executarea apelului pcap_lookupdev().

Deschiderea unei interfețe pentru interceptarea pachetelor

Pentru a crea o sesiune de interceptare a traficului, trebuie să apelați funcția pcap_open_live(). Prototipul pentru această funcție (din pagina de manual pcap) arată astfel:

Pcap_t *pcap_open_live (char *device, int snaplen, int promisc, int to_ms, char *ebuf)

Primul argument este numele dispozitivului pe care l-am definit la pasul anterior. snaplen este un număr întreg care specifică numărul maxim de octeți ai unui cadru de rețea care va fi capturat de bibliotecă. Dacă promisc este setat la true, interfața intră în așa-numitul mod promiscuu (pachetele adresate altor stații din rețea sunt interceptate). to_ms - timeout în milisecunde (dacă valoarea este setată la zero, citirea va avea loc până la prima eroare, dacă este setată la minus unu - la infinit). În cele din urmă, errbuf este linia în care vom primi mesajul de eroare. Funcția returnează mânerul de sesiune (descriptor).

Pentru a demonstra, să ne uităm la o bucată de cod:

#include Pcap_t *mâner; handle = pcap_open_live(somedev, BUFSIZ, 1, 0, errbuf);

Aici se deschide o interfață, al cărei nume este indicat în linia somedev , indicând câți octeți ai pachetului de capturat (valoarea BUFSIZ este definită în pcap.h). Interfața de rețea comută în modul promiscuu. Datele vor fi citite până când apare o eroare. În cazul unei erori, puteți afișa descrierea textului acesteia pe ecran folosind indicatorul errbuf.

O notă despre interceptarea traficului în moduri promiscue și non-promiscue: cele două metode sunt foarte diferite. În cazul interceptării traficului în modul non-promiscuu, nodul primește doar traficul care este direcționat către sau legat de acesta. Doar traficul către, de la și direcționat prin gazdă va fi interceptat de programul nostru. În modul promiscuu, interfața de rețea acceptă toate pachetele care vin prin cablu. Într-un mediu necomutat, acesta ar putea fi tot traficul de rețea. Avantajul său clar este că oferă un număr mai mare de pachete de capturat, ceea ce poate (sau nu) să fie util în funcție de ceea ce capturați fluxul de rețea.

Cu toate acestea, interceptarea traficului în modul promiscuu poate fi detectată; un alt nod poate determina cu mare precizie dacă folosim modul promiscuu. În plus, funcționează numai în medii fără comutare (cum ar fi hub-uri sau switch-uri care sunt inundate cu pachete arp). În al treilea rând, dacă rețeaua este încărcată puternic, programul nostru va folosi o cantitate mare de resurse de sistem.

Filtrarea traficului

Adesea este necesar un interceptor de pachete pentru a intercepta nu toate, ci doar anumite pachete. De exemplu, sunt momente când vrem să interceptăm traficul pe portul 23 (telnet) în căutarea parolelor. Sau poate vrem să interceptăm un fișier trimis prin portul 21 (FTP). Poate că vrem doar să interceptăm traficul DNS (portul UDP 53). În orice caz, foarte rar este necesar să interceptați toate datele. Funcțiile pcap_compile() și pcap_setfilter() sunt folosite pentru a filtra traficul.

Odată ce am apelat pcap_open_live() și avem o sesiune de captare a traficului funcțională, putem aplica filtrul nostru. Desigur, puteți implementa filtrul manual prin analizarea antetelor ETH/IP/TCP după primirea pachetului, dar utilizarea filtrului intern pcap este mai eficientă și, de asemenea, mai simplă.

Înainte de a putea aplica un filtru, trebuie să-l „compilați”. Expresia filtrului este stocată într-un șir obișnuit (matrice de caractere). Sintaxa unor astfel de expresii este descrisă în detaliu în pagina de manual tcpdump (man tcpdump).

Funcția pcap_compile() este utilizată pentru a compila filtrul. Prototipul său arată astfel:

Int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)

Primul argument este mânerul (descriptorul) sesiunii noastre (pcap_t *handle în exemplul anterior). Următorul argument este un pointer către zona din memorie în care vom stoca versiunea compilată a filtrului nostru. Urmează expresia filtrului în sine, sub forma unui șir obișnuit. Următorul parametru determină dacă expresia noastră trebuie să fie optimizată sau nu (ca de obicei, 0 înseamnă nu, 1 înseamnă da). Ultimul parametru este masca de rețea la care este aplicat filtrul nostru. Funcția returnează -1 în caz de eroare, toate celelalte valori indică finalizarea cu succes.

Odată compilată expresia, aceasta trebuie aplicată, ceea ce se face folosind funcția pcap_setfilter(). Prototipul său este următorul:

Int pcap_setfilter(pcap_t *p, struct bpf_program *fp)

Primul argument este mânerul (descriptorul) sesiunii noastre de interceptare a pachetelor, al doilea este un pointer către versiunea compilată a expresiei pentru filtru (de obicei, al doilea argument al funcției pcap_compile()).

Următorul exemplu demonstrează utilizarea unui filtru:

#include Pcap_t *mâner; // descriptor de sesiune char dev = "eth0"; // interfata pe care vom asculta char errbuf; // Linie cu eroare struct bpf_program filter; // Expresie compilată pentru filtrul char filter_app = "port 23"; // Expresie pentru masca filtrului bpf_u_int32; // Mască de rețea a interfeței noastre bpf_u_int32 net; // adresa IP a interfeței noastre pcap_lookupnet(dev, &net, &mask, errbuf); handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf); pcap_compile(handle, &filter, filter_app, 0, net); pcap_setfilter(mâner, &filtru);

Acest program pregătește un interceptor pentru pachetele care vin către sau dinspre portul 23, în mod promiscuu, pe interfața eth0. Exemplul conține funcția pcap_lookupnet(), care returnează adresa de rețea și masca de rețea pentru dispozitivul al cărui nume îi este transmis ca parametru. Utilizarea lui este necesară deoarece pentru a aplica un filtru trebuie să cunoaștem adresa și masca de rețea.

Interceptarea pachetelor

Există două tehnici de interceptare a pachetelor. Puteți intercepta și procesa câte un pachet la un moment dat, sau puteți lucra cu un grup de pachete setând o buclă specială care va rula până când pcap interceptează un anumit număr de pachete. Pentru a lucra în primul mod, se folosește funcția pcap_next(). prototipul pcap_next():

U_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)

Primul argument este mânerul sesiunii noastre, al doilea este un pointer către o structură în care vor fi stocate informații despre pachet, cum ar fi ora la care a fost interceptat, lungimea pachetului și lungimea părții sale individuale ( de exemplu, dacă pachetul este fragmentat). pcap_next() returnează un pointer u_char la locația de memorie în care este stocat pachetul descris de această structură.

Demonstrație de utilizare a pcap_next() pentru a captura un singur pachet:

#include #include int main() ( pcap_t *handle; char *dev; char errbuf; // linie care descrie structura de eroare filtrul bpf_program; // filtru compilat char filter_app = "port 23"; // filtru bpf_u_int32 mask; // masca de rețea bpf_u_int32 net ; // adresa noastră ip struct pcap_pkthdr // antetul pachetului care va umple pcap const u_char *packet // definește interfața dev = pcap_lookupdev(errbuf); (dev, &net, &mask, errbuf // deschideți sesiunea de interceptare în modul promiscuu handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf) // compilați și aplicați filtrul de pachete pcap_compile(handle, &filter, filter_app); 0, net); pcap_setfilter(handle, &filter // interceptează pachetul = pcap_next(handle, &header) // imprimă lungimea acestuia în consolă printf("Jacked un pachet cu lungimea de [%d]); , header.len / închide sesiunea pcap_close(handle);

Acest program interceptează pachetele de pe dispozitiv pe care le returnează pcap_lookupdev(), punându-l în modul pormisc. Detectează un pachet care vine prin portul 23 (telnet) și își afișează dimensiunea în octeți. Apelarea pcap_close() închide o sesiune de captură deschisă.

Metoda alternativă, deși mai greu de înțeles, este probabil să fie mai utilă. Există foarte puține (dacă există) capturi de pachete care folosesc pcap_next() . În marea majoritate a cazurilor folosesc pcap_loop() sau pcap_dispatch() (care, la rândul său, utilizează pcap_loop()). Pentru a înțelege utilizarea acestor două funcții, trebuie să înțelegeți ideea funcțiilor de apel invers.

Funcțiile de apel invers sunt o tehnică de programare folosită frecvent. Principiul este destul de simplu. Să presupunem că aveți un program care așteaptă un eveniment. În scopul, de exemplu, de a procesa o apăsare a tastei. De fiecare dată când o tastă este apăsată, vreau să apelez o funcție care se va ocupa de acel eveniment. Funcția pe care o folosesc este o funcție de apel invers. De fiecare dată când utilizatorul apasă o tastă, programul meu va apela o funcție de apel invers. Funcțiile de apel invers sunt folosite în pcap, dar în loc să le apeleze atunci când utilizatorul apasă o tastă, pcap le apelează când primește un alt pachet. pcap_loop() și pcap_dispatch() sunt funcții care folosesc mecanismul funcției de apel invers aproape în același mod. Ambele apelează o funcție de apel invers de fiecare dată când pcap interceptează un pachet care trece prin filtru (cu excepția cazului în care, desigur, filtrul este compilat și aplicat sesiunii, altfel toate pachetele interceptate sunt transmise funcției de apel invers)

Prototipul funcției pcap_loop():

Int pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char *user);

Primul argument este mâna noastră de sesiune. Următorul întreg îi spune pcap_loop() câte pachete totale să capteze (o valoare negativă înseamnă că pachetele trebuie capturate până când apare o eroare). Al treilea argument este numele funcției de apel invers (numai numele, fără paranteze). Ultimul argument este folosit în unele aplicații, dar de obicei este pur și simplu setat la NULL. pcap_dispatch() este aproape identic, singura diferență este modul în care funcțiile gestionează timeout-ul, a cărui valoare este setată când este apelată pcap_open_live().

pcap_loop() pur și simplu ignoră timeout-urile, spre deosebire de pcap_dispatch() . Detaliile sunt în man pcap.

Înainte de a da un exemplu de utilizare a pcap_loop(), trebuie să ne uităm la formatul funcției noastre de apel invers. Nu putem defini în mod arbitrar un prototip de funcție de apel invers deoarece pcap_loop() nu va ști ce să facă cu el. Prototipul funcției noastre de apel invers ar trebui să fie astfel:

Să aruncăm o privire mai atentă. În primul rând, funcția returnează o valoare goală (void). Acest lucru are sens, deoarece pcap_loop() nu poate ști ce să facă cu valoarea returnată. Primul argument este același cu ultimul argument pentru pcap_loop(). Orice valoare este folosită ca ultim argument pentru pcap_loop() este transmisă ca prim argument funcției de apel invers de fiecare dată când este apelată din pcap_loop() . Al doilea argument este antetul pcap, care conține informații despre momentul în care a fost capturat pachetul, dimensiunea acestuia etc. Structura pcap_pkthdr este definită în pcap.h după cum urmează:

Struct pcap_pkthdr ( struct timeval ts; // timestamp bpf_u_int32 caplen; // lungimea părții capturate a pachetului bpf_u_int32 len; // lungimea totală a pachetului);

Ultimul argument al funcției de apel invers este cel mai interesant. Acesta este un pointer către un buffer, care conține de fapt întregul pachet capturat folosind pcap_loop().

Cum se utilizează variabila pachet? Pachetul conține multe atribute, așa că, după cum vă puteți imagina, nu este de fapt un șir, ci un set de structuri (de exemplu, un pachet TCP/IP va conține un antet ethernet, ip, tcp și datele în sine). Parametrul de pachet, care este de tip u_char , este de fapt o versiune serializată a acestor structuri. Pentru a obține date utile din aceste structuri, trebuie să efectuăm câteva transformări.

În primul rând, trebuie să avem structuri definite în programul pe care îl vom folosi. Vom folosi următoarele structuri (de fapt le-am putea lua direct din fișierele antet, dar numele câmpurilor structurilor variază de la platformă la platformă, așa că acestea sunt folosite în scopuri demonstrative):

Struct sniff_ethernet ( u_char ether_dhost; u_char ether_shost; u_short ether_type; /* IP? ARP? RARP? etc */ ); // Structura antetului IP sniff_ip ( #if BYTE_ORDER == LITTLE_ENDIAN u_int ip_hl:4, ip_v:4; #endif #if BYTE_ORDER == BIG_ENDIAN u_int ip_v:4, /* versiunea */ ip_hl:4; /* lungimea antetului */ #endif /* not _IP_VHL */ u_short ip_len u_short ip_id #define IP_RF 0x8000 /* flag fragment rezervat */ #define IP_DF 0x4000 /* dont flag */ #define IP_MF 0x2000 /* flag mai multe fragmente OFF */ #define 0x1fff /* masca pentru fragmentarea biților */ u_char ip_ttl /* time to live */ u_char ip_p /* protocol */ u_short ip_sum */ struct in_addr ip_src, ip_dst; struct sniff_tcp ( u_short th_sport; u_short th_dport; tcp_seq th_seq; /* numărul de secvență */ tcp_seq th_ack; /* numărul de confirmare */ #dacă BYTE_ORDER == LITTLE_ENDIAN u_int ,/* 4:00:_; * offset de date */ #endif #if BYTE_ORDER == BIG_ENDIAN u_int th_off:4, /* offset de date */ th_x2:4 /* (neutilizat) */ #endif u_char th_flags #define TH_FIN 0x01 #define TH_SYN 0; TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 #define TH_FLAGS \ (TH_FIN|TH_SYN|TH_TH_TH|TH_TH|TH_TH|TH_TH|TH_TH|TH__TH| short th_win /* fereastra */ u_short th_sum /* checksum */ u_short th_urp /* urgent pointer */ );

Dacă sunt folosite descrieri de structură din fișierele antet standard, uneori, pentru ca un program care folosește o descriere antet TCP să fie compilată fără erori, este necesar să definiți simbolul _BSD_SOURCE înainte de a include fișierele antet. O modalitate alternativă este definirea manuală a structurilor care descriu antetul TCP.

pcap folosește în mod natural exact aceleași structuri atunci când captează pachete. Apoi pur și simplu creează un șir u_char (buffer) și copiază datele din structuri în el. Cum se analizează un șir înapoi în structuri? Acest lucru se realizează cu ușurință folosind indicatori și conversii de tip.

Mai întâi, să declarăm variabilele de care avem nevoie pentru a analiza pachetul u_char în anteturi separate:

Const struct sniff_ethernet *ethernet; const struct sniff_ip *ip; const struct sniff_tcp *tcp; const char *sarcină utilă; int size_ethernet = sizeof(struct sniff_ethernet); int size_ip = sizeof(struct sniff_ip); int size_tcp = sizeof(struct sniff_tcp);

Acum facem conversia tipului:

Ethernet = (struct sniff_ethernet*)(pachet); ip = (struct sniff_ip*)(pachet + dimensiune_ethernet); tcp = (struct sniff_tcp*)(pachet + size_ethernet + size_ip); sarcină utilă = (u_char *)(pachet + size_ethernet + size_ip + size_tcp);

După aceasta, putem accesa câmpurile tuturor structurilor în mod obișnuit, de exemplu:

Dacă (tcp->th_flags & TH_URG) ( ... ); ... printf("TTL = %d\n", ip->ip_ttl);

Închidere

Când ați terminat, trebuie să închideți sesiunea. Acest lucru se face folosind funcția pcap_close().