Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

Programowanie skryptowe - Laboratorium

Zajęcia 4. Usługi FTP i SSH realizowane za pomocą skryptów

!!! UWAGA !! Poniższą instrukcję wypełniamy uzupełniając tabelki z szarym tłem.

Punkty, które można zdobyć za poszczególne zadania znajdują się przy treści zadania.
Całkowita możliwa ilość punktów do zdobycia: 15.

Część 1. Wymiana plików z wykorzystaniem FTP


FTP (ang. File Transfer Protocol) to protokół sieciowy służący do przesyłania plików
pomiędzy dwoma komputerami w sieci. Działa on w modelu klient-serwer:
 serwer FTP przechowuje pliki i udostępnia je klientom,
 klient FTP to program, który łączy się z serwerem FTP i umożliwia pobieranie,
wysyłanie i zarządzanie plikami.

1. Bazując na kodzie, który został zaprezentowany do pobrania niniejszej instrukcji,


proszę przerobić go tak, aby możliwe było pobranie pliku tekstowego zamiast
binarnego, kod proszę umieścić w poniżej. Plik znajdujący się na serwerze nosi nazwę:
„test.txt”. Podpowiedź: przydatna może się okazać dokumentacja wbudowanej
biblioteki ftplib: https://docs.python.org/3/library/ftplib.html (1 pkt)
from ftplib import FTP

ftp_server_address: str = "10.104.130.2"

with FTP(ftp_server_address) as ftp:


print(ftp.getwelcome())
ftp.login('user', '12345')
with open('test.txt', 'wb') as local_file:
response = ftp.retrbinary('RETR test.txt', local_file.write)

str. 1
if response.startswith('226'):
print('Transfer zakończony powodzenie')
else:
print('Błąd!')
2. Następnie należy uruchomić program Wireshark, który umożliwia przechwytywanie
pakietów, co pozwoli nam zaobserwować w jaki sposób przesyłane są dane z
wykorzystaniem FTP.
a. Po uruchomieniu programu Wireshark, ukaże się lista dostępnych kart
sieciowych, po najechaniu ukażą się adresy IP powiązane z daną kartą sieciową,
odnajdujemy kartę sieciową, która posiada adres w sieci 10.104.130.X (zdjęcie
poglądowe, nie reprezentuje stanu w laboratorium).

b. Klikamy dwukrotnie na daną kartę sieciową, co rozpocznie proces


