## Introduktion # Introduktion til Scapy og Netværksanalyse Scapy er et kraftfuldt værktøj til netværksprogrammering og -analyse i Python. Det giver os mulighed for at oprette, manipulere og analysere netværkspakker på et højt niveau. Ved hjælp af Scapy kan vi udføre forskellige netværksopgaver, herunder indlæsning og analyse af pcap-filer, filtrering af pakker og meget mere. ## Lidt baggrund og forberedelse For at komme i gang med Scapy skal du først installere det. Du kan gøre dette ved at åbne din terminal eller kommandoprompt og udføre følgende kommando: https://scapy.readthedocs.io/en/latest/installation.html#installing-scapy-v2-x ```bash pip install scapy ``` Når Scapy er installeret, er du klar til at udforske netværksanalyse med Python. På en linode cloud kræver det pip3 så det starter vi med ```bash sudo apt update ``` ```bash pip3 --version ``` ![[Pasted image 20230929143748.png]] ```bash sudo apt install python3-pip ``` >[!warning] **VIGTIGT!!!** >Det er kun af af jer som skal installere `python3-pip` det kunne være itsuser1 Vi kan teste versionen af python og hvor denne er placeret ```bash python3 --version whereis python3 ``` ```bash mkdir python_scripts cd python_scripts/ ``` >[!tip] >Læs mere om Python virtual environments her: >https://docs.python.org/3/library/venv.html > >![[Pasted image 20230929211731.png]] ```bash python3 -m venv /home/itsuser1/python_scripts/my_venv ``` Fejl mangler python3 modul ```bash itsuser1@localhost:~/python_scripts$ python3 -m venv /home/itsuser1/python_scripts/my_venv The virtual environment was not created successfully because ensurepip is not available. On Debian/Ubuntu systems, you need to install the python3-venv package using the following command. apt install python3.10-venv You may need to use sudo with that command. After installing the python3-venv package, recreate your virtual environment. Failing command: /home/itsuser1/python_scripts/my_venv/bin/python3 ``` VIGTIGT Kun én personer/bruger pr server som gør følgende: ```bash sudo apt install python3.10-venv ``` Efter installation, lad os prøve igen ```bash python3 -m venv /home/itsuser1/python_scripts/my_venv ``` ```bash itsuser1@localhost:~/python_scripts$ python3 -m venv /home/itsuser1/python_scripts/my_venv itsuser1@localhost:~/python_scripts$ ls my_venv itsuser1@localhost:~/python_scripts$ ``` Nu kan vi tage vores virtuelle python miljø i brug ved at aktivere det: ```bash itsuser1@localhost:~/python_scripts$ source my_venv/bin/activate ``` Hvilket giver en ny prompt hvor vi kan se hvilket miljø som er aktiveret ```bash (my_venv) itsuser1@localhost:~/python_scripts$ cd my_venv (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ ``` lad os teste og importere et modul ```bash (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ python3 Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import requests Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'requests' >>> ``` Først kan vi se at modulet `requests` ikke er tilgængeligt Lad os hente det med følgende kommando: ```bash (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ pip install requests ``` Resultat hos mig: ```bash (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ python3 -m pip3 install requests /home/itsuser1/python_scripts/my_venv/bin/python3: No module named pip3 (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ python3 -m pip install requests Collecting requests Downloading requests-2.31.0-py3-none-any.whl (62 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.6/62.6 KB 573.6 kB/s eta 0:00:00 Collecting certifi>=2017.4.17 Downloading certifi-2023.7.22-py3-none-any.whl (158 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 158.3/158.3 KB 1.6 MB/s eta 0:00:00 Collecting idna<4,>=2.5 Downloading idna-3.4-py3-none-any.whl (61 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.5/61.5 KB 2.1 MB/s eta 0:00:00 Collecting urllib3<3,>=1.21.1 Downloading urllib3-2.0.5-py3-none-any.whl (123 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 123.8/123.8 KB 2.2 MB/s eta 0:00:00 Collecting charset-normalizer<4,>=2 Downloading charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (201 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 201.8/201.8 KB 1.7 MB/s eta 0:00:00 Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests Successfully installed certifi-2023.7.22 charset-normalizer-3.2.0 idna-3.4 requests-2.31.0 urllib3-2.0.5 ``` Lad os se om vi kan bruge `requests` modulet nu ```python Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import requests >>> r = requests.get('http://www.techdocs.dk') >>> r.status_code 200 >>> >>> if "jeppesen" in r.text: ... print('found') ... found ``` Hvad mon der vil ske hvis vi deactivere python miljøet: ```bash (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ deactivate itsuser1@localhost:~/python_scripts/my_venv$ itsuser1@localhost:~/python_scripts/my_venv$ python3 Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import requests Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'requests' >>> ``` Altså har kan vi kun bruge modulet i vores virtuelle python miljø ### Installation af Scapy Lad os få installeret scapy i vores python miljø ```bash (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ pip install scapy ``` Lad os test om alt er som det skal være ```python >>> from scapy.all import * >>> ``` ## Læs en .pcap fil På wiresharks hjemmeside finder vi en række **SampleCaptures** lad os kigge nærmere på en af dem: https://wiki.wireshark.org/SampleCaptures Find den som hedder telnet-raw.pcap https://wiki.wireshark.org/uploads/__moin_import__/attachments/SampleCaptures/telnet-raw.pcap Kan i ikke hente den via Wireshark er her et link: https://its-eaaa.eu-central-1.linodeobjects.com/telnet-raw.pcap Lad os hente den ned på vores server med `wget` ![[Pasted image 20230929223310.png]] ```bash wget https://wiki.wireshark.org/uploads/__moin_import__/attachments/SampleCaptures/telnet-raw.pcap ``` ```shell (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ ll total 52 drwxrwxr-x 6 itsuser1 itsuser1 4096 Sep 29 20:32 ./ drwxrwxr-x 3 itsuser1 itsuser1 4096 Sep 29 19:18 ../ drwxrwxr-x 2 itsuser1 itsuser1 4096 Sep 29 19:57 bin/ drwxrwxr-x 2 itsuser1 itsuser1 4096 Sep 29 19:18 include/ drwxrwxr-x 3 itsuser1 itsuser1 4096 Sep 29 19:18 lib/ lrwxrwxrwx 1 itsuser1 itsuser1 3 Sep 29 19:18 lib64 -> lib/ -rw-rw-r-- 1 itsuser1 itsuser1 71 Sep 29 19:22 pyvenv.cfg drwxrwxr-x 3 itsuser1 itsuser1 4096 Sep 29 19:57 share/ -rw-rw-r-- 1 itsuser1 itsuser1 24345 Mar 13 2023 telnet-raw.pcap (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ ``` skriv følgende program i nano (eller vscode hvis du har den koblet til serveren) gem den under et fornuftigt navn ```python from scapy.all import * # Åbn pcap-filen pcap_file = "dit_filnavn.pcap" #indsæt navn på den pcap vi hentede packets = rdpcap(pcap_file) # Gennemgå og udskriv hvert pakkeobjekt for packet in packets: print(packet.summary()) ``` husk filen skal gøres eksekverbar ```bash chmod 755 read_pcaps.py ``` ```bash (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ python3 read_pcaps.py Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet S Ether / IP / TCP 192.168.0.1:telnet > 192.168.0.2:1254 SA Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet A Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet PA / Raw Ether / IP / TCP 192.168.0.1:telnet > 192.168.0.2:1254 PA / Raw Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet A Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet PA / Raw Ether / IP / TCP 192.168.0.1:telnet > 192.168.0.2:1254 A Ether / IP / TCP 192.168.0.1:telnet > 192.168.0.2:1254 PA / Raw Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet PA / Raw ...... ... ``` ### Opgave 1: Enkel PCAP-analyse Individuel opgave Som it-sikkerhedsanalytiker bliver du bedt om at udføre en indledende analyse af netværkstrafik i forbindelse med et muligt angreb på en virksomhed. Du har fået adgang til en række pcap-filer, der indeholder data fra netværket under angrebet. Din første opgave er at forstå omfanget af trafikken ved at tælle antallet af pakker i hver pcap-fil. Brug følgende pcaps: https://github.com/StopDDoS/packet-captures/raw/main/pkt.ICMP.largeempty.pcap https://github.com/StopDDoS/packet-captures/raw/main/pkt.IPV4.randomprotofield.pcap https://github.com/StopDDoS/packet-captures/raw/main/amp.TCP.syn.optionallyACK.optionallysamePort.pcapng ![[hint_scapy_exercise_01.png]] Sammenlign dine resultater med resten af gruppen. ___ ## Analyse af pakker Nu vil vi gerne prøve om vi kan finde specifikke data i en pcap fil. fx. vil vi gerne lede efter en bestemt IP adresse. vi bruger telnet-raw.pcap til denne analyse. Lad os prøve at finde pakker med source ip adresse = 192.168.0.2 ```python from scapy.all import * # Åbn pcap-filen pcap_file = "dit_filnavn.pcap" #brug telnet-raw.pcap packets = rdpcap(pcap_file) # Definér den ønskede kilde-IP-adresse, du vil analysere target_source_ip = "192.168.0.2" # Gennemgå og udskriv kun pakker med den ønskede kilde-IP for packet in packets: if IP in packet and packet[IP].src == target_source_ip: print(packet.summary()) ``` ```bash (my_venv) itsuser1@localhost:~/python_scripts/my_venv$ python3 telnet_src_ip.py Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet S Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet A Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet PA / Raw Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet A Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet PA / Raw Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet PA / Raw Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet PA / Raw Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet PA / Raw Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet PA / Raw Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet PA / Raw Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet A Ether / IP / TCP 192.168.0.2:1254 > 192.168.0.1:telnet A ``` ### Opgave 2: Filtrering efter Kilde-IP under Et Angreb **Dette er en gruppeopgave** Du arbejder som it-sikkerhedsanalytiker, og din organisation er under et pågående netværksangreb. Det er kritisk at isolere og undersøge trafikken fra bestemte kilde-IP-adresser, som du har mistanke om at være relateret til angrebet. Din opgave er at indlæse en given pcap-fil og skrive et Python-program, der filtrerer og udskriver alle pakker med denne(de) bestemte kilde-IP-adresser. brug følgende pcap fil: pkt.ICMP.largeempty.pcap fra opgave 1 Du leder efter følgende source IPv4 adresser: - 162.27.239.154 - 137.191.2.241 - 203.102.6.1 - 192.24.190.209 - Hvilket adresser af ovenstående er at finde i pcap'en? - Af de IP adresser som findes i optagelsen, hvad er lag 2 adresserne (MAC adresser src og dst) i de pakker? ___ ## ICMP med Scapy Nu vil vi kigge nærmere på at anvende Scapy til at sende pakker over et TCP/IP netværk. Vi vil gøre brug af ICMP protokollen. **Introduktion til ICMP (Internet Control Message Protocol)** ICMP, eller Internet Control Message Protocol, er en protokol, der anvendes inden for internettet for at sende fejlmeddelelser og kontrolbeskeder. ICMP-opererer på netværkslaget (lag 3) i OSI-modellen og bruges primært til at rapportere fejlforhold i netværket. **Anvendelser af ICMP:** 1. **Ping (Echo Request og Echo Reply):** ICMP bruges til at udføre netværkstest og verificere, om en vært er tilgængelig. Dette gøres ved at sende en "ping" (Echo Request) og vente på en svarbesked (Echo Reply). 2. **Forsendelse af Fejlmeddelelser:** Hvis en vært eller en netværksenhed oplever problemer, kan den generere ICMP-fejlbeskeder for at informere afsenderen om problemerne. 3. **Fragmenteringskontrol:** ICMP bruges også til at håndtere fragmenteringskontrol, især når det gælder store datagrupper, der skal overføres gennem netværksforbindelser med forskellige MTU (Maximum Transmission Unit). **RFC 792:** RFC 792 er den officielle specifikation for ICMP og blev udgivet i september 1981. Denne RFC med titlen "Internet Control Message Protocol" definerer formater og anvendelsesregler for ICMP-pakker. **Nogle centrale punkter fra RFC 792:** - Definerer ICMP-pakkeformatet og strukturen af ICMP-meddelelser. - Forklarer forskellige typer af ICMP-meddelelser og deres anvendelser. - Beskriver ICMP-fejlbeskeder og deres rolle i netværk. For mere detaljeret information om ICMP anbefales det at læse RFC 792, der giver en grundig indsigt i protokollen og dens anvendelser. Læs nærmere her: https://datatracker.ietf.org/doc/html/rfc792 ### Opgave 3: Spørgsmål til diskussion i gruppen: - Hvad er formålet med ICMP (Internet Control Message Protocol)? - Beskriv kort forskellen mellem Echo Request og Echo Reply i ICMP. - Hvad er rollen af ICMP-fejlbeskeder? Giv et eksempel på en situation, hvor en ICMP-fejlbesked kan blive udløst. - Hvilket lag i OSI-modellen opererer ICMP på, og hvorfor er det vigtigt i netværkssammenhæng? - Hvad er betydningen af "Time Exceeded" ICMP-meddelelse? Hvordan kan den bruges i netværksscenarier? ___ ## Connectivity til Serveren For at sikre, at vi har en fungerende forbindelse, vil vi først kontrollere, om det er muligt at "pinge" serveren fra vores host-laptop. Udfør følgende opgaver: **Server ansvarlig:** Vælg en person i gruppen til at udføre kommandoer på serveren. **Laptop (EDU-netværk):** Udpeg en person til at udføre kommandoer på sin bærbare computer, der er tilsluttet EDU-netværket. Dette kan omfatte at sende ping-anmodninger til serveren og sikre, at der er en vellykket forbindelse. **Laptop (Internet via mobiltelefonens hotspot):** Vælg en person, der vil udføre kommandoer på sin bærbare computer, der er tilsluttet internettet via hotspot på sin mobiltelefon. Dette skal tjekke, om der er en vellykket forbindelse til serveren fra denne alternative internetkilde. Sørg for at rapportere eventuelle fejl eller udfordringer, du støder på, så vi kan analysere og løse eventuelle forbindelsesproblemer. ### Serveren På serveren vil vi gøre brug af tcpdump til at lytte på det interface som er forbundet med en public IPv4 adresse. Så der skal vi sætte den til at lytte på net trafik, og vi er kun interesseret i ICMP trafik: ```bash sudo tcpdump -ni eth0 icmp ``` >[!Todo]- Øvelse - Optag alt trafik på serveren >Prøv at sætte tcpdump til at optage alt trafik som er indkommen til serveren, lad optagelse løbe 2-4 minutter og analyser herefter data i fx. wireshark. hvad er det for data som er optaget, hvilke IP adresser kommer det fra, hvilke port(e), transport protokoller etc? (se eksempelvis min observation under [[#Send ICMP pakke via Scapy]] ![[Pasted image 20231001000115.png]] ### Laptop på EDU Fra denne Laptop tilkoblet EDU wifi net skal vi nu pinge serveren: ``` ping [server IPv4 adresse] ``` Er det fra en windows laptop vil den som default afsende 4 Echo requests, er det fra en Linux maskine kan man med fordel bruge option `-c 4` Denne kommando skulle gerne give et output på server: Analyser output på serveren og redegør for om det er som forventet. ### Laptop - Mobile hotspot Udfør samme kommando som ovenfor ``` ping [server IPv4 adresse] ``` ___ Lav en sammenligning af de oplysninger som i kan aflæse fra tcpdump og redegør for det er som forventet. >[!Success] Gruppe øvelse Brug følgende pcap fil til analyse, analysen må gerne udføres i wireshark. Optagelsen er foretaget via tcpdump på en server og en laptop (client) har udført et antal ping >https://its-eaaa.eu-central-1.linodeobjects.com/icmp_to_server_test.pcap >- Hvornår er første pakke optaget? >- Hvor mange pakker er optaget? >- Hvilke 2 IPv4 adresser har mest kommunikation (top-talkers)? >- Ud af de 2 IPv4 adresser kan I udtale jer om adressen på server og på laptop (client) >- Kan I læse noget af analysen som giver anledning til at antage at der er tale om 2 forskellige client OS? ___ ## Send ICMP pakke via Scapy >[!tip] >Det er en god idé at kende til nogle af de forskellige måder man kan bruge tcpdump på: >Se her for inspiration: > >https://andreafortuna.org/2018/07/18/tcpdump-a-simple-cheatsheet/ > >Fx. er denne option `-A` brug bare i denne øvelse > >**-A** >Print each packet (minus its link level header) in ASCII. Handy for capturing web pages. Til denne øvelse / opgave skal i gå sammen med en anden gruppe da I skal opbygge og sende ICMP pakker til hinandens servere. Således starter i med at tegne en topologi over det lille netværk og med alle de relevante oplysninger for at udføre opgaven. ![[topologi_icmp_scapy.drawio.png | Min topologi vil se sådan her ud (lavet i draw.io)]] Ovenstående ses min topologi som jeg vil gøre brug af i denne demonstration af Scapy ICMP. (lavet i https://app.diagrams.net/) Altså kan følgende tabel laves | | IP | |---------------|----------------| | Scapy Server | 194.233.164.37 | | tcpump server | 172.105.76.116 | >[!info]- Observation > >Under udarbejdelse af dette materiale sad jeg og optog med tcpdump på en cloud server. Her fremkom denne ICMP echo request > >![[Pasted image 20231001101615.png]] > >Hvem mon har IPv4 94.141.126.168 > >![[Pasted image 20231001101808.png]] Optagelse af trafik på tcpdump serveren foretages ved at bruge følgende kommando: ```bash sudo tcpdump -ni eth0 -A icmp ``` Husk at ændre interface navn hvis den hedder noget andet i jeres tilfælde. På Scapy serveren skal vi bruge Scapy modulet og skal derfor aktivere det python virtuelle miljø som i (måske) har oprettet. ```bash source /home/itsuser1/python_scripts/my_venv/bin/activate (my_venv) itsuser1@localhost:~$ ``` Vi vil starte med at bruge Python i interactive mode (https://docs.python.org/3/tutorial/interpreter.html) Nu er det vigtigt at vi aktivere den korrekt python3 og vi skal bruge eleveret rettigheder for at kunne sende pakker via scapy. Altså skal vi starte Python3 med `sudo` præfiks. Min CLI prompt viser ``` (my_venv) itsuser1@localhost:~$ ``` ```bash sudo /home/itsuser1/python_scripts/my_venv/bin/python3 Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> ``` ```python from scapy.all import IP, ICMP, sr1 src_ip = "194.233.164.37" dst_ip = "172.105.76.116" ``` ```python # Opret en ICMP Echo Request-pakke med den specificerede kilde-IP ping_packet = IP(src=src_ip, dst=) / ICMP() ``` ```python >>> ping_packet.summary() 'IP / ICMP 194.233.164.37 > 172.105.76.116 echo-request 0' >>> ``` ```python # Send pakken og modtag svaret (brug sr1 for at modtage et enkelt svar) response = sr1(ping_packet, timeout=1, verbose=False) ``` ```bash >>> response.show() ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 28 id = 11461 flags = frag = 0 ttl = 59 proto = icmp chksum = 0xf32f src = 172.105.76.116 dst = 194.233.164.37 \options \ ###[ ICMP ]### type = echo-reply code = 0 chksum = 0x0 id = 0x0 seq = 0x0 unused = '' >>> ``` ![[Pasted image 20231001233416.png]]