Witaj
Jesteś na GitHub'ie i czytasz właśnie plik README.md który znajduje się wewnątrz repozytorium flaga z instrukcjami 5, 7 i 8 etapu Szturmu na AWS.
Etap 1 - Rozdroże Etap 2 - Anonimowość Etap 3 - Edytor kodu VSCode Etap 4 - Zdobądź serwer Etap 5 - Domena Etap 6 - GitHub Etap 7 - Strona www i Flaga Etap 8 - Materiały i Jupyter Etap 9 - Pomoc Etap 10 - Rozdroże
- wejdziesz na zdobyty serwer
- przygotujesz go
- pobierzesz repozytorium z flagą,
- utworzysz nowe środowisko programistyczne
- w którym uruchomisz i udostępnisz w sieci stronę www napisaną w pythonie
- i jeżeli wszystko zadziała, przejdziesz do etapu 8 i powiesisz flagę.
Zaczynajmy!
- Upewnij się, że masz już stworzony folder xD w którym masz wszystkie potrzebne rzeczy (w tym np. klucz jak taki dostałeś zdobywając serwer AWS, serwery Home go nie mają)
- że masz zakładkę xD w której masz wszystkie podręczne linki dzięki którym szybko przywołasz potrzebne informacje
- że wiesz, jak szybko włączyć terminal, nie ważne w jakim folderze jesteś: terminal: (linux, mac) klikając jednocześnie ctrl+shift+t powershell: (windows) otwórz folder w którym chcesz otworzyć terminal i kliknij w adres i napisz tam powershell - otworzy się.
- Oraz, że wiesz, że jeżeli coś tu nie działa, a zwłaszcza jeżeli masz starszy system, to zawsze dobrze zrobisz jak napiszesz na kanale pomocy. Powershell/terminal: Windows: kliknij ścieżkę w folderze xD PS: od teraz, nie ważne czy jesteś na powershellu czy w terminalu, będę na tego typu okno mówił terminal, a powershell używał jedynie gdy będę opisywał coś co dotyczy konkretnie powershella.
Tu parę słów o obu drogach.
Po zalogowaniu na serwer:
- wejdź na root (utwórz go jeżeli jeszcze nie robiłeś).
echo $USER
Jak pokazuje root to idź do kroku 2. Jeżeli nie, utwórz hasło dla root wpisując:
sudo su
I sprawdź znów pisząc "echo $USER", aż będzie pokazywać root. Jak masz błąd, spytaj na grupie o pomoc.
- Uruchom skrypt:
wget -qO - 'https://raw.githubusercontent.com/ZPXD/flaga/main/pomocnicze_skrypty/unite_the_clans.sh' | bash -s $NEW_USER $DOMENA
I gotowe :) pobierz jeszcze klucz RSA, umieść go wypełniając poniższe:
Jak masz serwer w AWS:
scp -i NAZWA_KLUCZA_PEM.pem ubuntu@NUMER_IP:/home/ubuntu/NAZWA_KLUCZA NAZWA_KLUCZA
Jak masz serwer VPS z Home:
scp root@NUMER_IP:/home/NAZWA_UZYTKOWNIKA_NA_SERWERZE/.ssh/NAZWA_KLUCZA NAZWA_KLUCZA
Klucz wrzuć do folderu .ssh i dodaj go do pola w pliku .ssh/config wg. wzoru:
Host moj_serwerek
HostName 1.1.1.1
User rafal_paczes
IdentityFile /home/rafi/.ssh/potezny_klucz_rafiego
Gotowe! Pobaw się flagą, zmień coś (zobacz etap 8 w tym pliku) lub idź dalej.
Normalnie przechodzimy etapy 5, 6, 7, 8
Czas połączyć się z Twoim serwerem i przygotować go. W tym etapie:
- połączenie z serwerem
- awaryjnie: restart
- root
- użytkownik
- sudo i uaktualniamy paczki (packages).
- tworzymy klucz RSA
- pobieramy z serwera klucz RSA
- łaczymy się z serwerem
(Jeżeli nie wiesz jak to powróć do dokumentu z etapu 5: Jak połączyć się z serwerem ). Wpisz:
ssh root@1.1.1.1
Będąc w folderze xD, gdzie masz klucz .pem wpisz:
ssh -i nazwaklucza.pem ubuntu@1.1.1.1
Otwierając terminal w dowolnym miejscu i pisząc:
ssh moj_serwerek
Od teraz, gdyby coś poszło nie tak, zawsze możesz zrestartować serwer i zacząć od nowa: Resetowanie Serwera. To potrwa ok 5-10 minut i będziesz mógł zacząć od nowa. Raczej tego nie rób jak nie trzeba - stracisz wszystko co jest na serwerze.
Pewną stałą wbudowaną w system jest $USER. Zawsze pokazuje aktualnego użytkownika. Wpisz:
echo $USER
Jeżeli wszystko zrobiłeś prawidłowo, pojawi Ci się: root. Chyba, że jesteś na AWS, to pokaże Ci się ubuntu. Root to coś jak administrator. Ma nawet swój folder o ścieżce /root do którego tylko on ma dostęp. Wszystko co ma przypisane uprawnienia root możesz robić z jego poziomu. Ty jednak chcesz stworzyć nowego użytkownika.
Jednak najpierw, minuta dla AWS'owców.
Dla serwerów postawionych na AWS najpierw dodatkowo ustawiamy uprawnienia root ("administratora"). Skopiuj poniższe komendy i wklej do terminala.
sudo passwd # <----- Wpisz hasło i zapisz je sobie gdzieś.
su - # <----- Tak logujesz się na użytkownika 'root'.
Teraz jesteś jako root.
Użytkownik to to jako kto jesteś na serwerze. Zwykli użytkownicy mają inne uprawnienia niż root. Nie mogą robić pewnych rzeczy i wchodzić w pewne miejsca.
Napisz w terminalu poniższy kod zamieńiając XXX na nazwę jaką chcesz mieć jako użytkownik Twojego serwera. Nazwa nie może zawierać spacji i specjalnych znaków.
NEW_USER=XXXX
Stworzyłeś zmienną NEW_USER. Teraz możesz ją wywoływać zawsze pisząc jej nazwę ze znakiem dolara.
echo $NEW_USER
Czas stworzyć użytkownika o takiej nazwie jak chcesz.
Będziesz pytany o numer telefonu, pokoju i inne rzeczy - wszystko pomijaj naciskając enter.
Wklej poniższy kod aby stworzyć użytkownika o takiej nazwie jaką wartość przypisałeś do NEW_USER.
adduser $NEW_USER
I poniższy kod aby przypisać go do grupy www-data (potrzebnej np. do postawienia strony www) i do grupy sudo (potrzebnej do wykonywania operacji z poziomu użytkownika root).
Nie musisz kodu ręcznie go przepisywać. Możesz łatwo skopiować, najedź myszką na tę ramkę wyżej i w prawym rogu a pokaże się przycisk - kliknij i masz skopiowany tekst. Oczywiście możesz robić to także ręcznie. Ważna rzecz: możesz jednocześnie skopiować i wkleić do terminala wiele linii kodu Teraz możesz wkleić kod, w zależności czy jesteś w powershellu czy w terminalu:
- terminal: (linux, mac) klikając jednocześnie ctrl+shift+v
- powershell: (windows) klikając prawym przyciskiem myszy.
adduser $NEW_USER www-data
adduser $NEW_USER sudo
Sprawdź czy jesteś w grupie sudo i www-data:
groups $NEW_USER
Wyświetli się: $NEW_USER : $NEW_USER www-data sudo. Jak nie ma sudo i www-data, to pominąłeś krok wyżej.
Od teraz też masz swój nowy domowy katalog. Narazie nic tam nie ma. Gdy będziesz się logował na swojego użytkownika, tutaj będziesz się pojawiał
cd /home/$NEW_USER
pwd
Jak przełączać użytkowników? Wejście na Twojego użytkownika: su + nazwa Twojego użytkownika.
su $NEW_USER
Tego nie wpisuj: Wejście spowrotem na root:
su root
Tego nie wpisuj: Gdybyś miał jeszcze innego użytkownia, wszedł byś na niego pisząc (nie zadziała):
su inny_uzytkownik
I spowrotem na nowo utworzonego użytkownika:
su tak_jak_sie_nazwales
Jako użytkownik, pewnych rzeczy robić nie możesz. Np. wchodzić na niektóre foldery, modyfikować pewnych plików czy ich w pewnych miejscach tworzyć. Ani nie możesz instalować nowych paczek.
Upewnij się, że jesteś
su $NEW_USER
PS: w trakcie różnych instalacji gdy proces się zatrzymuje z zapytaniem "Do you want to continue? [Y/n]" na końcu, napisz "Y" aby przejść dalej.
apt update
Nie działa. A spróbuj z sudo:
sudo apt update
Działa. Podnieś wersję paczek:
sudo apt upgrade
Teraz upewniliśmy się, że paczki na naszym serwerze są zaktualizowane. Czasem wchodząc na nowy serwer mamy doczynienia z niezłym skansenem i zawsze warto to zrobić przed całą resztą.
Dzięki sudo możesz robić takie rzeczy jak instalacje. Zwłąszcza takie które mają wpływ na bardziej systemowe rzeczy, jak np. powyższe aktualizowanie paczek,
Napisz pwd a poznasz ścieżkę katalogu w którym jesteś.
pwd
Gdziekolwiek jesteś, przenieś się do swojego katalogu domowego. Zrobisz to używając komendy cd.
Przeniesiesz do dowolnego katalogu pisząc cd + ścieżka. Lećmy do Twojego katalogu domowego.
cd /home/$USER
Stwórz klucz RSA :)
Stwórz katalog .ssh pisząc mkdir + ścieżka folderu.
mkdir /home/$USER/.ssh
Nadaj mu wymagane uprawnienia i wejdź do środka:
chmod 700 /home/$USER/.ssh
cd /home/$USER/.ssh
Nazwij swoje klucze rsa. Bez spacji, znaków specjalnych. Najlepiej tak abyś kojarzył to z Twoim użytkownikiem i serwerem, projektem, np. klucz=xd_moj_uzytkownik:
klucz=NAZWA_KLUCZA
Stwórz parę kluczy RSA: prywatny i publiczny. Zapisz publiczny do authorized_keys i ustaw mu uprawnienia na 600 używając chmod. Wklej poniższe (to gęstsze komendy, ale nie martw się tym aż tak, opowiemy wszystko na zajęciach):
ssh-keygen -f /home/$USER/.ssh/$klucz -C $USER -N ''
cat /home/$USER/.ssh/$klucz.pub > /home/$USER/.ssh/authorized_keys
chmod 600 /home/$USER/.ssh/authorized_keys
Sprawdź, czy klucz został stworzony.
ls
Pojawią się 2 klucze o nazwie xd_$USER. W przeciwnym razie powtórz te kroki albo daj znać, że potrzebujesz pomocy.
Teraz sprawmy abyś mógł się logować. Potrzebujemy pobrać do Twojego katalogu xD nowoutworzony klucz prywatny (bez dopisku .pub).
Trzeba przygotować klucz do pobrania. Narazie nie możemy zrobić tego tutaj, bo nasz użytkownik główny to ubuntu. Trzeba skopiować klucz i nadać mu właściwe uprawnienia, pobrać go przez ubuntu i dopiero będzie można go używać na naszym nowym użytkowniku i dać mu jego uprawnienia. W tym celu dwie linie:
sudo cp $klucz /home/ubuntu/$klucz
sudo chown ubuntu:ubuntu /home/ubuntu/$klucz
Gotowe.
Aby pobrać klucz na komputer wejdź do folderu xD w terminalu i edytuj w poniższej komendzie:
- NUMER_IP - numer ip Twojego serwera, masz to w notatkach,
- NAZWA_UŻYTKOWNIKA - taka jaką stworzyłeś,
- NAZWA_KLUCZA - taka jaką stworzyłeś. Komenda dla VPS Ubuntu przez root (częste w Home):
scp root@NUMER_IP:/home/NAZWA_UŻYTKOWNIKA/.ssh/NAZWA_KLUCZA NAZWA_KLUCZA
Komenda dla AWS EC2 Ubuntu (tu jest jeszcze jedna zmienna):
- NAZWA_KLUCZA_PEM - ten klucz który dostałeś tworząc serwer.
scp -i NAZWA_KLUCZA_PEM.pem ubuntu@NUMER_IP:/home/ubuntu/NAZWA_KLUCZA NAZWA_KLUCZA
Zobacz ls, powinieneś widzieć plik NAZWA_KLUCZA.
ls
Otwórz terminal/powershell w katalogu i wpisz:
ssh -i NAZWA_KLUCZA NAZWA_UŻYTKOWNIKA@$NUMER_IP
Działa? To nie wszystko. Daj:
exit
- Otwórz folder xD i skopiuj znajdujący się tam klucz który właśnie popbrałeś.
- Znajdź u siebie folder .ssh Powinien być w folderze Twojego użytkownika.
- Wklej do środka .ssh Twój klucz który przed chwilą skopiowałeś w kroku 1.
- W środku .ssh znajdź plik config (w windowsie jest to Config) - lub stwórz go.
- Otwórz go i usuń w nim wszystkie wzmianki o Twoim serwerze (bloki zaczynające się od Host, w których jest ip Twojego serwera.
- W środku wklej:
Host TUTAJ_WPISZ_JAKAS_FAJNA_NAZWE_KROTKA_xD
HostName TU_WPISZ_IP_TWOJEGO_SERWERA_xD
User TU_WPISZ_JAK_NAZYWA_SIE_TWOJ_UZYTKOWNIK
IdentityFile TU_WPISZ_PELNA_SCIEZKE_DO_KLUCZA_RSA
Przykład:
Host moj_serwerek
HostName 1.1.1.1
User rafal_paczes
IdentityFile /home/rafi/.ssh/potezny_klucz_rafiego
ssh + to co wpisałeś wyżej po prawej stronie słowa Host. Np:
ssh moj_serwerek
I jesteś.
Wróć tu za chwilę. Teraz zobacz tutaj: łączenie domeny z serwerem.
Przyniesz domenę do serwera w panelu. To zabierze z 5 minut, zaraz tu wrócisz.
Ten etap robisz już jako Twój użytkownik.
Postaw stronę www tak, abyśmy widzieli ją w sieci.
- miejsce na stronę: folder /var/www
- git
- Instalacja paczek systemowych wymaganych do postawienia strony.
- Wewnątrz środowiska (env).
- Instalacja wymaganych bibliotek.
- Stworzenie plików z informacjami dla serwera aby wystawił stronę (nginx i gunicorn).
- Restart nginxa i serwisów.
- Moja strona działa!
Poza tym na AWS trzeba stworzyć folder, gdzie będziemy trzymać Twoją stronę z flagą: mkdir i nazwa folderu: /var/www. Dodaj 2>1 aby nie wyświetlało błędu, jeżeli folder już istnieje. I wejdź do /var.
mkdir /var/www
cd /var
Jeżeli ten katalog już istnieje (będzie błąd) - jest ok - idź dalej.
W środku znajduje się katalog www. Tam będziemy trzymać strony. Nadaj mu uprawnienia które pozwolą potem na dostęp do plików danych. I wejdź do środka.
sudo chown -R www-data:www-data /var/www
sudo chmod -R 775 /var/www
cd /var/www
Instalujemy git'a. To narzędzie do pobierania repozytoriów czyli powiedźmy projektów, aplikacji. My pobieramy repozytorium flagi, które zawiera wszystko czego potrzeba abyś postawił stronę www i zawiesił flagę. Zainstaluj go używając apt, co zrobisz jako użytkownik tylko, jak pamiętasz, używając sudo.
sudo apt install git
I pobieramy (to) repozytorium i rozkładamy manatki.
git clone https://github.com/ZPXD/flaga.git
I wejdź do flagi.
cd flaga
Wszystkie polecenia od teraz do końca skryptu wykonywane są wykonywane w folderze /var/www/flaga .
PS: Zawsze możesz sprawdzić w którym folderze jesteś, pisząc:
pwd
Ustaw nazwę aplikacji i MODYFIKUJ nazwę domeny.:
domena=TUTAJ_WPISZ.pl
echo 'Moja domena to:' $domena
Domena się nie zgadza? Popraw powyższe. Zgadza? Chodźmy dalej.
Jeżeli chcesz przejść etap 7 szybko to po prostu wklej ten cały kod. Jednak więcej się nauczysz przechodząc ten etap krok po kroku, nawet gdy nie znasz 90% tych rzeczy. To hartuje i daje dobre podstawy na przyszłość. Ewentualnie wróć tutaj później. Oto kod na szybko:
chmod +x pomocnicze_skrypty/turbo.sh
source pomocnicze_skrypty/turbo.sh $domena
I wejdź w przeglądarce na adres swojej strony www. Działa? Pewnie, że działa. Gratulacje! Leć do etapu 8. Ale jeszcze lepiej, przeczytaj całość poniżej. Zobaczysz co się dzieje pod spodem i wiele się nauczysz.
Chcesz dowiedzieć się trochę co się dzieje pod maską, samemu to poczuć i przeklikać? Świetny wybór, czegoś się nauczysz albo chociaż nabierzesz obycia i doświadczenia. Do dzieła.
Uruchom skrypt pythona który zawiera serię komend dla linuxa, które zrealizuje automatycznie. Jeżeli jesteś ciekaw co to za komendy możesz podejrzeć plik pisząc cat + nazwa_pliku (cat /var/www/flaga/pomocnicze_skrypty/xD.py ). PS: chodzi o xD.py z dużej litery xD.py a nie xd.py z małej litery.
sudo python3 /var/www/flaga/pomocnicze_skrypty/xD.py
PS: Tak jak się domyślasz, terminal nie czyta niczego po znaku "#" zobacz samemu, wpisz:
ls # sdfgsdfgsdgsgjpodgksg
Wszystkie polecenia wykonywane w tym kroku są wykonywane w folderze /var/www/flaga .
Upewnij się w jakim folderze jesteś, napisz:
pwd
Jeżeli to nie /var/www/flaga to napisz w terminalu:
cd /var/www/flaga
Stwórz środowisko:
python3 -m venv flagaenv # Stwórz środowisko flagenv używając venv.
source flagaenv/bin/activate # Aktywuj środowisko flagaenv
export FLASK_APP=app.py # I zapisz zmienną FLASK_APP równą app.py (nazwie programu strony www)
Użyjemy do tego pip3 - to narzędzie którym pobieramy w pythonie potrzebne biblioteki. We fladze używamy dodatkowo pliku requirements.txt, który jest niczym innym jak listą nazw i wersji bibliotek które będą.
pip3 install -r requirements.txt
Napisz:
nano settings.ini
po spacji wpisz nazwę swojej domeny np (bez "www") wg wzoru:
domena = nazwa_domeny.pl
Aby zapisać wciśnij ctrl+s Aby zamknąć wciśnij ctrl+x
PS: możesz też zrobić to definiując zmienną w bashu np:
domena=nazwa_domeny.pl
echo $domena
Uruchom skrypt przygotowujący hosting na serwerze (1 raz).
sudo python3 pomocnicze_skrypty/xd.py
lub, jeżeli zdefiniowałeś zmienną, napisz:
sudo python3 pomocnicze_skrypty/xd.py $domena
To przyda Ci się za każdym razem, gdy po modyfikacji plików html lub programu app.py będziesz chciał zobaczyć zmiany na stronie.
sudo systemctl daemon-reload
sudo systemctl restart nginx
sudo systemctl restart flaga.service
lub, jeżeli chcesz, napisałem skrypt który to robi za Ciebie.
sudo python3 pomocnicze_skrypty/reload.py
Użyj tej komendy a cofniesz się do początku kroku 6.
Jeżeli modyfikowałeś zmienną domena, wpisz:
python3 pomocnicze_skrypty/usun_pliki_serwerowe.py $domena
Jeżeli modyfikowałeś plik settings.ini, albo to i to, to użyj:
python3 pomocnicze_skrypty/usun_pliki_serwerowe.py
Wejdź na adres Twoje strony w wyszukiwarkę. Zobacz czy strona działa. Nie? Pogłówkuj trochę i/lub napisz na pomoc.
Działa? Wyślij komuś, pochwal się komuś.
Powróć do:
- Edytuj plik tekstowy którego treść widać na Twojej stronie.
- Zobaczy czy na stronie jest nowa treść!
- Stwórz nową zakładkę wymaganą do przejścia szturmu!
- Zobacz czy zakładka działa :)
Urządź się tu :) Będąc dalej na serwerze, w folderze /var/www/flaga edytuj zawartość pliku xd.txt. Dodaj tam coś od siebie.
cd /var/www/flaga
nano dane/xd.txt
Zobacz na stronie www czy działa :)
Ostatnie co zostało, to edycja zakładki /xd flagi. Twoja flaga aby przejść dalej musi spełniać 3 kryteria.
- być widoczna w sieci, czyli działać - to mamy
- w zakładce xd jest na niej "xD" - to też już mamy
- w zakladce xd jest na niej coś napisane poza "xDDD" - to mamy do zrobienia.
Wejdź w przeglądarce na adres swojej strony www i dopisz /xd - to Twoja zakładka /xd.
Bedąc dalej w folderze /var/www/flaga edytuj plik templates/xd.html. Zobacz, jest tam w 12 linii "xDDD". Zostaw xD (z dowolną ilością "D") i: dodaj coś od siebie. Dzięki temu będzie można sprawdzić czy ukończyłeś ten etap. Zrób to tak:
nano templates/xd.html
To plik html. Dodaj coś w 12 linii pomiędzy znakami ">" a "".
<h1 style="text-align:center">xDDD TUTAJ OD SIEBIE DOPISZ :) </h1>
Przeładuj:
sudo systemctl restart flaga.service
lub
sudo python3 pomocnicze_skrypty/reload.py
Zobacz na stronie www czy działa :) - dodaj do swojego adresu "/xd" czyli jak masz domenę "kubus-puchatek.pl" to wpisz "kubus-puchatek.pl/xd".
Możesz opuścić Terminal pisząć:
Najpierw aby się wylogować:
exit
Potem aby opuścić terminal:
exit
A strona nadal będzie stała w internecie.
Zawisło już ponad 750 flag. Zobacz je na: https://zajecia-programowania-xd.pl/flagi