Tematy na dziś

  • Serwery proxy
    • Tunele SSH
    • Tor
  • bezpieczeństwo HTTP
    • ciasteczka
    • webstorage
    • XSS
    • CSRF
  • Blockchain

Materiały

Serwery proxy i powiązane technologie

Klucze SSH

Firewalle

HTTP

Szyfrowanie

Ciasteczka

Ataki typu cross-site i zapobieganie im

Blockchain

Przebieg zajęć

  1. Wprowadzenie do protokołów TCP i UDP; porty, handshake TCP
  2. Najważniejsze porty i usługi
  3. Jak działają firewalle typu stateful?
  4. Wprowadzenie do sieci Tor
  5. Ustawianie kluczy SSH na maszynach wirtualnych
  6. Tworzenie tuneli z SSH

Zadania do wykonania w trakcie zajęć

Tor (1 pt)

Połącz się z przeglądarki Opera do sieci Tor (poprzez odpowiednie proxy SOCKS5). W przeglądarce Opera wyświetl stronę o poniższym adresie (osiągalnym tylko poprzez Tor):

https://www.facebookcorewwwi.onion/

W drugiej zakładce otwórz stronę:

https://whatismyipaddress.com/

Zwróć uwagę, gdzie Twój ruch w sieci Tor kontaktuje się z normalnym internetem (tzn., gdzie znajduję się twój węzeł wyjściowy Tor).

Konfiguracja maszyny wirtualnej (kontenera)

Maszyny wirtualne dedykowane do tych zajęć dostęne są pod adresem tin-sXXXXXX.vm.wmi.amu.edu.pl. Przed ich pierwszym użyciem wymagana jest ich konfiguracja. Należy wykonać następujące kroki:

  1. Zalogować się na stronie https://cloud.wmi.amu.edu.pl używając danych z domeny LABS.

  2. W lewym panelu (pool view), należy odnaleźć swoją maszynę. W zakładce Network możemy poznać adres IP swojej maszyny (nie jest to publiczny adres IP). W zakładce Console mamy dostęp do logowania się bezpośrednio na maszynę.

  3. Włącz maszynę a następnie zaloguj się (poprzez Console) na konto root korzystając z hasła tin2020.

  4. Zmieniamy hasło komendą passwd.

  5. Do wykonania następnego zadania konieczne jest włączenie logowania przez ssh dla roota. W tym celu należy zedytować plik /etc/ssh/sshd_config. Zmieniamy permitRootLogin na yes.

  6. Restartujemy usługę sshd komendą

    # systemctl restart sshd.service
  7. Sprawdzamy czy zmiany zostały uwzględnione próbując połączyć się do naszej maszyny wirtualnej z lokalnego komputera.

    $ ssh root@tin-sXXXXXX.vm.wmi.amu.edu.pl

    Zostaniemy poproszeni o nasze hasło. Jeśli zostaniemy poprawnie zalogowani to konfiguracja została zakończona.

Klucze SSH (1 pt)

Na własnym komputerze wygeneruj parę kluczy kryptograficznych (publiczny/prywatny). Przykłady poniżej będą używać tzw. kluczy Ed25519, które uważa się za bezpieczne i odporne na ataki. To jest stosunkowo nowy standard i starsze oprogramowanie może go nie wspierać. Należy wtedy użyć innych algorytmów (RSA, ECDSA).

$ ssh-keygen -t ed25519

Para kluczy będzie zapisana w plikach .ssh/id_ed25519 i .ssh/id_ed25519.pub. Pierwszy jest prywatny, drugi można wysyłać w świat. Klucz prywatny można dodatkowo zabezpieczyć szyfrowaniem z użyciem hasła.

Aby logować się do serwera bez potrzeby wpisywania hasła za każdym razem, należy dodać klucz publiczny do pliku .ssh/authorized_keys na serwerze. W pliku tym można mieć wiele kluczy pozwalających się logować.

