Skip to main content
ExposureCritical

Exposed Service

Exposed Elasticsearch Cluster

An exposed Elasticsearch cluster is an Elasticsearch node reachable from the public internet (usually on TCP 9200) with no authentication, letting anyone read, modify, or delete every index over the REST API.

Elasticsearch is a search and analytics engine that stores documents in indices and answers queries over a plain HTTP REST API. For most of its history it shipped with no authentication enabled by default, so an operator who bound it to a public interface created an open door: a single curl request to port 9200 returns the cluster's contents. The same simplicity that makes Elasticsearch a pleasure to develop against is what makes a misconfigured node a self-service data breach for anyone who finds it.

Reviewed byAakash HarishSecurity Research Contributor, LegbaReviewed 2026-05-28 · Updated 2026-05-28

What it is

An exposed Elasticsearch cluster is a deployment whose HTTP REST API (default TCP 9200) or transport port (9300) is reachable from untrusted networks without authentication or network restriction. Versions before 8.0 shipped with the security features of X-Pack disabled by default, meaning a freshly started node served unauthenticated reads and writes to whatever interface it was bound to. The REST API is fully self-describing: GET / returns version and cluster metadata, GET /_cat/indices?v lists every index with document counts and storage size, and GET /<index>/_search dumps the underlying documents. Because the API also exposes destructive verbs, the same open endpoint that leaks data lets an attacker issue DELETE /<index> or DELETE /* to wipe the entire cluster.

An open Elasticsearch node is not a future risk you can schedule around it is being indexed by Shodan and scraped by automated bots within hours of going live. The data inside is frequently the crown jewels: aggregated application logs containing session tokens and PII, customer records, or analytics that map your internal systems. Two concrete loss scenarios are well documented. In the 2020 "Meow" campaign, more than a thousand exposed databases including roughly 6,000 Elasticsearch services were destructively wiped, each index replaced with a random *-meow suffix and no ransom offered, just irreversible data loss. Separately, security researchers (Secureworks, reported via TechTarget) documented attackers dropping ransom notes into roughly 1,200 exposed Elasticsearch clusters demanding Bitcoin to return data they had already deleted. If your only copy of that data lived in the exposed cluster, recovery is impossible. Beyond destruction, the exposure is a textbook OWASP A05:2021 Security Misconfiguration and almost always triggers regulatory breach-notification obligations the moment customer data is in a publicly readable index.

At a glance

Typeexposed-elasticsearch
Ports9200, 9300
ProtocolsHTTP, HTTPS, TCP
Seen onElasticsearch, Elastic Stack (ELK), Kibana, OpenSearch, Logstash, Beats
SeverityCritical
Updated2026-05-28

How attackers find and exploit it

  • Enumerate the internet-wide attack surface using Shodan, Censys, or ZoomEye filters such as port:9200 product:Elasticsearch, which return live banners and version strings without ever touching the target.
  • Confirm the service is unauthenticated by requesting GET http://<host>:9200/ a 200 response with cluster name and Lucene version means no credentials are required; a 401 means security is enabled.
  • Fingerprint the data by calling GET /_cat/indices?v, which returns every index name, health, document count, and store size, giving the attacker an instant inventory of what is worth stealing.
  • Exfiltrate documents at scale using GET /<index>/_search with a large size parameter, or the scroll and _msearch APIs to page through millions of records, capturing PII, secrets, and logs.
  • Destroy or extort by issuing DELETE /<index> or wildcard DELETE /* to wipe data, then create an index named read_me or similar containing a ransom note pointing to a Bitcoin wallet the destructive 'meow' bots skip the ransom and simply overwrite indices with a *-meow suffix.
  • Pivot deeper by abusing exposed cluster APIs such as _cluster/settings or, on legacy or misconfigured nodes, scripting endpoints to attempt remote code execution and lateral movement into the hosting environment.

How to detect it on your surface

  • Inventory every host that answers on TCP 9200 and 9300 from outside your trust boundary using your EASM platform or an external scan, not just an internal asset list cloud instances and forgotten dev nodes are the usual offenders.
  • For each responding host, send an unauthenticated GET / and GET /_cat/indices and check whether you receive cluster data (exposed) or an HTTP 401/security exception (protected).
  • Review cloud security groups, firewall rules, and load-balancer listeners for any rule that allows 0.0.0.0/0 (or ::/0) to reach 9200 or 9300.
  • Check the running configuration of each node: confirm xpack.security.enabled is true and that network.host / http.host are not bound to a public or wildcard (0.0.0.0) interface.
  • Audit any Kibana, reverse proxy, or API gateway in front of the cluster to ensure it is not silently relaying unauthenticated traffic to the Elasticsearch REST API.

Detection signals

  • An HTTP 200 JSON response to GET / containing the keys cluster_name, version.number, and the tagline "You Know, for Search".
  • A tabular response from GET /_cat/indices?v listing index health, status, docs.count, and store.size without prompting for credentials.
  • Absence of a WWW-Authenticate header and no HTTP 401 on protected endpoints such as /_cluster/health or /_security/_authenticate.
  • Indices whose names carry a random *-meow suffix, or a lone index named read_me / how_to_recover / please_read containing a ransom message a direct indicator of a completed wipe or extortion attempt.
  • A listening service on 9300 (the transport protocol) reachable externally, indicating the inter-node port is also exposed beyond the cluster.

Validate before you report

  • Issue an unauthenticated GET /_cat/indices?v and confirm real index metadata is returned rather than a 401, a 403, or a TLS-required error this proves the data plane is open, not merely that a port is listening.
  • Retrieve a single bounded document with GET /<index>/_search?size=1 to verify that actual stored content (not an empty or template response) is readable without credentials, confirming a true data-exposure positive.
  • Distinguish Elasticsearch from look-alikes by parsing the version.number and version.lucene_version fields in GET /, and from OpenSearch by checking for an OpenSearch-specific distribution field.
  • Probe the security state safely with GET /_security/_authenticate: a 401 or a 'security must be explicitly enabled' message confirms whether X-Pack security is active without making any change.
  • Capture non-destructive evidence only the GET / banner, the redacted _cat/indices listing, and response headers and never issue write or delete verbs against a third-party or production target during validation.

What looks like this but isn't

  • A honeypot or decoy node: some defenders deploy fake unauthenticated Elasticsearch instances seeded with synthetic data confirm the indices contain real production records before escalating, and correlate with known asset ownership.
  • An intentional public read-only proxy: a 200 banner on 9200 may sit behind a reverse proxy that enforces auth or rate limits on the actual data endpoints test /_cat/indices and a real _search, not just GET /, before declaring exposure.
  • Security is enabled but on a non-standard port or behind TLS: a connection reset or a TLS handshake requirement on 9200 is not an open cluster; only an unauthenticated data read counts as a confirmed positive.

Remediation

  • Immediately remove public reachability by tightening cloud security groups, host firewalls, and load-balancer rules so that 9200 and 9300 are only accessible from trusted application subnets or a VPN never 0.0.0.0/0.
  • Enable the built-in security features by setting xpack.security.enabled: true on every node, then run elasticsearch-reset-password to set strong passwords for the elastic and kibana_system built-in users.
  • Bind the HTTP and transport listeners to private interfaces (set network.host to a specific private IP rather than 0.0.0.0) and configure TLS on both the HTTP layer (xpack.security.http.ssl) and the transport layer (xpack.security.transport.ssl).
  • Assume compromise if the node was ever open: rotate every credential, API key, and secret that may have been stored in or accessible via the indexed data, and review _cat/indices for unexpected, deleted, or *-meow indices.
  • Restore from a known-good snapshot if any index shows signs of tampering or deletion, and verify your snapshot repository is itself isolated from the exposed network so it cannot be wiped in the same attack.
  • Apply least-privilege role-based access control via the native realm or SSO so that applications and analysts each receive only the index and cluster privileges they require, then retest the host externally to confirm the data plane no longer answers unauthenticated requests.

Operational checklist

  • Maintain continuous external monitoring for any new host answering on 9200/9300 so a forgotten dev or staging cluster is caught within hours, not after it is indexed by Shodan.
  • Enforce secure defaults in infrastructure-as-code: provision Elasticsearch only with xpack.security.enabled: true, TLS, and private binding, and block deployment templates that expose the ports publicly.
  • Schedule automated snapshots to an isolated, access-controlled repository and routinely test restores so a destructive wipe is a recoverable event rather than permanent data loss.
  • Keep clusters on a supported, patched version (8.x or later, where security is on by default) and track Elastic security advisories for the deployed release line.
  • Apply network segmentation and a deny-by-default posture so Elasticsearch is reachable only from named application hosts, with all administrative access brokered through a bastion or VPN.
  • Audit access regularly: review enabled built-in users, role mappings, and API keys, disable unused accounts, and alert on creation of unexpected indices or spikes in _search/_cat traffic.

What to do next

An exposed Elasticsearch cluster is one of the cheapest exposures for an attacker to find and the most expensive for you to recover from data that is read once may be sold for years, and data that is wiped in a meow-style attack may be gone for good. The single most valuable thing right now is not another scanner alert but a confirmed, evidenced answer: is this specific node actually serving your data without authentication, and which indices are at risk? Get that confirmation first, lock 9200 behind your trust boundary, enable security, and verify your snapshots can bring the data back if the worst already happened.

Methodology

Each guide is written by our team, reviewed by a named security contributor, and cited against primary sources such as OWASP, CISA, NIST, and MITRE. We update pages when the underlying guidance changes. See our contributors and company.

FAQs.

Why is Elasticsearch so often found exposed with no authentication?
Elasticsearch releases before version 8.0 shipped with X-Pack security disabled by default, so a node started without explicit configuration served unauthenticated reads and writes. When an operator also bound it to a public interface (network.host: 0.0.0.0) or opened port 9200 in a cloud security group, the cluster became publicly readable a classic insecure-default plus misconfiguration combination.
What is the _cat/indices fingerprint and why does it matter?
GET /_cat/indices?v is a human-readable API that lists every index along with its health, document count, and storage size. For an attacker it is the fastest way to inventory exactly what data a cluster holds without downloading it, which is why both manual attackers and automated bots call it first. For a defender it is also the clearest validation signal: if it returns index data without credentials, the cluster is confirmed open.
What were the 'meow' attacks on Elasticsearch?
Beginning in July 2020, an automated bot scanned the internet for exposed databases and destructively wiped them, overwriting each index with a random *-meow suffix and leaving no ransom note just irreversible data loss. Researchers attributed roughly 6,000 wiped Elasticsearch services to the campaign, making it a stark example of why an open cluster can mean permanent loss rather than mere theft.
Can an exposed Elasticsearch cluster lead to anything worse than data theft?
Yes. Attackers can issue DELETE verbs to destroy entire indices, plant ransom notes demanding cryptocurrency to return data they have already deleted, and on legacy or misconfigured nodes abuse cluster and scripting APIs to attempt remote code execution and lateral movement into the hosting environment. Leaked logs frequently contain session tokens, API keys, and credentials that enable follow-on attacks elsewhere.
How do I confirm my cluster is properly secured rather than just looking secure?
From outside your network, send an unauthenticated GET /_cat/indices and GET /_security/_authenticate. A properly secured node returns HTTP 401 (or requires TLS) on both; an exposed node returns index data. Pair that with a configuration check that xpack.security.enabled is true and that the HTTP/transport ports are bound to private interfaces and blocked from 0.0.0.0/0.
How does Legba Adversary handle exposed Elasticsearch clusters?
Adversary discovers Elasticsearch services across your external attack surface on 9200 and 9300, then validates each one by safely confirming whether the data plane actually answers unauthenticated requests rather than just flagging an open port. It captures non-destructive evidence such as the banner and redacted index listing, assigns a Critical severity based on confirmed data exposure, and drafts prioritized remediation for your team to review before action.

References

  1. 01
  2. 02
  3. 03
  4. 04
  5. 05

Weakness references (CWE)

Keep exploring

Try it on the next page you do not trust

Legba is a Chrome extension with two modes. Ghost gives you a private browser route. Shield opens a page in an isolated browser off your device.

Free for 30 days. No card required.

Ghost. A private route for your browser. Shield. An isolated browser, off your device. Choose the mode. Close when finished.