Sniffere. Analizoare de protocol. Ethereal.
Un sniffer este un program care are posibilitatea de a monitoriza datele traficate într-o retea. Acest gen de programe poate fi folosit atât de catre utilizatorii de drept (administratorii de retea) în scop de diagnostic, cât si de catre hackeri în ideea de a dobândi acces neautorizat (a "sparge" reteaua).
Modalitatea de lucru a unui sniffer este legata de posibilitatea placii de retea de a lucra în promiscuous mode. În regim de functionare normala, subnivelul MAC analizeaza cadrele receptionate si livreaza subnivelelor superioare cadrele a caror adresa destinatie este recunoscuta ca fiind cea a statiei sau cea de broadcast (FF-FF-FF-FF-FF-FF), restul de cadre fiind ignorate. Modul promiscuous permite placii de retea sa livreze sistemului de operare toate cadrele "simtite" pe mediul fizic, chiar daca acestea nu sunt destinate statiei pe care se afla snifferul.
Din acest mod de functionare rezulta si posibilitatile, limitarile si dezavantajele snifferului:
poate captura cadre de pe mediul fizic la care este conectat, cu conditia ca placa de retea sa suporte modul promiscuous
daca reteaua este segmentata / microsegmentata, snifferul nu va captura decât pachetele "vazute" pe segmentul pe care se afla, plus broadcast - urile, care se stie ca "trec" prin echipamente precum HUB sau switch.
dat fiind modul de functionare, este foarte dificila detectarea unui sniffer neautorizat, singurele modalitati fiind fie suspectarea existentei sale prin efectele ulterioare (de exemplu parole cunoscute de catre intrusi), când deja este prea târziu, fie prin descoperirea sa chiar pe calculatorul pe care a fost instalat, prin verificari ocazionale sau sistematice ale calculatoarelor din retea.
Un
analizor de date sau analizor de protocoale este un utilitar
care decodeaza (prezinta într-o forma accesibila
utilizatorului) câmpurile prezente în headerele diverselor protocoale
împachetate în cadrul unui frame. Analizoarele de protocoale pot fi individuale
(analizorul stie sa decodeze un singur protocol) sau combinate,
varianta optima fiind cea a unei aplicatii grafice care
realizeaza decodarea pentru toate protocoalele prezente în frame-ul
capturat si permite si vizualizarea arborescenta a
încapsularii, cum este cazul Ethereal-ului.
Ethereal
Ethereal este un sniffer combinat cu analizor de date, disponibil free atât pentru Windows cât si pentru Unix. El poate fi folosit pentru capturarea de date direct din retea si pentru analizarea datelor capturate (sau a unor capturi anterioare salvate sub forma de fisier), gradul de detaliu fiind reglabil în functie de preferintele utilizatorului.
Homepage-ul Ethereal se afla la https://www.ethereal.com; tot aici exista si documentatia completa (în limba engleza).
Facilitatile principale oferite de Ethereal sunt urmatoarele:
datele pot fi capturate direct din mediul fizic, în tehnologie Ethernet, FDDI, Token Ring, X.25, IP over ATM, sau pot fi citite dîntr-un fisier captura; Ethereal suporta mai multe formate de fisiere captura (tcpdump, NAI SnifferPro etc.) si de asemenea poate deschide direct fisiere captura arhivate în format tar.gz.
vizualizarea capturii se poate face în mod text (utilitarul tethereal) sau grafic
fisierele captura pot fi editate sau convertite prin intermediul utilitarului editcap
lista de interfete si protocoale suportate este uriasa
se pot defini filtre
o la capturare - se captureaza numai pachetele care corespund cu regulile definite în filtru
o la vizualizare - fie pentru filtrarea display-ului (cautarea unui anume tip de pachete sau eliminarea unora ce nu prezinta interes), sau pentru configurarea iluminarii în diverse culori a anumitor pachete (pentru o mai usoara urmarire)
facilitati suplimentare, cum ar fi urmarirea unui stream TCP, statistici de trafic per captura etc.
Utilizare
Ne vom referi în continuare la interfata grafica a Ethereal-ului, disponibila sub Windows sau sub mediile grafice Unix (de exemplu X server).
Captura
se poate realiza din meniul Capture
sau apasând CTRL-k în fereastra continând lista de pachete.
Optiunile disponibile au urmatoarele semnificatii:
Interfata pe care se face captura - denumirea depinde de sistemul de operare. Din pacate sub Windows ea este destul de criptica (FIXME), însa sub Linux dispunem de eth0, eth1 etc. începând cu versiunea 0.9.1 a Ethereal-ului
Count/File size/Duration - specifica limita superioara a capturii exprimata în numar de pachete/marime a fisierului generat/timp
Filter - aici se poate defini filtrul la capturare; expresia filtrului se poate scrie direct în edit box-ul corespunzator, sau se poate alege un filtru predefinit apasând eticheta Filter
File - permite specificarea numelui sub care va fi salvat fisierul
Capture length - se poate specifica lungimea datelor ce vor fi capturate din fiecare pachet
Capture packets în promiscuous mode - seteaza modul promiscuous pe interfata specificata; daca este debifat, va fi capturat doar traficul strict legat de interfata pe care se face captura
Use ring buffer - FIXME
Update list of packets în real time - se executa refresh-ul ferestrei cu lista de pachete în timp real pe durata capturii
Automatic scrolling în live capture - odata cu refresh-ul ferestrei din fundal, se realizeaza si scrollingul automat astfel încât focusul sa se afle întotdeauna pe ultimul pachet capturat
Enable MAC name resolution daca este bifat, adresele MAC se vor afisa sub forma NumeProducator_xx:xx:xx
Enable network name resolution - daca este bifat se încearca rezolutia DNS inversa a adreselor IP; optiunea nu este recomandabila deoarece consuma mult timp
Enable transport name resolution - bifarea are ca efect afisarea ca nume de serviciu a porturilor (de exemplu ftp în loc de 21)
FILTRE
În Ethereal avem doua tipuri de filtre - filtrele pe captura si cele de vizualizare. Odata definite, ele pot fi salvate si aplicate ori de câte ori este nevoie. Pentru definirea filtrelor este necesar sa cunoastem limbajul de filtrare folosit, adica modul în care se construiesc expresiile care vor defini ce pachete trec sau nu de filtru.
Din pacate sintaxa expresiilor folosite în filtrul de captura difera de cea pentru filtrul de vizualizare. În cazul primului sintaxa este aceea a limbajului de filtrare pcap folosit de celebrul utilitar tcpdump din Linux, iar pentru cel de-al doilea exista un limbaj propriu de definire a filtrelor, asemanator cu limbajul de programare C.
Sintaxa filtrului de captura
Specificatia completa poate fi gasita în manpage-ul lui tcpdump. În continuare vor fi exemplificate cele mai des utilizate elemente de sintaxa.
A specifica filtrul presupune scrierea unei expresii ; pentru fiecare pachet în parte este evaluata logic aceasta expresie. Daca în urma evaluarii se obtine o expresie adevarata, pachetul trece de filtru, în caz contrar fiind oprit.
O expresie de filtrare consta dîntr-o serie de primitive agregate prin intermediul operatorilor and (&&), not(!), or (||)
PRIMITIVA |
PARAMETRI |
EXEMPLU sI DESCRIERE |
src host dst host Host |
host_addr |
Sunt capturate numai pachetele cu adresa IP specificata src host 10.0.0.1 - adresa sursa 10.0.0.1dst host 10.0.0.1 - adresa destinatie 10.0.0.1 host 10.0.0.1 - oricare din adrese este 10.0.0.1 |
ether src ether dst ether host |
ehost |
Sunt capturate doar pachetele cu adresa MAC specificata ether src 11:22:33:44:55:66 - adresa MAC sursa este 11:22:33:44:55:66ether dst 11:22:33:44:55:66 adresa MAC destinatie este 11:22:33:44:55:66 ether host 11:22:33:44:55:66 oricare din adresele MAC este 11:22:33:44:55:66 |
net |
net ne/tlen net mask mask |
Sunt capturate pachetele a caror adresa IP face parte din subreteaua specificata Poate fi combinata cu src, dst net 10.0.0.0 - oricare din adresele IP apartine intervalului 10.0.0.1-10.0.0.255net 10.0.0.0/25 - intervalul permis este 10.0.0.1-10.0.0.127 src net 10.0.0.0 mask 255.255.255.128 - reteaua sursa este cea din exemplul anterior |
src port dst port port |
port |
Sunt capturate doar pachetele TCP sau UDP ce contin portul specificat src port 53 - pachetele cu port sursa 53 (DNS)dst port 53 - pachetele cu port destinatie 53 port 53 - oricare din porturi este 53 |
less greater |
length |
Sunt capturate doar pachetele a caror lungime îndeplineste cerinta less 1000 - pachetele cu marime mai mica de 1000 de octetigreater 1000 - marimea pachetelor trebuie sa fie mai mare de 1000 de octeti |
ip proto |
\icmp \tcp \udp nd igrp |
Protocolul aflat deasupra IP-ului este cel specificat; tcp, udp si icmp sunt de asemenea primitive, în consecinta trebuie precedate de câte un escape character (\) ip proto icmp - pachetele ICMPip proto tcp - pachetele TCP ip proto igrp - pachetele IGRP |
sau prin grupare folosind parantezele. Primitive posibile si exemple de utilizare sunt prezente în tabelul 1.
Alte exemple de expresii de filtrare pe captura:
host 10.0.0.1 and not icmp and less 100 - captureaza numai pachetele ce contin ca adresa sursa sau destinatie 10.0.0.1, a caror lungime este mai mica de 100 de octeti si excluzând pachetele ICMP
src net 10.0.0.0/24 and dst port 80 and not udp- pachetele care vin dinspre reteaua 10.0.0.0 catre portul 80 (HTTP) pe protocol TCP
Sintaxa filtrului de vizualizare
Literal |
C |
Descriere si exemplu |
eq | |
Egal ip.addr==10.0.0.5 |
ne | |
Diferit ip.addr!=10.0.0.5 |
gt | > |
Mai mare decât frame.pkt_len > 10 |
lt | < |
Mai mic decât frame.pkt_len < 128 |
ge | >= |
Mai mare sau egal |
le | <= |
Mai mic sau egal frame.pkt_len <= 0x20 |
Filtrul de vizualizare ne permite sa ne concentram doar pe pachetele care prezinta interes, lasând la o parte restul capturii. Pachetele pot fi selectate dupa protocol, prezenta si valoarea unui câmp din header, sau chiar comparatii între câmpuri sau între câmpuri si valori introduse manual.
TABELUL 2
Ethereal ofera un limbaj de filtrare usor, mai ales pentru cei familiarizati cu limbajul de programare C. Operatorii de agregare a expresiilor au atât forme literale, cât si formele cunoscute din limbajul C, dupa cum arata tabelul 2.
Ethereal dispune de o mare varietate de câmpuri ce pot fi incluse într-o expresie. În tabelele 3 si 4 pot fi gasite o parte din câmpurile disponibile pentru IP si TCP; pentru detalii suplimentare, se poate consulta Anexa A a User Manual-ului aflat pe site, unde poate fi gasita o lista detaliata cu câmpurile recunoscute pentru fiecare protocol în parte.
Filtrul de vizualizare poate fi aplicat fie scriind expresia sa în edit box-ul din partea de jos a ferestrei Ethereal si apasând ENTER, fie alegându-l din lista de filtre salvate anterior. Revenirea la afisarea nefiltrata a pachetelor se face apasând butonul Reset.
Exemple de filtre de vizualizare:
ip.src==10.0.0.1/25 && ip.src>10.0.0.3 sau
ip.src eq 10.0.0.1/25 and ip.src gt 10.0.0.3 - sunt afisate doar pachetele ce provin din subreteaua 10.0.0.1-10.0.0.127 în afara de primele 3 adrese din acest interval
ip.src==10.0.0.1 and icmp and ip.ttl<=3 - sunt afisate numai pachetele ICMP provenite de la 10.0.0.1 care au TTL-ul mai mic sau egal cu 3
ip.src==10.0.0.1&&tcp.srcport!=80 - sunt vizualizate doar pachetele provenite de la 10.0.0.1 al caror port TCP sursa nu este cel HTTP (80)
Câmp |
Semnificatia câmpului |
tcp.ack |
Acknowledgement number |
tcp.checksum |
Checksum |
tcp.dstport |
Port destinatie |
tcp.flags |
Flags |
tcp.hdr_len |
Lungimea header-ului |
tcp.port |
Port sursa sau destinatie |
tcp.seq |
Sequence number |
tcp.srcport |
Port sursa |
tcp.urgent_pointer |
Urgent pointer |
tcp.window_size |
Dimensiunea ferestrei |
Câmp |
Semnificatia câmpului |
ip.addr |
Adresa sursa sau destinatie |
ip.checksum |
Header checksum |
ip.dst |
Adresa destinatie |
ip.flags.df |
Don't fragment |
ip.flags.mf |
More fragments |
ip.hdr_len |
Lungimea header-ului |
ip.len |
Lungime totala |
ip.src |
Adresa sursa |
ip.tos |
Type of Service |
ip.ttl |
Time to live |
|