6379 - Pentesting Redis
Приєднуйтесь до HackenProof Discord, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!
Інсайти щодо Хакінгу Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу
Новини про Хакінг у Реальному Часі Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі
Останні Оголошення Будьте в курсі найновіших запусків баг баунті та важливих оновлень платформи
Приєднуйтесь до нас на Discord та почніть співпрацювати з топовими хакерами вже сьогодні!
Основна Інформація
З документації: Redis - це відкрите програмне забезпечення (ліцензія BSD), яке використовується як сховище структур даних в пам'яті, використовується як база даних, кеш та посередник повідомлень).
За замовчуванням Redis використовує протокол на основі простого тексту, але слід пам'ятати, що він також може реалізувати ssl/tls. Дізнайтеся, як запустити Redis з ssl/tls тут.
Порт за замовчуванням: 6379
Автоматичне перелікування
Деякі автоматизовані інструменти, які можуть допомогти отримати інформацію з екземпляра redis:
Ручне переліку
Банер
Redis - це текстовий протокол, ви можете просто надіслати команду через сокет, і отримані значення будуть читабельними. Також пам'ятайте, що Redis може працювати з використанням ssl/tls (але це дуже дивно).
У звичайному екземплярі Redis ви можете просто підключитися за допомогою nc
або також можете використовувати redis-cli
:
Першою командою, яку ви можете спробувати, є info
. Вона може повернути вивід із інформацією про екземпляр Redis або щось подібне до наступного:
У цьому останньому випадку це означає, що вам потрібні дійсні облікові дані, щоб отримати доступ до екземпляра Redis.
Аутентифікація Redis
За замовчуванням Redis можна отримати доступ без облікових даних. Однак його можна налаштувати для підтримки тільки пароля або імені користувача + пароля.
Можливо встановити пароль в файлі redis.conf з параметром requirepass
або тимчасово до перезапуску служби, підключившись до неї та виконавши: config set requirepass p@ss$12E45
.
Також ім'я користувача можна налаштувати в параметрі masteruser
всередині файлу redis.conf.
Якщо налаштований лише пароль, то використовується ім'я користувача "default". Також слід зауважити, що зовнішнім чином неможливо визначити, чи було Redis налаштовано лише з паролем чи ім'ям користувача + паролем.
У випадках, подібних до цього, вам потрібно знайти дійсні облікові дані, щоб взаємодіяти з Redis, тому ви можете спробувати перебрати їх. Якщо ви знайшли дійсні облікові дані, вам потрібно аутентифікувати сеанс після встановлення з'єднання за допомогою команди:
Дійсні облікові дані будуть відповідати: +OK
Аутентифіковане переліку
Якщо сервер Redis дозволяє анонімні підключення або якщо ви отримали дійсні облікові дані, ви можете ініціювати процес переліку служби, використовуючи наступні команди:
Інші команди Redis можна знайти тут і тут.
Зверніть увагу, що команди Redis екземпляра можуть бути перейменовані або видалені в файлі redis.conf. Наприклад, цей рядок видалить команду 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 (бази даних) за допомогою:
У цьому прикладі використовуються бази даних 0 та 1. База даних 0 містить 4 ключі, а база даних 1 містить 1. За замовчуванням Redis використовуватиме базу даних 0. Щоб, наприклад, вивантажити базу даних 1, вам потрібно виконати:
У разі отримання наступної помилки -WRONGTYPE Операція проти ключа, який містить неправильний тип значення
під час виконання GET <KEY>
це тому, що ключ може бути чимось іншим, ніж рядок або ціле число і вимагає спеціального оператора для відображення його.
Щоб дізнатися тип ключа, використовуйте команду TYPE
, приклад нижче для ключів списку та хешу.
Вивантаження бази даних за допомогою npm redis-dump або python redis-utils
Приєднуйтесь до сервера HackenProof Discord, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!
Інсайти щодо Хакінгу Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу
Новини про Хакінг у Реальному Часі Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі
Останні Оголошення Будьте в курсі найновіших баг-баунті, які запускаються, та важливих оновлень платформи
Приєднуйтесь до нас на Discord та почніть співпрацювати з найкращими хакерами вже сьогодні!
Redis RCE
Інтерактивна Оболонка
redis-rogue-server може автоматично отримати інтерактивну оболонку або зворотню оболонку в Redis (<=5.0.5).
PHP Веб-оболонка
Інформація з тут. Вам потрібно знати шлях до папки веб-сайту:
Якщо виникла помилка доступу до веб-оболонки, ви можете очистити базу даних після резервного копіювання та спробувати ще раз, не забудьте відновити базу даних.
Шаблон веб-оболонки
Так само, як у попередньому розділі, ви також можете перезаписати деякий файл html-шаблону, який буде інтерпретований шаблонним движком, і отримати оболонку.
Наприклад, слідуючи за цією статтею, ви можете побачити, що зловмисник впровадив rev shell в html, який інтерпретується шаблонним движком nunjucks:
Зверніть увагу, що декілька шаблонних движків кешують шаблони в пам'яті, тому навіть якщо ви їх перезапишете, новий не буде виконаний. У цих випадках або розробник залишив автоматичне перезавантаження активним, або вам потрібно виконати DoS на службу (і очікувати, що вона буде автоматично перезапущена).
SSH
Приклад звідси
Будь ласка, зверніть увагу, що результат config get dir
може змінитися після інших команд вручну. Рекомендується виконати його першим, одразу після входу в Redis. У виводі config get dir
ви можете знайти домашню директорію користувача redis (зазвичай /var/lib/redis або /home/redis/.ssh), і знаючи це, ви знаєте, куди можна записати файл authenticated_users
для доступу через ssh з користувачем redis. Якщо ви знаєте домашню директорію іншого дійсного користувача, де у вас є права на запис, ви також можете зловживати цим:
Згенеруйте пару ключів ssh public-private на своєму комп'ютері:
ssh-keygen -t rsa
Запишіть публічний ключ у файл:
(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
Імпортуйте файл в Redis:
cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
Збережіть публічний ключ у файлі authorized_keys на сервері Redis:
Нарешті, ви можете ssh на сервер Redis з приватним ключем: ssh -i id_rsa redis@10.85.0.52
Цю техніку автоматизовано тут: https://github.com/Avinash-acid/Redis-Server-Exploit
Crontab
Останній приклад для Ubuntu, для Centos, вищезазначену команду слід змінити на: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/
Цей метод також можна використовувати для заробітку біткоїнів: yam
Завантаження модуля Redis
Дотримуючись інструкцій з https://github.com/n0b0dyCN/RedisModules-ExecuteCommand ви можете скомпілювати модуль Redis для виконання довільних команд.
Потім вам потрібно якось завантажити скомпільований модуль
Завантажте завантажений модуль під час виконання за допомогою
MODULE LOAD /path/to/mymodule.so
Перелік завантажених модулів для перевірки правильності завантаження:
MODULE LIST
Виконайте команди:
Відключіть модуль в будь-який момент:
MODULE UNLOAD mymodule
Обхід пісочниці LUA
Тут можна побачити, що Redis використовує команду EVAL для виконання Lua-коду в пісочниці. У зазначеному пості можна побачити, як це можна зловживати, використовуючи функцію dofile, але здається це вже не можливо. У будь-якому випадку, якщо ви зможете обійти пісочницю Lua, ви зможете виконувати довільні команди в системі. Також, з того ж поста ви можете побачити деякі варіанти спричинення DoS.
Деякі CVE для виходу з LUA:
Модуль Майстер-Слейв
Майстер Redis всі операції автоматично синхронізуються з редисом-слейвом, що означає, що ми можемо розглядати уразливий редіс як редіс-слейв, підключений до майстер-редісу, який ми контролюємо, тоді ми можемо вводити команди до нашого власного редісу.
SSRF розмова з Redis
Якщо ви можете надіслати запит чітким текстом до Redis, ви зможете спілкуватися з ним, оскільки Redis буде читати запит по рядках і просто відповідати помилками на рядки, які він не розуміє:
Отже, якщо ви знайдете уразливість 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:
І запит URL encode, зловживаючи SSRF та CRLF для виконання whoami
та надсилання виводу через nc
, має наступний вигляд:
З якоїсь причини (як для автора https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/, звідки була взята ця інформація), експлуатація працювала з схемою git
, а не з схемою http
.
Приєднуйтесь до HackenProof Discord сервера, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!
Інсайти щодо Хакінгу Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу
Новини про Хакінг у Реальному Часі Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі
Останні Оголошення Будьте в курсі найновіших запусків баг баунті та важливих оновлень платформи
Приєднуйтесь до нас на Discord та почніть співпрацювати з топовими хакерами вже сьогодні!
Last updated