kiterunner · git:20260504.2a64374 · 2026-05-04 · sha256 e15f40181b2fa289

kiterunner git:20260504.2a64374A

Immutable. This exact content is served forever at /api/v1/blob/e15f40181b2fa289.

---
name: kiterunner
description: API-aware content discovery using Swagger/OpenAPI-derived wordlists. Sends properly formatted requests with correct HTTP methods, headers, and parameters. Use after identifying API targets or extracting Swagger specs from source maps.
---

# kiterunner -- API Content Discovery

Content discovery that understands API route structures. Each wordlist entry carries HTTP method, headers, path, and parameters -- not just a path string.

## When to Use

- Target exposes API endpoints (REST, GraphQL gateway, microservices)
- Swagger/OpenAPI spec extracted from source maps or recon
- Traditional bruting (feroxbuster/gobuster) returned only generic 404s
- Need to discover undocumented API routes with correct methods

## When NOT to Use

- Static file discovery (use feroxbuster/gobuster instead)
- Target behind aggressive WAF with rate limiting (kr is noisy)

## CLI Reference

| Command | Purpose |
|---------|---------|
| `kr scan <target> -w routes.kite` | API scan with .kite wordlist (method+headers+params per route) |
| `kr brute <target> -w wordlist.txt` | Traditional path brute (like gobuster) |
| `kr kb replay "OUTPUT_LINE" --proxy=http://localhost:8080` | Replay finding through Caido |
| `kr kb convert wordlist.txt wordlist.kite` | Convert between txt/json/kite formats |
| `kr wordlist list` | List available Assetnote wordlists |

## Key Flags (scan/brute)

| Flag | Purpose |
|------|---------|
| `-A apiroutes-260227:20000` | Assetnote wordlist (`:N` = head N entries) |
| `-w routes.kite` | Local .kite or .txt wordlist |
| `-x 5` | Max connections per host (default: 3) |
| `-j 50` | Max parallel hosts (default: 50) |
| `-t 3s` | Request timeout |
| `-H "Header: value"` | Custom header |
| `--fail-status-codes 400,401,404,403,501,502` | Blacklist response codes |
| `--ignore-length 100-105` | Ignore responses by content-length range |
| `-o json` | Output format: `json`, `text`, `pretty` |

**Proxy:** Only available on `kb replay --proxy=http://localhost:8080`. Scan/brute do not support proxy directly.

**Wordlist aliases rotate monthly.** Run `kr wordlist list` to see current aliases.

## Patterns

```bash
# API scan with Assetnote wordlist
kr scan https://api.target.com -A=apiroutes-260227:20000 -x 5 \
  --fail-status-codes 400,401,404,403,501,502

# Scan multiple targets
kr scan targets.txt -A=apiroutes-260227:20000 -x 3 -j 100

# Replay finding through Caido for evidence
kr kb replay -q --proxy=http://localhost:8080 -w routes.kite "OUTPUT_LINE"

# Technology-specific brute (.NET)
kr brute https://target.com -A=aspx-260227:10000 -x 5
```

## Chain With

- **jxscout** -- extract Swagger/OpenAPI specs from source maps, convert to .kite
- **Caido** -- replay findings via `kb replay --proxy` for evidence capture
- **vulnx** -- discovered endpoints reveal technology versions for CVE lookup