www.flickr.com

donderdag 10 augustus 2006

Start en stop TCP connecties monitoren

Als je een netwerk sniffer als tcpdump of ethereal start zonder te filteren, dan zul je overweldigd worden door de grote hoeveelheid berichtjes die opvangt. Een filter is dus ten zeerste aan te raden. Maar hoe kun je het beste filteren? Ik vond een artikeltje van Danilo Lujambio dat ik zelf erg handig vond en 1 op 1 heb overgenomen.

.... We zullen hier enkele expressies geven die als filters kunnen fungeren waardoor de hoeveelheid gegenereerde gegevens behapbaar blijft.

Om deze expressies te kunnen begrijpen laten we hier eerst het formaat van een TCP-pakketje zien.

TCP (RFC793)

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgement Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Offset | Reserved |U|A|P|R|S|F| Window |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


We zien dat het 13de byte de vlaggen bevat die het type pakketje bepaalt (SYN, FIN etc.). Met deze kennis en het gebruik van de AND-operatie (&) kunnen we vervolgens bits maskeren en daarmee expressies opbouwen als:

$ tcpdump ' tcp[13] & 7 != 0 and dst 192.168.255.20 ' >/tmp/out7

Waardoor alleen nog pakketjes worden doorgelaten waarvan het R, S of F-bit actief is (het masker is hier 00000111) en die de machine 192.168.255.20 als bestemming hebben.

Met de volgende expressie:

$ tcpdump ' tcp[13] & 1 != 0 and dst 192.168.255.20 ' >/tmp/out1

detecteren we FIN-pakketten (het masker is 00000001). Dit kan handig zijn om te detecteren of nmap actief is met de optie -sF. En met:

$ tcpdump ' tcp[13] & 2 != 0 and dst 192.168.255.20 ' >/tmp/out2

krijgen we alleen pakketten met het SYN-bit actief, om zo te achterhalen of iemand met de optie - sS aan het snuffelen is.

Voor deze laatste variant (optie -sS) zijn er speciale detectieprogramma's verkrijgbaar.


OmniPeek

Mocht je nu gebruik maken van Omnipeek, dan kun je dezelfde informatie verkrijgen door een expert filter te maken met de volgende criteria:


Protocol Filter
Protocol: TCP

AND

Value Filter
Length : 1 byte
Offset : 47
Mask : 0x07
Signed : not checked
Network byte order : not checked
Operator : !=
Value : 0


Of je kunt natuurlijk ook gewoon even mijn filter importeren. Deze kun je downloaden door deze link te gebruiken.

Dit filter werkt exact hetzelfde als de tcpdump variant. Er wordt namelijk binnen TCP pakketten gekeken naar een bepaalde positie welke door middel van de offset wordt aangegeven. Daarna worden de bits gemaskeerd die interessant zijn. Hierdoor worden alleen de laatste 3 bitjes van de tcp control byte gefilterd. En de waarde hiervan mag niet 0 zijn. Zo bereik je hetzelfde resultaat.

Geen opmerkingen: