-
Notifications
You must be signed in to change notification settings - Fork 1
Troubleshooting
Common issues and solutions for IndustrialXPL-Forge.
Symptom: pip reports build error or dependency conflict.
Solution:
# Upgrade pip first
python -m pip install --upgrade pip
# Install with verbose output to see exact error
pip install industrialxpl-forge -v
# If scapy fails on Windows, install Npcap first
# https://npcap.com/
# Python version check
python --version # must be 3.9+Symptom: ixf: command not found or 'ixf' is not recognized
Diagnosis:
# Check if entry point installed
pip show industrialxpl-forge | grep -i location
# Find the scripts directory
python -c "import sys; print(sys.prefix + '/Scripts')" # Windows
python -c "import sys; print(sys.prefix + '/bin')" # Linux/macOSSolution:
# Linux/macOS: add to PATH
export PATH="$HOME/.local/bin:$PATH"
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
# Windows: add Scripts folder to PATH in System Environment Variables
# Or use the full path:
python -m industrialxpl
# Or from the repo:
python ixf.pyCause: readline is None on Windows (Unix-only module), and the shell tried to call it.
Fix: Upgrade to v1.0.12+ which guards all readline calls:
pip install --upgrade industrialxpl-forgeIf still failing, manually install pyreadline3:
pip install pyreadline3>=3.4Cause: scapy failed to install (common on Windows without Npcap).
Fix:
# Install Npcap first (Windows): https://npcap.com/
# Then:
pip install scapy
# On Linux if libpcap missing:
sudo apt install libpcap-dev # Debian/Ubuntu
sudo dnf install libpcap-devel # Fedora/RHEL
pip install scapyCause: pysnmp not installed or wrong version.
Fix:
pip install "pysnmp>=6.1"
# Note: pysnmp v4.x is incompatible with Python 3.12+Symptom:
RequestsDependencyWarning: urllib3 (2.6.3) or chardet doesn't match a supported version!
Fix:
pip install "requests>=2.31.0,<3.0" "urllib3>=1.26.0,<3.0"Symptom:
[*] Indexing modules…
[+] 0 modules indexed.
Diagnosis:
python -c "
from industrialxpl.core.exploit.utils import index_modules, MODULES_DIR
print('MODULES_DIR:', MODULES_DIR)
print('Exists:', MODULES_DIR.exists())
mods = index_modules()
print('Count:', len(mods))
"Fix:
# Reinstall package
pip install --force-reinstall industrialxpl-forge
# Or install from source
git clone https://github.com/mrhenrike/IndustrialXPL-Forge.git
cd IndustrialXPL-Forge
pip install -e .Symptom:
ixf > use cve/siemens/cve_2021_22681_s7_1200_hardcoded_key
[-] Error loading module: ...
Diagnosis:
python -c "
from industrialxpl.core.exploit.utils import import_exploit
obj = import_exploit('industrialxpl.modules.cve.siemens.cve_2021_22681_s7_1200_hardcoded_key')
print('OK:', obj)
"Common causes:
- Syntax error in module file — check the file for syntax issues
- Missing dependency — the module may require an optional package
- Wrong Python version — some modules use f-strings or walrus operator
Symptom: check shows NOT VULNERABLE even when target should respond.
Diagnosis:
# Test raw connectivity
python -c "
import socket
s = socket.socket()
s.settimeout(5)
try:
s.connect(('192.168.1.100', 502))
print('Port open')
s.close()
except Exception as e:
print('Failed:', e)
"Common causes:
- Firewall blocking the port
- Wrong port number — use
show optionsand verify - Module probe rejected by device — some devices only respond to specific unit IDs
- Network routing issue — can you ping the target?
Cause: Module's run() doesn't call DestructiveGate.print_simulation().
This may be a module bug. Check the module source:
cat industrialxpl/modules/cve/vendor/module_name.py | grep "print_simulation"If missing, the module only implements live mode. File an issue on GitHub.
Windows: Requires pyreadline3. Install if missing:
pip install pyreadline3Linux/macOS: readline should be built-in. If not:
pip install readline # macOS
sudo apt install python3-readline # Debian/UbuntuSymptom: Up-arrow doesn't show previous session commands.
Cause: ~/.ixf_history file not being written (permission issue or readline not available).
Fix:
# Check if file exists
ls -la ~/.ixf_history
# Check write permissions
touch ~/.ixf_historySymptom: Output shows \x1b[32m[+]\x1b[0m instead of colored text.
Fix: Use Windows Terminal or PowerShell 7:
# Install Windows Terminal from Microsoft Store
# Or use PowerShell 7+: https://github.com/PowerShell/PowerShell
# Alternative: disable colors (workaround)
$env:NO_COLOR = "1"
ixfFix:
sudo python tools/nse_install.py --install
# or
sudo ixf
# then: nse installFix: Run terminal as Administrator:
- Right-click PowerShell → Run as Administrator
- Then run
ixfandnse install
Symptom: nse status shows "Nmap NOT installed" but nmap works in terminal.
Cause: nmap not in PATH for the Python process.
Diagnosis:
import shutil
print(shutil.which("nmap")) # Should show path or NoneFix (Linux/macOS):
which nmap # Find nmap path
# Add to PATH if needed
export PATH="/usr/bin:$PATH"Fix (Windows):
where.exe nmap # Find nmap path
# Add Nmap folder to PATH in System Environment VariablesRun nmap --script-updatedb to refresh the script database:
nmap --script-updatedb
# Or use IXF (it runs this automatically after install)
ixf > nse installixf > sast /path/to/plc/ --mode sast
[-] No LLM API key configured
Fix:
export OPENAI_API_KEY=sk-...
export GOOGLE_AI_STUDIO_API_KEY=AIzaSy...
ixfOr inside IXF:
ixf > llm-key gemini AIzaSyBGaoio...
Rate limit exceeded. Wait a few seconds and retry:
ixf > sast /path/to/plc/ --mode sast
Or switch to a different provider:
ixf > llm-key openai sk-...
Symptom: Analysis cuts off mid-sentence.
Cause: Default max_tokens limit.
Workaround: Use a provider with higher token limits (GPT-4o: 128K context, Claude 3.5: 200K).
Cause: Large number of modules (1190+) being indexed.
Workaround: Indexing is cached in memory for the session. Subsequent operations are fast.
Improvement: Use non-interactive mode for single commands:
ixf stats # faster than interactive start + statsCauses:
- Large CIDR range — use
--rate-limitto control pace - High timeout — reduce with
set timeout 3 - Many modules per technique — use
ttp-checkfor faster check-only mode
ixf > ttp T0843 192.168.1.0/24 --rate-limit 100
ixf > set timeout 3
ixf > ttp-check T0843 192.168.1.0/24
- Check this troubleshooting guide
- Run
python tools/env_doctor.pyfor environment diagnostics - Search GitHub Issues: https://github.com/mrhenrike/IndustrialXPL-Forge/issues
- Open a new issue with:
- IXF version:
ixf stats - Python version:
python --version - OS:
uname -a(Linux/macOS) orwinver(Windows) - Full error output
- IXF version:
Back to Index