relift

Relift — CLI Reference

relift [--version] [--no-color] [--config PATH] <command> [flags]
Exit code Meaning
0 success
1 a module errored during a scan (the run is still written and reportable)
2 refused by the scope gate — nothing was sent
3 bad usage, bad input, unknown category, missing run, bad credential file
130 interrupted (Ctrl+C)

Running relift with no command prints the banner and the help text and exits 0.


Targets

--target accepts an origin, a database endpoint, an SSH listener or the local host:

Form Example Families planned
HTTP/HTTPS https://lab.internal:8443 http
PostgreSQL postgres://10.10.10.20:5432/appdb (alias postgresql) db
MySQL/MariaDB mysql://10.10.10.20:3306/appdb (alias mariadb) db
Redis redis://10.10.10.20:6379 (alias rediss) db
MongoDB mongodb://10.10.10.20:27017 db
MSSQL mssql://10.10.10.20:1433 (aliases sqlserver, tds) db
Elasticsearch elasticsearch://10.10.10.20:9200 (aliases opensearch, es) http + db
CouchDB couchdb://10.10.10.20:5984 http + db
SSH ssh://10.10.10.20:22 ssh
Local host local:// host

Omitting the port uses the scheme default. Omitting the scheme means https://. The path segment is the database name for engines that need one.

local:// audits the machine Relift is running on. It still needs 127.0.0.1 (or the local hostname) in the scope file and still writes an audit line; it does not bypass the gate.


relift list

Prints the attack catalogue — every technique the tool knows, its tier, whether it is implemented, and what it needs.

relift list
relift list --category db
relift list --implemented-only
relift list --json
Flag Meaning
--category C one of recon, tls, web, db, system, auth, analysis, report
--implemented-only hide design-only entries
--json machine-readable array

An unknown --category exits 3 and lists the valid ones.

ID                        TECHNIQUE                              TIER      STATUS
recon.dns                 DNS resolution & address inventory      passive   ready
recon.http_fingerprint    HTTP fingerprint                        passive   ready
recon.port_scan           TCP connect sweep                       safe      ready
recon.service_scan        Service/version detection               safe      ext: nmap
...
24 techniques · 16 ready · 3 external · 5 design-only / excluded

relift providers

Shows each AI provider, whether it is reachable right now, and which one would be selected.

relift providers
relift providers --json

relift init-scope

Writes a scope file. Refuses to overwrite without --force.

relift init-scope --engagement homelab --host 127.0.0.1 --host 10.10.10.0/24
relift init-scope --engagement db-lab --host 127.0.0.1 \
  --ports 5432,6379 --out scope.json --allow-intrusive
Flag Default Meaning
--engagement NAME required engagement name, appears in every audit line
--host H 127.0.0.1 repeatable; host, wildcard or CIDR
--deny H — repeatable deny entry
--out PATH scope.json output path
--max-risk R safe passive or safe
--expires ISO +30 days expiry timestamp
--ports LIST common set comma-separated ports
--allow-intrusive off sets max_risk: intrusive and allow_intrusive: true together
--authorized-by Jay who signed off
--organization Pixelcity organisation
--notes — free text copied into the scope
--force off overwrite an existing file

Choosing --allow-intrusive still does nothing without --profile lab at scan time. Both switches are required.

relift plan

Builds the ordered run plan without executing it. Always safe: no packets beyond the DNS lookups the scope check performs.

relift plan --target http://127.0.0.1:8080 --scope scope.json
relift plan --target postgres://127.0.0.1:5432/appdb --scope scope.json --no-ai
relift plan --target 10.10.10.20 --profile lab --scope scope.json --no-ai
Flag Default Meaning
--target T required any form from the target table
--scope S required scope file path
--profile P from config, else safe passive | safe | standard | lab
--ai ID auto provider id; none = rule engine
--no-ai off force the rule engine
--json off emit the plan as JSON

relift scan

Executes the plan. Dry-run unless --execute is given.

# shows what would run, sends nothing
relift scan --target http://127.0.0.1:8080 --scope scope.json

# actually does it
relift scan --target http://127.0.0.1:8080 --scope scope.json --execute

# a database, safe tier
relift scan --target postgres://127.0.0.1:5432/appdb \
  --scope scope.json --execute

# credentials you already hold, lab only
relift scan --target mysql://10.10.10.20:3306/appdb \
  --scope scope.json --profile lab --execute --db-creds creds.json

# bounded injection probe on one parameter, lab only
relift scan --target http://127.0.0.1:8080 \
  --scope scope.json --profile lab --execute \
  --sqli-url "http://127.0.0.1:8080/product?id=1" --sqli-param id