Na szczęście nie trzeba tego robić ręcznie, istnieje narzędzie do kopiowania kluczy. Wpisanie:

$ ssh-copy-id -i ~/.ssh/id_ed25519 root@tin-s123456.vm.wmi.amu.edu.pl

z adresem odpowiedniej maszyny wirtualnej skpiuje klucz i umożliwi logowanie bez hasła. Aby jeszcze bardziej uprościć sprawę, dodajemy poniższe linijki do pliku .ssh/config:

Host lts
    HostName lts.wmi.amu.edu.pl
    User sXXXXXX

Host tin
    HostName tin-s123456.vm.wmi.amu.edu.pl
    User root
    ProxyJump lts

Teraz możemy się zalogować wpisując tylko ssh tin. Ponieważ dodaliśmy też sekcję z lts i linijkę z ProxyJump, możemy zalogować się do tin z dowolnego miejsca, mimo że samo tin jest nieosiągalne spoza sieci wydziałowej. SSH najpierw zaloguje się na serwer lts i dopiero potem na tin.

Po wszystkim można zabronić logowania na serwer z użyciem hasła użytkownikowi root. Aby tak się stało należy upewnić się, że mamy linijkę

PermitRootLogin prohibit-password

w pliku /etc/ssh/sshd_config. Aby zadziałało, musimy zrestartować serwer SSH:

# systemctl restart sshd

Klucze SSH nie są wykorzystywane tylko do dostępu do linii poleceń. Kluczy SSH można również używać np. do dostępu bez konieczności wpisywania hasła do GitHub-a czy serwera git.wmi.amu.edu.pl.

Zadania domowe

Dostęp do wyników zadań

Zadania podstawowe sprawdzane są automatycznie. Wyniki zadań dostępne są w pliku tekstowym pod adresem https://kino.vm.wmi.amu.edu.pl/results/dtin/######.txt, gdzie ###### to sześciocyfrowy numer indeksu. Globalna lista wyników dostępna jest pod adresem https://kino.vm.wmi.amu.edu.pl/results/dtin.txt.

Klucz SSH serwera (1 pt.)

Skonfiguruj klucz SSH serwera (hosta) na swojej maszynie wirtualnej w taki sposób, by przedstawiał się publicznym kluczem Ed25519 (klucz ten powinien być różny od stworzonego automatycznie w czasie instalacji maszyny wirtualnej, wygeneruj po prostu nowy klucz).

Aby zadanie zostało sprawdzone należy wysłać maila pod adres bikol@wmi.amu.edu.pl z tematem „[DTIN] Z3.1 ######” (z wpisanym własnym numerem indeksu, będącym częścią nazwy maszyny wirtualnej).

Firewall (1 pt.)

Skonfiguruj firewall na swojej maszynie wirtualnej w taki sposób, by wszystkie próby połączeń na porty 1-1000 (poza 22, 80 i 443) były ignorowane. Upewnij się, że maszyna wirtualna nadal odpowiada na ping.

Aby zadanie zostało sprawdzone należy wysłać maila pod adres bikol@wmi.amu.edu.pl z tematem „[DTIN] Z3.2 ######” (z wpisanym własnym numerem indeksu, będącym częścią nazwy maszyny wirtualnej).

Tunel SSH (1 pt.)

Używając nazwy użytkownika i hasłą z domeny LABS zaloguj się do aplikacji pod adresem https://kino.vm.wmi.amu.edu.pl:1031/ w taki sposób, aby serwerowi wydawało się, że Twoim adresem IP jest adres serwera lts.wmi.amu.edu.pl.

Wskazówka: Konfiguracja sieci wydziałowej sprawia, że port 1031 nie jest osiągalny spoza wydziału. Użyj tunelu SSH albo użyj wbudowanego w ssh proxy SOCKS5.

Pukanie do portów (klient) (2 pt.)

