コンテンツにスキップ

Caido

Overview

Caido is a modern, lightweight web security testing proxy written in Rust. It provides core penetration testing capabilities including request interception, replay, and automation features as a lighter alternative to Burp Suite. The clean modern UI and cross-platform support make it ideal for security researchers and penetration testers.

Installation

macOS (Homebrew)

brew install caido
caido --version

Linux (AppImage / Direct Download)

# Download from https://caido.io/download
chmod +x Caido-x.x.x.AppImage
./Caido-x.x.x.AppImage

Windows (EXE / Installer)

# Download installer from https://caido.io
# Run the .exe installer or portable executable
caido.exe --version

Docker

docker run -d -p 8080:8080 caido/caido:latest

Starting the Caido Proxy

Default Startup

caido
# Launches on http://localhost:8080 by default

Custom Port

caido --port 9090

Headless Mode (Server Only)

caido --headless --listen 0.0.0.0:8080

Enable SSL/TLS Decryption

caido --tls
# Generate and trust CA certificate for MITM

Proxy Configuration

Browser Proxy Setup

BrowserSteps
ChromeSettings → Advanced → System → Proxy settings → Manual proxy configuration → HTTP: localhost:8080
FirefoxSettings → Network Settings → Manual proxy configuration → HTTP Proxy: localhost:8080
SafariSystem Preferences → Network → Advanced → Proxies → Web Proxy (HTTP) → localhost:8080
EdgeSettings → Advanced → System → Open proxy settings → Manual proxy setup

System-Wide Proxy (Linux)

export http_proxy=http://localhost:8080
export https_proxy=http://localhost:8080
export HTTP_PROXY=http://localhost:8080
export HTTPS_PROXY=http://localhost:8080

System-Wide Proxy (macOS)

networksetup -setwebproxy "Wi-Fi" localhost 8080
networksetup -setsecurewebproxy "Wi-Fi" localhost 8080

Certificate Installation

# Export CA certificate from Caido UI
# macOS
sudo security add-trusted-cert -d -r trustRoot \
  -k /Library/Keychains/System.keychain caido-ca.pem

# Linux (Ubuntu/Debian)
sudo cp caido-ca.pem /usr/local/share/ca-certificates/
sudo update-ca-certificates

# Windows
certutil -addstore -f "ROOT" caido-ca.pem

Request Interception

Enable Interception

ActionSteps
Intercept AllClick “Intercept” button → Select “All”
Intercept Requests OnlyClick “Intercept” → Select “Requests”
Intercept Responses OnlyClick “Intercept” → Select “Responses”
Disable InterceptionClick “Intercept” → Select “Off”

Modify Intercepted Requests

Original Request:
GET /api/user/123 HTTP/1.1
Host: example.com
Authorization: Bearer token123

Modified Request:
GET /api/user/456 HTTP/1.1
Host: example.com
Authorization: Bearer token456

Forward / Drop Decisions

ActionShortcut
Forward RequestClick “Forward” or press F
Drop RequestClick “Drop” or press D
Send to ReplayDrag to Replay tab
Toggle Request/ResponseTab key

Repeater (Request Replay)

Basic Replay

# In Caido UI:
1. Right-click intercepted request
2. Select "Send to Repeater"
3. Click "Send" to replay request
4. Compare original vs. modified response

Modify and Resend

Original:
POST /api/login HTTP/1.1
Content-Type: application/json

{"username":"admin","password":"pass123"}

Modified:
POST /api/login HTTP/1.1
Content-Type: application/json

{"username":"admin","password":"newpass"}

Response Comparison

FeatureUsage
Side-by-side ViewCompare two responses visually
Diff HighlightingAutomatic diff between requests
Save ResponseExport response for archival
Pretty PrintAuto-format JSON/XML responses

Macro Recording

# Record request sequence:
1. Click "Macros" tab
2. Click "Record New Macro"
3. Perform actions in browser (login, navigate)
4. Stop recording
5. Macro is saved and can be replayed

Intruder (Automation & Fuzzing)

Basic Fuzzing Workflow