przechwytywania pakietów.
c. Wyświetli się okno z widokiem na przesyłane pakiety.
d. Uruchamiamy skrypt napisany w punkcie 1.
e. Zatrzymujemy przechwytywanie pakietów (czerwony kwadrat na górnym pasku
programu).
f. Program Wireshark posiada bardzo rozbudowany silnik (dokumentacja:
https://www.wireshark.org/docs/man-pages/wireshark-filter.html), który
umożliwia filtrowanie pakietów, aby możliwe było znalezienie interesujących
nas konkretnych pakietów. Aby odfiltrować pakiety protokołu FTP należy w
polu filtrowania (zrzut ekranu poniżej) wpisać ftp, które odfiltruję tylko pakiety
należące do tego protokołu, dodatkowo warto również odfiltrować sobie ftp-
data, które będzie zawierało nasz plik tekstowy, filtry można łączyć ze sobą
podobnie jak w logice Python-owej, więc finalnie nasz filtr przyjmie postać: ftp
str. 2
or ftp-data

g. Poniżej proszę umieścić zrzut ekranu prezentujący odfiltrowane pakiety (1 pkt)

h. Bazując na odfiltrowanych pakietach, jak po kolei wygląda transmisja w FTP.


Podpowiedź: po najechaniu na pakiet w dolnym lewym rogu pokazane będą
poszczególne komendy protokołu oraz odpowiedzi na nie. (1 pkt)

Wysłanie nazwy użytkownika (USER) → odpowiedź kod 331 nazwa

str. 3
użytkownika poprawna, proszę o hasło → wysłanie hasła (PASS) →
odpowiedź kod 230 udane logowanie → żądanie zmiany na typ binarny
(TYPE I) → odpowiedź kod 200 zmieniono na typ binarny → żądanie
zmiany na try pasywny (PASV) → odpowiedź kod 227 wejście w tryb
pasywny → żądanie pliku test.txt (RETR test.txt) → odpowiedź kod 125
rozpoczęto transfer → DANE → odpowiedź kod 226 transfer zakończony →
żądanie wyjścia (QUIT) → odpowiedź kod 221 „Do widzenia”
i. W oparciu o pierwszy odfiltrowany pakiet: czy aby na pewno mamy
odfiltrowaną, całą transmisję pomiędzy klientem a serwerem? Odpowiedź
proszę uzasadnić? (1 pkt)
Nie, ponieważ pierwszy pakiet jest opisany jako response (odpowiedź), więc
klient musiał wcześniej użyć innego protokołu aby połączyć się z serwerem i
wysłać żądanie, na które odpowiedzią jest pierwszy pakiet.
j. Jeżeli odpowiedź na poprzednie pytanie była: „Nie, (…)”, proszę odfiltrować w
inny sposób, np. podając adresy IP dla adresów źródłowych (Source) i
docelowych (Destination), można to zrobić za pomocą filtru: ip.src== oraz
ip.dest==. Gdzie po == podajemy adresy IP, proszę również pamiętać że
transmisja jest dwukierunkowa, więc źródłem będzie raz klient raz serwer,
podobnie będzie z adresem docelowym. Jak będzie wyglądać taki filtr? (1 pkt)
ip.src==10.104.130.20 or ip.dst==10.104.130.20 or ip.src==10.104.130.2 or
ip.dst==10.104.130.2

k. Jakie pakiety pojawiły po zastosowaniu takiego filtrowania, proszę zamieścić


krótki opis + zrzut ekranu. (2 pkt)

Przed pakietami protokołu FTP pojawił się trójstronny uścisk dłoni (SYN→
SYN-ACK→ACK) protokołu TCP.

str. 4
3. Proszę napisać, bazując na poprzednich skryptach, skrypt, który będzie listował
zawartość katalogu na serwerze FTP. Podpowiedź do listowania plików można
wykorzystać komendy protokołu FTP: https://ss64.com/rawftp.html. Poniżej proszę
umieścić kod źródłowy. (1 pkt)
from ftplib import FTP

ftp_server_address: str = "10.104.130.2"

with FTP(ftp_server_address) as ftp:


print(ftp.getwelcome())
ftp.login('user', '12345')
ftp.retrlines('LIST')
ftp.quit()

4. Jaki jest wynik działania poprzedniego skryptu? (1 pkt)


220 pyftpdlib based ftpd ready.
-rw-r--r-- 1 ms ms 12784 Nov 07 2022 aREeob5_460swp.webp
-rw-r--r-- 1 ms ms 272490 Mar 20 14:00 instrukcja.docx
-rw-r--r-- 1 ms ms 12 Mar 14 07:21 test.txt

str. 5
Część 2. Wymiana plików z wykorzystaniem SFTP (SSH + FTP)
SFTP (ang. Secure File Transfer Protocol) jest to protokół sieciowy służący do
bezpiecznego przesyłania plików pomiędzy dwoma komputerami w sieci. Jest on oparty na
protokole SSH (Secure Shell), co zapewnia szyfrowanie danych.

1. Instalujemy bibliotekę paramiko (https://www.paramiko.org/installing.html), która


służy do obsługi SSH w wersji 2 w Pythonie.
2. Z ePortalu pobieramy przykładowy skrypt (plik: 2_sftp_client.py), w którym
zaprezentowane zostało w jaki sposób można nawiązać połącznie z wykorzystaniem
SSH. Zapoznajemy się z nim.
3. Przed uruchomieniem ponownie włączamy przechwytywanie pakietów w Wireshark
(identycznie jak poprzednio).
4. Uruchamiamy skrypt, który wylistuję wszystkie pliki znajdujące się na serwerze.
5. Zatrzymujemy przechwytywanie w Wireshark.
6. Filtrujemy pakiety związane z transmisją SSH, wpisując w polu filtra Wireshark: ssh.
Poniżej proszę umieścić zrzut ekranu. (1 pkt)

7. Na podstawie przechwyconych pakietów, proszę określić jaka różnica występuje


pomiędzy FTP a SFTP? (1 pkt)
W SFTP nie widzimy zawartości pakietów, ponieważ są one szyfrowane. W FTP nie
ma szyfrowania, więc widzimy cała „rozmowę” klient-serwer oraz zawartość
przesyłanych plików.
8. Proszę napisać krótki skrypt, który będzie pobierał plik test.txt z serwera SFTP i

str. 6
zapisywał na komputerze pod nazwą test_sftp.txt. Podpowiedź w dokumentacji
biblioteki paramiko. Poniżej proszę zamieścić kod źródłowy. (1 pkt)
9. Poniżej proszę zamieścić zrzut ekranu z eksploratora plików z widocznym pobranym
plikiem test_sftp.txt (1 pkt)

import paramiko

ssh_client = paramiko.SSHClient()

host: str = "10.104.130.2"


username: str = "student"
password: str = "student"
port: int = 22

ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=host, port=port, username=username,
password=password)

sftp = ssh_client.open_sftp()

sftp.get('test.txt',r'C:\Users\student\Desktop\test_stfp.txt' )

sftp.close()
10. Proszę napisać skrypt, który będzie wysyłał plik na serwer, a następnie listował
wszystkie pliki na serwerze. Plik powinien być nazwany według konwencji:
Imie_Nazwisko.txt. Poniżej proszę zamieścić kod programu. (1 pkt)

str. 7
import paramiko

ssh_client = paramiko.SSHClient()

host: str = "10.104.130.2"


username: str = "student"
password: str = "student"
port: int = 22

ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=host, port=port, username=username,
password=password)

sftp = ssh_client.open_sftp()

sftp.put(r'C:\Users\student\Desktop\
Maksymilian_Siergiej.txt','Maksymilian_Siergiej.txt')
print('Pliki: ' + ', '.join(sftp.listdir()))

sftp.close()
11. Poniżej proszę zamieścić wynik działania poprzedniego skryptu. (1 pkt)
Pliki: test.txt, .profile, Maksymilian_Siergiej.txt, .bashrc, .bash_logout,
Kajetan_Kucharski.txt
12. Wypełniony dokument proszę przesłać na ePortal w formacie PDF.

str. 8

You might also like