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.

woensdag 2 augustus 2006

Beheer Terminal Server sessies via telnet

Als je een Windows 2000 of 2003 server beheert door middel van terminal services in admin mode, zul je vast wel eens tegen het limiet van de 2 of 3 maximale simultane connecties aangelopen zijn. Het is mogelijk om met de Terminal Services Manager sessies te resetten. Maar in sommige gevallen werkt deze tool niet. Bijvoorbeeld in het geval dat de te beheren machines lid zijn van een ander domein.

Gelukkig is het dan mogelijk om door middel van de command line alsnog deze sessies te resetten. Hiervoor komt een oude tool weer van pas welke (geloof het of niet) recentelijk in Windows besturingssystemen is geïntroduceerd: TELNET.

Je kunt door middel van een Services of Computer Management snap-in remote te verbinden met de te beheren computer om de telnet service te starten. Vervolgens log je in via telnet. Eenmaal ingelogd, zul je een command prompt krijgen op de remote server.

Nu zijn er 2 commando's die je kunt gebruiken om weer te kunnen inloggen via Terminal servives:

QUERY SESSION
toont welke gebruikers aangelogd zijn

QUERY USER [username sessionname sessionid]
toont o.a. de logon- en idle tijden van de ternminal sessie

Gewapend met deze informatie kun je vervolgens het commando LOGOFF gebruiken om ongewenste connecties af te loggen.

Let er wel op dat deze procedure een noodoplossing is. Telnet is een applicatie die clear-text over het netwerk gaat en is dus uit het oogpunt van beveiliging niet echt gewenst. Zet deze service daarom ook weer uit als je ermee klaar bent.