Call it, name the target, go — like nmap <target>. A bare target runs the
recon pipeline (the default action); no recon keyword needed. Everything is scope-gated
and audited: no network action runs against a host that isn't on an explicit, non-expired allow-list.
The default action — no recon keyword needed. Runs the full OSINT pipeline against an
authorized target: infers its email/username schema, correlates scattered signals into confidence-scored
identities (exact → fuzzy → perceptual avatar-hash), enriches them, maps in-scope authentication surfaces, and
returns a ranked "most-likely way in". Accepts several targets at once, and - to read them from
stdin. The scope is auto-discovered; it refuses to run without one.
Scaffolds a scope.json engagement file, pre-filling the allow-list with the target and
its subdomains and setting a one-year window. Edit authorized_by before you run — the scope is your
declaration of authorization. -g writes it globally to ~/.config/skirmisher/scope.json
so skirmisher <target> then works from any directory; -o FILE chooses the path;
--force overwrites an existing one.
The explicit form of skirmisher <target> — runs the five stages
(Profile → Correlate → Enrich → Surface → Rank). Add -O for live surface discovery (DNS + TLS on
in-scope hosts), -P for passive crt.sh subdomain discovery, and -e FILE for
credential-reuse enrichment. -j / --dot change the output format.
Validates a scope file — it must be well-formed, name an authorized_by, carry a
non-empty allow-list, and not be expired — then prints what's authorized (allow / deny). With
-H <host> it tests a single host against the scope and prints ALLOW or
DENY with the reason, so you can confirm a target is in scope
before touching it. The file is auto-discovered if omitted.
Lists every available module with its short alias and a one-line description, and whether it is
read-only [aux] or [invasive]. Use the alias with run/check
— e.g. probe, expose, headers, fp, tls,
ssh.
Lists the recon collectors and their tier: offline (always run — schema
inference, fixtures), network (-O: live surface discovery),
or passive (-P: crt.sh). Shows which are gated behind an
opt-in flag.
Runs a module against a host. The positional target sets RHOST; set other options with
-o KEY=VAL (repeatable, e.g. -o RPORT=8443 -o SSL=false). The runner authorizes every
target through the scope guard before the module executes, so an out-of-scope host is refused before a
single packet is sent — and the decision is audited. Each meaningful result is recorded as a
finding (to <scope>.findings.jsonl) for skirmisher report;
--no-findings skips that.
Runs a module's non-invasive check only — the quick "is it there / is it exposed?" probe
without the full action (e.g. which ports are open, whether the host serves HTTP). Same scope-gating, options,
and findings behaviour as run.
Builds a Markdown penetration-test report from the findings recorded during the engagement: an
executive summary with a severity tally, the scope, every finding by severity with its evidence and timestamp,
a methodology section derived from the audit trail, and an appendix. -o FILE writes it to a file
(otherwise stdout); -s points at the scope for engagement metadata; findings are auto-discovered
alongside the scope.
Prints a shell-completion script for the sk and skirmisher commands so
subcommands and module aliases tab-complete. Source it from your shell rc — e.g.
skirmisher completions zsh > ~/.config/skirmisher/completion.zsh, then source it (after
compinit on zsh).
Prints the full manual to the terminal — the same reference as the installed man sk
page (synopsis, commands, options, pipes, exit status, and the authorization statement).
Prints the installed version. skirmisher --version works too.
Every command also accepts skirmisher <command> -h to print its full flags. The next
pages detail the flags for the commands that have them (recon, run/check) plus scope, output, and examples.
skirmisher <target> [options]| Flag | What it does |
|---|---|
| -s, --scope FILE | Engagement scope JSON. Optional — auto-discovered (see §06). Default-deny if none found. |
| -n, --names "A,B" | Comma-separated known names → seeds candidate identities (e.g. "Jane Doe,John Roe"). |
| -f, --fixtures DIR | Offline fixtures dir (defaults to ./fixtures if present) — <target>.json sample data. |
| -F, --fixture-file F | An explicit fixture JSON file. |
| -e, --exposure FILE | Exposure index → flags identities whose email/username is exposed (credential-reuse), boosts their routes. |
| --no-enrich | Skip enrichment (credential-reuse flags). |
| -O, --online | Enable networked collectors: live DNS + TLS surface discovery on in-scope hosts. |
| -P, --passive | Enable third-party passive OSINT (crt.sh subdomain discovery; in-scope domains only). |
| --timeout SEC | Per-connection timeout for -O probes (default 4). |
| -c, --collectors L | Comma-separated collector names to run (default: all applicable). |
| -l, --limit N | Max ranked routes (default 10). |
| -j, --json | Machine output — NDJSON, one compact object per target (pipes to jq). |
| --dot | Graphviz DOT of the identity graph (pipe to dot -Tpng). |
| -q, --quiet | Results only — no banner or decoration. |
| -v, --verbose | Print pipeline stages to stderr (stdout stays clean for pipes). |
Five stages, one flow: Profile (infer email/username schema) → Correlate (fuse usernames/emails/avatars into confidence-scored identities: exact → fuzzy → perceptual avatar-hash) → Enrich (credential-reuse) → Surface (map in-scope auth surfaces) → Rank (identity × surface × evidence → a "most-likely way in" shortlist).
| Flag | Meaning |
|---|---|
| -s, --scope FILE | Scope JSON (auto-discovered if omitted). |
| -o, --option K=V | Set a module option (repeatable), e.g. -o RPORT=8443 -o SSL=false. |
| --findings FILE | Findings JSONL to append to (default: alongside the scope). --no-findings to skip. |
| Module (alias) | What it does | Options (defaults) |
|---|---|---|
| tcp_service_probe (probe) | Scope-gated TCP connect + banner grab across common ports. | RHOST, PORTS=21,22,25,80,110,143,443, TIMEOUT=4 |
| http_expose (expose) | Read-only web-exposure audit: .git/.env/.svn, directory listing, status endpoints. | RHOST, RPORT=443, SSL=true, PATHS, TIMEOUT=5 |
| http_fingerprint (fp) | Fingerprint a web surface: server banner, page title, tech tells. | RHOST, RPORT=443, SSL=true, TIMEOUT=5 |
| http_headers (headers) | Security-headers audit: missing HSTS / CSP / X-Frame-Options, version disclosure, insecure cookies. | RHOST, RPORT=443, SSL=true, TIMEOUT=5 |
| tls_audit (tls) | TLS posture: deprecated protocol, weak cipher, expired / self-signed cert. | RHOST, RPORT=443, TIMEOUT=5 |
| ssh_audit (ssh) | SSH banner audit: SSH protocol 1.x, outdated OpenSSH (< 7.4). | RHOST, RPORT=22, TIMEOUT=5 |
| Collector | Tier | What it does |
|---|---|---|
| email-schema | offline | Infer likely email/username formats for the target domain. |
| fixture | offline | Load signals/surfaces from a local JSON fixture (demo/test). |
| surface-probe | network (-O) | Resolve in-scope hosts + read TLS cert → live auth surfaces. |
| cert-transparency | passive (-P) | crt.sh subdomain discovery; feeds the active probe. |
Offline collectors always run. Networked ones run only under -O; third-party ones only
under -P (and only for in-scope domains).
Allow / deny entries domains (*. = subdomains
only), bare hostnames, IPs, or CIDRs. engagement and authorized_by are required; an
empty allow-list is rejected. Default-deny, deny beats allow, expiry
enforced, every decision audited.
Discovery order -s FILE → ./scope.json →
./scope.example.json → $SKIRMISHER_SCOPE →
~/.config/skirmisher/scope.json. Exposure & findings files follow the same pattern.
JSON goes to stdout, logs/stage timings to stderr (-v),
so output pipes cleanly.
| Code | Meaning |
|---|---|
| 0 | Success. |
| 1 | A module check failed / nothing found. |
| 2 | Bad usage or error (e.g. no scope, malformed file). |
| 3 | Refused — target out of scope. |
Scriptable: skirmisher acme.com && ….
Skirmisher is for targets you own or are contracted to test. Scope defines legality; the guard enforces it and the audit log records it.