Ravage is source-checkout-first. Install from this repository and run the
ravage CLI from the checkout virtual environment so the docs, examples, labs,
and benchmark evidence match the code you are running.
>=3.12,<3.13; Python 3.14 is not supported)pip, normally through python -m pipUse Ravage only on systems you own or are explicitly authorized to test.
The active CLI is localhost-first. Public/DNS targets are blocked by default
even when they are in scope; test a local or staging copy exposed on
http://127.0.0.1:* or http://localhost:*.
Use this path when developing or running directly from the repository:
git clone https://github.com/duriantaco/ravage.git
cd ravage
scripts/bootstrap.sh
source .venv/bin/activate
ravage --help
ravage --version
Create the starter files:
ravage init --target-url http://127.0.0.1:8080
This writes:
.env for model provider variables;brief.yaml for scope, rules of engagement, objectives, and budget.Edit both files before running against a real target. .env is only a starter;
keep real API keys private and do not commit them.
If you want to run the same steps manually, create a Python 3.12 virtualenv and install the repository root in editable mode:
python3.12 -m venv .venv
. .venv/bin/activate
python -m pip install "setuptools>=68" wheel
python -m pip install --no-build-isolation -e .
ravage --help
If an old virtualenv command still imports orchestrator, rerun bootstrap. It
repairs stale .venv activation paths and reinstalls the editable checkout:
scripts/bootstrap.sh
Python package installation does not install scanners such as nmap, ffuf,
katana, nuclei, or sqlmap.
Check what is available:
ravage tools list
ravage tools check
The recommended repeatable path is Docker. It hides host dependency drift and matches Ravage’s scoped tool-runtime path:
scripts/install_tools.sh --method docker --execute
ravage tools check
On Linux, Kali, or WSL where host tools are preferred:
scripts/install_tools.sh --method apt --execute
ravage tools check
On macOS with Homebrew:
scripts/install_tools.sh --method brew --execute
ravage tools check
To preview the install plan without changing the machine, omit --execute.
Run attacks and scans with --tool-runtime auto unless you need to force a
specific path. auto uses the scoped Docker-backed path for supported external
tools when scope firewalling is available.
Before spending model calls, run:
set -a; source .env; set +a
ravage setup check --brief brief.yaml --model-profile hosted-openai --model-tier low
ravage setup check validates:
If a check fails, the CLI prints a concrete fix and a [next] section with the
next command to run. For machine-readable automation:
ravage setup check --brief brief.yaml --json
Human CLI output uses a green/cyan terminal theme by default in interactive
terminals. Set RAVAGE_COLOR=never to disable it or RAVAGE_COLOR=always to
force it in unusual terminal environments. JSON output stays plain.
Start a local lab:
ravage lab up ravage-acme-box
Run a no-model deterministic scan:
ravage scan examples/labs/ravage-acme-box/brief.yaml \
--run-dir runs/quickstart-acme-scan \
--tool-runtime auto
Verify outputs:
ravage audit verify runs/quickstart-acme-scan
python -m json.tool runs/quickstart-acme-scan/report.json | head -80
A healthy setup has a run directory with audit.db, report.json,
scan.stdout, and workspace/.
Use the model-driven agent only after ravage scan works.
For a local OpenAI-compatible route such as Ollama:
RAVAGE_OLLAMA_MODEL=qwen2.5-coder:32b \
OLLAMA_BASE_URL=http://localhost:11434/v1 \
ravage attack examples/labs/ravage-acme-box/brief.yaml \
--model-profile local-ollama \
--model-tier mid \
--tool-runtime auto \
--memory off
For hosted OpenAI-compatible routes, set the provider key and explicitly acknowledge paid model use:
OPENAI_API_KEY=... \
ravage attack examples/labs/ravage-acme-box/brief.yaml \
--model-profile hosted-openai \
--model-tier low \
--tool-runtime auto \
--memory off \
--allow-paid-models
Inspect route readiness before running:
ravage setup check --brief brief.yaml --model-profile hosted-openai --model-tier low
Provider-specific variables are documented in Model Providers.
The wrapper commands infer --target-url from the first HTTP or HTTPS URL in
scope.in_scope. If the brief starts with CIDRs, hostnames, or multiple
allowed origins, either put the primary base URL first or pass --target-url
explicitly.
Generate a starter brief from the CLI:
ravage init --target-url http://127.0.0.1:8080
ravage brief template --target-url http://127.0.0.1:8080 > brief.yaml
ravage brief template --help
Minimal brief:
engagement_id: "99999999-9999-4999-8999-999999999999"
scope:
in_scope:
- "http://127.0.0.1:8080"
out_of_scope: []
roe:
max_rps: 5
no_destructive_actions: true
data_handling: "placeholders_only"
objectives:
- "web_application_assessment"
budget:
max_cost_usd: 5.0
max_runtime_min: 20
For a user-owned Docker or staging app, publish it to localhost and put that localhost URL in the brief:
ravage scan brief.yaml \
--target-url http://127.0.0.1:8080 \
--tool-runtime auto
If the engagement also needs a public hosting sanity check, keep the active target as localhost and add an explicit live website in brief context:
context:
description: "Local staging copy of the app."
hosting_check:
live_site: "https://example.com"
When a Markdown report is written, Ravage runs a separate hosting-layer report
agent after the localhost test and records curl -I results for HTTPS/HTTP apex
and www variants in report.md.
Use web_application_assessment for normal web tests and
api_security_assessment for API-heavy targets. Specific classes like xss,
jwt, or sql_injection are better for targeted retests only. Clean benchmark
or local CTF-style runs should keep broad objectives and let the agent derive
hypotheses from the challenge description and live target evidence.
.venv, or use .venv/bin/ravage.ravage setup check --brief brief.yaml.ravage tools check, then install with
scripts/install_tools.sh --method docker --execute.docker info.127.0.0.1 or
localhost, then update scope.in_scope and rerun.ravage setup check --brief brief.yaml --model-profile ... --model-tier ....--target-url or add an HTTP(S) URL to
scope.in_scope.