1. Right-click request "Send to Intruder"
2. Click payload positions to mark variables
3. Choose attack type (Sniper, Battering Ram, etc)
4. Configure payloads
5. Click "Start Attack"

Payload Types

TypeDescriptionExample
Simple ListPredefined wordlistnumbers.txt (0-1000)
Custom IteratorGenerate sequencesA, AA, AAA, AAAA
Date GeneratorDate sequences2026-01-01, 2026-01-02
Recursive GrepExtract from responseExtract from HTML
Character FrobberMutate charactersabc → abd, abe, etc

Attack Types

Attack TypeUsage
SniperSingle placeholder, one wordlist
Battering RamMultiple placeholders, same wordlist
PitchforkMultiple placeholders, synced wordlists
Cluster BombMultiple placeholders, all combinations

Example Fuzzing

# Endpoint: GET /api/user/[ID]?role=[ROLE]
# Sniper attack on ID parameter with 1-100

GET /api/user/1?role=user HTTP/1.1
GET /api/user/2?role=user HTTP/1.1
GET /api/user/3?role=user HTTP/1.1
...
GET /api/user/100?role=user HTTP/1.1

Filter Results

Filter OperatorExample
Status Codestatus == 200
Response Lengthlength > 1000
Response Timetime > 500
Contains Textcontains “admin”
Regular Expressionregex “error[0-9]+“

Scope Configuration

Define Target Scope

# In Settings → Scope:
1. Click "Add Scope"
2. Enter domain/path pattern
3. Select "Include" or "Exclude"
4. Examples:
   - example.com (all subdomains)
   - *.api.example.com (API subdomains)
   - /admin/* (admin paths only)

Scope Rules

RulePatternMatches
Exact Domainexample.comOnly example.com
Wildcard*.example.comSub.example.com, api.example.com
Path Prefix/api/*/api/users, /api/posts
Regex^/admin/.*/admin/users, /admin/settings

Enforce Scope

# In Proxy Settings:
- Enable "Only show requests in scope"
- Enable "Only intercept requests in scope"

Filter Toolbar

FilterSyntaxExample
Hosthost:example.comhost:api.example.com
Methodmethod:GETmethod:POST
Pathpath:/apipath:/admin
Statusstatus:200status:4||5 (4xx or 5xx)
Containscontains:passwordcontains:“bearer”
Regexregex:^/apiregex:.json$

Combine Filters

# Multiple filters (AND logic):
host:api.example.com method:POST status:500

# Exclude patterns:
host:cdn.example.com -contains:image

HTTPQL Query Language

Basic Query Syntax

# Find all POST requests
method = "POST"

# Find requests with specific header
headers.contains("Authorization")

# Find responses with status 200
response.status = 200

# Combine conditions
method = "POST" and host = "api.example.com"

HTTPQL Examples

# Find all API requests
host = "api.example.com"

# Find login attempts
path.contains("login")

# Find requests with API keys
headers.contains("api-key")

# Find large responses
response.body.length > 10000

# Find JSON responses
response.headers["content-type"].contains("json")

# Find requests with specific parameter
request.query["user_id"]

# Find vulnerable patterns
response.body.contains("error") and response.status = 500

Match & Replace

Create Match Rules

# In Settings → Rules:
1. Click "Add Rule"
2. Define Match pattern (regex)
3. Define Replace value
4. Enable rule

Common Match/Replace Patterns

PatternMatchReplaceUse Case
Auth TokenBearer\s+(\S+)Bearer newtoken123Replace tokens
User IDuser_id=\d+user_id=999ID manipulation
CSRF Tokencsrf=(\S+)csrf=validtokenBypass CSRF
Timestamptimestamp=\d+timestamp=1234567890Time manipulation

Example Rules

# Replace Authorization header
Match: Authorization: Bearer.*
Replace: Authorization: Bearer admin_token

# Inject XSS payload
Match: search=(.*)
Replace: search=<img src=x onerror=alert('xss')>

# Bypass WAF
Match: SELECT.*FROM.*WHERE
Replace: SeLeCt * FrOm users WhErE

Workflows & Automation

Workflow Creation

