hacktricks/network-services-pentesting/9200-pentesting-elasticsearch.md
2024-02-10 18:14:16 +00:00

15 KiB
Raw Blame History

9200 - Elasticsearch Pentesting

AWS hackleme becerilerini sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları:

Temel bilgiler

Elasticsearch, tüm veri türleri için dağıtık, ık kaynaklı bir arama ve analitik motorudur. Hızı, ölçeklenebilirliği ve basit REST API'leri ile tanınır. Apache Lucene üzerine inşa edilen Elasticsearch, ilk olarak 2010 yılında Elasticsearch N.V. (şimdi Elastic olarak bilinir) tarafından piyasaya sürülmüştür. Elasticsearch, veri alımı, zenginleştirme, depolama, analiz ve görselleştirme için açık kaynaklı araçların bir koleksiyonu olan Elastic Stack'in temel bileşenidir. Bu yığın, genellikle ELK Stack olarak adlandırılır ve Logstash ve Kibana'yı da içerir ve şimdi Beats adı verilen hafif veri taşıma ajanlarına sahiptir.

Elasticsearch indeksi nedir?

Bir Elasticsearch indeksi, JSON olarak depolanan ilgili belgelerin bir koleksiyonudur. Her belge, anahtarları ve bunlara karşılık gelen değerleri (dizeler, sayılar, boole'lar, tarihler, diziler, coğrafi konumlar vb.) içerir.

Elasticsearch, hızlı tam metin aramalarını kolaylaştırmak için ters indeks adı verilen verimli bir veri yapısı kullanır. Bu indeks, belgelerdeki her benzersiz kelimeyi listeler ve her kelimenin hangi belgelerde göründüğünü belirler.

İndeksleme süreci sırasında Elasticsearch, belgeleri depolar ve ters indeksi oluşturur, böylece neredeyse gerçek zamanlı arama yapılabilir. İndeks API'si, belirli bir indeks içinde JSON belgeleri eklemek veya güncellemek için kullanılır.

Varsayılan port: 9200/tcp

El ile Numaralandırma

Banner

Elasticsearch'e erişmek için kullanılan protokol HTTP'dir. HTTP üzerinden eriştiğinizde bazı ilginç bilgiler bulacaksınız: http://10.10.10.115:9200/

/'ye erişirken bu yanıtı görmüyorsanız, aşağıdaki bölüme bakın.

Kimlik Doğrulama

Varsayılan olarak Elasticsearch kimlik doğrulaması etkin değildir, bu nedenle varsayılan olarak herhangi bir kimlik bilgisi kullanmadan veritabanının içindeki her şeye erişebilirsiniz.

Kimlik doğrulamasının devre dışı olduğunu doğrulamak için aşağıdaki isteği yapabilirsiniz:

curl -X GET "ELASTICSEARCH-SERVER:9200/_xpack/security/user"
{"error":{"root_cause":[{"type":"exception","reason":"Security must be explicitly enabled when using a [basic] license. Enable security by setting [xpack.security.enabled] to [true] in the elasticsearch.yml file and restart the node."}],"type":"exception","reason":"Security must be explicitly enabled when using a [basic] license. Enable security by setting [xpack.security.enabled] to [true] in the elasticsearch.yml file and restart the node."},"status":500}

Ancak, / adresine bir istek gönderirseniz ve aşağıdaki gibi bir yanıt alırsanız:

{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}

Bu, kimlik doğrulamanın yapılandırıldığı ve herhangi bir bilgi elde etmek için geçerli kimlik bilgilerine ihtiyaç duyduğu anlamına gelir. Ardından, brute force deneyebilirsiniz (HTTP temel kimlik doğrulama kullanır, bu nedenle HTTP temel kimlik doğrulamayı BF yapabilen herhangi bir şey kullanılabilir).
İşte varsayılan kullanıcı adları listesi: elastic (süper kullanıcı), remote_monitoring_user, beats_system, logstash_system, kibana, kibana_system, apm_system, _anonymous_._ Eski Elasticsearch sürümlerinde bu kullanıcı için varsayılan şifre changeme'dir.

curl -X GET http://user:password@IP:9200/

Temel Kullanıcı Saptama

Elasticsearch Kullanıcıları

Elasticsearch, kullanıcıların belirli izinlere sahip olabileceği bir kullanıcı tabanı yönetim sistemine sahiptir. Kullanıcılar, Elasticsearch API'sini kullanarak belirli eylemleri gerçekleştirebilirler. Bu nedenle, hedef Elasticsearch sunucusunda mevcut olan kullanıcıları saptamak önemlidir.

Kullanıcıları saptamak için aşağıdaki adımları izleyebilirsiniz:

  1. _cat/users API'sini kullanarak kullanıcıları listeleme: Elasticsearch, _cat/users API'sini kullanarak mevcut kullanıcıları listeler. Bu API'yi kullanarak kullanıcı adlarını ve rollerini elde edebilirsiniz.

    curl -XGET 'http://<elasticsearch-ip>:9200/_cat/users?v'
    
  2. Kullanıcı adı ve parola kombinasyonlarını deneme: Elasticsearch, kullanıcı adı ve parola kombinasyonlarını deneyerek doğru kimlik bilgilerini bulmanıza izin verir. Bu, zayıf parola kullanımını tespit etmek için kullanışlı bir yöntem olabilir.

Elasticsearch İndeksleri

Elasticsearch, verileri indeksler halinde saklar. Bu nedenle, hedef Elasticsearch sunucusunda mevcut olan indeksleri saptamak da önemlidir.

İndeksleri saptamak için aşağıdaki adımları izleyebilirsiniz:

  1. _cat/indices API'sini kullanarak indeksleri listeleme: Elasticsearch, _cat/indices API'sini kullanarak mevcut indeksleri listeler. Bu API'yi kullanarak indeks adlarını ve diğer bilgileri elde edebilirsiniz.

    curl -XGET 'http://<elasticsearch-ip>:9200/_cat/indices?v'
    
  2. İndeks adlarını inceleme: İndeks adları, hedef sistemdeki veriler hakkında ipuçları sağlayabilir. Örneğin, bir indeks adı "customer" ise, bu indeksin müşteri verilerini içerdiği anlamına gelebilir.

Bu temel kullanıcı saptama adımları, hedef Elasticsearch sunucusunda mevcut olan kullanıcıları ve indeksleri belirlemenize yardımcı olacaktır. Bu bilgiler, daha fazla saldırı vektörü belirlemek ve hedef sistemdeki zayıf noktaları keşfetmek için kullanılabilir.

#List all roles on the system:
curl -X GET "ELASTICSEARCH-SERVER:9200/_security/role"

#List all users on the system:
curl -X GET "ELASTICSEARCH-SERVER:9200/_security/user"

#Get more information about the rights of an user:
curl -X GET "ELASTICSEARCH-SERVER:9200/_security/user/<USERNAME>"

Elastic Bilgisi

Elasticsearch hakkında bazı bilgileri edinmek için GET ile erişebileceğiniz bazı uç noktalar aşağıda listelenmiştir:

_cat /_cluster /_security
/_cat/segments /_cluster/allocation/explain /_security/user
/_cat/shards /_cluster/settings /_security/privilege
/_cat/repositories /_cluster/health /_security/role_mapping
/_cat/recovery /_cluster/state /_security/role
/_cat/plugins /_cluster/stats /_security/api_key
/_cat/pending_tasks /_cluster/pending_tasks
/_cat/nodes /_nodes
/_cat/tasks /_nodes/usage
/_cat/templates /_nodes/hot_threads
/_cat/thread_pool /_nodes/stats
/_cat/ml/trained_models /_tasks
/_cat/transforms/_all /_remote/info
/_cat/aliases
/_cat/allocation
/_cat/ml/anomaly_detectors
/_cat/count
/_cat/ml/data_frame/analytics
/_cat/ml/datafeeds
/_cat/fielddata
/_cat/health
/_cat/indices
/_cat/master
/_cat/nodeattrs
/_cat/nodes

Bu uç noktalar belgelerden alınmıştır ve daha fazlasını bulabilirsiniz.
Ayrıca, /_cat'e erişirseniz, yanıtta örneğin desteklenen /_cat/* uç noktaları bulunur.

/_security/user (eğer yetkilendirme etkinse) üzerinden superuser rolüne sahip kullanıcıyı görebilirsiniz.

İndeksler

Tüm indeksleri edinmek için http://10.10.10.115:9200/_cat/indices?v adresine erişebilirsiniz.

health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .kibana 6tjAYZrgQ5CwwR0g6VOoRg   1   0          1            0        4kb            4kb
yellow open   quotes  ZG2D1IqkQNiNZmi2HRImnQ   5   1        253            0    262.7kb        262.7kb
yellow open   bank    eSVpNfCfREyYoVigNWcrMw   5   1       1000            0    483.2kb        483.2kb

Bir dizinde hangi tür verilerin saklandığı hakkında bilgi almak için şu adrese erişebilirsiniz: http://host:9200/<index>, örneğin bu durumda http://10.10.10.115:9200/bank

Dizin dökümü

Bir dizinin tüm içeriğini dökmek isterseniz, şu adrese erişebilirsiniz: http://host:9200/<index>/_search?pretty=true, örneğin http://10.10.10.115:9200/bank/_search?pretty=true

Bank dizini içindeki her belgenin (girişin) içeriğini ve bu dizindeki alanları önceki bölümde gördüğümüzle karşılaştırmak için biraz zaman ayırın.

Bu noktada, "hits" içinde "total" adında bir alan olduğunu fark edebilirsiniz. Bu alan, bu dizinde 1000 belgenin bulunduğunu ancak yalnızca 10'unun alındığını gösterir. Bu, varsayılan olarak 10 belirli bir sınırlama olduğu için.
Ancak, şimdi bu dizinin 1000 belge içerdiğini bildiğinize göre, hepsini dökebilirsiniz. size parametresinde dökülecek giriş sayısını belirterek: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000
Not: Daha büyük bir sayı belirtirseniz, tüm girişler yine dökülecektir, örneğin size=9999 belirtebilirsiniz ve daha fazla giriş varsa garip olur (ancak kontrol etmelisiniz).

Tümünü dök

Tümünü dökmek için, öncekiyle aynı yolu izleyebilirsiniz, ancak herhangi bir dizin belirtmeden http://host:9200/_search?pretty=true adresine gidebilirsiniz, örneğin http://10.10.10.115:9200/_search?pretty=true
Unutmayın ki bu durumda varsayılan 10 sonuç sınırı uygulanacaktır. Daha fazla sonuç dökmek için size parametresini kullanabilirsiniz. Daha fazla bilgi için önceki bölümü okuyun.

Arama

Bir bilgi arıyorsanız, tüm dizinlerde raw bir arama yapabilirsiniz. http://host:9200/_search?pretty=true&q=<arama_terimi> şeklinde http://10.10.10.115:9200/_search?pretty=true&q=Rockwell gibi

Sadece bir dizinde arama yapmak isterseniz, yolu belirtmeniz yeterlidir: http://host:9200/<index>/_search?pretty=true&q=<arama_terimi>

Arama içeriği aramak için kullanılan q parametresinin düzenli ifadeleri desteklediğini unutun

Ayrıca, bir Elasticsearch hizmetini fuzz etmek için https://github.com/misalabs/horuz gibi bir şey kullanabilirsiniz.

Yazma izinleri

Yazma izinlerinizi kontrol etmek için aşağıdaki gibi yeni bir belgeyi yeni bir dizine oluşturmayı deneyerek kontrol edebilirsiniz:

curl -X POST '10.10.10.115:9200/bookindex/books' -H 'Content-Type: application/json' -d'
{
"bookId" : "A00-3",
"author" : "Sankaran",
"publisher" : "Mcgrahill",
"name" : "how to get a job"
}'

Bu komut, "bookId", "author", "publisher" ve "name" özniteliklerine sahip bir books türünde bir belgeye sahip olan bookindex adında bir yeni indeks oluşturur.

Dikkat edin, yeni indeks şimdi listede görünüyor:

Ve otomatik olarak oluşturulan özelliklere dikkat edin:

Otomatik Numaralandırma

Bazı araçlar, önceden sunulan verilerin bir kısmını elde eder:

msf > use auxiliary/scanner/elasticsearch/indices_enum

{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}

Shodan

  • port:9200 elasticsearch
htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları: