Wireshark – Bite the bits
Wireshark is de opvolger (fork) van het bekende Ethereal en is een van de bekendste netwerk data analyzers die momenteel (gratis) op de markt te verkrijgen is. Wireshark is in essentie een netwerk sniffer en een protocol analyzer wat erop neerkomt dat Wireshark gebruikt wordt om netwerk pakketten “op te nemen” en later te analyseren. Met Wireshark kun je ontzettend diep in de afzonderlijke pakketten kijken zodat je kunt analyseren wat voor soort data er over de lijn gaat. De Wireshark functionaliteiten komen sterk overeen met applicaties als “tcpdump” en natuurlijk het hiervoor genoemde “Ethereal” maar biedt een unieke GUI waardoor het gebruikersgemak is toegenomen. En toch… om goed met Wireshark te werken zijn een aantal essentiële weetjes niet onbelangrijk. Na het lezen van deze post hoop ik dat je wat makkelijker met Wireshark uit de voeten kunt zodat je eindelijk eens kunt zien wat er nu werkelijk over die lijn gaat.
Ethereal is ontwikkeld door Gerald Combs en verscheen in 1998. Gerald Combs veranderde in 2006 van werk en mocht de merknaam Ethereal niet meenemen. Hij is toen begonnen aan Wireshark waarvan hij natuurlijk nog wel de broncode bevatte. Momenteel is Wireshark de bekendste en meest gebruikte “packet analyzer” op de markt. Wireshark is multi-platform verkrijgbaar en werkt o.a. op Windows, Linux en MacOS. Er bestaat ook een terminal based Wireshark versie onder de naam “TShark”. TShark is ook automatisch geïnstalleerd als je Wireshark geïnstalleerd hebt. In Windows start je TShark b.v. vanuit de Wireshark folder met het “tshark –D” commando. In deze post gebruiken we de Wireshark versie incl. GUI.
Om met Wireshark te werken moet de netwerkkaart van de computer in “promiscuous mode” gezet worden. Dit wil zeggen dat de netwerkkaart alle inkomende pakketten kan verwerken i.p.v. alleen de pakketten die aan hem gericht zijn. Met andere woorden, alle frames worden door de netwerkkaart geaccepteerd waardoor Wireshark ze kan “onderscheppen en loggen”. Wireshark zal zelf je netwerkkaart in “promiscuous mode” proberen te plaatsen waarna Wireshark volledig kan functioneren. Als het niet lukt om de netwerkkaart in “promiscuous mode” probeer dan een andere netwerkkaart want niet iedere netwerkkaart ondersteund deze optie.
Als Wireshark de opgenomen netwerkactiviteit (packet dump) op wilt slaan kan hij dat in diverse formaten. Sinds versie 1.8 gebruikt Wireshark het pcapng formaat welke de meeste zaken opslaat. Voor versie 1.8 en nog steeds een veelgebruikte optie is het “libpcap” formaat welke met extenties werkt als .pcap, .cap en .dmp. Verder kent Wireshark nog vele andere formaten zoals b.v. .enc, .bfr, .trc en .syc. Wireshark kan eveneens trace formaten converteren naar andere formaten. Vooral pcapng formaten worden vaak teruggezet naar pcap formaten omdat diverse andere tools het pcap formaat hanteren.
Als je Wireshark opstart krijg je het volgende scherm te zien:
Om vervolgens je netwerkactiviteit op wilt nemen druk je op de “rec” button.
En om de opname te stoppen gebruiken we uiteraard de “stop” button.
Nadat de opname gestopt is kan de packet dump worden geanalyseerd en worden opgeslagen.
De intuïtieve GUI van Wireshark voorziet in een handige kleurencodering waardoor bepaalde pakketten meteen met een protocol of gebeurtenis kunnen worden geassocieerd. Het default kleurenschema is als volgt:
Let op, je kunt in Wireshark dit kleurenschema gemakkelijk aanpassen om je eigen kleuren te gebruiken. Dit kun je doen onder “View” – “Coloring Rules”.
Belangrijk om te weten is dat groen “HTTP” verkeer is, lichtpaars is TCP en lichtblauw is UDP. Lichtroze is ICMP verkeer.
Een paar Wireshark Tips
Om nog efficienter met Wireshark te werken zijn er een aantal tips die we kunnen inzetten om het allemaal nog net iets makkelijker te maken. Bijvoorbeeld:
- DNS resolution
Standaard laat Wireshark alleen maar IP adressen zien. Echter is het soms handiger om de domeinnamen te zien. Nu kun je alle IP adressen zelf gaan resolven maar waarom moeilijk doen als het makkelijk kan. Wireshark kan dit namelijk ook voor je doen. Deze feature zet je aan via “Edit” – “Preferences” (CTRL+SHIFT+P). Hier ga je naar “Name Resolution” alwaar je de optie “Resolve network (IP) addresses” inschakeld.Let op: Wireshark gaat nu elk IP adres proberen te resolven waardoor de complete netwerk trace wordt “vervuild” met DNS requests.
- Remote capturing
Windows Wireshark gebruikers hebben de WinPCap library geïnstalleerd en kunnen hiermee verkeer monitoren van een remote device zoals switches en firewalls. Om hiervan gebruik te maken moet je eerst de “Remote Packet Capture Protocol” service starten in je service manager (services.msc). Nu deze service gestart is moet je ervoor zorgen dat je toegang hebt op poort 2002 van het remote systeem. Deze poort wordt door Wireshark gebruikt. Als dit geverifieerd is ga je in Wireshark naar “Capture” – “Options” (CTRL+K) en ga naar “Manage Interfaces”. Hier klik je op het tabblad “Remote Interfaces”. Door op het “+” icoontje te klikken voeg je een nieuwe interface toe. Vul hier het remote apparaat in en het poortnummer (default dus 2002). Voeg eventueel nog authenticatiegegevens toe en “capturen” maar. - Maak Firewall ACL rules
Gebruik je als netwerk administrator Wireshark om firewalls en verkeersstromen te testen dan biedt Wireshark je de optie om nieuwe ACL regels aan te maken op je firewall. Wireshark doet dit door de juiste commando’s te genereren die je alleen nog maar uit hoeft te voeren op de Firewall. Het genereren van ACL regels gaat als volgt in zijn werk. Selecteer eerst een pakket waarop een ACL gemaakt moet worden. Vervolgens ga je naar “Tools” – “Firewall ACL Rules”.
Vervolgens komt er een popup waar je je apparaat moet selecteren zodat Wireshark weet in welke taal de regels geschreven moeten worden. Ook kun je nog kiezen voor een “deny” of “allow” ACL. De regels worden vervolgens in het bovenste venster getoond.
- Voorbeeld Wireshark Captures
Mocht je het e.e.a. willen testen, maar gebeurt er niks interessants op je netwerk dan kun je gebruik maken van voorbeeld traces. Deze traces kun je downloaden via de volgende link: https://wiki.wireshark.org/SampleCaptures. De meeste captures zijn in het .pcap en .cap formaat. - TCP Stroom volgen
Je kunt natuurlijk zelf alle pakketten vergelijk in de complete packet dump, maar als je alle pakketten tussen 2 apparaten in een bepaalde sessie wilt zien kun je gemakkelijk een TCP stroom volgen. Om dit uit te voeren klik je rechts op een bepaald pakketje en kies je voor “Follow” – “*** Stream”.
Hier zie je de volledige conversatie tussen de apparaten in een sessie.
- Kolommen toevoegen
In Wireshark staan de meest voorkomende kolommen al gedefinieerd. Je kunt echter zelf gemakkelijk een kolom toevoegen. Zie je een waarde in het “Packet Details” venster (venster 2) die je als kolom toe wilt voegen klik hier dan rechts op en selecteer “Apply as Column”.
Eigen profiel / instellingen
De default settings in Wireshark zijn prima. Toch geef ik er de voorkeur aan om toch een eigen draai aan de interface te geven zodat bepaalde zaken net wat duidelijker en handiger worden. De settings die ik altijd meteen verander zijn als volgt:
Maak onder “Edit” – “Configuration Profiles” een nieuw profiel aan (of overschrijf het huidige “default” profiel:
Vervolgens gaan we een paar instellingen aanpassen:
Onder “Edit” – Preferences”:
De layout ziet er nu als volgt uit:
De volgende stap is het aanpassen van je kleurenprofiel zoals eerder ook als tip gegeven. Het kleurenprofiel aanpassen kan onder “View” – “Coloring Rules”. De default kleuren zijn prima maar als je vaak Wireshark gebruikt om b.v. bepaalde errors zoals HTTP errors te detecteren dan kun je ervoor kiezen om alles behalve HTTP groen te kleuren. Op die manier maak je de interface nog intuïtiever en Wireshark makkelijker in gebruik.
Wireshark Filters
Wireshark kent 2 soorten filters, namelijk de “Capture Filters” en de “Display Filters”. Capture filters zijn minder uitgebreid en worden gebruikt tijdens het capturen van pakketten om het formaat van de “Raw Packet Capture” te verkleinen. Voor Capture filters wordt de BPF syntax gebruikt. Capture filters worden geplaatst voordat het capturen start en kunnen niet meer aangepast worden tijdens het capturen. Display filters kunnen wel on-the-fly worden aangepast en zijn een stuk uitgebreider. Ze verkleinen echter het formaat van de Raw Capture niet.
Door het toepassen van filters wordt verkeer welke voldoet aan de filter getoond of weggelaten uit het overzicht (afhankelijk van het filter). Filters zijn dus een zeer belangrijk onderdeel en misschien ook wel het moeilijkste onderdeel van Wireshark.
Laten we eens een aantal filter commando’s (operators) bekijken!
- eq
Equal (gelijk aan / =) - ne
Not equal (niet gelijk aan / !=) - gt
Greater than (groter dan / >) - lt
Less than (kleiner dan / <) - ge
Greater than or equal to (groter dan of gelijk aan / >=) - le
Less than or equal to (kleiner dan of gelijk aan / <=) - and
Logiacal AND (en / &&) - or
Logiacal OR (of / ||) - xor
Logiacal XOR (xor / ^^) - not
Logiacal NOT (niet / !) - ||
Koppel meerdere separate commando’s aan elkaar. - {}
Membership brackets. Middels deze brackets kunnen we bepaalde waarde groeperen zodat we deze niet los hoeven te definiëren.tcp.port in {80 443 8080}
Is hetzelfde als:
tcp.port == 80 || tcp.port == 443 || tcp.port == 8080
Bovenstaande operators zijn slechts een kleine greep uit alle mogelijkheden. Wireshark ondersteund bijvoorbeeld ook reguliere expressies – https://jarnobaselier.nl/reguliere-expressie-regular-expression-regexp-regex-re/.
Met bovenstaande kennis kunnen we al aardig wat filters creëren. Bijvoorbeeld de volgende “Capture Filters”.
Wireshark Capture Filters
Toon al het verkeer van een bepaalde host:
host 192.168.100.1 |
Capture al het verkeer binnen een network range:
net 192.168.100.0/24 |
Capture al het verkeer vanuit devices binnen een network range naar de host:
src net 192.168.100.0/24 |
Capture al het verkeer van de host naar apparaten binnen een specifiek subnet:
dst net 192.168.100.0/24 |
Capture alleen specifiek verkeer (b.v. DNS traffic):
port 53 |
Capture al het verkeer met uitzondering van specifiek verkeer (b.v. DNS traffic):
port not 53 |
Capture al het verkeer binnen een range van opgegeven poorten:
tcp portrange 1001-2001 |
Capture geen broadcast en multicast verkeer:
not broadcast and not multicast |
Mocht je een specifieke activiteit op het network willen traceren kun je ervoor kiezen om alleen dat specifieke verkeer te capturen. Het volgende filter zoekt naar een icmp echo-aanvraag welke 92 bytes lang is en waarvan de een icmp-lading begint met 4 bytes van A’s (hex). Dit is namelijk de handtekening van de welchia worm net voordat het probeert een systeem in gevaar te brengen.
Capture geen broadcast en multicast verkeer:
icmp[icmptype]==icmp-echo and ip[2:2]==92 and icmp[8:4]==0xAAAAAAAA |
Om meerdere wormen te vinden kan het volgende verkeer gecaptured worden:
dst port 135 or dst port 445 or dst port 1433 and tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) = 0 and src net 192.168.100.0/24 |
Hiermee onderscheppen we namelijk al het verkeer welke vanuit het lokale netwerk naar de poorten 135, 445 en 1433 van andere devices gestuurd worden. Wormen en virussen proberen juist op deze poorten vaak andere hosts te contacteren en te recruteren.
Persoonlijk ben ik niet zo’n fan van capture filters omdat delen van het verkeer niet opgenomen worden. En deze missende delen kunnen dus nooit meer bekeken worden. Ik neem liever gewoon alles op en filter later pas wat ik werkelijk nodig heb. Laten we dus eens kijken naar de Wireshark Display Filters.
Wireshark Display Filters
Laat alleen pakketten zien die van apparaten gestuurd zijn in het 192.168.100.x subnet:
ip.src==192.168.100.0/24 |
Laat alleen pakketten zien die naar apparaten gestuurd zijn in het 192.168.100.x subnet:
ip.dst==192.168.100.0/24 |
Toon alleen verkeer in het interne 192.168.100.x subnet (verkeer van en naar elkaar):
ip.src==192.168.100.0/24 and ip.dst==192.168.100.0/24 |
Toon alleen verkeer tussen 2 devices (2 IP adressen):
ip.addr==192.168.100.1 && ip.addr==192.168.100.2 |
Toon alleen poort 25 (SMTP) verkeer:
tcp.port eq 25 or icmp |
Toon al het HTTP en DNS verkeer:
http or dns |
Verwijder vervuiling in het overzicht door ARP, ICMP en DNS verkeer eruit te filteren:
!(arp or icmp or dns) |
Toon al het verkeer van en naar een specifieke poort:
tcp.port==2500 |
Toon alle TCP pakketten met het woord “facebook”. Dit is ideaal al je zoekt naar een specifiek woord of een userID:
tcp contains facebook |
Filter verkeer op basis van een MAC adres:
eth.addr == AA:BB:CC:DD:11:22 |
Toon alle actieve PING’s in het network:
icmp.type == 8 || icmp.type == 0 |
Toon alle ICMP echo (PING) requests die niet beantwoord werden:
icmp.type==8 and not icmp.resp_in |
Toon alle TCP resets:
tcp.flags.reset==1 |
Zoek naar TCP pakketten met informatie of waarschuwingen zoals retransmissions, dubbele ACK’s, out-of-orders etc.
tcp.analysis.flags |
Zoals al eerder gezegd ondersteund Wireshark ook RegEx. RegEx kan b.v. gebruikt worden om geavanceerd te zoeken. Een e-mailadres filter maken we d.m.v. RegEx als volgt:
smtp matches "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9._%+-]" |
Hetzelfde trucje kunnen we ook doen voor IP adressen:
http matches "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}" |
Als we het dan nog wat geavanceerder maken kunnen we ook zoeken naar een e-mail met een creditkaartnummer (Mastercard in dit voorbeeld):
smtp matches "5\\d{3}(\\s|-)?\\d{4}(\\s|-)?\\d{4}(\\s|-)?\\d{4}" |
Waar je op moet letten tijdens het filteren is dat Wireshark in de IP Header van een bericht kijkt. In deze header staan meerdere protocol velden. De filter “ip.addr” is dus een geldige filter maar kijkt zowel naar het source als destination adres. De filter:
ip.addr == 10.43.54.65 |
Is dus hetzelfde als:
ip.src == 10.43.54.65 or ip.dst == 10.43.54.65 |
Bovenstaande is nog niet zo verwarrend. Het wordt verwarrende wanneer we verkeer willen uitsluiten. Laat bijvoorbeeld al het verkeer zien behalve het verkeer van IP adres 10.43.54.65.
ip.addr != 10.43.54.65 |
Bovenstaande filter is dus feitelijk hetzelfde als:
ip.src != 10.43.54.65 or ip.dst != 10.43.54.65 |
Dit vertaalt zich naar “laat al het verkeer zien behalve het verkeer met een source IPv4-adres van 10.43.54.65 EN een destination IPv4-adres van 10.43.54.65”. Het resultaat is dus dat er niets getoond wordt en dat is niet wat de bedoeling is.
Om dit probleem op te lossen moeten we de hele expressie uitsluiten zodat de regel al het verkeer laat zien behalve het verkeer met een source IPv4-adres van 10.43.54.65 OF een destination IPv4-adres van 10.43.54.65.
! ( ip.addr == 10.43.54.65 ) |
Bovenstaande is niet alleen van toepassing op IP adressen maar ook op meerdere waardes zoals b.v. “tcp.port” + “udp.port” en “eth.addr”.
Als je een goed filter hebt welke je op wilt slaan dan kun je dat op een aantal manieren doen. Bijvoorbeeld:
1. Via “Analyze” – “Display Filters” kun je ook je d.m.v. het “+” icoontje je commando toevoegen aan de lijst:
2. Je kunt het filter ook toevoegen als button. Dit kun je doen via het “+” icoontje achter de filter balk of via “Edit” – “Preferences” en dan via “Filter Expressions”. Vul je commando in en geef hem een naam. Vervolgens zal het commando als button verschijnen zodat je deze gemakkelijk kunt inschakelen.
3. Via “Display Filter Macro’s” onder de “Analyze” menuitem kun je eveneens je filter opslaan. Je geeft dan je filter een naam, bijvoorbeeld “macro1” en later kun je dan weer gemakkelijk naar dit filter refereren door deze aan te roepen met de naam als “${macro1}”.
That’s all folks
Filtering in Wireshark is misschien nog wel de lastigste klus van allemaal. Ik hoop dat ik in deze post een aantal nuttige tips heb gegeven over het werken met Wireshark en dat het filteren van netwerkverkeer weer iets duidelijker is geworden. Na het lezen van deze post kun je zelf aan de slag om de stroom van netwerkverkeer te ontrafelen en om de geheimen te ontdekken die zich nu nog verschuilen in deze wirwar van bits en bytes.
Vond je deze post nuttig deel hem dan even via je sociale kanalen! Dat wordt uiteraard enorm gewaardeerd!!