Scanning Runbook
This runbook describes how operators should launch and schedule scans in the current hxEASM product. It documents the implemented behavior, not future scan orchestration ideas.
For lower-level reference, see Scan Profiles, Asset Observed State, and Plugin Development.
Scanning Model
The normal scanning flow is:
approved Scope
-> Scan Profile
-> ordered plugins
-> discovered Assets
-> scanner-owned observed state in metadata.asset_info
-> Asset Scan History
-> Threats where vulnerability plugins emit findings
Scope is the customer-approved starting input. A Scan Profile is an ordered pipeline of independently runnable plugins. Plugins do not call each other directly and must remain usable in arbitrary valid profiles.
During profile execution, the worker runs plugins in profile order. When a plugin succeeds, normalized Assets from that plugin are added to the running scan scope, so later plugins in the same scan may consume them. This is why profiles such as recon_expanded can start from root domains and later probe discovered subdomains, WebApps, and certificates.
Most profiles start from the selected Scope IDs plus Assets discovered earlier in that same scan. They do not automatically scan every previously discovered Asset in the organization.
vuln_scan is the current exception. Before running httpx -> nuclei, the worker augments its initial scope with existing WebApp, Subdomain, Domain, and IP Assets for the organization. This makes vuln_scan the preferred recurring vulnerability profile.
Threats are created when vulnerability plugins such as Nuclei emit vulnerability entities. Scanner-observed Asset state is stored separately in metadata.asset_info and produces Asset Scan History.
Scope Types
Common scan starting Scope types are:
| Scope type | Operational meaning |
|---|---|
domain |
Root domain discovery input, for example example.com. |
ip |
Single IP target. |
ip_range |
IPv4 range stored as one Scope entry, expanded at scan runtime. |
cidr |
CIDR scope passed separately to plugins that accept CIDR. |
IP Range Expansion
ip_range remains stored as one Scope record:
type = ip_range
value = 10.0.0.1-10.0.0.3
At scan runtime, the worker expands the range into normal ip ScopeItems:
ip:10.0.0.1
ip:10.0.0.2
ip:10.0.0.3
This expansion is runtime-only:
- plugins receive ordinary
iptargets; - plugins do not need to understand
ip_rangesyntax; - no IP Assets are created merely because an IP is a member of the range;
- overlapping ranges and explicit IP scopes are deduplicated;
- malformed ranges fail the scan clearly;
- oversized ranges fail instead of being truncated.
Current limits are:
- 65,536 IPs per individual
ip_rangeScope; - 65,536 unique expanded IP range targets per scan.
CIDR behavior is separate and unchanged. CIDR scopes are not expanded by this mechanism.
Built-In Scan Profiles
The built-in profiles are configured in backend/configs/config.yaml.
| Profile | Plugin chain | Purpose | Recommended starting target | Relative load | Typical use |
|---|---|---|---|---|---|
quick |
subfinder -> dnsx -> httpx |
Fast discovery and freshness check. | Root domains. | Low to moderate. | Daily domain/DNS/Web freshness. |
default |
subfinder -> dnsx -> httpx -> naabu -> nuclei |
Balanced scan with discovery, port discovery, and Nuclei. | Domains or IPs. | Moderate to high. | One-off baseline, but overlaps other profiles. |
deep |
subfinder -> amass -> dnsx -> naabu -> nmap -> httpx -> tlsx -> katana -> nuclei |
Maximum visibility. | Explicitly approved domains/ranges. | High. | Manual investigation or off-hours broad assessment. |
stealth |
subfinder -> amass -> httpx |
Low-noise reconnaissance. | Root domains. | Moderate; Amass can run long. | Optional domain reconnaissance. |
recon_nmap |
subfinder -> dnsx -> nmap |
Reconnaissance with Nmap service validation. | Domains or IPs. | Moderate to high. | Usually superseded by port_discovery for network discovery. |
tls_audit |
subfinder -> dnsx -> httpx -> tlsx |
Certificate and TLS inventory. | Root domains. | Moderate. | Weekly certificate/TLS refresh. |
web_discovery |
subfinder -> dnsx -> httpx -> katana -> nuclei |
Web discovery, crawling, and initial web vulnerability scan. | Domains and appropriate IP scopes. | High. | Initial web/vulnerability baseline or periodic crawl. |
port_discovery |
subfinder -> dnsx -> naabu -> nmap |
Network service mapping. | IP ranges, IPs, domains. | Moderate to high. | Initial and recurring IP range service discovery. |
vuln_scan |
httpx -> nuclei |
Recurring vulnerability validation. | Approved scope; also uses existing discovered assets. | Moderate to high. | Weekly vulnerability refresh. |
recon_expanded |
subfinder -> amass -> dnsx -> httpx -> tlsx |
Strong non-vulnerability discovery. | Root domains. | Moderate to high. | Initial domain baseline and periodic expanded recon. |
screenshot |
subfinder -> dnsx -> httpx -> httpx_screenshot |
Web screenshot collection. | Domains or known Web targets. | Moderate. | Optional visual inventory and demo evidence. |
Domain Scanning Flow
Recommended domain baseline:
root domains
-> recon_expanded
Current recon_expanded chain:
subfinder
-> amass
-> dnsx
-> httpx
-> tlsx
This establishes a broad non-vulnerability baseline:
- Subfinder and Amass discover subdomains from root domains.
- DNSX resolves domains/subdomains and records DNS state.
- HTTPX probes HTTP services and creates/enriches WebApp Assets.
- TLSX observes certificates and TLS endpoint state.
This can populate:
- Domain/Subdomain DNS records: A, AAAA, CNAME, NS, MX;
- resolved IP Assets from A/AAAA records;
- WebApp Assets;
- HTTP status, server, selected security headers, CSP, safe cookie flags, technologies, favicon hash, and page fuzzy hash where HTTPX reports them;
- Certificate Assets and certificate observed state;
- Service TLS observed version when TLSX reports an IP and port.
Do not expect WHOIS/RDAP or ASN enrichment from this profile. Those are not production-backed in the current implementation.
IP Range Scanning Flow
Recommended IP range baseline:
ip_range
-> runtime IP expansion
-> port_discovery
Current port_discovery chain:
subfinder
-> dnsx
-> naabu
-> nmap
For IP range targets, the practical flow is:
stored ip_range
-> expanded ip ScopeItems
-> DNSX PTR where available
-> Naabu open service discovery
-> Nmap service and OS fingerprinting
This is the preferred existing profile for initial network/service discovery from approved IPv4 ranges. It can populate:
- IP PTR state where DNSX returns PTR records;
- Service Assets from Naabu and Nmap;
- service state and transport from Naabu;
- IP OS fields from Nmap where available;
- service name, product, version, state, and transport from Nmap.
Range expansion does not create IP Assets by itself. IP Assets are created only when scanner output observes them.
Web and Vulnerability Baseline
Use web_discovery as the initial Web/vulnerability pass after basic domain and network baselines.
Current chain:
subfinder
-> dnsx
-> httpx
-> katana
-> nuclei
This profile is useful because it adds:
- WebApp discovery and enrichment through HTTPX;
- Web paths through Katana;
- initial standard Nuclei findings.
It overlaps with lighter discovery and vulnerability profiles. Do not schedule it very frequently by default unless the customer expects regular crawling and vulnerability load.
Recurring Vulnerability Scanning
Use vuln_scan for recurring vulnerability refresh.
Current chain:
httpx
-> nuclei
vuln_scan has special current behavior: before plugin execution, the worker augments the selected scope with existing WebApp, Subdomain, Domain, and IP Assets for the organization. This lets Nuclei cover previously discovered assets without requiring an operator to manually select every discovered Asset.
Nuclei is allowed to be long-running. hxEASM no longer applies the old 600-second whole-process wall-clock timeout to Nuclei. Scanner-native request-level timeouts, retries, rate limits, and concurrency remain separate and should not be confused with total process duration.
Do not treat that as permission to run Nuclei aggressively by default. For a pilot, weekly vulnerability scanning is a more conservative starting point than daily scanning.
First Customer Baseline
For a first pilot customer with several approved root domains and one or more approved IPv4 ranges:
Step 1
Target: : Root domain scopes
Profile:
: recon_expanded
Purpose: : Establish the domain, DNS, WebApp, and TLS/certificate baseline.
Step 2
Target: : IP range scopes
Profile:
: port_discovery
Purpose: : Establish the IP, service, and OS baseline from approved network ranges.
Step 3
Target: : Approved domain and IP range scopes
Profile:
: web_discovery
Purpose: : Establish Web paths and initial Nuclei vulnerability baseline.
Step 4 - Optional
Target: : Approved domain and Web-relevant scopes
Profile:
: screenshot
Purpose: : Collect visual inventory and demo evidence.
Do not automatically run deep across the entire customer perimeter during onboarding by default. Use it only with explicit operator/customer approval and preferably off-hours.
Recommended Pilot Schedule
Stagger weekly jobs instead of launching all of them at the same time.
| Frequency | Profile | Target | Purpose |
|---|---|---|---|
| Daily | quick |
Root domains | Domain, DNS, and Web freshness. |
| Weekly | port_discovery |
IP ranges | Network/service refresh. |
| Weekly | vuln_scan |
Approved scope plus existing discovered assets according to current implementation | Vulnerability refresh. |
| Weekly | tls_audit |
Root domains | Certificate/TLS refresh. |
| Initial or on-demand | web_discovery |
Domains and appropriate IP scope | Crawl/path discovery and Nuclei baseline. |
| Manual/on-demand | deep |
Explicitly selected approved scope | Deeper investigation. |
Do not schedule daily Nuclei by default during a first pilot.
Why Domains and IP Ranges Use Different Flows
Domains are discovery roots. They are best for:
domain
-> subdomains
-> DNS
-> IPs
-> WebApps
-> certificates
IP ranges are network discovery roots. They are best for:
range
-> IP targets
-> ports
-> Services
-> service fingerprints
-> OS where available
Because the starting intent is different, domains and IP ranges should not automatically use identical profiles or schedules.
Asset Scan History
Recurring scans are important not only for discovering new Assets, but also for detecting changes in already known Assets. Scanner-owned observed state is written to metadata.asset_info; scan snapshots and field-level scan changes are generated from those observations.
Current production-backed sources include:
| Plugin | Asset Scan History fields |
|---|---|
| DNSX | A, AAAA, CNAME, NS, MX on Domain/Subdomain assets; PTR on IP assets. |
| Nmap | IP OS fields; service name, product, version, state, transport. |
| Naabu | Service state and transport. |
| HTTPX | HTTP status, server, selected security headers, CSP, safe cookie flags, technologies, favicon hash, page fuzzy hash. |
| Katana | WebApp paths. |
| TLSX | Certificate fingerprint, serial, subject/issuer fields, SANs, validity, expired flag, and observed TLS version on Service assets where available. |
Asset Scan History is separate from System Changes and Exposure Changes. See Asset Observed State for the storage model.
Profile Overlap
Avoid blindly scheduling every profile.
quickoverlaps with many larger profiles.defaultoverlaps withquick, network discovery, and Nuclei.deepoverlaps with most other profiles.web_discoveryoverlaps lighter discovery and vulnerability scanning.recon_expandedoverlapstls_audit.
For a pilot, prefer the smallest useful set:
quickdaily on domains;port_discoveryweekly on IP ranges;vuln_scanweekly;tls_auditweekly if certificate/TLS history matters;web_discoveryinitially or on demand.
Expensive or Active Scans
Schedule these conservatively and only within customer-approved scope:
- Nuclei;
- Nmap;
- Naabu;
- Katana;
- Amass;
- Nmap vulnerability scripts if manually used in a custom profile.
Broad IP range scans, crawling, vulnerability scanning, and deep scans can generate significant traffic or run for a long time.
Deep Profile
deep currently runs:
subfinder
-> amass
-> dnsx
-> naabu
-> nmap
-> httpx
-> tlsx
-> katana
-> nuclei
Treat it as a broad/heavy profile. Recommended operational use:
- manual investigation;
- explicitly approved broad assessment;
- optionally monthly/off-hours after the pilot team understands normal runtime and customer tolerance.
Do not make deep part of the default daily or weekly first-pilot schedule.
Current Limitations
Current relevant limitations:
- WHOIS/RDAP is not production-backed.
- ASN enrichment is not production-backed.
- TLS supported-version enumeration is not production-backed.
- Nmap vulnerability scripts are registered as
nmap_vulns, but they are not included in built-in profiles. - Custom Nuclei templates are registered as
nuclei_custom_templates, but they are not included in built-in profiles. - Most profiles start from selected Scope IDs and same-scan discoveries.
vuln_scanhas special existing-Asset augmentation behavior.
Do not describe unsupported enrichment or custom profile behavior to customers as if it were part of the default scanning lifecycle.
Operational Quick Reference
First Run
| Target | Profile |
|---|---|
| Domains | recon_expanded |
| IP ranges | port_discovery |
| Domains/IP ranges | web_discovery once |
Continuous
| Target | Profile | Frequency |
|---|---|---|
| Domains | quick |
Daily |
| IP ranges | port_discovery |
Weekly |
| Vulnerabilities | vuln_scan |
Weekly |
| TLS/certificates | tls_audit |
Weekly |
On Demand
| Profile | Use |
|---|---|
deep |
Deeper approved investigation. |
screenshot |
Visual inventory or demo evidence. |
web_discovery |
Crawl/path discovery and Web vulnerability refresh. |