# the machine you are on
relift scan --target local:// --scope scope.json --execute
Flag Default Meaning
--target T required as above
--scope S required scope file path
--profile P from config, else safe as above
--execute off send real traffic
--ai ID / --no-ai auto analyst selection
--ports LIST from scope override the port set
--timeout S 6 per-operation socket timeout
--insecure off skip TLS verification (lab self-signed certs)
--db-creds FILE — JSON file of credentials you already hold; one attempt each
--sqli-url URL — URL containing the parameter to probe; must be on the target host
--sqli-param NAME — the parameter in that URL
--json off print the run record as JSON

--sqli-url and --sqli-param must be given together. --db-creds and the injection probe only run under --profile lab with an intrusive scope; otherwise they are not planned at all and the run says so.

Sample output:

target   postgres://127.0.0.1:55433/postgres   engagement: relift-lab
scope    6c1d7b74c272   profile: lab   analyst: offline/rule-engine
run      20261107-141726-4106   2026-11-07T14:17:26+00:00

   TECHNIQUE             RESULT  TIME    NOTE
─  ────────────────────  ──────  ──────  ──────────────────────────────
✓  recon.dns             ok      0.00s   1 finding(s)
✓  recon.port_scan       ok      10.21s  1 finding(s)
–  recon.service_scan    skipped 0.00s   missing tool: nmap
✓  db.fingerprint        ok      0.00s   1 finding(s)
✓  db.security_config    ok      0.20s   3 finding(s)
✓  db.credential_verify  ok      0.20s   1 finding(s)

FINDINGS

 CRIT Credential for postgres accepted on postgres  [db.credential_verify]
 ...
ATTACK THREADS

 CRIT Held postgres credential still works and is superuser
  path   credential access -> privilege escalation -> collection
  break  Rotate the credential, then find its source: config file, CI secret,
         backup, or an application default. ...

5 executed · 1 skipped · 7 finding(s) (2 critical · 1 high) · 2 thread(s)
run saved to .relift-runs/20261107-141726-4106/run.json   audit: ~/.relift/audit.jsonl

relift report

Re-renders a stored run. Works offline; the AI narrative is optional and regenerated only if asked.

relift report --run 20261107-120501-4f2a
relift report --run 20261107-120501-4f2a --format md
relift report --run 20261107-120501-4f2a --format json
relift report --run <id> --ai openai      # regenerate the narrative
relift report --run <id> --no-ai          # rule engine narrative
relift report --run <id> --format md --out report.md
Flag Default Meaning
--run ID latest run id under .relift-runs/, or a path to a run.json
--format F text text | md | json
--ai ID / --no-ai auto narrative source
--out PATH stdout write instead of printing

Markdown output contains the findings table, an attack-threads section with one stage table per thread, and the coverage table.

relift chains

Prints the correlated attack threads for a stored run. Recomputes them from the findings when the artefact predates the correlation engine, so it works on old runs.

relift chains                       # latest run
relift chains --run 20261107-141726-4106
relift chains --format json
relift chains --out threads.json --format json
Flag Default Meaning
--run ID latest run id or path to run.json
--format F text text | json
--out PATH stdout write instead of printing
ATTACK THREADS

 CRIT Unauthenticated redis reachable: full datastore read path
  path   reconnaissance -> initial access -> collection
  The redis listener on port 6379 answered the protocol probe without demanding
  credentials. ...
  break  Enable authentication and bind the listener to the loopback or an
         internal interface. Fix order: bind address first, then auth.

--format json returns {run_id, target, headline, chains[]}; each chain carries id, title, severity, summary, stages[] (stage, attack_id, title, detail), break_at and confidence.

relift desktop

Starts the desktop application: one loopback server, a native window when pywebview is installed, the default browser otherwise. Same engine, same scope gate. The same program is installed as relift-desktop.

relift desktop
relift desktop --no-window --port 8765
Flag Default Meaning
--port N 0 0 picks a free ephemeral port
--no-window off serve only; print the URL instead of opening a window
RELIFT · Pixelcity Red Team Orchestrator · v0.2.0
  desktop   http://127.0.0.1:43719/
  window    native
  scope gate: same engine, same scope file, no bypass
  press Ctrl+C to stop

Ctrl+C stops the server; closing the native window does the same. Architecture, API and build instructions: 08-DESKTOP.md.

Run artefacts

.relift-runs/20261107-120501-4f2a/run.json
~/.relift/audit.jsonl

run.json holds the target, scope hash, profile, provider, every execution, every finding and every correlated thread. audit.jsonl holds the authorisation decisions and a chains event per run. Both are gitignored by default because they describe your internal network.

Paths can be redirected with RELIFT_RUNS_DIR and RELIFT_AUDIT_FILE.