6379 - Pentesting Redis
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!
Hacking Insights Engage with content that delves into the thrill and challenges of hacking
Real-Time Hack News Keep up-to-date with fast-paced hacking world through real-time news and insights
Latest Announcements Stay informed with the newest bug bounties launching and crucial platform updates
Join us on Discord and start collaborating with top hackers today!
З документації: Redis - це відкритий код (ліцензія BSD), сховище структур даних в пам'яті, яке використовується як база даних, кеш і брокер повідомлень.
За замовчуванням Redis використовує протокол на основі простого тексту, але ви повинні пам'ятати, що він також може реалізувати ssl/tls. Дізнайтеся, як запустити Redis з ssl/tls тут.
Порт за замовчуванням: 6379
Деякі автоматизовані інструменти, які можуть допомогти отримати інформацію з екземпляра redis:
Redis є текстовим протоколом, ви можете просто надіслати команду в сокет і повернуті значення будуть читабельними. Також пам'ятайте, що Redis може працювати з використанням ssl/tls (але це дуже дивно).
У звичайному екземплярі Redis ви можете просто підключитися за допомогою nc
або ви також можете використовувати redis-cli
:
Першою командою, яку ви можете спробувати, є info
. Вона може повернути вихід з інформацією про екземпляр Redis або щось подібне, як наведено нижче:
У цьому останньому випадку це означає, що вам потрібні дійсні облікові дані для доступу до екземпляра Redis.
За замовчуванням Redis можна отримати доступ без облікових даних. Однак його можна налаштувати на підтримку тільки пароля або імені користувача + пароля.
Можна встановити пароль у файлі redis.conf з параметром requirepass
або тимчасово до перезапуску служби, підключившись до неї та виконавши: config set requirepass p@ss$12E45
.
Також можна налаштувати ім'я користувача в параметрі masteruser
всередині файлу redis.conf.
Якщо налаштовано лише пароль, то використовується ім'я користувача "default". Також зверніть увагу, що немає способу дізнатися зовні, чи був Redis налаштований лише з паролем або з ім'ям користувача + паролем.
У таких випадках вам потрібно знайти дійсні облікові дані для взаємодії з Redis, тому ви можете спробувати brute-force його. У разі, якщо ви знайшли дійсні облікові дані, вам потрібно аутентифікувати сесію після встановлення з'єднання за допомогою команди:
Дійсні облікові дані будуть відповідати: +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 Operation against a key holding the wrong kind of value
під час виконання GET <KEY>
, це може бути через те, що ключ може бути чимось іншим, ніж рядком або цілим числом, і вимагає спеціального оператора для його відображення.
Щоб дізнатися тип ключа, використовуйте команду TYPE
, приклад нижче для спискових та хеш-ключів.
Вивантажте базу даних за допомогою npm redis-dump або python redis-utils
Приєднуйтесь до HackenProof Discord сервера, щоб спілкуватися з досвідченими хакерами та шукачами вразливостей!
Інсайти з хакінгу Залучайтеся до контенту, який занурюється в захоплення та виклики хакінгу
Новини про хакінг у реальному часі Слідкуйте за швидкоплинним світом хакінгу через новини та інсайти в реальному часі
Останні оголошення Будьте в курсі нових програм винагород за вразливості та важливих оновлень платформ
Приєднуйтесь до нас на Discord і почніть співпрацювати з провідними хакерами вже сьогодні!
redis-rogue-server може автоматично отримати інтерактивну оболонку або зворотну оболонку в Redis(<=5.0.5).
Інформація з тут. Ви повинні знати шлях до папки сайту:
Якщо виникає виняток доступу до веб-оболонки, ви можете очистити базу даних після резервного копіювання і спробувати знову, не забудьте відновити базу даних.
Як і в попередньому розділі, ви також можете перезаписати деякий html шаблонний файл, який буде інтерпретовано шаблонним двигуном, і отримати оболонку.
Наприклад, слідуючи цьому опису, ви можете побачити, що зловмисник вставив rev shell в html, інтерпретованому двигуном шаблонів nunjucks:
Зверніть увагу, що декілька шаблонних движків кешують шаблони в пам'яті, тому навіть якщо ви їх перезапишете, новий не буде виконаний. У таких випадках або розробник залишив автоматичне перезавантаження активним, або вам потрібно зробити DoS над сервісом (і сподіватися, що він буде перезапущений автоматично).
Приклад звідси
Будь ласка, зверніть увагу, що результат config get dir
може змінитися після інших ручних експлойт-команд. Рекомендується виконати його спочатку відразу після входу в Redis. У виході config get dir
ви можете знайти домашню директорію користувача redis (зазвичай /var/lib/redis або /home/redis/.ssh), і знаючи це, ви знаєте, куди можна записати файл authenticated_users
для доступу через ssh з користувачем redis. Якщо ви знаєте домашню директорію іншого дійсного користувача, де у вас є права на запис, ви також можете зловживати цим:
Згенеруйте пару ssh публічного-приватного ключа на вашому ПК: 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
Останній приклад для Ubuntu, для Centos вище наведена команда повинна бути: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/
Цей метод також можна використовувати для заробітку біткойнів :yam
Дотримуючись інструкцій з https://github.com/n0b0dyCN/RedisModules-ExecuteCommand, ви можете скомпілювати модуль redis для виконання довільних команд.
Потім вам потрібен спосіб завантажити скомпільований модуль.
Завантажте завантажений модуль під час виконання за допомогою MODULE LOAD /path/to/mymodule.so
.
Перерахуйте завантажені модулі, щоб перевірити, чи був він правильно завантажений: MODULE LIST
.
Виконайте команди:
Вивантажте модуль, коли завгодно: MODULE UNLOAD mymodule
.
Тут ви можете побачити, що Redis використовує команду EVAL для виконання коду Lua в пісочниці. У пов'язаному пості ви можете побачити, як це зловживати, використовуючи функцію dofile, але очевидно, що це більше не можливо. У будь-якому випадку, якщо ви можете обійти пісочницю Lua, ви могли б виконати довільні команди на системі. Також, з того ж посту ви можете побачити деякі варіанти для виклику DoS.
Деякі CVE для втечі з LUA:
Головний redis автоматично синхронізує всі операції з slave redis, що означає, що ми можемо розглядати вразливий redis як slave redis, підключений до головного redis, який ми контролюємо, тоді ми можемо ввести команду до нашого власного redis.
Якщо ви можете надіслати текстовий запит до Redis, ви можете спілкуватися з ним, оскільки Redis буде читати запит по рядках і просто відповідати помилками на рядки, які не розуміє:
Тому, якщо ви знайдете SSRF vuln на вебсайті і зможете контролювати деякі заголовки (можливо, з вразливістю CRLF) або POST параметри, ви зможете надсилати довільні команди до Redis.
У 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 і почніть співпрацювати з провідними хакерами вже сьогодні!
Вчіться та практикуйте хакінг AWS:HackTricks Training AWS Red Team Expert (ARTE) Вчіться та практикуйте хакінг GCP: HackTricks Training GCP Red Team Expert (GRTE)