Most recent
navigate open esc close Corpus index built 2026-06-07 23:58 UTC

← All reference

Reference

Network Perimeter / Service Mesh — Query Catalog

Source: https://github.com/nuclide-research/AI-LLM-Infrastructure-OSINT/blob/main/shodan/queries/service-mesh-queries

Generated: 2026-05-31 from Stage −1 OSINT pass (4 platforms). See: data/platform-intel/service-mesh-perimeter-osint-2026-05-31.md for full intel.

Threat model: These planes describe the cluster’s internal traffic by design. A reachable control/observability plane = cluster-wide recon API (service graph, pod IPs, mesh identities, mTLS certs, L7 metadata). Most ship no-auth-by-default and rely on network placement as the only control.

Source routing. High/odd ports (15000, 15014, 4191, 4245, 9962-9965, 20001, 8084) are Shodan-undersampled → Censys-preferred (full-range coverage). Shodan brand-dorks will undercount this category. Censys discovery search = web UI / Playwright (cencli search 403 on free); cencli view = per-asset verify, 1 credit. Identity-probe column is the aimap/grpcurl verification probe, not a dork.


Istio / Envoy

Auth default: Envoy admin (15000) no-auth, loopback-bound (reachable via co-tenant / nodePort). istiod debug (15014/15010) unauth pre-1.30. Kiali anonymous strategy = full cluster read. Exposure class: /config_dump = full mesh topology + cert material; istiod /debug/registryz = full service registry; Kiali anon = cluster-wide read via Kiali SA.

LabelQuerySourceRationaleFP Risk
envoy-adminport:15000 http.html:"config_dump"Censys/ShodanEnvoy admin landing page links the admin endpointsMed
istiod-metricsport:15014 "pilot_xds"Censyspilot_xds* metric prefix is Istio-exclusiveLow
kiali-panelhttp.title:"Kiali"ShodanExact UI titleLow
spiffe-sanssl:"spiffe://cluster.local"Shodan/CensysWorkload URI SAN; custom trust domain attributes operatorLow
jaeger-codeployhttp.title:"Jaeger UI"ShodanCo-deployed trace UI, no-auth defaultLow
identity-probeGET :15000/server_info → json state=LIVE + node.user_agent_name=envoy + body sidecar~Confirms Istio-managed Envoy vs standalone
identity-probeGET :15014/debug/endpointz"serviceAccount"+"namespace"+.svc.cluster.localistiod registry, gated 401 on 1.30+

Linkerd

Auth default: proxy admin (4191) no-auth on 0.0.0.0; viz dashboard (8084) no auth layer (Host-header guard only). Exposure class: 4191 /env.json = proxy env (creds if env-injected); /metrics = workload graph; viz = full topology; tap = live cross-pod request headers (auth material).

LabelQuerySourceRationaleFP Risk
viz-panelhttp.html:"data-controller-namespace=\"linkerd"ShodanDashboard namespace attr (matches verified nuclei)Low
viz-titlehttp.title:"Linkerd"ShodanUI title; pair with namespace attrMed
proxy-adminport:4191 "proxy_build_info"CensysProxy metric, not in generic exportersLow
identity-issuerssl.cert.subject.cn:"identity.linkerd.cluster.local"Shodan/CensysHigh-precision operator-attribution pivotLow
trust-anchorssl:"root.linkerd.cluster.local"Shodan/CensysLinkerd trust anchor CNLow
identity-probeGET :4191/metricsproxy_build_info+inbound_http_authz_allow_total; GET :4191/env.jsonLINKERD2_PROXY_Presence + unauth env confirmation

Cilium / Hubble

Auth default: Hubble Relay (4245) external listener plaintext gRPC, no auth by default. Hubble UI no auth. Metrics/health no auth. Exposure class: GetFlows on 4245 = cluster-wide live flow tap (pods, identities, L7 HTTP/DNS/Kafka, policy verdicts). The category’s crown jewel.