Używając nazwy użytkownika i hasła z domeny LABS zaloguj się do aplikacji pod adresem https://kino.vm.wmi.amu.edu.pl:1032/. Port 1032 jest normalnie blokowany, aby go otworzyć, musisz najpierw zapukać pod porty o numerach 37366 and 22908 (w tym porządku). Port 1032 otworzy się wtedy dla Ciebie na 10 sekund. W tym czasie musisz nawiązać połączenie. Dalszy ruch będzie dopuszczony przez śledzenie połączeń zapory sieciowej. Upewnij się, że tym razem Twój adres IP jest różny od adresu serwera lts.wmi.amu.edu.pl.

Wskazówka: Konfiguracja sieci wydziałowej sprawia, że port 1032 nie jest osiągalny spoza wydziału. Normalnie rozwiązaniem problemu byłby tunel SSH (jak w zadaniu powyżej), ale zadanie wymaga innego serwera niż lts. Można obejść ten problem rozwiązując zadanie z wewnątrz sieci wydziałowej, korzystając z tunelu do swojej maszyny wirtualnej lub korzystając z wydziałowego VPN-a. Szczegóły konfiguracji VPN-a można znaleźć tutaj.

Zadania dodatkowe

Pukanie do portów (serwer) (3 pt.)

Skonfiguruj pukanie do portów na swojej maszynie wirtualnej.

  • Port 85 powinien być normalnie blokowany (porównaj drugie zadanie powyżej).
  • Weź swój numer indeksu (np. 412345). Podziel go na dwie liczby trzycyfrowe (np. 412 and 345). Do każdej z tych liczb dodaj 1000. To są numery portów pod które należy pukać.
  • Skonfiguruj serwer czekający na zapukanie w taki sposób, by wysłanie pakietu TCP na pierwszy port i pakietu UDP na drugi port otwierało port 85 dla źródłowego adresu IP na 15 sekund. Na porcie 85 powinien nasłuchiwać serwer HTTP zwracający dla każdego żądania GET plik testowy zawierający 6 znaków: numer indeksu.

Blockchain (2 pt.)

Stwórz kilka plików tekstowych tworzących łańcuch blockchain w następujący sposób:

  • Stwórz trzy pliki tekstowe: 0.txt, 1.txt, 2.txt. Każdy z nich powinien być identyczny i zawierać tylko jedną linijkę tekstu: Twoje imię i nazwisko oraz numer indeksu w nawiasach, np. Michał Goliński (123456). Użyj kodowania UTF-8, ostatnim znakiem powinien być pojedynczy znak nowej linii w stylu Unix (LF, a nie CRLF).
  • Aby umieścić plik 0.txt na początku łańcucha znajdź ciąg takich 32 cyfr szesnastkowych (używaj małych liter a-f), by po dodaniu do pliku 0.txt jako druga linijka (znowu zakończona pojedynczym znakiem nowej linii), skrót MD5 tak utworzonego pliku zaczynał i kończył się dwoma zerami (tzn. w sumie wymagamy min. 4 zer w sumie MD5).
  • Aby umieścić plik 1.txt za 0.txt w naszym łańcuchu blockchain postępujemy następująco. Najpierw dodaj obliczoną wyżej sumę MD5 (zaczynającą i kończącą się zerami, z małymi literami a-f) jako drugą linijkę pliku 1.txt. Znajdź ciąg 32 cyfr szesnastkowych (z małymi literami a-f), tak by po umieszczeniu w 1.txt jako trzecia linia (znowu z jednym znakiem nowej linii na końcu) skrót MD5 całego tak utworzonego pliku zaczynał i kończył się dwoma zerami.
  • Podobnie dodaj plik 2.txt do blockchainu: najpierw dodaj linijkę ze skrótem pliku 1.txt i następnie znajdź ciąg 32 cyfr szesnatkowych w trzeciej linijce, która sprawi, że skrót całości zaczyna się i kończy dwoma zerami.