-
Notifications
You must be signed in to change notification settings - Fork 1
Lab Setup
IXF includes a Docker-based ICS/OT laboratory generator that deploys safe, isolated honeypot targets for testing modules without risk to real infrastructure.
- Quick Start
- Components
- Lab Setup Module
- Manual Docker Compose
- Lab Exercises
- Connecting IXF to the Lab
# Generate lab files and start
ixf > use assessment/lab_environment_setup
ixf (ICSLab) > set INCLUDE_CONPOT true
ixf (ICSLab) > set INCLUDE_FUXA true
ixf (ICSLab) > set OUTPUT_DIR /tmp/ics_lab
ixf (ICSLab) > run
[+] ICS/OT lab files generated in: /tmp/ics_lab
docker-compose.yml Docker services definition
setup.sh Automated setup script
LAB_NOTES.md Lab exercises guide
[*] Start: cd /tmp/ics_lab && bash setup.sh
[*] Stop: docker compose downcd /tmp/ics_lab && bash setup.sh
[*] Pulling Docker images...
[*] Starting Conpot (172.20.0.10)...
[*] Starting FUXA SCADA (172.20.0.20)...
[+] Lab ready.
Conpot Modbus: 172.20.0.10:502
Conpot S7comm: 172.20.0.10:102
Conpot HTTP: http://172.20.0.10
FUXA HMI: http://localhost:1881Conpot is a low-interaction ICS honeypot that simulates industrial devices.
- Modbus TCP: port 502 - accepts read/write requests, simulates holding registers and coils
- S7comm: port 102 - simulates a Siemens S7-200 PLC
- HTTP: port 80 - serves a Siemens-style web interface
- SNMP: port 161 - responds with industrial device OID values
- BACnet: port 47808 - simulates a BACnet controller
Safe target for: ransomware modules, write exploits, scanner modules, MiTM proxy, PCAP capture.
Limitations: Conpot returns static responses - it does not simulate real process effects. The register values do not change based on physical state.
FUXA is an open-source SCADA/HMI web application.
- Web HMI: http://localhost:1881
- Supports Modbus TCP, S7, OPC UA data sources
- Renders process displays and trends
- Can connect to Conpot as its Modbus data source
Useful for: testing HMI-layer attacks, SCADA web vulnerabilities, CVE-2026-25895 (FUXA RCE).
Path: assessment/lab_environment_setup
ixf > use assessment/lab_environment_setup
ixf (ICSLab) > show options
Name Value Description
INCLUDE_CONPOT true Deploy Conpot ICS honeypot
INCLUDE_FUXA true Deploy FUXA SCADA/HMI
INCLUDE_OPENPLC false Deploy OpenPLC Runtime (optional)
NETWORK_SUBNET 172.20.0.0/24 Lab network subnet
CONPOT_IP 172.20.0.10 Conpot container IP
FUXA_IP 172.20.0.20 FUXA container IP
OUTPUT_DIR /tmp/ics_lab Output directory for generated filesixf (ICSLab) > set INCLUDE_OPENPLC true
ixf (ICSLab) > run
[+] Additional component: OpenPLC Runtime
OpenPLC Modbus: 172.20.0.30:502
OpenPLC WebIDE: http://localhost:8080
Default login: openplc / openplc
[*] OpenPLC executes real PLC ladder logic (IEC 61131-3)
[*] Registers change based on the loaded programIf you prefer to build the lab manually:
# docker-compose.yml
version: '3.8'
networks:
ics_lab:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
services:
conpot:
image: mushorg/conpot:latest
networks:
ics_lab:
ipv4_address: 172.20.0.10
ports:
- "80:80"
- "502:502"
- "102:102"
restart: unless-stopped
fuxa:
image: frangoteam/fuxa:latest
networks:
ics_lab:
ipv4_address: 172.20.0.20
ports:
- "1881:1881"
restart: unless-stoppeddocker compose up -d
docker compose ps # verify all containers running
docker compose down # stop and remove containers# Scan the Conpot honeypot
ixf > use scanners/ics/modbus_detect
ixf (ModbusDetect) > set TARGET 172.20.0.10
ixf (ModbusDetect) > check
# Expected: Siemens S7-200 device identification from Conpotixf > use assessment/protocols/modbus_read_holding
ixf (ModbusRead) > set TARGET 172.20.0.10
ixf (ModbusRead) > set COUNT 50
ixf (ModbusRead) > run
# Read 50 registers and understand the register mapixf > use exploits/ransomware/plc_project_locker
ixf (PLCProjectLocker) > set TARGET 172.20.0.10
ixf (PLCProjectLocker) > run
# Review what a real attack would do - in simulate mode only# Start capture in background
Start-Process -NoNewWindow tcpdump -ArgumentList "-i", "any", "-w", "/tmp/lab_session.pcap", "'tcp port 502'"
# Run several modules against Conpot (simulate mode)
ixf > use scanners/ics/modbus_unit_scan
ixf (ModbusUnitScan) > set TARGET 172.20.0.10
ixf (ModbusUnitScan) > run
# Analyze results
ixf > use assessment/detection/modbus_pcap_analyzer
ixf (ModbusPCAP) > set PCAP_FILE /tmp/lab_session.pcap
ixf (ModbusPCAP) > run# Generate Suricata rules
ixf > use assessment/detection/suricata_ot_rules_generator
ixf (SuricataOT) > set OUTPUT_FILE /tmp/ics_rules.rules
ixf (SuricataOT) > run
# Test rules against the captured session
suricata -r /tmp/lab_session.pcap -S /tmp/ics_rules.rules -l /tmp/suricata_out/
cat /tmp/suricata_out/fast.logSet the default lab target before starting a session:
# All modules will default to Conpot
ixf > setg TARGET 172.20.0.10
ixf > setg PORT 502
# Now use any Modbus module without re-entering target
ixf > use scanners/ics/modbus_detect
ixf (ModbusDetect) > check # uses 172.20.0.10:502 from globalAfter working with the lab, use the Conpot detection module to verify the honeypot fingerprint:
ixf > use assessment/detection/conpot_integration
ixf (ConpotDetect) > set TARGET 172.20.0.10
ixf (ConpotDetect) > run
[*] Scanning 172.20.0.10 for Conpot honeypot indicators
[*] Modbus FC43: vendor=Siemens, model=S7-200 [GENERIC - SUSPECT]
[*] HTTP /index.html: default Conpot template detected [CONFIRMED]
[!] VERDICT: High confidence Conpot honeypot (2/3 indicators)This module is useful in real assessments to identify whether a target is a honeypot before running live exploits.
Author: Andre Henrique (@mrhenrike) | Uniao Geek | https://uniaogeek.com.br/