HTB - Cap
Kolejnym wyzwaniem na platformie Hack The Box w ścieżce maszyn linuksowych jest Cap, oznaczona poziomem trudności Easy. W tym laboratorium badam aplikację webową do monitorowania sieci, wykorzystuję podatność IDOR do przechwycenia poświadczeń z nieszyfrowanego zrzutu pakietów, uzyskuję dostęp do systemu przez FTP i SSH, a na koniec przeprowadzam eskalację uprawnień do konta root za pomocą mechanizmu Linux Capabilities.
Skanowanie i identyfikacja usług
Zadanie rozpoczynam od pełnego rekonesansu portów TCP na przydzielonym adresie IP maszyny docelowej. Aby sprawdzić cały zakres portów oraz ustalić wersje uruchomionego oprogramowania, wykonuję skanowanie narzędziem nmap:
nmap -p- --open -sV 10.129.117.225
W poleceniu wykorzystałem następujące przełączniki:
- Pełny zakres portów (All Ports) – opcja
-p-skanuje wszystkie 65535 portów TCP. - Filtrowanie otwartych portów (Open Ports Only) – parametr
--openogranicza raportowane wyniki wyłącznie do portów o statusie otwartym. - Wykrywanie wersji (Service Version Detection) – flaga
-sVodpytuje otwarte porty, aby ustalić nazwy i wersje działających usług.
Wynik skanowania wskazuje trzy aktywne usługi:
Nmap scan report for 10.129.117.225
Host is up (0.066s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
80/tcp open http Gunicorn
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Na maszynie zidentyfikowałem serwer FTP (vsftpd 3.0.3), usługę SSH (OpenSSH 8.2p1) oraz serwer HTTP obsługiwany przez Gunicorn.
Rekonesans aplikacji webowej i podatność IDOR
Po otwarciu adresu IP w przeglądarce trafiam na aplikację webową pełniącą funkcję panelu administracyjnego do monitorowania parametrów sieciowych serwera. W menu znajduje się między innymi zakładka Security Snapshot, która pozwala na generowanie zrzutów ruchu sieciowego.
Podczas analizy ruchu HTTP w narzędziu Burp Suite zauważam, że wyświetlenie szczegółów zrzutu wysyła żądanie do endpointu /data/1, natomiast pobranie wygenerowanego pliku PCAP odbywa się pod adresem /download/1.
Wskazuje to na bezpośrednie odwoływanie się do obiektów IDOR.
Podatność typu IDOR polega na braku weryfikacji uprawnień użytkownika do zasobu wskazanego w parametrze żądania, co umożliwia dostęp do danych innych użytkowników poprzez modyfikację identyfikatora.
Postanawiam przetestować podatność i zmieniam identyfikator w żądaniu z 1 na 0, odpytując adres /download/0. Serwer bez żadnej autoryzacji zwraca wcześniejszy zrzut pakietów, zarejestrowany podczas startu systemu.

Pobrany plik 0.pcap poddaję analizie. Wśród przechwyconych pakietów odnajduję nieszyfrowaną sesję protokołu FTP, w której użytkownik nathan przesyła swoje hasło jawnym tekstem.
Weryfikacja poświadczeń i zdobycie flagi użytkownika
Mając pozyskany login oraz hasło, przechodzę do weryfikacji poświadczeń na serwerze FTP:
ftp nathan@10.129.117.225
Po podaniu hasła logowanie kończy się sukcesem, a wylistowanie zawartości katalogu poleceniem ls potwierdza obecność pliku user.txt:

Ponieważ użytkownicy często stosują to samo hasło w różnych usługach, sprawdzam możliwość zalogowania się na konto systemowe przez protokół SSH:
ssh nathan@10.129.117.225

Uwierzytelnienie przebiega pomyślnie. Uzyskuję interaktywną powłokę w systemie docelowym jako użytkownik nathan i odczytuję flagę użytkownika z pliku user.txt.
Eskalacja uprawnień za pomocą Linux Capabilities
Kolejnym etapem jest podniesienie uprawnień do konta administratora (root). W celu przeprowadzenia audytu konfiguracji systemu przesyłam na maszynę skrypt LinPEAS za pośrednictwem protokołu SCP:
scp linpeas.sh nathan@10.129.117.225:/home/nathan
Po nadaniu uprawnień wykonywania uruchamiam skrypt na maszynie docelowej. W sekcji dotyczącej plików wykonywalnych ze specjalnymi uprawnieniami LinPEAS wyróżnia interpreter Pythona:

Obecność uprawnień weryfikuję również wbudowanym poleceniem systemowym:
getcap -r / 2>/dev/null
Plik /usr/bin/python3.8 posiada przypisane uprawnienie cap_setuid+eip:
Uprawnienia procesów w Linuksie (Linux Capabilities) – mechanizm dzielący pełne uprawnienia roota na mniejsze, precyzyjne przywileje przypisywane do konkretnych plików wykonywalnych.
Zmiana identyfikatora użytkownika (Set UID Capability) – uprawnienie cap_setuid pozwala procesowi na dowolną zmianę swojego identyfikatora UID, w tym na przyjęcie tożsamości roota (UID 0).
Ponieważ interpreter Pythona może manipulować własnym identyfikatorem UID, uruchamiam go i wykonuję krótki kod wykorzystujący moduł os:
import os
os.setuid(0)
Po zmianie UID na 0 proces zyskuje pełne uprawnienia administratora, co pozwala wylistować zawartość katalogu /root oraz odczytać flagę z pliku root.txt:

W ten sposób pomyślnie zdobywam flagę roota i kończę realizację maszyny.
Podsumowanie
Laboratorium Cap doskonale ilustruje łańcuch ataku, w którym pojedyncze błędy konfiguracyjne prowadzą do całkowitego przejęcia systemu:
- Podatność IDOR (Insecure Direct Object Reference) – brak weryfikacji uprawnień w aplikacji webowej pozwolił na nieautoryzowane pobranie zrzutu ruchu sieciowego.
- Nieszyfrowana transmisja (Cleartext Transmission) – przesyłanie poświadczeń otwartym tekstem w protokole FTP umożliwiło łatwe przechwycenie hasła.
- Ponowne użycie haseł (Password Reuse) – wykorzystanie tego samego hasła w usłudze SSH pozwoliło na natychmiastowe uzyskanie powłoki systemowej.
- Nadmiarowe uprawnienia (Excessive Capabilities) – nadanie uprawnienia
cap_setuidinterpreterowi Pythona otworzyło bezpośrednią drogę do przejęcia konta root.
W środowisku produkcyjnym kluczowe jest rygorystyczne sprawdzanie uprawnień na poziomie aplikacji, wycofanie nieszyfrowanych protokołów transmisji oraz stosowanie zasady najmniejszych uprawnień przy konfigurowaniu przywilejów plików wykonywalnych.
Raport z testów można pobrać tutaj.