run discover spends its whole budget on the first handful of hosts. A sweep has the opposite shape - you want a shallow answer about thousands of hosts, so you can decide which few deserve a real scan.
Aliases:
probing, httpx, alive, sweep. vigolium run httpx -T hosts.txt and vigolium scan -T hosts.txt --only probe are the same command.When to use it
The intended flow is probe first, rank by
surface_score, then point a full scan at the top of that list.
Quick start
Bare hostnames are fine. A subdomain list with no schemes is normalized per line before the sweep starts, so
hosts.txt straight out of a recon tool needs no pre-processing. Since v0.4.9 a schemeless probe target resolves its scheme by TCP connect - plus a TLS handshake on a non-standard port - rather than defaulting to http:// and recording a redirect to the real one. See Schemeless targets.Output
stdout is pure JSONL; human progress goes to stderr. Pipe with2>/dev/null, or add --silent for a fully quiet run. One object per record:
a / aaaa / cname / tls), so a consumer written against that output reads these unmodified.
A sweep produces records, not findings. A
0 findings summary is the expected result - the answer lives in the record’s surface_score, technology, and status_code columns.Probe flags
--tls-probe and --record-redirect-chain on a run that has no probe phase warn that they are inert rather than silently doing nothing.
--tls-probe
Reports the negotiated TLS version and cipher plus the leaf certificate - subject/CN, SANs, issuer, validity window, serial, and MD5/SHA-1/SHA-256 fingerprints - under an httpx-shaped tls key.
Validation is deliberately off. An expired or self-signed certificate is the result you came for, so the handshake records it instead of refusing it.
The certificates are stored, so you can read them back later (v0.5.5).
vigolium hosts --has tls -j lists every endpoint whose handshake was recorded, and vigolium hosts --has tls --sans prints the distinct SANs one per line — a ready -T file for the next sweep. The fingerprint phase probes HTTPS unconditionally; --tls-probe is what turns it on for run probe. See Host facts.--redirect-mode
Replaces the old FollowRedirects / FollowHostRedirects bool pair, which had no spelling for what a host sweep actually needs.
same-apex fails closed to exact-host equality when either side has no registrable domain.
--record-redirect-chain
Each followed hop becomes its own http_records row, chained through the existing parent_uuid column. a.example (301) -> www.a.example (302) -> the 200 that answered is three rows, not one.
A 3xx also stores its Location header verbatim in response_location, so traffic --tree prints the destination (↪ https://…) off the row instead of hydrating response bytes.
Since v0.4.9 the flag gates only the hop rows: the request/response re-pairing happens regardless, so a redirected record always names the server whose bytes it carries. Stored chains also collapse canonical hops - scheme upgrade, trailing slash, www., default port - into their destination row and cap at 4 rows, keeping both ends; chain_truncated on the record marks the ones that hit the cap, and root_uuid resolves the chain’s first hop in O(1). See the records API.
Probe-only defaults
A standalone probe run -vigolium run probe, vigolium scan --only probe, or REST {"only": "probe"} - flips its own defaults. Each one yields to an explicit flag, and none of them apply when the probe rides along inside a wider scan.
Reactive back-off after a confirmed WAF block is untouched. To restore either default:
--no-waf-pacing=false re-enables proactive pacing, --export-only http,findings puts the findings back in the envelope.
Attack-surface scoring
Every probed record gets asurface_score: 0-100, the percentage of a 17-signal set present on that exchange. It is written by the surface-scoring passive module and is deterministic - the same record scores the same on every scan.
Every signal is readable from a single unauthenticated GET, which is what a host sweep has to rank on:
- An advertised authentication boundary, a session, a login surface
- A non-standard port
- A dynamic origin (versus edge-cached)
- Permissive CORS
- Leaked internals - source maps, directory listings, dev-server banners, debug headers
- API markers and the input surface the response advertises
surface_score is not risk_score. See --min-surface vs --min-risk for the full comparison - the short version is that surface is absolute and reproducible, while risk is a rank within whichever batch the record was flushed alongside.
Reading a sweep back
Probe rows are labelledsource: probe, so a sweep is separable from a real scan in the same project:
Related
- Scanning Modes Overview - phase control, aliases, and
--only/--skip - Running Phases Independently - chaining phases into a custom pipeline
- CLI Reference -> Scanning - the full flag surface
- Discovery - the depth-first counterpart to this breadth-first sweep