1. Click "Workflows" tab
2. Click "New Workflow"
3. Define workflow steps (conditions, actions)
4. Save and enable

Workflow Examples

# Auto-add custom header to all requests
Condition: host = "api.example.com"
Action: Add header "X-Security-Test: true"

# Log sensitive requests
Condition: headers.contains("Authorization")
Action: Log request to security audit

# Auto-replay failed requests
Condition: response.status = 500
Action: Send to repeater for investigation

Plugins & Extensions

Plugin Development

# caido_plugin.py example
from caido import Hook, Request, Response

def on_request(req: Request) -> Request:
    """Modify requests before sending"""
    req.headers["X-Custom"] = "value"
    return req

def on_response(res: Response) -> Response:
    """Modify responses after receiving"""
    # Log or analyze response
    print(f"Response status: {res.status}")
    return res

Installing Plugins

# Copy plugin to plugins directory
cp my_plugin.py ~/.caido/plugins/

# Reload Caido to activate
# Or click Settings → Plugins → Reload

Comparison with Burp Suite

FeatureCaidoBurp Suite
LicenseCommunity (Free)Paid (Professional)
LanguageRustJava
Memory UsageLowHigh
UIModern (Qt)Heavy (Java Swing)
Startup TimeFastSlow
InterceptionYesYes
RepeaterYes (Full)Yes
IntruderYesYes (Pro)
ScannerNoYes (Pro)
MacrosYesYes
PluginsLimitedExtensive (BApp)
Cross-platformYesYes

Advanced Techniques

Man-in-the-Middle (MITM) Interception

# Enable TLS interception:
1. Start Caido with --tls flag
2. Install CA certificate in system
3. Route traffic through proxy
4. HTTPS requests now decrypted and re-encrypted

Headless API Usage

import requests

# Send request through Caido proxy
proxies = {
    'http': 'http://localhost:8080',
    'https': 'http://localhost:8080'
}

response = requests.get(
    'https://example.com/api',
    proxies=proxies,
    verify=False  # Ignore cert warnings
)

Integration with Tools

# Zaproxy → Caido proxy chain
# Caido listens on 8080
# Configure other tools to proxy through Caido

# Command-line automation
curl -x http://localhost:8080 https://example.com/api

# Browser extension for cookie/auth injection
# Use interceptor to modify auth headers mid-request

Troubleshooting

Certificate Trust Issues

# macOS: Trust CA in Keychain
open caido-ca.pem

# Linux: Update CA store
sudo update-ca-certificates --fresh

# Force curl to trust Caido CA
curl --cacert caido-ca.pem https://example.com

HTTPS Decryption Not Working

# Verify TLS is enabled:
caido --tls --listen 0.0.0.0:8080

# Check if certificate is installed:
# macOS: Keychain Access → System → Caido CA
# Linux: /etc/ssl/certs/ contains Caido cert

# Restart proxy and browser

High Latency/Timeouts

# Check proxy performance:
1. Review request queue in Caido
2. Disable unnecessary features (logging, replay)
3. Increase buffer size in settings
4. Run Caido on dedicated machine for high-traffic testing

Out of Memory

# Clear request history:
Caido UI Sessions Clear History

# Or restart Caido:
caido --headless (restart fresh session)

Best Practices

Security Testing Workflow

1. Configure scope to target domain only
2. Enable interception for requests only
3. Perform manual exploration (2-3 minutes)
4. Review all requests in history
5. Test high-value endpoints with Intruder
6. Document findings with screenshots

Performance Optimization

# Disable response interception if not needed:
Settings Proxy Intercept: Requests Only

# Clear history periodically:
Sessions Clear History

# Use filters to reduce displayed requests:
path:/api (only show API requests)

Automation at Scale

# Use Intruder for batch testing:
1. Export target URLs to file
2. Create Intruder payload from file
3. Filter responses by status code
4. Export results to CSV

Resources

ResourceURL
Official Websitehttps://caido.io
Documentationhttps://caido.io/docs
GitHubhttps://github.com/caido/caido
Discord Communityhttps://discord.gg/caido