Institutionen för
Informationsteknologi och Medier
Avdelningen för Informations- och
kommunikationssystem
Laboration 2, DTEA22, 5p
VT 2005, period 4.
Protokoll- och trafikanalys
Materialet författat av Daniel Forsgren
och reviderat av Magnus Eriksson
Laborationsassistent: Magnus
Eriksson, magnus.eriksson@miun.se
Inlämningsdatum: ______________________________________________
Namn, pnr och e-post för
laborant(er):
________________________________________________________________
________________________________________________________________
< labburk =
ftp.sunet.se >
< labburk-login =
anonymous >
< labburk-pass = hyshhysh >
Om inte en ”labburk” skulle vara
tillgänglig av någon anledning, exempelvis om du gör labbarna på annan plats än
i Universitetets laborationssalar, så kan du använda ftp-applikationen mot en
publik server för att generera trafik till övningarna. Prova att pinga
<labburk> för att vara säker på att den är tillgänglig. Ett exempel på en
annan lämplig server är annars ftp://ftp.sunet.se/, där man kan logga in
med login anonymous och godtyckligt lösenord.
Uppgift 1:
Vanliga standardprotokoll- och applikationer för IP-nät
IP-paket bär oftast UDP eller
TCP-data, och valet av transportprotokoll beror på vad som är lämpligast för
applikationen. Oberoende av vilket transportprotokoll som ett applikationspar
använder sig av i sin kommunikation (som exempelvis en webserver och en
webläsare), så kommer nätverket i regel att överföra alla IP-paket lika.
Nätverksrouters tar med andra ord normalt inte hänsyn till hurvida ett IP-paket
i sin tur bär ett UDP-datagram eller ett segment i en TCP-konversation.
Skillnaderna i överföringsegenskaper mellan transportprotokollen UDP och TCP
kommer därför främst av mekanismer i protokollen, och i applikationerna som
körs i de kommunicerande ändsystemen.
Applikationsprogram (och
applikationsprotokoll), som kräver tillförlitlig nättransport, men inte har
speciellt höga krav på en låg fördröjning, använder i regel
transportprotokollet TCP. TCP-protokollet är utformat för att verka i harmoni
med nätverket, och ser bland annat till att reglera bandbreddsanvändningen för
att passa den i varje tillfälle tillgängliga bandbredden längst routen genom
nätverket (bandbreddstillgången styrs förstås av situationen i ”flaskhalsen”
efter routen). Med TCP omsänds också paket som försvunnit i nätverket
(exempelvis på grund av trafikstockning i en routernod, som därmed tvingats
kasta paket) automatiskt av transportlagret, utan att någon extra
funktionalitet behöver implementeras ovanför transportlagret.
TCP har varit, och är fortfarande
det mest använda transportprotokollet för tillämpningar över Internet, därav
den populära TCP/IP-kombinationen. Med den ökade användningen av
multimediatillämpningar förväntas dock andelen UDP-trafik att ständigt öka i
framtida IP-nät, en bandbreddskrävande sådan tillämpning är exempelvis
TV-distribution över IP-baserade nätverk.
Vilka skäl kan tänkas finnas för att föredra UDP framför TCP, för
strömmande mediaöverföring över IP-nätverk?:
________________________________________________________________
________________________________________________________________
Ovanpå IP-transportprotokollen TCP
och UDP finns också olika standardiserade applikationsprotokoll definerade.
Syftet med dessa är att mer i detalj specificera hur kommunikationen skall gå
till i olika standardtillämpningar (tjänster), och applikationsprotokollen
använder i sin tur något av de två standardtransportprotokollen för själva
överföringen av data över nätverket. Ett vanligt exempel, som baseras på
TCP-transportprotokollet, är HyperText Transfer Protocol (HTTP). HTTP är
primärt till för överföring av websidor med tillhörande information, och är
optimerat för detta. Två andra vanliga exempel är File Transfer Protocol (FTP)
för filöverföringstjänster, och Telnet för fjärrterminallogin. FTP
standardiserar hur en server som tillhandahåller ett filbibliotek skall
kommunicera med klienter som ansluter till och efterfrågar olika
filöverföringstjänster från servern. Till exempel så standardiseras kommandon
och procedurer för att skicka, ta emot och lista filer. Telnet definerar hur en
telnet-server, som exekveras på en dator som skall tillhandahålla en
textbaserad fjärrinloggningstjänst till användare, skall kommunicera med
klienter som begär fjärrtillgång till datorn över nätverket.
Abstraktionen ”port” är viktig i
ändsystemen, och används för att man skall kunna skicka ett visst UDP eller
TCP-paket till rätt applikation (applikationer kopplar sina sockets till portar
på både server- och klientsidan, på serversidan är i regel vissa ”välkända”
portar knutna till tjänsten). Centralt i nätverket, där ju UDP såväl som TCP
överförs likvärdigt enkapsulerade i IP-paket, saknar dock portnumret mening,
och det är därför normalt sett bara i de kommunicerande ändsystemen portvärdena
tolkas (de hör till transportprotokollets header).
I RFC nummer 1700, sidan 15, finns
standardportarna för några olika tjänster listade (en del modernare tjänster
saknas dock i detta dokument).
Ange vilka tjänster som använder följande standardserverportar och
transportprotokoll:
21/tcp:_________________________________________________________
25/tcp:_________________________________________________________
80/tcp:_________________________________________________________
Alla de vanliga
applikationsprotokollen, som HTTP, FTP och TELNET, skickar all information i
klartext (i alla dessa exempel över TCP). Detta innebär att vem som helst, som
har tillgång till trafiken som passerar någon nätverksnod efter den väg som
kommunikationen följer, har möjlighet att direkt läsa all information som förs
över, som inloggningsuppgifter och kreditkortsnummer. Det är på grund av detta
som banker och Internet-handlare numera ofta använder en krypterad version av
HTTP, kallad HTTPS, för deras webtjänster (inledningen till URL:en indikerar
vilket protokoll som används). Det finns även krypterade versioner av
applikationsprotokoll som FTP (SFTP) och Telnet-liknande lösningar för
terminalaccess (Secure Shell, SSH). En ännu generellare lösning är att kryptera
all IP-kommunikation på lägre nivå (förutom IP-paketheaders – nätverksnoderna
måste ju fortfarande kunna skicka paketen till rätt destination), ett
standardiserat sätt att göra detta för är att använda protokollet IPSec, vilket
bland annat diskuteras i RFC 2401. I sektion 3.2 av detta dokument beskrivs de
två huvudsakliga protokollen för att ge trafiksäkerhet.
Vilka två protokoll nämns (skriv även ut vad förkortningen står för)?:
________________________________________________________________
________________________________________________________________
Uppgift 2:
Protokollanalysatorn Ethereal
Vi skall nu använda en typ av
program som kan användas både för legitima såväl som illegitima syften,
nämligen en fritt tillgänglig protokollanalysator (populärt kallad
”paketsniffer”), Ethereal. En annan
vanlig paketsniffer, som dock saknar grafiskt användargränssnitt, är tcpdump som inkluderas med många
Unix-liknande operativsystem. Ethereal, som är släppt under en så kallad Open
Source-licens (närmare bestämt GNU)
för en rad olika plattformar och operativsystem, finns att hämta hem och läsa
mer om på URL http://www.ethereal.com/.
Manualen till hela programvaran finns att hämta som Adobe pdf-fil exempelvis på
denna URL,
och en belysande ”FAQ” finns här.
Glöm inte att även installera WinPcap om du installerar programvaran själv i
Microsoft Windows.
Med en paketsniffer kan man
”snappa upp” all trafik som är tillgänglig på nätverket på låg nivå (OSI-nivå
2), och kan sedan analysera den insamlade datan på en önskad nivå och i ett
önskat sammanhang, till exempel som enskilda Ethernet-frames (nivå 2), IP-paket
(nivå 3), TCP-strömmar (nivå 4) och applikationsprotokolltrafikflöden (nivå
5+), till exempel HTTP. Trots namnet så kan Ethereal även användas med andra
typer av underliggande nätverksgränssnitt än Ethernet. URL http://www.ethereal.com/media.html
ger några exempel.
Ge tre olika fysiska mediatyper som Ethereal kan avlyssna under
Windows:
________________________________________________________________
________________________________________________________________
________________________________________________________________
För att paketsniffern skall kunna
läsa all nätverkstrafik på ett nätverksgränssnitt, så måste den ”tappa in” och
läsa trafik långt ner i protokollstacken (på nivå 2). Då går den också förbi
protokollstackens normala funktionalitet på högre nivåer, och man kan till
exempel få tillgång till ett inkommande IP-paket som som har en
destinationsport som inget program egentligen ”lyssnar på” i datorn som
paketsniffern exekveras på. Det är till exempel också möjligt att läsa paket
som har ett annat destinations-IP än datorn som paketsniffern lyssnar på (till
exempel i en gateway där all aggregerad trafik till och från ett subnät
passerar).
Säkerhetsimplikationerna av detta
är uppenbara i fallet gateway/router – en illasinnad person som har möjlighet
att exekvera en paketsniffer på ett IP-subnäts gateway har möjlighet att fritt
undersöka all trafik som går till och från subnätet. Valet mellan ”hubbat”
eller ”switchat” lokalt nät blir också viktigt för säkerheten av liknande skäl.
Förklara varför ett switch-baserat lokalt nät är att föredra framför
ett hub-baserat nät ur säkerhetssynpunkt:
________________________________________________________________
________________________________________________________________
________________________________________________________________
Allt detta möjliggörs genom att
man kan läsa data ”rått” på gränssnittet med hjälp av drivrutinen WinPcap
(eller libpcap i Unix-liknande operativsystem), se mer på URL http://winpcap.polito.it/.
Användaren av paketsniffern kan sätta upp kriterier för exakt vilken trafik som
skall samlas in för senare analys med hjälp av ett filter-uttryck (till exempel ”tcp and dst 10.14.1.254 and port 21”
för att enbart lyssna på TCP-trafik med destination 10.14.1.254 och port 21),
och därmed sålla bort de potentiellt stora mängderna trafik som man inte är
intresserad av.
På grund av
säkerhetsimplikationerna så brukar dock användning av dessa mjukvaror kräva
administratörsrättigheter i de flesta operativsystem. I Universitetets
laborationssalar så får du av säkerhetsskäl inga allmänna
administratörsrättigheter på datorn. Dock finns en lösning som gör att du ändå
kan använda Ethereal i labbet. Detta fungerar så att du startar en ”Virtual
PC”, det vill säga en virtuell separat installation av Windows XP, i en
”sandlåda” på datorn, med tillgång till några få program. För närvarande är
dessa program, förutom Ethereal, en ftp-klient och en telnet-klient.
Det interface du skall lyssna på i
Virtual PC-installationen har inte en IP-adress från den normala 10/8-serien,
utan i stället en från 192.168/16-serien.
Uppgift 3:
Headeranalys
Vår första handfasta övning med
Ethereal blir att samla in lite godtycklig IP-trafik, och studera den
information vi kan få ut av headerinformation på olika OSI-nivåer.
Starta Ethereal-applikationen
(”Start-program-ethereal” i labbet), och välj ”Start” under ”Capture”-menyn i
Ethereal. För att avgränsa mängden trafik att analysera så filtrerar vi bort
alla frames som inte bär på TCP-data, detta görs genom att skriva ”tcp” i
fältet ”Capture filter” innan ”OK” trycks i rutan ”capture options”. Se också
till att rätt nätverksgränssnitt är valt under ”Interface”, det valda gränssnittets
IP-adress syns under och bör alltså vara från 192.168.x.y om du gör labbarna i
Universitetets laborationsmiljö. I annat fall skall IP-adressen för det
interface som kopplar dig mot Internet visas.
Starta nu någon av ”telnet” eller
”ftp”-applikationerna. Skriv ”open <labburk>”
för att koppla dig mot labburken och därmed generera trafik (det kan även komma
med annan trafik, som genereras av operativsystemet eller andra applikationer,
detta kan man begränsa med hjälp av tydligare filteruttryck). Tryck ”STOP” då
några paket registrerats i räknarna på skärmen.
Du har nu en lista som innehåller
alla frames (ramar) som Ethereal fångat upp, på grund av filtret kommer alla
att vara IP-paket som bär TCP-data.
Välj ut en frame mitt i listan,
som bär på ett IP-paket (varje IP-paketet är enkapsulerat i en Ethernet-frame,
eller flera om paketet är fragmenterat), och svara på följande med hjälp av
Ethereals headerdata-fönster (det i mitten). Glöm inte att du kan expandera
varje headerinformationsgrupp med hjälp av ”+”-tecknen i kanten.
Vilken OSI-nivå berör headerinformationen under den första gruppen?:
________________________________________________________________
Framenummer: ___________________________________________________
Tidsdifferens (delta) jämfört med föregående frame: _____________________
Framestorlek i bytes: ______________________________________________
Protokoll som bärs i denna frame: ____________________________________
Källans fysiska (Ethernet)-adress: ___________________________________
(Du kan ofta också se vilken
tillverkare Ethernet-hårdvaran har utifrån den fysiska adressen, då olika
tillverkare tilldelas egna fysiska adressintervall).
Källans IP-adress: ________________________________________________
Destinationens fysiska adress: ______________________________________
Destinationens IP-adress: __________________________________________
Under ”Internet Protocol” kan man
extrahera information ur headern för det IP-paket som ramen bär på.
Vilken OSI-nivå berör denna headerinformation?: ________________________
Time-To-Live: ____________________________________________________
Transportprotokollnummer
(inom parantes): ___________________________
Headerchecksumma: ______________________________________________
Under ”Transmission Control
Protocol” kommer man slutligen åt headerinformation för det specifika
transportprotokoll som används.
Vilken OSI-nivå berör denna headerinformation?: ________________________
Källport: ________________________________________________________
Destinationsport: _________________________________________________
Relativt sekvensnummer: __________________________________________
Headerstorlek i byte: ______________________________________________
Uppgift 4: Studie
av upprättandet och nedbrytandet av en TCP-anslutning
I denna övning ska vi studera hur
en socketanslutning upprättas lite mer i detalj. En socket är en abstraktion av
en virtuell koppling mellan två IP-adress- och portpar, och använder oftast
transportprotokollet TCP. Bitar av kommunikationen transporteras i TCP-segment,
som i sin tur bärs individuellt över nätverket i IP-paket. En socket är
uppbyggd av en serversocket som används i serverprocessen (till exempel en
webserver som Apache) och en klientsocket som används i klientprocessen (till
exempel en webläsare som Internet Explorer). Serverprocessen lyssnar efter
anslutningar från klienter på en viss port på serverdatorn (standardporten för
HTTP är till exempel 80 på serversidan). Klienterna väljer en ledig port, som
används för kommunikationen mot serverdatorn. Då en socket initieras utförs
först en handskakning mellan klient- och serverprocesserna. Efter att denna är
utförd är socketen etablerad och klar för att överföra data åt båda hållen.
Här kommer upprättandet och
nedbrytningen av en socket att undersökas i FTP-fallet.
Starta först en capture-session i
Ethereal. För att minska ner på mängden fångad trafik kan du förstås utnyttja
något lämpligt filteruttryck, till exempel ”tcp and port x”, där x är
standardporten för den applikation du studerar.
Starta nu antingen
FTP-applikationen, och skriv ”open <labburk>”.
Stoppa sedan infångningen i Ethereal direkt, utan att ge några ytterligare
kommandon (om du kör ncftp mot ftp://ftp.sunet.se/
kan eventuellt hela inloggningen gå igenom automatiskt – då får du in
ytterligare trafik efter upprättandet av anslutningen, som du får bortse från),
och svara på följande med hjälp av informationen i Ethereal.
Serveradress: ____________________________________________________
Serverport: ______________________________________________________
Klientadress: _____________________________________________________
Klientport: _______________________________________________________
Då TCP-anslutningen sätts upp genomförs
ett trevägshandskakning mellan de två kommunicerande parterna. En klient
initierar handskakningen genom att skicka ett synkroniseringspaket [SYN] till
rätt port på servern. Att ett TCP-segment är av typen [SYN] indikeras i
TCP-headerns flaggfält. Kontrollera vilket värde flaggfältet i TCP-headern på
det första [SYN]-paketet har i ditt fall.
TCP Flags: _______________________________________________________
Servern svarar med att skicka ett
[SYN, ACK]-paket som svar tillbaks till klienten (synchronization
acknowledgement), vilket ger ett annat flags-värde i TCP-headern. Kontrollera
vilket det är.
TCP Flags: _______________________________________________________
För att slutföra anslutningen
skickar klienten tillbaks ett [ACK]-paket till servern. Kontrollera flaggvärdet
igen.
TCP Flags: _______________________________________________________
Anslutningen är nu upprättad, och
kan användas bidirektionellt.
Vi skall nu också studera
nedbrytandet av en TCP-anslutning. Detta görs med en fyrvägshandskakning mellan
de kommunicerande parterna som upprättat en anslutning. Gör en fullständig
inloggning på FTP-servern och starta sedan en ny capture-session i Ethereal.
Skriv ”quit” i FTP-applikationen och stoppa sessionen i Ethereal.
Nedbrytningen görs i båda
riktningar. Även nedbrytningen initieras av klienten, som först skickar ett
[ACK, FIN]-paket (paket 1) till servern (acknowledgement, finish). Kontrollera
flaggvärdena på detta paket.
TCP Flags: _______________________________________________________
Servern svarar nu med ett
[ACK]-paket (paket 2), och börjar sedan bryta ner anslutningen även från sin
sida. Redovisa (inom hakar, [ ]) vilka ytterligare två pakettyper som skickas i
fortsättningen av nedbrytningen, och i vilken riktning varje paket i den går
(server-klient eller klient-server).
Paket 3: _________________________________________________________
Paket 4: ________________________________
Anslutningen är nu nedbruten på
normalt sätt.
Anslutningar kan också brytas ner
mer abrupt, till exempel på grund av nätverksproblem, för stor fördröjning
(timeout), abrupt avslutade applikationer och liknande. Då kan i stället ett
enda Reset [RST]-paket eller ett [RST, ACK]-paket få bryta ner anslutningen.
Testa detta genom att sniffa med Ethereal (använd inget TCP-specifikt filter i
detta fall, eftersom [RST]-paket inte är del av TCP-anslutningen, dock är [RST,
ACK]-paket det) medan du kopplar dig till FTP-servern, men avbryter med CTRL-C
på inloggningsprompten (detta terminerar FTP-klienten abrupt). Om du kör ncftp
i labbet så fungerar inte CTRL-C, stäng då i stället fönstret med ”krysset” för
fönstret, så avbryts klienten.
Observerad sista pakettyp: _________________________________________
Flags-värde för detta paket: ________________________________________
Uppgift 5:
Sniffning av FTP-session
I denna uppgift skall vi följa en
FTP-konversation med hjälp av Ethereal, för att försöka ta reda på vad den
innehåller, vilket borde gå eftersom FTP är ett okrypterat protokoll.
Starta en ny capture-session i
Ethereal (använd ett lämpligt filter för att enbart fånga din ftp-session om du
vill). Logga in fullständigt på en valfri FTP-server. Skriv ett kommando på
webservern, till exempel ”ls” för att lista filer. Skriv sedan ”exit” för att
stänga anslutningen. Stoppa sedan Ethereal-sessionen.
Högerklicka nu på något av de
fångade paketen i din FTP-session. Välj ”follow TCP stream”.
Kan du se inloggningsuppgifterna: ____________________________________
Anteckna FTP-kommandon som du observerar under sessionen, med argument
(till exempel USER, brukar vara rödmarkerat):
______________________________________________________________ __
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
Vi skall nu testa att koppla
telnetklienten till FTP-servern du nyss använde, och ge FTP-kommandon. Det kan
göras genom att peka ftp-klienten till FTP-porten på servern, i stället för
till standardporten för telnet (23). Starta nu telnetklienten, och skriv ”open
<labburk> 21”.
Skriv in de FTP-kommandon du
noterade i förra uppgiften, och notera resultatet av varje kommando. Börja med
USER <användarnamn> och så vidare.
Kunde du logga in på FTP-servern med telnet-klienten?
________________________________________________________________
Kunde du hämta en fillista med telnet-klienten?:
________________________________________________________________
Vilket resultat ger kommandot HELP?:
________________________________________________________________
FRIVILLIGA
TILLÄGGSUPPGIFTER (behöver ej redovisas)
Ethereal erbjuder många andra
möjligheter, undersök dem. Titta speciellt efter annan typ av trafik, till
exempel sådan som genereras av operativsystemet. Om du inte gör labbarna i
Universitetets datorsalar kan du också ladda ner och undersöka paketdumpfiler
från olika scenarion på URL: http://wiki.ethereal.com/SampleCaptures