Cyberrange 2 - XSS#
Autor: Tomasz Kowalski
“Where some see coincidence, I see consequence. Where others see chance, I see cost.” Merowing, Matrix Rewolucje
Początkowy dostęp#
Każdy incydent bezpieczeństwa ma jakiś początek. Zwykle takim początkiem jest uzyskanie przez atakującego pewnego dostępu do pewnego środowiska. Ten rodzaj działań został sklasyfikowany w MITRE ATT&CK jako TA0108.
Co to jest MITRE ATT&CK?#
MITRE ATT&CK (Adversarial Tactics, Techniques, and Common Knowledge) to publiczna baza wiedzy opisująca:
działania cyberprzestępców (np. hakerów APT),
metody, techniki i procedury (TTPs), które stosują,
w realistycznym kontekście ataków na systemy IT i OT.
MITRE ATT&CK modeluje zachowanie napastników na podstawie rzeczywistych incydentów. Nie mówi tylko „co może się stać”, ale „co faktycznie robią hakerzy” — krok po kroku.
Zorganizowano to w postaci matrycy, która dzieli działania cyberprzestępców na taktyki i techniki. Jak przystało na katalog, każda z taktyk i technik została oznaczona pewnym identyfikatorem literowocyfrowym.
Matryca ATT&CK służy np. do:
Threat intelligence – analiza grup APT i ich metod,
Red teaming / Blue teaming – projektowanie i testowanie scenariuszy ataku,
Detekcji i monitoringu – tworzenie reguł SIEM / EDR / XDR,
Oceny poziomu bezpieczeństwa – mapowanie luk obronnych,
Compliance – integracja z NIST, ISO, MITRE D3FEND.
Czasami w wiadomościach usłyszysz o dużych incydentach bezpieczeństwa i często wtedy wskazuje się na kraj, który taki atak zainicjował. Faktycznie takie działania cybernetyczne są więc elementem wojny hybrydowej.
Spróbuj wyszukać informacji na temat grupy APT28
, aby przyjrzeć się jej działaniom.
Możesz zacząć do https://pl.wikipedia.org/wiki/APT28 gdzie oprócz opisu znajdziesz bogatą listę przypisów do materiałów prasowych i nie tylko.
Przykładowy opis konkretnych działań najdziesz np. na stronach naszego CERT: https://cert.pl/posts/2024/05/apt28-kampania/
Możesz też zerknąć do MITRE ATT&CK https://attack.mitre.org/groups/G0007/ gdzie znajdziesz nie tylko charakteryzację tej grupy pod kątem stosowanych taktyk (np. T1071.001, T1059.001 lub T1203), ale także opisy innych znanych grup.
TA0108#
W kontekście bezpieczeństwa IT, TA0108 to identyfikator taktyki „Initial Access” w ramach modelu MITRE ATT&CK dla środowisk przemysłowych (ICS). Oznacza to metody, które atakujący mogą wykorzystać, aby uzyskać pierwsze naruszenie systemów OT/ICS.
Odwiedź stronę MITRE ATT&CK TA0108 – Initial Access (ICS): https://attack.mitre.org/tactics/TA0108/
Szukasz inspiracji do działań ofensywnych? Przekonaj się od czego może zacząć się incydent.
Jest tam 12 taktyk, których mogą użyć Twoi przeciwnicy. Szczęśliwie z każdą z nich powiązane są działanie defensywne, które możesz podjąć.
T1189#
Wśród technik w ramach TA0108 wymienia się T1189: Drive-by Compromise. To technika opisująca atak, w którym napastnik wykorzystuje złośliwą stronę internetową do zainfekowania użytkownika, gdy ten odwiedza stronę, często bez jakiejkolwiek interakcji z jego strony (np. bez klikania na linki czy pobierania plików).
W przypadku Drive-by Compromise użytkownik nie musi niczego pobierać ani klikać, wystarczy, że wejdzie na złośliwą stronę internetową. Jest to popularna technika w phishingu oraz atakach na przeglądarki.
Atak opiera się na wykorzystaniu złośliwego kodu w stronach internetowych, który jest automatycznie uruchamiany w przeglądarce użytkownika. Atakujący wstrzykuje złośliwy kod (np. exploit, malware) w zasoby strony, co pozwala im uzyskać dostęp do systemu ofiary bez jej wiedzy lub interakcji.
Odwiedź stronę MITRE ATT&CK T1189: https://attack.mitre.org/techniques/T1189/
W akapicie “Procedure Examples” jest wiele konkretnych przykładów wykorzystania tej techniki. Na pewno bez trudu odnajdziesz APT28 i zauważysz tzw. reflected cross-site scripting (XSS).
Jak działa strona webowa?#
Strona internetowa to zbiór zasobów (tekstów, obrazów, skryptów, plików) wyświetlanych w przeglądarce internetowej, które komunikują się z serwerem, aby dostarczyć użytkownikowi informacje lub umożliwić interakcję z aplikacją.
Podstawowe składniki strony internetowej#
HTML (HyperText Markup Language): Struktura strony, np. nagłówki, akapity, linki, obrazy, formularze. To „szkielet” strony.
CSS (Cascading Style Sheets): Style, które określają wygląd strony — kolory, układ, czcionki.
JavaScript: Skryptowanie, które pozwala na dynamiczne interakcje, np. walidacja formularzy, animacje, zmiana zawartości bez przeładowania strony.
Obrazy i multimedia: Pliki, takie jak zdjęcia, filmy czy dźwięki.
Aby przekonać się jak to faktycznie wygląda odwiedź dowolną stronę internetową i wciśnij ctrl
+ u
Przeglądarka wyświetli Tobie kod HTML tej strony. To najpewniej nie wszystko co składa się na tę stronę, którą oglądasz.
Podstawowy proces ładowania strony#
Wpisanie adresu URL w przeglądarkę:
Użytkownik wpisuje adres URL (np.
https://www.example.com
) w pasku adresu swojej przeglądarki.Zapytanie DNS:
Przeglądarka wysyła zapytanie do systemu DNS (Domain Name System), aby dowiedzieć się, jaki adres IP odpowiada za domenę. Dzięki temu przeglądarka wie, na jaki serwer ma wysłać żądanie.
Połączenie z serwerem:
Po uzyskaniu adresu IP, przeglądarka nawiązuje połączenie z serwerem, który hostuje stronę internetową. Zwykle odbywa się to za pomocą protokołu HTTP lub bezpiecznego HTTPS.
Żądanie HTTP:
Przeglądarka wysyła żądanie HTTP lub HTTPS do serwera, prosząc o przesłanie plików potrzebnych do wyświetlenia strony.
Odpowiedź serwera:
Serwer odpowiada, wysyłając pliki HTML, CSS, JavaScript oraz inne zasoby (np. obrazy). Często odpowiedź zawiera też nagłówki HTTP, które przekazują dodatkowe informacje, jak np. typ treści, status odpowiedzi (np. 200 OK).
Renderowanie strony przez przeglądarkę:
Przeglądarka odbiera dane i zaczyna je renderować. Oznacza to przetwarzanie HTML, CSS i JavaScript w celu wyświetlenia strony na ekranie użytkownika.
Interaktywność:
Po załadowaniu podstawowej treści strony, JavaScript (np. przy użyciu DOM - Document Object Model) pozwala na interakcje z użytkownikiem — np. reagowanie na kliknięcia, zmiana treści strony, walidacja formularzy bez jej przeładowania.
Aby przekonać się jak to faktycznie wygląda odwiedź dowolną stronę internetową i wciśnij F12
Przeglądarka wyświetli Tobie okno z tzw. narzędziami deweloperskimi. Wśród zakładek znajdź tę zatytułowaną “Sieć”, przejdź do niej i wciśnij “wczytaj stronę ponownie”.
Po chwili zobaczysz informacje o tym co sieciowo zrobiła przeglądarka, aby wczytać tę stronę. Zwróć uwagę na licznik u dołu.
Współczesne strony są zwykle dość rozbudowane. Przykładowo, aby wczytać stronę chatgpt.com przeglądarka musi wykonać ponad 130 różnych żądań HTTP. Nie powinno więc dziwić, że użytkownik nie nadzoruje tych czynności świadomie i ktoś może chcieć to wykorzystać.
Edycja podstawowej strony webowej#
Kompletna strona webowa to sporo kodu (i innych zasobów). Można jednak poeksperymentować z mniejszymi przykładami.
CodePen to internetowe narzędzie, które umożliwia tworzenie, testowanie i udostępnianie fragmentów kodu front-endowego bez potrzeby instalowania czegokolwiek na komputerze.
Pozwala pracować z HTML (struktura strony), CSS (wygląd strony), JavaScript (mechanika, interaktywność strony).
Otwórz stronę https://codepen.io/tomaszkow/pen/KwprOza
To jest tzw. „Pen” — czyli mały projekt zawierający kod HTML, CSS i JS, który możesz od razu zobaczyć w działaniu w przeglądarce.
Edytuj, zmieniaj i obserwuj wyniki! ``
Dzisiejsze LLM-y potrafią pisać kod webowy na poziomie juniora, a często nawet lepiej. (Oczywiście nadal warto znać podstawy, bo LLM to narzędzie — nie zastępuje myślenia, testowania i zrozumienia).
Co potrafią LLM-y w kontekście kodu webowego?
Tworzyć pełne strony internetowe:
HTML + CSS + JS (często także responsywne),
z elementami UI/UX (np. formularze, nawigacja, animacje).
Budować aplikacje w frameworkach (React, Vue, Angular, Next.js, Svelte, Tailwind CSS, Bootstrap, …)
Debugować kod (wskazują błędy w istniejącym kodzie, proponują poprawki).
Tłumaczyć kod (opisują, co robi dany fragment).
Optymalizować kod (skracać, upraszczać, czynić bardziej czytelnym i wydajnym).
Użyj np. ChatGPT, aby pomógł Tobie w zmianach w kodzie strony, np. “napisz kod javascript, który zamienia kolorami elementy h1
i button
”.
Odpowiedź przeklej do powyższego pen-a ze zrozumieniem:
wszystko co jest wewnątrz
<style>
wklej do CSSwszystko co wewnątrz
<script>
wklej do JSw HTML zostaw tylko
<h1>
i<button>
Przykładowe modele zdolne do web developmentu:
GPT-4o / GPT-4-turbo (OpenAI),
Claude (Anthropic),
Gemini (Google),
Mistral / Mixtral (open source),
Code LLaMA / DeepSeek / StarCoder.
Oczywiście nadal warto znać podstawy, bo LLM to narzędzie — nie zastępuje myślenia, testowania i zrozumienia. To do człowieka należy precyzyjne określenie co LLM ma wyprodukować np. „Napisz stronę HTML z formularzem kontaktowym, użyj Tailwind CSS, a dane wyślij przez fetch()
do /api/contact
.”
Środowisko do eksperymentów#
Pobierz właściwy dla tego ćwiczenia plik.
Link znajduje się w opisie ćwiczenia na https://pentesterlab.com/exercises/xss-and-mysql-file. Należy kliknąć na “Attachment/Files”; tam jest link do pobrania ISO.
Maszyna wirtualna do tego ćwiczenia nie jest wymagająca. W zupełności wystarczy 512MB ramu i jeden rdzeń. Na maszynie znajduje się podatny serwis webowy, więc aby do niego się dostać trzeba mieć łączność z VM na porcie 80. Być może musisz określić przekierowanie portu.
Przydatne informacje o tym jak uruchomić VM znajdują się w materiale do ćwiczenia “Cyberrange 1 - ciasteczko WP”.
Przebieg ćwiczenia#
W tym serwisie webowym jest luka umożliwiająca tzw. wstrzyknięcie kodu.
XSS (Cross-Site Scripting) to rodzaj ataku na aplikacje webowe, w którym złośliwy kod JavaScript (lub inny skrypt) zostaje wstrzyknięty do strony internetowej, a następnie uruchamia się w przeglądarce innego użytkownika.
Dzięki XSS atakujący może:
wykraść ciasteczka (np. sesyjne),
przechwycić dane z formularzy (np. loginy, hasła),
wykonywać akcje w imieniu ofiary (np. wysłać wiadomość, zmienić hasło),
przekierować na inną stronę,
wyświetlać fałszywe formularze (phishing).
Oto bardzo prosty przykład:
<input type="text" value="<script>alert('XSS!')</script>">
Jeśli serwer nie „oczyści” tego wejścia, skrypt zostanie uruchomiony w przeglądarce osoby odwiedzającej stronę to wyskoczy alert.
Deface#
Poeksperymentuj co “ciekawego” można zrobić z podatną na XSS stroną.
Poproś ChatGPT o pomoc. Niech on wygeneruje kod javascript, który np.:
a. Zmienia wielkość/kolor tekstu b. Obraca stronę o 90 stopni c. Przekierowuje na rickroll na YT
„Zdefejsować stronę” (od ang. deface) oznacza zmodyfikować lub zniszczyć wygląd strony internetowej w wyniku bez zgody właściciela strony.
To sytuacja, gdy atakujący:
zastępuje oryginalną treść strony własnym komunikatem,
dodaje grafiki, hasła, manifesty polityczne, żarty, albo nawet groźby,
czasami zostawia „podpis” w stylu: „Strona została zdefejsowana przez Xx_H4ck3r_xX”.
Jak dochodzi do deface’u?
Najczęściej dzięki:
podatnościom typu XSS, RFI, SQL Injection,
słabym hasłom do panelu CMS (np. WordPress, Joomla),
braku aktualizacji systemu lub pluginów,
błędnej konfiguracji serwera.
Przykładowe cele takich ataków to:
pokaz siły (tzw. hacktivism),
kompromitacja ofiary (np. urzędu, partii, instytucji),
czasem po prostu „dla zabawy”,
zostawienie backdoora lub osadzenie linków do złośliwego oprogramowania.
Jak się chronić?
To zasadniczo odpowiedzialność developera strony. Trzeba zawsze pamiętać filtrowaniu i oczyszczaniu wejścia użytkownika. (Pomaga także używanie bibliotek do bezpiecznego renderowania (np. DOMPurify), stosowanie nagłówków bezpieczeństwa (np. Content Security Policy), unikanie innerHTML
, unikanie dynamicznego tworzenia JS z danych użytkownika. Ogólnie - to kwestia dobrych praktyk i czujności).
Wykorzystanie początkowego dostępu#
Oryginalny opis ćwiczenia dostępny jest na https://pentesterlab.com/exercises/xss-and-mysql-file
Realizację ćwiczenia w całości wymaga użycia narzędzi konsolowych i dobrej konfiguracji środowiska sieciowego maszyny wirtualnej. Choć może się to wydawać nieco wymagające to końcowy rezultat jest bardzo satysfakcjonujący.
Uprowadzenie sesji#
Wykorzystanie podatności XSS polega tutaj na tym, aby wstrzyknąć do strony kod javascript, który spowoduje, że przeglądarka będzie chciała załadować obrazek z serwera, który kontrolowany jest przez atakującego.
W ćwiczeniu “Cyberrange 1 - ciasteczko WP” fałszowaliśmy ciasteczko administratora. Teraz po prostu próbujemy je ukraść.
Ta czynność ma na celu ukrycie prawdziwej intencji. Komentarze często są moderowane i chodzi o to, aby moderator zauważył jedynie to, że komentarz zawiera życzliwy obrazek. Liczymy na to, że moderator nie będzie miał ochoty sprawdzić skąd ten obrazek pochodzi i jak jest wczytywany.
Złośliwy kod wstrzyknięty na tę stronę skłania przeglądarkę do załadowania obrazka w taki sposób, że w żądaniu HTTP wysłanym przez przeglądarkę ukryte będzie ciasteczko sesyjne użytkownika.
Session hijacking (przejęcie sesji) to atak polegający na przejęciu aktywnej sesji użytkownika, zwykle po to, by podszyć się pod niego i uzyskać nieautoryzowany dostęp do systemu lub konta.
Po wyjaśnienie tego i innych terminów zerknij np. na https://www.cyberark.com/what-is/session-hijacking/
Miniserwer HTTP#
socat
to absolutnie genialne narzędzie. potrafi bardzo wiele ale przez to jego użycie z początku nie jest wcale łatwe.
Zerknij na BlessedRebuS/OSCP-Pentesting-Cheatsheet
To zbiór notatek z przygotować do pewnego egzaminu. socat
jest tam wspomniany, choć raczej skromnie. Jest za to szereg innych narzędzi, więc warto popatrzyć, gdyż może się trafić coś czego jeszcze nie znasz.
Na potrzeby tego ćwiczenia być może lepiej jest wykorzystać dowolny malutki serwer HTTP. Jeśli w swoim systemie masz zainstalowanego pythona to masz taki pod ręką. W module http.server
ze standardowej biblioteki jest dostępna funkcjonalność uruchomienia serwera, który generuje listing bieżącego folderu, a gdy żądanie dotyczy konkretnego pliku to potrafi go zaserwować.
Zerknij na https://www.digitalocean.com/community/tutorials/python-simplehttpserver-http-server
To bardzo sympatyczny artykuł na temat tego małego serwerka w pythonie.
W wewnętrznym perymetrze#
Obserwując mecz bokserski zwrócił uwagę na postawę jaką przyjmują zawodnicy - należy być zawsze gotowym na to, że przeciwnik wyprowadzi atak. Może zdarzyć się tak, że w pewnym momencie ktoś opuści gardę.
W tym ćwiczeniu, gdy przejmiesz sesja administratora przekonasz się, że teraz - jako zaufany użytkownik, znajdujesz w się już w innym, mniej chronionym, obszarze; tutaj programista opuścił gardę.
Tutaj wykorzystany zostanie SQL injection. ****Jeśli to nowy dla Ciebie temat to skorzystaj wcześniej z ćwiczenia https://pentesterlab.com/exercises/from-sqli-to-shell
Nie tylko użytkownicy i programiści popełniają błędy. Każdemu może się trafić “słabszy dzień” (chore dziecko i nieprzespana noc, zepsuł się samochód i jeszcze pada). Także administrator może popełnić błąd.
W bezpieczeństwie IT, configuration errors (błędy konfiguracyjne) to niewłaściwe ustawienia systemów, aplikacji, usług lub infrastruktury, które narażają je na ataki lub nadużycia.
To sytuacje, w których:
coś jest źle skonfigurowane,
działa w niewłaściwym trybie,
jest niepotrzebnie odsłonięte (np. publicznie dostępne),
lub nie ma włączonej ważnej funkcji bezpieczeństwa.
W tym ćwiczeniu baza danych skonfigurowana jest tak, że zostanie ona wykorzystana do utworzenia nietypowego (jak na bazę danych) plik w dość specyficznym miejscu.
Jeśli administrujesz bazą MySQL i faktycznie potrzebujesz dostępu do plików w kwerendach to zwróć uwagę na opcję secure_file_priv
Więcej na ten temat w dokumentacji na: https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html#sysvar_secure_file_priv