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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
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
Banner
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:
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).
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>
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=1000
asd
_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.
Search
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:
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:
msf > use auxiliary/scanner/elasticsearch/indices_enum
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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.