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 |
|