By Jeff Gray — Federal CISA IR Training Lead, Air Force Veteran, 30+ Years OT/ICS Security
Published: June 10, 2026 • Last Updated: June 10, 2026
LOTL attacks leverage existing system tools and native OT protocols (DNP3, Modbus, IEC 60870-5-104, OPC-UA) rather than deploying custom malware. The attacker "lives off the land" using what is already present in the environment.
| Technique | Description | Detection Method |
|---|---|---|
| Legitimate engineering tools used maliciously | Attackers use official vendor software to program PLCs | Zeek protocol parsing + access control lists |
| Abuse of maintenance accounts | Stolen credentials for authorized OT tools | Behavioral anomaly detection on account activity |
| Protocol manipulation | Modified DNP3/Modbus commands using standard protocol | Deep protocol parsing with Zeek DNP3/Modbus modules |
| Supply chain implants | Backdoored engineering software or firmware updates | Integrity monitoring + hash verification |
| Log File | What It Detects | Alert Trigger |
|---|---|---|
dnp3.log | Unauthorized DNP3 command writes | Function code 21 (Direct Operate) from unknown IP |
modbus.log | Malicious Modbus coil/register writes | Function code 5/15/6/16 from non-master device |
conn.log | Unexpected connections to OT assets | New source IP communicating with PLC/RTU ranges |
http.log | Web-based HMI/admin access | Access to engineering web interfaces from unauthorized hosts |
Before detecting anomalies, you must know what normal looks like. Run Zeek passively for at least two weeks to capture normal polling intervals, typical command sequences, and authorized IP addresses.
Coordinate with operations to identify all scheduled maintenance, firmware updates, and engineering work. Any activity outside these windows should be treated as suspicious.
# Monitor Zeek dnp3.log for Direct Operate (FC=21) commands from non-master IPs
if (dnp3_fc == 21 && src_ip not in authorized_masters) {
alert("CRITICAL: Unauthorized DNP3 Direct Operate from " + src_ip);
}
# Function codes 5 (Write Single Coil), 15 (Write Multiple Coils),
# 6 (Write Single Register), 16 (Write Multiple Registers)
if (modbus_fc in [5,6,15,16] && not maintenance_window) {
alert("HIGH: Modbus write function outside maintenance window");
}
# Check conn.log for new source addresses talking to known PLC ranges
if (new_connection_to_plc_range && src_ip not in whitelist) {
alert("MEDIUM: New IP " + src_ip + " communicating with OT asset " + dst_ip);
}
The LOT-Squatch passive AI agent automates much of this analysis by:
Download the OT Risk Management Guide v2.0 (Quantitative FAIR-based OT risk calculator, $24.99 — includes LOTL detection templates and checklists).
© 2026 Cyborama LLC • This playbook is updated monthly. Last reviewed: June 2026.