LabelQuerySourceRationaleFP Risk
hubble-uihttp.title:"Hubble UI"ShodanUnique product titleV.Low
hubble-metricsport:9965 "hubble_flows_processed_total"CensysZero-FP Hubble metricV.Low
cilium-metrics"cilium_drop_count_total"CensysCilium-exclusive metric namespaceV.Low
operator-metricsport:9963 "cilium_operator"CensysOperator metrics, default-on all-ifaceLow
hubble-grpc-sanssl:"hubble-grpc.cilium.io"Shodan/CensysRelay/server cert SAN; leaks cluster nameV.Low
relay-grpcport:4245 (full-range) → grpcurl reflectCensys/tiptoegRPC, Shodan-dark; aimap gap, grpcurl manual
identity-probegrpcurl -plaintext :4245 listobserver.Observer; observer.Observer/ServerStatusnum_flows,versionIdentity + unauth confirmation in one call

Pomerium

Auth default: Pomerium IS the auth layer. Presence trivial; finding is behavioral (public route → open relay). Exposure class: misconfigured route fronting internal tooling (Grafana/Kibana/Jupyter/Argo CD/Vault UI); pprof/metrics on public iface (split mode, <0.17.1); databroker JWT (<0.27.1).

LabelQuerySourceRationaleFP Risk
pomerium-cookiehttp.headers.set_cookie:"_pomerium"ShodanDistinctive session cookie nameLow
pomerium-htmlhttp.html:"pomerium"ShodanCatches login/error pages — also docsMed
authenticate-sanssl.cert.subject.an:"authenticate."Censys/Shodanauthenticate. subdomain; real operator SANsMed
identity-probeGET /.well-known/pomerium/jwks.json → json keys.0.use=sig+kty=ECDeterministic unauth presence (NOT generic /.well-known/jwks.json)
misconfig-proberoute / returns 200 upstream content, no OIDC redirect to authenticate., no pomerium.com in bodyBehavioral open-relay state; not a finding until manually verified

FP traps documented (do not re-run blind)

  • http.html:"pomerium" and http.title:"Linkerd" are single-token — pair with a second conjunct (cookie / namespace attr) per Insight #7.
  • nuclei linkerd-ssrf*.yaml target Linkerd 1.x l5d-dtab — silent-miss on 2.x; do not treat a null as “not vulnerable”.
  • ssl:"spiffe://cluster.local" / *.default.hubble-grpc.cilium.io with default names are noisy across many clusters; the custom trust-domain / cluster-name variants are the attribution-grade signals.
  • 200 on Envoy admin / Hubble UI / Linkerd viz = identity, not auth-state (Insight #16) — confirm with the data-layer identity-probe before counting unauth.

VERIFIED RESULTS (2026-05-31 survey, aimap v1.9.42)

23-host console-tier corpus (title-dorks). Per-plane data-layer verification:

  • Kiali http.title:"Kiali": 10 candidates, 4 confirmed anonymous via /kiali/api/namespaces (full ns array unauth), 6 unconfirmed. The 4 anon are bare-port (:80, :20001); the 6 unconfirmed are :443 TLS-ingress (gated auth-on or title reflection). The ~50% rule holds (Insight #15). Pattern: TLS-ingress Kiali tends auth-on, bare-port tends anon.
  • Hubble UI http.title:"Hubble UI": 9 confirmed exposed (no login by design). Fingerprint anchors on the literal <title>Hubble UI</title> tag, not a bare “Hubble UI” substring (case-insensitive prose FP).
  • Cilium metrics port:9965 "hubble_flows_processed_total" / "cilium_drop_count_total": zero-FP metric names, unauth by construction.
  • kube-apiserver (Cilium cluster-cert pivot, :6443): /version anon-readable (identity) but /api/v1/namespaces anon DENIED by RBAC. Do NOT score an exposed apiserver as unauth without the data-layer probe; 3/3 held here.

Console-tier bias (Insight #71 corollary). Title-dorks select the console tier. The data-plane tier (Envoy admin 15000, istiod 15014, Linkerd proxy-admin 4191, Hubble Relay 4245) is Shodan-dark and unmeasured by this corpus; Hubble Relay 4245 was internal on 0/12 confirmed Cilium hosts. Measure the data-plane tier with Censys full-range or tiptoe/naabu, not Shodan title-dorks.