-
Notifications
You must be signed in to change notification settings - Fork 1
Shell Reference
Complete reference for all 35 IXF interactive shell commands.
Shell prompts:
-
ixf >— global context, no module loaded -
ixf (Module Name) >— module loaded
Commands with hyphens (e.g. mitre-scan) work with or without hyphens; they map internally to command_mitre_scan.
Display the global help menu or module-specific help.
Syntax: help
Context: global or module
ixf > help
IndustrialXPL-Forge v1.0.12 — IXF Shell Commands
─────────────────────────────────────────────────────────────
use <module> Load a module
back Unload current module
search <term> Search modules by keyword/CVE/vendor
set <option> <value> Set module option
setg <option> <value> Set global option (all modules)
show [info|options] Show module details
run Execute loaded module
check Connectivity/vulnerability check
discover <CIDR> OT device discovery sweep
cve <CVE-ID> Load module by CVE ID
ttp <TID> <target> Execute MITRE ATT&CK technique
mitre-scan <t> <ip> MITRE tactic/technique sweep
mitre-coverage Coverage % per tactic
sast <path> Offline PLC code analysis (LLM)
stats Module statistics
vendors [filter] List covered vendors
protocols List covered protocols
report [format] Generate assessment report
help This help
exit Exit IXF
Exit the IXF shell.
Syntax: exit
Context: global or module
ixf > exit
[*] Exiting IndustrialXPL-Forge. Stay safe.
Load a module by its path. Accepts slash notation (scanners/ics/modbus_detect) or dot notation (scanners.ics.modbus_detect).
Syntax: use <module_path>
| Argument | Type | Required | Description |
|---|---|---|---|
| module_path | string | yes | Slash or dot notation module path (relative to modules/) |
ixf > use scanners/ics/modbus_detect
[*] Module loaded: Modbus TCP Device Detect
[*] CVE: N/A | CVSS: N/A | Impact: LOW
ixf (Modbus TCP Device Detect) >
ixf > use cve/siemens/cve_2021_22681_s7_1200_hardcoded_key
[*] Module loaded: CVE-2021-22681 Siemens S7-1200/1500 PLC
[*] CVE: CVE-2021-22681 | CVSS: 9.8 | Impact: CRITICAL
If a required Tier 3 runtime is absent, IXF warns but still loads the module:
[!] Module requires 'go' runtime. Python fallback available.
Install Go: https://go.dev/dl/
Unload the current module and return to the global context.
Syntax: back
Context: module only
ixf (Modbus TCP Device Detect) > back
ixf >
Set an option on the currently loaded module.
Syntax: set <option> <value>
Context: module only (requires module loaded)
| Argument | Type | Required | Description |
|---|---|---|---|
| option | string | yes | Option name (case-insensitive) |
| value | varies | yes | Value appropriate for the option type (see Module System) |
ixf (Modbus TCP Device Detect) > set target 192.168.1.100
[*] target => 192.168.1.100
ixf (Modbus TCP Device Detect) > set port 5020
[*] port => 5020
ixf (Modbus TCP Device Detect) > set simulate false
[*] simulate => False
ixf (Modbus TCP Device Detect) > set timeout 10
[*] timeout => 10
Setting a boolean option:
ixf > set destructive true
ixf > set simulate false
ixf > set verbose yes # also accepts: yes, no, on, off, 1, 0, true, false
Validation error example:
ixf (Modbus TCP Device Detect) > set port 99999
[-] Validation error for 'port': Port must be between 1 and 65535
Set a global option that persists across all modules in the current session.
Syntax: setg <option> <value>
Context: global or module
| Argument | Type | Required | Description |
|---|---|---|---|
| option | string | yes | Option name |
| value | varies | yes | Value (same types as set) |
ixf > setg target 10.0.0.100
[*] Global: target => 10.0.0.100
ixf > use scanners/ics/modbus_detect
[*] Module loaded: Modbus TCP Device Detect
[*] target already set from global: 10.0.0.100
Common globals: target, timeout, simulate, destructive.
Remove a global option.
Syntax: unsetg <option>
Context: global or module
ixf > unsetg target
[*] Global 'target' cleared.
Display module information.
Syntax: show [info|options|advanced|devices|all]
Context: module only
| Subcommand | Description |
|---|---|
options |
Standard options (default if subcommand omitted) |
info |
Full module metadata (__info__ dictionary) |
advanced |
Advanced options only |
devices |
Target device types |
all |
Both info and options
|
ixf (CVE-2021-22681 Siemens S7-1200/1500 PLC) > show options
Options — CVE-2021-22681 Siemens S7-1200/1500 PLC
+------------+-----------+----------+----------------------------------------------+
| Option | Value | Required | Description |
|------------+-----------+----------+----------------------------------------------|
| target | | yes | Target Siemens S7-1200 IP |
| port | 102 | no | Port |
| simulate | True | no | Simulate (default: True) |
| destructive| False | no | Live exploitation — may cause irreversible |
+------------+-----------+----------+----------------------------------------------+
ixf (CVE-2021-22681 Siemens S7-1200/1500 PLC) > show info
Module Information
─────────────────────────────────────────────────────
name : CVE-2021-22681 Siemens S7-1200/1500 PLC
description : Siemens S7-1200/1500 hardcoded TLS private key...
authors : ('Andre Henrique (mrhenrike)',)
references : ('https://cert-portal.siemens.com/...',)
devices : ('Siemens S7-1200/1500 PLC',)
impact : CRITICAL
exploit_type : Hardcoded Key — MitM/Decryption
cve : CVE-2021-22681
cvss : 9.8
severity : CRITICAL
mitre_techniques: ['T0855', 'T0830']
mitre_tactics : ['Collection']
Execute the loaded module. Behavior depends on simulate and destructive options.
Syntax: run
Context: module only
| simulate | destructive | Behavior |
|---|---|---|
True (default) |
any | Print simulation output only; no packets sent |
False |
False |
Run check() only (safe probe) |
False |
True |
Full exploit with DestructiveGate confirmation for HIGH/CRITICAL/CATASTROPHIC impact |
# Simulate mode (default)
ixf (Modbus TCP Device Detect) > run
[SIMULATE MODE — no packets sent]
...
# Live run (authorized lab only)
ixf > set simulate false
ixf > set destructive true
ixf > run
[DESTRUCTIVE MODE — HIGH IMPACT]
...
Confirmation> I ACCEPT FULL RESPONSIBILITY FOR THIS DESTRUCTIVE OPERATION
See SafeMode / DestructiveMode for the full confirmation flow.
Run a read-only connectivity and vulnerability probe. Does not send exploits.
Syntax: check
Context: module only
ixf (Modbus TCP Device Detect) > set target 192.168.1.100
ixf (Modbus TCP Device Detect) > check
[*] Checking 192.168.1.100:502...
[+] VULNERABLE — Modbus device detected
ixf (CVE-2021-22681 Siemens S7-1200/1500 PLC) > set target 192.168.1.50
ixf (CVE-2021-22681 Siemens S7-1200/1500 PLC) > check
[*] Checking 192.168.1.50:102...
[-] NOT VULNERABLE — Port 102 not reachable or S7comm+ not detected
Search indexed modules by keyword, CVE ID, vendor name, or protocol.
Syntax: search <term>
Context: global
| Argument | Type | Required | Description |
|---|---|---|---|
| term | string | yes | Substring to match against module paths and names |
ixf > search CVE-2022-29965
[*] Search results for: CVE-2022-29965
use cve/emerson/cve_2022_29965_roc800_hardcoded_creds
ixf > search default_creds
[*] Search results for: default_creds (showing 50 of 184)
use creds/siemens/ssh_default_creds
use creds/siemens/telnet_default_creds
...
ixf > search dnp3
[*] Search results for: dnp3
use exploits/protocols/dnp3/dnp3_data_spoofing
use exploits/protocols/dnp3/dnp3_replay_command
use exploits/protocols/dnp3/dnp3_unauthorized_control
use scanners/ics/dnp3_scanner
Launch an OT device discovery sweep on a subnet.
Syntax: discover <CIDR>
Context: global
| Argument | Type | Required | Description |
|---|---|---|---|
| CIDR | string | yes | Network range (e.g. 192.168.1.0/24) |
ixf > discover 192.168.1.0/24
[*] Loading scanners/ics/modbus_detect for OT sweep...
[i] For full OT discovery, run: ttp T0846.001 192.168.1.0/24
[i] For protocol-specific scan: use scanners/ics/modbus_detect
Find and load a module by CVE identifier.
Syntax: cve <CVE-ID>
Context: global
| Argument | Type | Required | Description |
|---|---|---|---|
| CVE-ID | string | yes | CVE, CNVD, or other identifier (e.g. CVE-2022-29965) |
ixf > cve CVE-2021-22681
[*] Module loaded: CVE-2021-22681 Siemens S7-1200/1500 PLC
ixf > cve CVE-2023-6448
[*] Module loaded: CVE-2023-6448 Unitronics Unistream PLC
# Multiple matches — displays list
ixf > cve CVE-2022-3232
[*] Multiple modules found for CVE-2022-3232:
1. use cve/ls_electric/cve_2022_3232_xgk_modbus_dos
2. use cve/scanners/ls_electric/ls_electric_xgk_scanner
Select module (number or path):
Placeholder: discover assets and suggest CVE testing workflow.
Syntax: cve-scan <CIDR>
ixf > cve-scan 192.168.1.0/24
[i] CVE scan: discover assets first with mitre-scan discovery 192.168.1.0/24
[i] Then load specific CVE modules with: cve <CVE-ID>
Generate an assessment report from the current session.
Syntax: report [json|html|markdown]
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| format | string | no | json |
Output format |
ixf > report json
[*] Generating report...
[+] Report saved: ixf_report_20260601_153045.json
ixf > report html
[+] Report saved: ixf_report_20260601_153112.html
ixf > report markdown
[+] Report saved: ixf_report_20260601_153201.md
List all modules that cover a specific MITRE technique.
Syntax: mitre <TID>
ixf > mitre T0843
[*] Modules for T0843 (Program Download):
cve.siemens.cve_2022_1161_controllogix_modified_fw
cve.rockwell.cve_2022_1161_controllogix_modified_fw
exploits.protocols.s7comm.s7_unauthorized_cpu_control
assessment.mitre_ics.t0843_program_upload
List all mapped MITRE techniques with module counts. Optional tactic filter.
Syntax: mitre-list [tactic_name_or_alias]
| Argument | Type | Required | Description |
|---|---|---|---|
| tactic | string | no | Tactic name, alias, or TA-ID (e.g. discovery, initial-access, TA0108) |
ixf > mitre-list
MITRE ATT&CK for ICS — Technique Index
─────────────────────────────────────────────────────────────────
T0817 Drive-by Compromise 3 modules
T0819 Exploit Public-Facing Application 47 modules
T0822 External Remote Services 12 modules
...
ixf > mitre-list discovery
MITRE ATT&CK for ICS — Discovery Techniques
─────────────────────────────────────────────────────────────────
T0840 Network Connection Enumeration 2 modules
T0842 Network Sniffing 3 modules
T0846 Remote System Discovery 8 modules
...
Run a MITRE tactic sweep or single technique against a target.
Syntax: mitre-scan <tactic|TID> <target> [--destructive]
| Argument | Type | Required | Description |
|---|---|---|---|
| tactic or TID | string | yes | Tactic name/alias or technique ID (e.g. discovery, T0843) |
| target | string | yes | Target IP, hostname, or CIDR range |
--destructive |
flag | no | Disable simulate mode (authorized labs only) |
ixf > mitre-scan discovery 192.168.1.0/24
[*] Sweeping tactic: Initial Access (TA0108) on 192.168.1.0/24
[*] simulate=True (safe mode)
[*] Technique T0817 — Drive-by Compromise...
[*] Technique T0819 — Exploit Public-Facing Application...
...
[+] Tactic sweep complete: 9 techniques, 23 modules executed
ixf > mitre-scan T0843 192.168.1.100
[*] Sweeping T0843 (Program Download) on 192.168.1.100...
Sweep all 79+ mapped MITRE ATT&CK for ICS techniques (always in simulate mode).
Syntax: mitre-all <target>
ixf > mitre-all 192.168.1.100
[*] Full MITRE ATT&CK for ICS sweep on 192.168.1.100 (simulate=True)
[*] Running 74 techniques across 12 tactics...
Display coverage percentage per tactic.
Syntax: mitre-coverage
ixf > mitre-coverage
MITRE ATT&CK for ICS Coverage
──────────────────────────────────────────────────────────────
Initial Access (TA0108) : 9/9 (100%)
Execution (TA0104) : 8/9 (88%)
Persistence (TA0110) : 6/8 (75%)
Privilege Escalation (TA0111) : 2/2 (100%)
Evasion (TA0103) : 4/5 (80%)
Discovery (TA0102) : 11/13 (84%)
Lateral Movement (TA0109) : 3/3 (100%)
Collection (TA0100) : 8/9 (88%)
Command and Control (TA0101) : 3/3 (100%)
Inhibit Response Function (TA0107) : 14/18 (77%)
Impair Process Control (TA0106) : 9/11 (81%)
Impact (TA0105) : 8/11 (72%)
──────────────────────────────────────────────────────────────
TOTAL : 74/90 (82%)
Generate a MITRE ATT&CK Navigator-compatible layer or report.
Syntax: mitre-report [json|html|layer]
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| format | string | no | layer |
layer = ATT&CK Navigator JSON; json = raw data; html = HTML report |
ixf > mitre-report layer
[+] ATT&CK Navigator layer saved: ixf_mitre_layer_20260601.json
[i] Open at: https://mitre-attack.github.io/attack-navigator/
ixf > mitre-report html
[+] MITRE ICS coverage report saved: ixf_mitre_report_20260601.html
Alias for mitre-scan. See mitre-scan above.
Execute all modules mapped to a specific MITRE technique ID against a target.
Syntax: ttp <TID> <target> [--destructive] [--stop-on-first] [--output <file>] [--rate-limit <ms>]
| Argument | Type | Required | Description |
|---|---|---|---|
| TID | string | yes | MITRE technique ID (e.g. T0843, T0843.001) |
| target | string | yes | Target IP, hostname, or CIDR range |
--destructive |
flag | no | Disable simulate mode |
--stop-on-first |
flag | no | Stop after first confirmed hit |
--output <file> |
string | no | Save results to file |
--rate-limit <ms> |
int | no | Milliseconds between modules (default: 0) |
ixf > ttp T0843 192.168.1.100
[*] TTP T0843 (Program Download) — 12 modules — simulate=True
[*] Running cve/siemens/cve_2021_22681_s7_1200_hardcoded_key...
[*] Running cve/rockwell/cve_2022_1161_controllogix_modified_fw...
...
[+] T0843 sweep complete: 12 modules, 3 simulate matches
ixf > ttp T0878 10.0.0.0/24 --rate-limit 500
[*] TTP T0878 (Alarm Suppression) — subnet 10.0.0.0/24 — 500ms between modules
ixf > ttp T0859 192.168.1.1 --stop-on-first --output results.json
Run only the check() probe for all technique modules (read-only, no exploits).
Syntax: ttp-check <TID> <target>
ixf > ttp-check T0843 192.168.1.100
[*] T0843 check-only sweep on 192.168.1.100...
[+] POTENTIAL: cve/siemens/cve_2022_38465_s7_global_key — port 102 open
[-] NOT VULNERABLE: cve/rockwell/cve_2023_3595_controllogix_rce — port 44818 closed
Force simulate mode for all technique modules (safe, no packets beyond check).
Syntax: ttp-simulate <TID> <target>
ixf > ttp-simulate T0866 192.168.1.100
[*] T0866 simulation on 192.168.1.100 (simulate forced)
List all TTP-IDs with module counts. Optional tactic filter.
Syntax: ttp-list [--tactic <tactic_name>]
| Argument | Type | Required | Description |
|---|---|---|---|
--tactic |
string | no | Filter by tactic name/alias |
ixf > ttp-list
TTP Index — all techniques
─────────────────────────────────────────────────────────────
T0801 Monitor Process State 2 modules [Collection]
T0802 Automated Collection 5 modules [Collection]
T0806 Brute Force I/O 1 module [Impair Process Control]
...
ixf > ttp-list --tactic evasion
TTP Index — Evasion (TA0103)
─────────────────────────────────────────────────────────────
T0820 Exploitation of Remote Services 3 modules
T0849 Masquerading 1 module
T0856 Spoof Reporting Message 2 modules
T0858 Change Credential 4 modules
T0874 Hooking 1 module
Load and immediately execute an assessment module.
Syntax: assess <module_path>
Context: global
ixf > assess iec62443/zone_conduit_audit
[*] Loading assessment/iec62443/zone_conduit_audit...
[*] Running IEC 62443 Zone and Conduit Audit...
ixf > assess risk/ics_risk_scorer
ixf > assess nist_sp800_82/control_checklist
ixf > assess threat_intel/ics_kill_chain
Display module statistics and coverage summary.
Syntax: stats
ixf > stats
[i] IXF Module Statistics
Total: 976 modules
──────────────────────────────────────
Category Count %
cve 486 49%
exploits 159 16%
creds 34 3%
scanners 31 3%
assessment 18 1%
──────────────────────────────────────
[i] Vendors covered: 150 | Malware TTPs: 26
[i] MITRE ATT&CK for ICS: 12 tactics, 103 techniques mapped
[i] PyPI: pip install industrialxpl-forge
List all covered OT/ICS vendors with CVE module counts.
Syntax: vendors [substring_filter]
| Argument | Type | Required | Description |
|---|---|---|---|
| filter | string | no | Case-insensitive substring filter |
ixf > vendors
Vendors (150 covered)
─────────────────────────────────────────
Vendor Modules
Schneider Electric 39
Rockwell Automation 38
Siemens 27
...
ixf > vendors siemens
Vendors (1 covered)
─────────────────────────────────────────
Siemens 27
ixf > vendors germany
Vendors (12 covered)
─────────────────────────────────────────
Siemens 27
Beckhoff 5
Belden/Hirschmann 2
...
List all covered OT/ICS protocols with exploit module counts.
Syntax: protocols
ixf > protocols
Protocol Coverage (26 protocols)
─────────────────────────────────────────
Protocol Exploit Modules
MODBUS 18
DNP3 4
S7COMM 2
IEC61850 3
ENIP 4
BACNET 2
...
Alias for mitre-coverage. See MITRE ATT&CK for ICS.
Configure an LLM provider API key for SAST analysis. Keys are stored in-session only (never written to disk by this command).
Syntax: llm-key <provider> <api_key>
| Argument | Type | Required | Description |
|---|---|---|---|
| provider | string | yes |
openai, anthropic, gemini, deepseek, or grok
|
| api_key | string | yes | API key string |
ixf > llm-key gemini AIzaSyBGaoio5aKf3rWNFjpqc8trP4EJPyABYH8
[+] LLM key configured: provider=gemini len=39
ixf > llm-key openai sk-svcacct-...
[+] LLM key configured: provider=openai len=82
Alternatively, set via environment variables before launching IXF:
export GOOGLE_AI_STUDIO_API_KEY=AIzaSy...
export OPENAI_API_KEY=sk-...
ixfDisplay the status of all configured LLM providers.
Syntax: llm-status
ixf > llm-status
LLM Providers
─────────────────────────────────────
Provider Status
openai not configured
anthropic not configured
gemini configured
deepseek not configured
grok not configured
─────────────────────────────────────
Active: gemini
Run offline LLM-powered SAST analysis on a PLC/RTU source code file or directory.
Syntax: sast <path> [--mode sast|reverse|diff|exploit-gen] [--diff <other_file>]
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| path | string | yes | — | Path to PLC source file or project directory |
--mode |
string | no | sast |
Analysis mode (see below) |
--diff |
string | no | — | Second file for diff mode |
Modes:
| Mode | Description |
|---|---|
sast |
Full vulnerability analysis (setpoints, safety, auth, network, logic) |
reverse |
Reverse engineer binary/compiled PLC firmware |
diff |
Compare two versions of PLC code for unauthorized changes |
exploit-gen |
Generate proof-of-concept exploit based on findings |
ixf > sast /opt/plc_projects/water_treatment/ --mode sast
[*] Analyzing: water_treatment/ (5 files, 245 lines)
[*] Provider: gemini | Sanitized: 2 credentials, 1 public IP
[*] Sending to LLM...
SAST REPORT — water_treatment/
─────────────────────────────────────────────────────────────
FINDING [SEVERITY: CRITICAL]: Unvalidated Chlorine Dosing Setpoint
Location: water_treatment.st, line 48
Description: SP_CHLORINE_HIGH := 4000.0 — 2000x WHO safe limit
Attack Vector: Modbus FC16 write to HR[200] (DOSE_FACTOR)
Physical Impact: 4000 mg/L chlorine — lethal dose for infants
MITRE: T0836 (Modify Parameter), T0880 (Alarm Suppression)
Remediation: Validate DOSE_FACTOR <= 2.0; add hardware interlock
FINDING [SEVERITY: HIGH]: Race Condition in pH Dosing
Location: water_treatment.st, lines 65-71
...
See SAST / LLM Analysis for the full guide.
Execute an arbitrary shell command and display output. Timeout: 30 seconds.
Syntax: exec <command>
ixf > exec ping 192.168.1.1 -c 3
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
...
ixf > exec python tools/env_doctor.py
Previous: Quick Start | Next: Module System