Interpreting HTTP Responses During Active Reconnaissance
Interpreting HTTP Responses During Active Reconnaissance#
Why HTTP Responses Matter#
During active reconnaissance, HTTP status codes are not just pass/fail indicators—they are intelligence signals. Each response code tells a story about the target’s infrastructure, access controls, and intentionality. Learning to read these signals separates noise from signal.
The Response Code Spectrum#
2xx Responses: Live, Accessible Services#
200 OK — The baseline. The service responded and served content.
- At x.ai, the main domain returns 200 behind Cloudflare
- Tells you: Service is live, web tier is accessible
- Next step: Analyze content for API endpoints, framework fingerprints, API keys
307 Temporary Redirect — A deliberate traffic shaping decision.
- At console.x.ai, unauthenticated requests redirect to /home
- Tells you: Authentication is enforced; the application exists and is active
- Next step: Follow the redirect chain to understand login flow; test for session fixation or redirect bypasses
- Critical insight: 307 (not 302) means POST requests preserve method—could be attack surface
4xx Responses: The Interesting Cases#
403 Forbidden — The most informative failure code.
- At auth.x.ai and status.x.ai, Cloudflare returns 403
- Tells you: Endpoint exists, DNS resolves, and someone intentionally blocked it
- Contrast with 404 (page not found) or NXDOMAIN (DNS failure)—403 proves the infrastructure exists
404 Not Found — The endpoint legitimately doesn’t exist.
- If a path returns 404, you’ve hit the origin—not a WAF block
- Tells you: You’ve bypassed edge protection or the path was never defined
- At scale, 404 responses leak origin fingerprints (Apache vs nginx vs custom)
421 Misdirected Request — A proxy layer protocol violation.
- At api.x.ai, the Envoy ingress returns 421 with “prod-ic-ingress-fallback” header
- Tells you: Backend infrastructure is on a different proxy tier; SNI or routing rules don’t match your request
- Critical insight: This is not a security block—it’s a configuration issue. Different request headers (Host, SNI, User-Agent) might route differently
429 Too Many Requests — Rate limiting is active.
- Tells you: The target tracks request frequency and enforces limits
- Next step: Measure rate limits; find the boundary (how many requests before blocking?)
- Could be login brute-force protection, API throttling, or DDoS mitigation
5xx Responses: Backend Visibility#
500 Internal Server Error — You’ve reached the origin.
- Cloudflare does not return 500; only the origin can
- If you see 500, the WAF is not filtering this request
- Tells you: Your request bypassed edge protection or hit an unprotected path
502 Bad Gateway — Backend is down or misconfigured.
- Indicates origin server failure or connectivity issue
- During recon, 502 reveals when the origin is unreachable (different from WAF blocks)
Timeouts: The Non-Response#
Connection Timeout — The server accepted the connection but didn’t respond.
- At developer.x.ai, DNS resolves but the connection times out
- Tells you: Infrastructure exists but is intentionally unresponsive (likely an intentional block)
- Contrast with NXDOMAIN (DNS failure) or 403 (immediate rejection)
NXDOMAIN — DNS resolution failed.
- At login.x.ai, register.x.ai, oauth.x.ai, etc., DNS queries fail
- Tells you: x.ai deliberately chose not to provision these subdomains
- Reconnaissance value: Negative results are still results. Absence of a subdomain is a deliberate choice.
Reading the Evidence: x.ai Case Study#
Observation 1: The 421 at api.x.ai#
Status: 421 Misdirected Request
Header: prod-ic-ingress-fallback
What this tells you:
- The backend API infrastructure exists and responds
- It’s running on Envoy WASM (a proxy layer)
- Your request matched the routing rules (you got a response, not a timeout)
- But your SNI or Host header didn’t match the expected value
- This is not a security block—it’s a protocol mismatch
Next probe: Try different Host headers, SNI values, or HTTP/2 vs HTTP/1.1. The 421 response suggests the backend is responsive to requests that satisfy its routing criteria.
Observation 2: The 403 at auth.x.ai vs. NXDOMAIN at oauth.x.ai#
auth.x.ai: 403 Forbidden (DNS resolves, HTTP responds)
oauth.x.ai: NXDOMAIN (DNS fails)
What this tells you:
- auth.x.ai is provisioned in DNS and configured in the origin; Cloudflare blocks it
- oauth.x.ai was never provisioned in DNS—x.ai chose not to create it
- Different strategies: auth.x.ai says “blocked”; oauth.x.ai says “doesn’t exist”
- This pattern suggests x.ai carefully manages DNS surface
Next probe:
- For auth.x.ai: Test WAF bypass techniques (the block is at edge, not origin)
- For oauth.x.ai: Enumerate other common subdomains; x.ai avoids them deliberately
Observation 3: The 307 at console.x.ai#
Status: 307 Temporary Redirect
Location: /home
What this tells you:
- console.x.ai is a live authenticated application
- The redirect happens on every unauthenticated request
- 307 (not 302) preserves POST method—POST requests to console.x.ai still redirect to /home
- No authentication cookies are forwarded in the redirect response
Next probe:
- Test if the redirect chain leaks information (e.g., session tokens in redirect URL)
- Try to access /home directly (does it redirect again?)
- Attempt authentication bypass on the redirect target
- Test for IDOR on redirect parameters
Observation 4: The docs.x.ai Loop#
Status: 308 Permanent Redirect
Location: docs.x.ai (self-reference)
What this tells you:
- This is either misconfiguration or intentional access denial
- 308 (permanent) suggests it’s by design, not a temporary issue
- The redirect loop prevents access without browser following (browsers stop after N redirects)
- This is a common technique to quietly block a resource without returning 403
Next probe:
- Test if curl can reach the actual content (browser stops, curl might not)
- Check Wayback Machine for historical snapshots of docs.x.ai
- Investigate if the redirect URL itself contains information (API version, build ID, etc.)
General Principles#
1. Contrast Reveals Intentionality#
When you see different response codes for similar subdomains, intentionality emerges:
- auth.x.ai → 403 (blocked by WAF, but exists)
- oauth.x.ai → NXDOMAIN (deliberately not provisioned)
- console.x.ai → 307 (live application, redirects unauthenticated)
Each choice tells you something different about the organization’s security posture.
2. Errors from the Origin Are More Valuable Than Edge Blocks#
A 403 from Cloudflare is a denial. A 500 from the origin is a window.
If you can make a request reach the origin and trigger an error, you’ve bypassed the edge. That’s reconnaissance progress.
3. Timeouts Are Distinct from Denials#
A connection timeout is different from a 403 rejection.
Timeout = intentional non-response (likely deliberate blocking) 403 = intentional rejection (proves the endpoint exists) NXDOMAIN = intentional absence (proves the subdomain was never created)
4. HTTP Redirect Chains Are Attack Surfaces#
307 and 308 redirects preserve request methods. Follow the chain:
POST /login → 307 /auth-check → origin processes
POST requests follow redirects, which can lead to:
- Double-submit CSRF bypasses
- Session fixation
- Redirect-based information leakage
5. Response Headers Leak Infrastructure#
Look for:
Serverheader (nginx, Apache, custom)X-Frame-Options,X-Content-Type-Options(security posture)- Custom headers like
prod-ic-ingress-fallback(infrastructure topology) CF-RAYheaders (Cloudflare protection)
Conclusion#
HTTP responses are not binary successes and failures. They are intelligence signals. Learning to read status codes, headers, and response chains reveals:
- Whether endpoints exist
- Whether access is denied by WAF or origin
- Whether infrastructure is misconfigured
- Which paths bypass edge protection
- Where redirect chains might leak information
During reconnaissance, spend time analyzing response patterns. Contrast tells the story: why does auth.x.ai return 403 but oauth.x.ai return NXDOMAIN? Why does console.x.ai redirect but docs.x.ai loop? These differences are not noise—they are the target’s security architecture exposed through HTTP responses.