<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
CouchDB é um banco de dados orientado a documentos e dentro de cada documento os campos são armazenados como mapas de chave-valor. Os campos podem ser um par chave/valor simples, lista ou mapa.
Cada documento armazenado no banco de dados recebe um identificador único em nível de documento (`_id`) bem como um número de revisão (`_rev`) para cada alteração que é feita e salva no banco de dados.
Observe que se ao acessar a raiz do couchdb você receber um `401 Unauthorized` com algo como: `{"error":"unauthorized","reason":"Authentication required."}`**você não será capaz de acessar** o banner ou qualquer outro endpoint.
Estes são os endpoints onde você pode acessar com uma requisiçã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).
* **`/_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 de 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` mostra todos os nós que este nó conhece, incluindo os 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.
* **`/_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 essa informação.
* **`/_node/{node-name}/_stats`** O recurso `_stats` retorna um objeto JSON contendo as estatísticas para o servidor em execução. A string literal `_local` serve como um alias para o nome do nó local, então para todas as 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 do nó atual.
* **`/_up`** Confirma que o servidor está ativo, em funcionamento 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 Universais (UUIDs) da instância do CouchDB.
* **`/_reshard`** Retorna uma contagem de trabalhos completados, falhados, em execução, parados e o total, junto com o estado do 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)
Graças às diferenças entre os analisadores de JSON do Erlang e do JavaScript, você poderia **criar um usuário administrador** com as credenciais `hacktricks:hacktricks` com a seguinte solicitação:
Nos documentos do CouchDB, na [seção de configuração de cluster](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup), fala sobre as diferentes portas usadas pelo CouchDB:
> Erlang usa a porta TCP `4369` (EPMD) para encontrar outros nós, então todos os servidores devem ser capazes de se comunicar entre si nesta porta. Em um Cluster Erlang, todos os nós estão conectados a todos os outros nós. Uma malha.
**Você pode**[ **ler esta seção para aprender como abusar dos cookies do Erlang para obter RCE**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**.**\
Além disso, você pode ler alguns **relatórios de máquinas Canape HTB** [**como este**](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution) para ver e **praticar** como **explorar essa vulnerabilidade**.
Ao escrever este post, descobri que um novo CVE havia sido divulgado para o CouchDB pela mdsec, [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/). Ele também requer permissões de escrita no arquivo `local.ini`, então não é uma opção útil para o Canape. Mas, como já tornei o arquivo editável como root, vamos ver se conseguimos fazê-lo funcionar.
Podemos usar o curl para modificar as origens no arquivo `local.ini`. A vulnerabilidade aqui é que, se usarmos o curl para colocar uma nova origem e em seguida novas linhas, podemos escrever informações adicionais, incluindo um novo cabeçalho e detalhes. Então, vamos tirar vantagem do campo `[os_daemons]` e adicionar um processo para o CouchDB tentar manter em execução:
Se olharmos para os processos em execução com "couchdb" na linha de comando, veremos não apenas a linha de comando que nos fornece o valor do cookie que usamos anteriormente, mas também `runsrv couchdb`:
Precisaríamos escrever um novo query\_server e, em seguida, invocá-lo. Quando Canape foi lançado, a maioria dos POCs era para couchdb 1.x, mas esta caixa está executando a versão 2, então o caminho dos query\_servers da maioria dos POCs não existe. Isso mudou agora, mas vamos seguir os mesmos passos. Primeiro, obtenha a versão e mostre que o caminho 1.X não existe:
Algumas pesquisas no Google mostram que isso é um problema de permissões. De fato, se verificarmos com nosso shell root, podemos ver que o arquivo `local.ini` não é gravável por ninguém, muito menos por www-data:
Portanto, isso é um beco sem saída para o Canape. Mas se quisermos tentar fazê-lo funcionar, podemos torná-lo legível com nosso acesso root ou homer e continuar por esse caminho. Faremos um backup do original para podermos ver as mudanças:
Agora, devemos ser capazes de criar um db e, em seguida, um documento nesse db, e então solicitá-lo com uma view que mapeia nosso query_server para obter execução.
<summary><strong>Aprenda a hackear AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).