Identyfikacja i eksploatacja Redisa
Pierwsze ćwiczenie z bezpieczeństwa polega na wykryciu serwera z uruchomioną usługą Redis w sieci lokalnej. Celem zadania jest uzyskanie dostępu do usługi oraz odczytanie przechowywanych w niej danych.
Założenia
- Przeskanowanie sieci i wyszukanie aktywnych hostów
- Przeskanowanie portów i identyfikacja działających usług
- Namierzenie usługi Redis oraz złamanie loginu i hasła
- Odczytanie danych znajdujących się w bazie Redis
Instalacja Redis Server
Na Ubuntu Server zainstalowałem Redis Server z repozytoriów systemowych:
sudo apt install redis-server -y
sudo systemctl status redis-server
Redis domyślnie powinien nasłuchiwać lokalnie, zwykle na adresie:
127.0.0.1:6379
Do ćwiczeń potrzebowałem jednak, aby Redis był widoczny również z drugiej maszyny wirtualnej w tej samej sieci labowej.
Konfiguracja usługi Redis Server
Plik konfiguracyjny Redis znajduje się w:
/etc/redis/redis.conf
W konfiguracji ustawiłem dyrektywę bind tak, aby Redis nasłuchiwał lokalnie oraz na adresie IP maszyny:
bind 127.0.0.1 192.168.202.131
Dodatkowo zostawiłem włączony tryb ochronny:
protected-mode yes
Po zmianach zrestartowałem usługę:
sudo systemctl restart redis-server
Następnie sprawdziłem, czy Redis nasłuchuje na porcie 6379:
sudo ss -lntp | grep 6379
Oczekiwany efekt to nasłuchiwanie na localhost oraz adresie interfejsu sieciowego:

Ustawienie loginu i hasła w Redis Server
Redis w nowszych wersjach obsługuje mechanizm ACL (Access Control List), który pozwala tworzyć użytkowników z osobnym loginem, hasłem i zestawem uprawnień. To lepsze rozwiązanie niż samo requirepass, ponieważ umożliwia bardziej precyzyjną kontrolę dostępu.
W moim labie użyłem Redis Server w wersji 8, więc mogłem skonfigurować dostęp w formie:
login: admin
hasło: admin
Najpierw edytowałem plik konfiguracyjny Redisa:
sudo nano /etc/redis/redis.conf
Następnie dodałem konfigurację użytkownika ACL:
user default off <- wyłączenie domyślnego użytkownika Redisa - nie można się zalogować bez podania danych uwierzytelniających
user admin on >admin ~* +@all <- utworzenie użytkownika admin z dostępem do wszystkich kluczy
Poprawne logowanie z użyciem użytkownika i hasła wygląda tak:
redis-cli --user admin -a 'admin' PING
Identyfikacja aktywnych hostów w sieci
Z pomocą narzędzia nmap wyszukałem wszystkie aktywne hosty w sieci:
nmap -sn 192.168.202.131/24
Parametr -sn skanuje aktywne hosty bez skanowania portów.
Narzędzie wykrywa kilka aktywnych hostów:

Następnie przeskanowałem aktywne hosty:
nmap -Pn -sV -p- 192.168.202.131
- Parametr
-Pnpomija sprawdzanie, czy host jest aktywny, - Parametr
-sVwykrywa wersję usługi dostępną na skanowanych portach, - Parametr
-p-skanuje wszystkie porty od 1 do 65535.

Do prostego testu połączenia można użyć klienta Redis:
redis-cli -h 192.168.202.131 -p 6379 PING
Jednak w tym przypadku serwer Redisa jest zabezpieczony i nie można się do niego zalogować bez autoryzacji:
(error) NOAUTH Authentication required.
Eksploitacja hasła Redis Server
System Kali Linux zawiera wiele narzędzi do łamania haseł. Jednym z popularniejszych jest hydra. Niestety w przypadku, gdy serwer Redis zabezpieczony jest loginem i hasłem (a nie samym hasłem), hydra nie wystarczy.
W celu wykrycia hasła napisałem prosty skrypt w Pythonie, który z użyciem redis cli sprawdza możliwe kombinacje haseł z dostarczonej wordlisty.
python3 exploit-redis.py -H 192.168.202.131 -p 6379 -u admin -w /usr/share/wordlists/fasttrack.txt
Wynik działania polecenia po kilku chwilach:

Jak widać, proste hasło można złamać bardzo szybko.