9200 - Pentesting Elasticsearch

Reading time: 7 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks

Osnovne informacije

Elasticsearch je distribuirani, otvoreni izvor pretraživač i analitički motor za sve vrste podataka. Poznat je po svojoj brzini, skalabilnosti i jednostavnim REST API-jima. Izgrađen na Apache Lucene, prvi put je objavljen 2010. godine od strane Elasticsearch N.V. (sada poznat kao Elastic). Elasticsearch je osnovna komponenta Elastic Stack-a, kolekcije alata otvorenog koda za unos, obogaćivanje, skladištenje, analizu i vizualizaciju podataka. Ova stack, koja se obično naziva ELK Stack, takođe uključuje Logstash i Kibana, a sada ima i lagane agente za slanje podataka nazvane Beats.

Šta je Elasticsearch indeks?

Elasticsearch indeks je kolekcija povezanih dokumenata pohranjenih kao JSON. Svaki dokument se sastoji od ključeva i njihovih odgovarajućih vrednosti (stringovi, brojevi, booleans, datumi, nizovi, geolokacije, itd.).

Elasticsearch koristi efikasnu strukturu podataka nazvanu inverzni indeks kako bi olakšao brza pretraživanja punog teksta. Ovaj indeks navodi svaku jedinstvenu reč u dokumentima i identifikuje dokumente u kojima se svaka reč pojavljuje.

Tokom procesa indeksiranja, Elasticsearch pohranjuje dokumente i konstruira inverzni indeks, omogućavajući gotovo real-time pretraživanje. Index API se koristi za dodavanje ili ažuriranje JSON dokumenata unutar specifičnog indeksa.

Podrazumevani port: 9200/tcp

Ručna enumeracija

Protokol koji se koristi za pristup Elasticsearch-u je HTTP. Kada mu pristupite putem HTTP-a, pronaći ćete neke zanimljive informacije: http://10.10.10.115:9200/

Ako ne vidite taj odgovor prilikom pristupa /, pogledajte sledeću sekciju.

Autentifikacija

Podrazumevano, Elasticsearch nema omogućenu autentifikaciju, tako da podrazumevano možete pristupiti svemu unutar baze podataka bez korišćenja bilo kakvih akreditiva.

Možete proveriti da li je autentifikacija onemogućena zahtevom na:

bash
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}

Međutim, ako pošaljete zahtev na / i dobijete odgovor poput sledećeg:

bash
{"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}

To će značiti da je autentifikacija konfigurisana i potrebne su vam važeće kredencijale da biste dobili bilo kakve informacije iz elasticsearch-a. Zatim, možete pokušati da bruteforce-ujete (koristi HTTP basic auth, tako da se može koristiti bilo šta što BF HTTP basic auth može).
Evo vam lista podrazumevanih korisničkih imena: elastic (superuser), remote_monitoring_user, beats_system, logstash_system, kibana, kibana_system, apm_system, _anonymous_._ Starije verzije Elasticsearch-a imaju podrazumevanu lozinku changeme za ovog korisnika.

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

Osnovna Enumeracija Korisnika

bash
#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 Info

Evo nekoliko krajnjih tačaka koje možete pristupiti putem GET da dobijete neke informacije o elasticsearch:

_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

Ove krajnje tačke su uzete iz dokumentacije gde možete pronaći više.
Takođe, ako pristupite /_cat, odgovor će sadržati /_cat/* krajnje tačke koje podržava instanca.

U /_security/user (ako je autentifikacija omogućena) možete videti koji korisnik ima ulogu superuser.

Indices

Možete prikupiti sve indekse pristupajući http://10.10.10.115:9200/_cat/indices?v

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

Da biste dobili informacije o tome koja vrsta podataka je sačuvana unutar indeksa, možete pristupiti: http://host:9200/<index> iz primera u ovom slučaju http://10.10.10.115:9200/bank

Dump index

Ako želite da izbacite sve sadržaje indeksa, možete pristupiti: http://host:9200/<index>/_search?pretty=true kao http://10.10.10.115:9200/bank/_search?pretty=true

Uzmite trenutak da uporedite sadržaj svakog dokumenta (unosa) unutar bank indeksa i polja ovog indeksa koja smo videli u prethodnom odeljku.

Dakle, u ovom trenutku možete primetiti da postoji polje nazvano "total" unutar "hits" koje ukazuje da je 1000 dokumenata pronađeno unutar ovog indeksa, ali je samo 10 vraćeno. To je zato što podrazumevano postoji limit od 10 dokumenata.
Ali, sada kada znate da ovaj indeks sadrži 1000 dokumenata, možete izbaciti sve njih tako što ćete naznačiti broj unosa koje želite da izbacite u size parametru: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000asd
_Napomena: Ako naznačite veći broj, svi unosi će biti izbačeni u svakom slučaju, na primer, mogli biste naznačiti size=9999 i biće čudno ako ima više unosa (ali trebate proveriti)._

Dump all

Da biste izbacili sve, možete jednostavno otići na istu putanju kao pre, ali bez naznačavanja bilo kog indeksa http://host:9200/_search?pretty=true kao http://10.10.10.115:9200/_search?pretty=true
Zapamtite da će u ovom slučaju biti primenjen podrazumevani limit od 10 rezultata. Možete koristiti size parametar da izbacite veću količinu rezultata. Pročitajte prethodni odeljak za više informacija.

Ako tražite neke informacije, možete uraditi sirovu pretragu po svim indeksima odlaskom na http://host:9200/_search?pretty=true&q=<search_term> kao u http://10.10.10.115:9200/_search?pretty=true&q=Rockwell

Ako želite samo da pretražujete unutar indeksa, možete jednostavno naznačiti to u putanji: http://host:9200/<index>/_search?pretty=true&q=<search_term>

Napomena da q parametar koji se koristi za pretragu sadržaja podržava regularne izraze

Takođe možete koristiti nešto poput https://github.com/misalabs/horuz za fuzzing elasticsearch servisa.

Write permissions

Možete proveriti svoja prava pisanja pokušavajući da kreirate novi dokument unutar novog indeksa pokretanjem nečega poput sledećeg:

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

Ta komanda će kreirati novi indeks pod nazivom bookindex sa dokumentom tipa books koji ima atribute "bookId", "author", "publisher" i "name"

Primetite kako se novi indeks sada pojavljuje na listi:

I obratite pažnju na automatski kreirane osobine:

Automatska Enumeracija

Neki alati će dobiti neke od podataka prikazanih ranije:

bash
msf > use auxiliary/scanner/elasticsearch/indices_enum

GitHub - theMiddleBlue/nmap-elasticsearch-nse: Nmap NSE script for enumerate indices, plugins and cluster nodes on an elasticsearch target

Shodan

  • port:9200 elasticsearch

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks