Cariddi: Take a list of domains, crawl urls and scan for endpoints, secrets, api keys, file extensions, tokens and more
π§ Overview

Cariddi is a fast, pipeline-first web crawler written in Go by edoardottt. You hand it a list of live hosts on stdin, and it crawls each one hunting for the things a tester actually cares about: endpoints, secrets, hidden parameters, juicy file extensions, error messages, and useful information β all in a single pass.
What makes cariddi stand out is that itβs designed to be a stage in a chain, not a standalone GUI toy. It reads from stdin, writes clean output (including JSON), and every feature is a flag you can toggle. Drop it after subfinder | httpx and it becomes the βdeep lookβ step that turns a list of live domains into a list of things worth attacking.
| π OffSec Tip
Cariddiβs philosophy is βtake a list of domains, crawl them, find sensitive stuff.β If your recon already ends in a list of live hosts, cariddi is the natural next command.
Repo: github.com/edoardottt/cariddi
π¦ Installation
Golang (recommended β always latest):
1 | |
Homebrew:
1 | |
Snap:
1 | |
Arch (pacman):
1 | |
NixOS:
1 | |
From source (Linux):
1 | |
From source (Windows):
1 | |
Verify:
1 | |
π Basic Usage
Cariddi always reads targets from stdin β one URL per line. Thatβs the whole interface.
1 | |
Plain crawl with no flags just walks the site and prints discovered URLs. The power comes from turning on hunt modes.
| π OffSec Tip
Because input is always stdin, cariddi composes with everything. There is no βtarget fileβ flag β piping is the API.
π© All CLI Flags
π― Hunt modes (what to look for)
| Flag | Description |
|---|---|
-s |
Hunt for secrets (API keys, tokens, credentials) |
-e |
Hunt for juicy endpoints |
-err |
Hunt for errors in websites |
-info |
Hunt for useful information in websites |
-ext [1-7] |
Hunt for juicy file extensions (1 = most juicy, 7 = least) |
-intensive |
Also crawl subdomains β treats the target like *.target.com |
π§© Custom pattern files
| Flag | Description |
|---|---|
-ef [file] |
Use an external file of custom endpoints to hunt for |
-sf [file] |
Use an external file of custom secret regexes |
βοΈ Crawl configuration
| Flag | Default | Description |
|---|---|---|
-c [int] |
20 |
Concurrency level |
-d [int] |
Delay between crawled pages (seconds) | |
-t [int] |
10 |
Timeout for requests (seconds) |
-md [int] |
Maximum depth the crawler will follow | |
-proxy [url] |
Set a proxy (http / socks5 supported) |
|
-cache |
Use a .cariddi_cache folder as cache |
π« Ignore / scope control
| Flag | Description |
|---|---|
-i [words] |
Ignore URLs containing these comma-separated words |
-it [file] |
Ignore URLs matching lines in this file |
-ie [exts] |
Comma-separated extensions to skip while scanning |
πͺͺ Headers & User-Agent
| Flag | Description |
|---|---|
-headers [string] |
Custom headers, e.g. "Cookie: auth=yes;;Client: type=2" |
-headersfile [file] |
Read custom headers from a file |
-ua [string] |
Use a custom User-Agent |
-rua |
Use a random browser User-Agent on every request |
π€ Output
| Flag | Description |
|---|---|
-plain |
Print only the results (no banners/extras) |
-json |
Print output as JSON to stdout |
-ot [name] |
Write output to a TXT file |
-oh [name] |
Write output to an HTML file |
-sr |
Store HTTP responses on disk |
-debug |
Print debug information while crawling |
βΉοΈ Info
| Flag | Description |
|---|---|
-version |
Print version |
-examples |
Print built-in examples |
-h |
Print help |
| π OffSec Tip
Run cariddi -examples any time you forget a flag β the tool ships with its own quick reference.
π Every Flag Explained (the ones that matter)
π -intensive β go wide
Normal crawling stays on the exact host you fed it. -intensive expands scope to the whole subdomain tree (*.target.com). Use it when your targetβs root domain is in scope, not just one host.
1 | |
π§ -ext [1-7] β juicy files by aggressiveness
The number is a sensitivity dial, not a category. 1 returns only the most interesting extensions (.env, .git, .sql, backupsβ¦); 7 returns a much broader (noisier) set.
1 | |
π -s / -e β secrets and endpoints
-s runs cariddiβs secret regexes over every response body. -e extracts endpoints (including those buried in JS). They stack.
1 | |
π -md β depth control
Without a depth cap, cariddi follows links as far as they go. On big sites thatβs slow. Cap it:
1 | |
π§ -i / -it / -ie β staying in scope
Keep the crawler out of logout links, huge media, or out-of-scope paths:
1 | |
π§ͺ Practical Examples
Crawl and hunt secrets:
1 | |
Endpoints with your own custom endpoint list:
1 | |
Grab juicy files across a target:
1 | |
Faster, but polite (200 workers with a 2s delay):
1 | |
Route everything through Burp for inspection:
1 | |
Authenticated crawl:
1 | |
π§ Advanced Examples
π The βeverythingβ pass
Turn on every hunt mode at once for a full deep-dive on a small, in-scope list:
1 | |
π§© Custom secret patterns
Create a file of regexes (one per line) for the clientβs internal token formats:
1 | |
Then:
1 | |
π₯· Stealthy crawl
Random UA, delay, capped concurrency, capped depth:
1 | |
πΎ Cache to resume
-cache writes to .cariddi_cache so re-runs donβt re-fetch everything:
1 | |
π― Real Pentest Workflow
The canonical recon chain β subdomains β live hosts β deep crawl β attack surface:
1 | |
| π OffSec Tip
Run cariddi with -json in any automated workflow. Human-readable output is for eyeballing; JSON is for piping into jq and the next tool.
π€ Automation Examples
Reusable shell function:
1 | |
Loop over a whole scope file, one program per line:
1 | |
π§Ύ JSON Output Explanation
With -json, cariddi emits structured records to stdout instead of plain text. Each finding carries the URL it came from plus a field describing what kind of finding it is β a matched secret, an endpoint, an error string, an info leak, or a juicy-extension URL. That structure is what lets you split one crawl into many targeted wordlists with jq (see below).
For reporting, -oh results.html gives you a shareable HTML report, and -ot results writes a plain TXT log β both can run alongside -json.
π§ jq Filtering Examples
1 | |
| π OffSec Tip
Field names in the JSON can vary by cariddi version. Pipe one record through jq '.' first to see the exact keys before you script against them.
π‘οΈ Combine with Katana
Katana is a heavier crawler with headless + JS support. A common pattern is to let Katana collect the URL surface, then hand cariddi the job of hunting over it:
1 | |
Or the reverse β use cariddi as the discovery crawler and Katana as a second, JS-aware pass. Either way they complement rather than duplicate.
π°οΈ Combine with gau
Feed cariddi historical URLs from Wayback/Common Crawl so it hunts over old, forgotten paths too:
1 | |
π‘ Combine with httpx
httpx is the gatekeeper β only send cariddi hosts that actually respond, so you donβt waste crawl time on dead entries:
1 | |
π Combine with subjs
cariddi already parses JS, but subjs can pre-collect script URLs from a host list to widen coverage before the crawl:
1 | |
π₯ Combine with ffuf
Turn cariddiβs discovered endpoints into a targeted fuzz wordlist:
1 | |
β‘ One-liners
1 | |
β οΈ Common Mistakes
- No stdin. cariddi has no
-u/-ltarget flag; it only reads stdin.cariddi https://x.comdoes nothing useful β you mustechoorcatinto it. - Skipping
httpxfirst. Crawling dead or non-HTTP hosts wastes time. Filter to live hosts before piping in. -intensiveon out-of-scope roots. It expands to*.target.com. Make sure the whole subdomain tree is in scope before you use it.- Concurrency too high, no delay.
-c 200with no-dwill get you rate-limited or blocked. Tune to the target. - Grepping JSON. Use
-json+jq, not-plain+grep, when you need to script against results. - Assuming
-ext 7is βbestβ. Higher numbers mean more (noisier) extensions, not more valuable ones. Start at1β2.
π‘ Pro Tips & Performance
- Tune the trio:
-c,-d,-t. Concurrency, delay, and timeout together decide speed vs. stealth vs. reliability. On a fragile target:-c 5 -d 2 -t 15. On a beefy CDN-backed one:-c 100. - Always cap depth in automation.
-md 2or-md 3keeps runtime bounded on huge sites. - Use
-cachefor iterative work. Re-running the same scope while tuning flags? Cache saves you the re-fetch. - Ignore aggressively.
-i "logout,signout" -ie "png,jpg,css,woff,svg"cuts noise and avoids self-inflicted session kills. -ruafor blends. Random User-Agent per request helps avoid trivial UA-based blocking.- Store responses when it matters.
-srkeeps raw responses so you can re-analyze offline without re-hitting the target.
π Conclusion
Cariddi earns its place as the βdeep lookβ stage of a recon pipeline. It doesnβt try to be a subdomain tool or an HTTP prober β it assumes you already have a list of live hosts and does one job extremely well: crawl them and surface the sensitive stuff. Secrets, endpoints, parameters, errors, and juicy files, all in one pass, all pipeable as JSON.
Wire it in right after subfinder | httpx, feed the output through jq into ffuf, and youβve got a repeatable chain that turns a raw scope into a ranked attack surface. Keep a custom secrets file (-sf) per client, respect the target with sane -c/-d values, and let the pipeline do the rest.
| π OffSec Tip
The best cariddi command is the one that fits inside a pipe. If youβre copy-pasting URLs into it by hand, youβre not using it the way it was built.