LabbCybersäkerhet · Etisk hackning
0/0
Laboration

Trafikanalys — varför okrypterade protokoll inte håller

Mål: Förstå med egna ögon varför TLS är obligatoriskt, och kunna konfigurera korrekt transportkryptering.
Miljö: Ditt eget labbnät. All trafik du analyserar är din egen.

Observera

Starta Wireshark i Kali och börja fånga trafik på labbgränssnittet. Logga in på en testapplikation i labbet över vanlig HTTP. Stoppa fångsten och använd filtret:

http.request.method == "POST"
Vad koden gör — förklaring rad för rad

Detta är inte kod utan ett filter du skriver i Wiresharks sökfält. Det döljer all trafik utom den du vill titta på.

http.request.method
Pekar ut en viss egenskap hos ett nätverkspaket: vilken sorts HTTP-begäran det är.
== "POST"
Två likhetstecken betyder "är lika med". POST är den sorts begäran som skickas när du fyller i ett formulär — alltså en inloggning.

Öppna paketet och expandera HTML Form URL Encoded. Dina inloggningsuppgifter står där i klartext.

Gör sedan om samma sak mot en tjänst som använder HTTPS, och filtrera på tls. Du ser att en anslutning sker, du ser serverns certifikat i handskakningen, men innehållet är obegripligt.

Detta är hela poängen med laborationen: skillnaden mellan de två fångsterna är inte en teoretisk risk, den är synlig på skärmen.

Analysera grundorsaken

HTTP, FTP, Telnet och äldre SMTP skickar allt innehåll som läsbar text. Vem som helst som kan läsa trafiken på vägen — någon på samma wifi, en komprometterad router, en nätverksoperatör — ser allt. Problemet är inte en bugg, utan en designegenskap hos protokoll som utformades innan kryptering var standard.

Fundera på var i kedjan trafiken faktiskt passerar: klient → accesspunkt → router → internetleverantör → ett antal mellanliggande nät → server. Varje steg är en plats där trafiken kan läsas.

Bygg försvaret

1. Tvinga TLS på webbservern. Omdirigera all HTTP till HTTPS. Exempel för nginx:

server {
    listen 80;
    server_name exempel.se;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name exempel.se;

    ssl_certificate     /etc/letsencrypt/live/exempel.se/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/exempel.se/privkey.pem;

    # Tillåt endast moderna protokollversioner
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
}
Vad koden gör — förklaring rad för rad

En nginx-konfigurationsfil. Det här är inte ett program som körs rad för rad utan en inställningsfil som webbservern läser när den startar. Blocket säger: ta emot vanlig HTTP och skicka genast vidare besökaren till HTTPS.

server { ... }
Ett block med inställningar för en webbplats. Klammerparenteserna håller ihop det som hör till samma block.
listen 80;
Port 80 är den port vanlig, okrypterad HTTP använder. Här säger servern att den lyssnar där.
return 301 https://$host$request_uri;
301 betyder "flyttad permanent". Servern svarar aldrig på frågan — den skickar besökaren till samma adress fast med https. $host och $request_uri är platshållare som fylls i med webbplatsens namn och sidan besökaren bad om.
listen 443 ssl;
Port 443 är HTTPS-porten. ssl slår på krypteringen.
ssl_certificate
Sökvägen till webbplatsens certifikat, den fil som bevisar för besökarens webbläsare att servern är den den utger sig för att vara.
ssl_protocols TLSv1.2 TLSv1.3;
Tillåter bara de två moderna versionerna av krypteringsprotokollet. Äldre versioner har kända svagheter och utesluts här.

2. Lägg till HSTS. HTTP Strict Transport Security talar om för webbläsaren att den aldrig ska försöka nå sajten över HTTP igen, vilket stänger luckan vid allra första anslutningen efter en omdirigering:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Vad koden gör — förklaring rad för rad

En enda rad som läggs till i nginx-konfigurationen. Den skickar med ett extra meddelande i varje svar, där servern instruerar webbläsaren att aldrig mer försöka nå sajten över okrypterad HTTP.

add_header
Lägger till en rad extra information i svaret till webbläsaren. Besökaren ser den inte, men webbläsaren läser den.
max-age=31536000
Hur länge webbläsaren ska komma ihåg detta, räknat i sekunder. 31 536 000 sekunder är ett år.
includeSubDomains
Regeln gäller även alla underdomäner, till exempel blogg.exempel.se.
always
Skicka med huvudet i alla svar, även felsvar. Utan det utelämnas det ibland.

3. Märk kakor korrekt. En sessionskaka utan Secure kan läcka över HTTP även om sajten i övrigt använder HTTPS:

Set-Cookie: session=...; Secure; HttpOnly; SameSite=Lax
Vad koden gör — förklaring rad för rad

Så här ser det ut när en server ger webbläsaren en kaka. En kaka är en liten textbit som webbläsaren sparar och skickar tillbaka vid varje besök — det är så sajten kommer ihåg att du är inloggad. Orden efter semikolonen är regler för hur kakan får hanteras.

session=...
Själva värdet. I verkligheten en lång slumpmässig sträng som identifierar just din inloggning.
Secure
Kakan får bara skickas över HTTPS. Utan denna kan den läcka ut i klartext.
HttpOnly
JavaScript på sidan får inte läsa kakan. Det begränsar skadan om någon lyckas köra kod på sidan.
SameSite=Lax
Kakan skickas inte med när en annan webbplats gör anrop till din. Skyddar mot att någon lurar din inloggade webbläsare att utföra handlingar.

Secure = skickas bara över HTTPS. HttpOnly = kan inte läsas av JavaScript (relevant i Lab 4). SameSite = begränsar att kakan skickas med vid anrop från andra sajter.

Verifiera

Fånga trafiken igen efter ändringen och bekräfta att inloggningen nu sker över TLS. Kontrollera också att omdirigeringen fungerar:

curl -I http://exempel.se
# Förväntat: HTTP/1.1 301 Moved Permanently + Location: https://...
Vad koden gör — förklaring rad för rad

Ett terminalkommando som kontrollerar att omdirigeringen fungerar. Du ber servern om startsidan över vanlig HTTP och tittar på vad den svarar.

curl
Ett verktyg som hämtar en webbadress från kommandoraden, ungefär som en webbläsare utan fönster.
-I
Stort i. Betyder "hämta bara svarshuvudena, inte själva sidan". Det är huvudena vi vill se.
http://
Observera att vi medvetet frågar över okrypterad HTTP — det är just den vägen vi testar.

Dokumentera

Skriv ett fynd enligt mallen: Rubrik, Allvarlighetsgrad, Beskrivning, Bevis (skärmbild från Wireshark med lösenordet maskerat), Rekommendation. Maskera alltid känsliga uppgifter i rapportbevis — det är standard i riktiga uppdrag.

Reflektionsfrågor: Varför räcker det inte att bara "erbjuda" HTTPS utan att tvinga det? Vad är det specifika problem som HSTS löser och som en 301-omdirigering inte löser?


Kunskapskontroll

Välj ett svar per fråga. Du får återkoppling direkt, och avsnittet markeras som klart när alla frågor är besvarade.

1Du fångar en HTTP-inloggning i Wireshark och filtrerar på POST-anrop. Var finns lösenordet?

2Vilket problem löser HSTS som en vanlig 301-omdirigering inte löser?

3Vad gör flaggan `Secure` på en kaka?