About hunt-metrics-exposure
A security-testing skill for authorized assessments that checks observability endpoints for exposed metrics and sensitive operational details. It guides discovery, analysis, and validation while distinguishing informational data from meaningful leaks.
Key features
- 01Discover common metrics and health endpoints
- 02Analyze Prometheus and health data
- 03Identify model, database, and dependency details
- 04Verify exposure and assess sensitivity
- 05Document false positives and pitfalls
Use cases
- 01Assess public observability endpoints during an authorized test
- 02Check whether metrics reveal internal services or usage
- 03Evaluate exposed Actuator data for sensitive information
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ uphiago/ recon-skills --skill hunt-metrics-exposureAfter installing, type/hunt-metrics-exposurein Claude Code to confirm it loaded.
Details
From the project READMEWhen to Use
The target uses modern observability tooling (Go, .NET, Java, Node.js). These frameworks often expose /metrics, /health, and /status endpoints that are forgotten behind auth. Unlike application data leaks, metrics leaks reveal the ENTIRE operational profile: which AI models are used, how many users are active, database connection exhaustion, and third-party service dependencies.
Phase 1 — Discover Metrics Endpoints
TARGET="https://target.com"
# Common observability paths
for ep in metrics health status ready live readyz healthz \
actuator/health actuator/metrics actuator/prometheus \
Telescope telescope horizon debug; do
code=$(curl --max-time 30 --connect-timeout 10 -sk -o /tmp/metrics_${ep}.txt -w "%{http_code}" \
"${TARGET}/${ep}" 2>/dev/null)
if [ "$code" = "200" ]; then
size=$(wc -c < /tmp/metrics_${ep}.txt)
echo " /${ep}: HTTP 200 (${size} bytes)"
fi
done
Phase 2 — Analyze Prometheus Metrics
# Count unique metric families (each reveals a subsystem)
grep -c '^# HELP' /tmp/metrics_metrics.txt
# Extract AI/ML model usage
grep -i 'ai_\|model\|llm\|openai\|gemini\|copilot' /tmp/metrics_metrics.txt
# Extract database pool states
grep -i 'db_pool\|database\|connection' /tmp/metrics_metrics.txt
# Extract third-party dependencies
grep -i 'stripe\|openai\|sendgrid\|twilio\|email' /tmp/metrics_metrics.txt
# Extract request volumes (user activity)
grep -i 'http_request\|api_request\|grpc_request' /tmp/metrics_metrics.txt
# Extract circuit breaker states (service health)
grep -i 'circuit_breaker' /tmp/metrics_metrics.txt
Phase 3 — Analyze Health/Status Endpoints
# Spring Boot Actuator
curl --max-time 30 --connect-timeout 10 -sk "${TARGET}/actuator/health" | python3 -m json.tool
curl --max-time 30 --connect-timeout 10 -sk "${TARGET}/actuator/metrics" | python3 -m json.tool
curl --max-time 30 --connect-timeout 10 -sk "${TARGET}/actuator/env" | python3 -m json.tool # May leak env vars
# Custom health endpoints
curl --max-time 30 --connect-timeout 10 -sk "${TARGET}/health" | python3 -m json.tool
curl --max-time 30 --connect-timeout 10 -sk "${TARGET}/api/health" | python3 -m json.tool
# Laravel Telescope (if exposed)
curl --max-time 30 --connect-timeout 10 -sk "${TARGET}/telescope/requests" | head -c 500
What Metrics Reveal
| Metric | Intelligence Gained |
|---|---|
ai_analyzer_output_total{model="gpt-5-mini"} | Which AI models are used, usage volume |
db_pool_idle_connections{pool="api"} | Database pool sizing, connection exhaustion risk |
circuit_breaker_state{client="stripe"} | Third-party dependencies and their health |
clinical_copilot_sse_active | Real-time user count for specific features |
http_requests_total | Request volume, peak hours, user activity |
app_version / build_info | Deployed version, build timestamps |
Verification
- Confirmed exposure:
/metricsreturns Prometheus text format (lines starting with# HELPor# TYPE) - Actuator exposure:
/actuator/healthreturns JSON with component statuses - False positive: Endpoint returns
{"status":"ok"}only (minimal health check, not a metrics leak) - Severity upgrade: If
/actuator/envor/actuator/configpropsis exposed → CRITICAL (environment variables leaked)
What Next
- AI model usage metrics → pivot to
hunt-llm-ai(prompt injection on discovered models) - DB pool metrics showing overload → DoS attack surface identified
- Circuit breaker states for Stripe/email → infrastructure dependency map for chained attacks
- Combine with
hunt-schema-enumerationfor full target profile
Verification
Run this self-test to confirm metrics-exposure hunting readiness:
-
Skill integrity — confirm the skill file is readable and well-formed:
grep -q "name: hunt-metrics-exposure" SKILL.md && echo "PASS: skill frontmatter present" || echo "FAIL" grep -q "revision_date:" SKILL.md && echo "PASS: revision date present" || echo "FAIL" -
Category check — confirm the skill has a category:
grep -q "category:" SKILL.md && echo "PASS: category present" || echo "FAIL" -
Pitfalls section — confirm pitfalls are documented:
grep -q "^## Pitfalls" SKILL.md && echo "PASS: pitfalls section present" || echo "FAIL"
All 3 tests verify the skill is properly structured and ready for use.
Pitfalls
- Prometheus /metrics without secrets — metrics endpoints exposing request counts are informational. Need labels containing PII, internal hostnames, or credentials.
- Spring Boot Actuator /actuator/metrics — metrics are intentionally exposed for monitoring. Only report if they leak sensitive data (usernames in labels, internal IPs).
- JMX without auth — JMX exposure without authentication is critical only if write operations (MBean invocation) are possible. Read-only JMX is informational.
- Health endpoint without sensitive data —
/health,/status,/readyendpoints are designed to be public. Need leaked internal data.