9200 - Pentesting Elasticsearch

Support HackTricks

Basic information

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-ima. 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 kolekcija, 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.

What is an Elasticsearch index?

Elasticsearch indeks je kolekcija povezanih dokumenata pohranjenih kao JSON. Svaki dokument se sastoji od ključeva i njihovih odgovarajućih vrednosti (stringovi, brojevi, booleovi, 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.

Default port: 9200/tcp

Manual Enumeration

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.

Authentication

Po defaultu, Elasticsearch nema omogućenu autentifikaciju, tako da po defaultu možete pristupiti svemu unutar baze podataka bez korišćenja bilo kakvih kredencijala.

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

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:

{"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 koristiti). 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

#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> u ovom slučaju http://10.10.10.115:9200/bank

Dump index

Ako želite da izbacite sav sadržaj 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 ga 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 da fuzz-ujete elasticsearch servis.

Write permissions

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

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

That cmd will create a new index called bookindex with a document of type books that has the attributes "bookId", "author", "publisher" and "name"

Notice how the new index appears now in the list:

And note the automatically created properties:

Automatic Enumeration

Neki alati će dobiti neke od podataka predstavljenih ranije:

msf > use auxiliary/scanner/elasticsearch/indices_enum

Shodan

  • port:9200 elasticsearch

Podržite HackTricks

Last updated