Iran-linked threat actors forced a UK power plant offline for four days, causing real-world operational disruption and exposing how fragile Britain's distributed energy infrastructure remains against repeatable, state-aligned intrusion campaigns.
Introduction
This is not a theoretical exercise anymore. According to reporting from SecurityWeek, an Iran-linked hacking group successfully disrupted operations at a UK power generation facility for four consecutive days — a duration that tells you the attackers didn't just trip an alarm; they achieved sufficient depth in the operational technology (OT) environment that recovery required days of engineering effort, not a simple reboot.
Three things should concern every defender reading this. First, the target profile: distributed energy resources — smaller, decentralized generation sites — typically have thinner security staffing, flatter networks, and more remote vendor access paths than large centralized plants. Second, the actor profile: Iran-linked groups such as CyberAv3ngers and affiliated personas have a documented track record of targeting internet-exposed programmable logic controllers (PLCs) and human-machine interfaces (HMIs) across water, energy, and industrial sectors in the US, UK, Israel, and Europe. Their tradecraft favors opportunistic exploitation of exposed OT devices, default credentials, and unpatched remote access infrastructure rather than bespoke zero-days. Third, the implication in the reporting itself: this attack is repeatable. If the underlying exposure class isn't remediated across the estate, the same playbook works against the next site.
If you operate, monitor, or advise any organization with generation, transmission, or industrial control assets, this incident is your forcing function. Below is a practitioner-level breakdown of how these intrusions typically unfold, what you should be hunting for today, and how to harden the environment so a four-day outage doesn't become your postmortem.
Technical Analysis
Why distributed energy infrastructure is the soft target
The UK's energy transition has shifted meaningful generation capacity into distributed sites — wind, solar, gas peaking plants, battery storage, and aggregated small-scale generation. From a security architecture standpoint, these sites share common weaknesses:
- Internet-reachable OT components. PLCs, remote terminal units (RTUs), and HMIs exposed directly or through poorly segmented remote access gateways. Iran-linked actors have repeatedly exploited exposed Unitronics and similar PLCs in prior campaigns.
- Default or weak credentials on control equipment. Engineering workstations and controllers shipped with vendor defaults that never get rotated.
- Flat network architecture. IT and OT networks with insufficient segmentation, allowing pivot from a compromised corporate asset into the control environment.
- Third-party remote access. Vendor maintenance tunnels (TeamViewer, AnyDesk, RDP gateways, cellular modems) that bypass enterprise monitoring entirely.
- Minimal OT visibility. No passive network monitoring of industrial protocols, meaning unauthorized commands to controllers generate zero alerts.
Typical attack chain for Iran-linked OT intrusions
Based on the documented tradecraft of Iran-nexus groups targeting industrial environments, the kill chain defenders should model looks like this:
- Reconnaissance (MITRE ATT&CK for ICS T0846/T0842): Scanning for internet-exposed ICS ports — Modbus/TCP 502, DNP3 20000, S7comm 102, EtherNet/IP 44818, OPC UA 4840 — and web-facing HMI panels via Shodan/Censys-style enumeration.
- Initial access (T0866/T0819): Exploitation of exposed remote services, default credentials on PLCs/HMIs, or compromise of the IT environment followed by pivot through weak segmentation.
- Persistence and discovery (T0859/T0840): Deployment of commodity remote access tools on OT DMZ jump hosts; enumeration of engineering workstations, historian databases, and control logic.
- Impact (T0831/T0828/T0816): Manipulation of control logic, issuance of unauthorized commands to stop generation processes, tampering with safety or alarm thresholds, or destructive actions against Windows-based HMI/engineering hosts that force a manual, safety-verified restoration — which is precisely why outages measured in days occur even when physical equipment is undamaged.
A four-day shutdown strongly suggests the operators could not simply trust the integrity of their control systems post-intrusion. Once an attacker has had write access to PLCs or engineering workstations, every logic block, setpoint, and safety parameter must be validated before restart. That validation — not the attack itself — consumes the outage window.
Exploitation status
This incident is confirmed, real-world operational disruption — not a proof of concept. No specific CVE has been disclosed in connection with this attack, and defenders should note that Iran-linked OT campaigns frequently require no vulnerability at all: exposed services and default credentials are sufficient. That makes this fundamentally an architecture and visibility problem, not a patch-management problem.
Detection & Response
The detections below target the behaviors that recur across Iran-linked OT intrusions: commodity RAT deployment on OT-adjacent Windows hosts, unauthorized ICS protocol traffic, and tampering with control-system services. Tune thresholds to your baseline — OT environments are quiet by nature, which works in the defender's favor.
---
title: Remote Access Tool Execution on OT Zone Windows Hosts
id: 9f2c4b18-3e7a-4d91-b6f5-8a1c2e3d4f5a
status: experimental
description: Detects execution of common commodity remote access tools on Windows hosts in OT/DMZ segments, consistent with Iran-linked intrusions that deploy RMM tooling for persistence on HMI, engineering workstation, or jump host systems.
references:
- https://attack.mitre.org/techniques/T1219/
- https://www.securityweek.com/iran-linked-hackers-shut-down-uk-power-plant-for-four-days/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.command_and_control
- attack.t1219
logsource:
category: process_creation
product: windows
detection:
selection_image:
Image|endswith:
- '\teamviewer.exe'
- '\teamviewer_service.exe'
- '\anydesk.exe'
- '\screenconnect.exe'
- '\connectwisecontrol.exe'
- '\radmin.exe'
- '\ammyy.exe'
- '\ngrok.exe'
- '\chisel.exe'
- '\rustdesk.exe'
filter_approved_paths:
Image|startswith:
- 'C:\Program Files\ApprovedVendorRemote\'
condition: selection_image and not 1 of filter_approved_paths
falsepositives:
- Approved vendor maintenance sessions — maintain an explicit allowlist of RMM tools authorized for OT support and alert on everything else
level: high
---
title: Stop or Disable of SCADA / HMI / Historian Services
id: 4b8d1e62-7c3f-4a25-9d18-2f6b5c8a9e01
status: experimental
description: Detects attempts to stop, disable, or delete services associated with SCADA, HMI, or historian software on Windows hosts — a common precursor to operational disruption and a frequent step before an attacker manipulates or replaces control logic.
references:
- https://attack.mitre.org/techniques/T1489/
- https://attack.mitre.org/techniques/T1562/001/
- https://www.securityweek.com/iran-linked-hackers-shut-down-uk-power-plant-for-four-days/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.impact
- attack.t1489
- attack.t1562.001
logsource:
category: process_creation
product: windows
detection:
selection_cmd:
CommandLine|contains:
- 'sc stop'
- 'sc config'
- 'sc delete'
- 'net stop'
- 'Stop-Service'
- 'Set-Service'
- 'Disable-Service'
selection_target:
CommandLine|contains:
- 'AVEVA'
- 'Wonderware'
- 'InTouch'
- 'Citect'
- 'ClearSCADA'
- 'Ignition'
- 'iFIX'
- 'Proficy'
- 'WinCC'
- 'PCS7'
- 'FactoryTalk'
- 'Historian'
- 'OPC'
- 'KEPServer'
condition: all of selection_*
falsepositives:
- Scheduled maintenance windows — correlate against change tickets; suppress only for approved engineering accounts during defined windows
level: critical
---
title: PLC / Engineering Software Launched by Non-Engineering Process or User Context
id: 7d3e9a41-5b28-4c76-a1f3-6e8d2c4b7f09
status: experimental
description: Detects execution of PLC programming / engineering software (used to read, modify, or download control logic) from unexpected parent processes or user accounts. Unauthorized logic modification is the core objective in disruptive OT intrusions.
references:
- https://attack.mitre.org/techniques/T0855/
- https://attack.mitre.org/techniques/T0839/
- https://www.securityweek.com/iran-linked-hackers-shut-down-uk-power-plant-for-four-days/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.ics
- attack.t0855
- attack.t0839
logsource:
category: process_creation
product: windows
detection:
selection_image:
Image|endswith:
- '\tia_portal.exe'
- '\portal.exe'
- '\step7.exe'
- '\unity_pro.exe'
- '\control_expert.exe'
- '\rslogix5000.exe'
- '\studio5000.exe'
- '\cx-programmer.exe'
- '\gx_works.exe'
- '\visilogic.exe'
selection_suspicious_parent:
ParentImage|endswith:
- '\cmd.exe'
- '\powershell.exe'
- '\wscript.exe'
- '\cscript.exe'
- '\explorer.exe'
- '\winword.exe'
- '\excel.exe'
- '\rundll32.exe'
- '\mshta.exe'
condition: selection_image and selection_suspicious_parent
falsepositives:
- Rare; engineering tools launched from scripts during automated builds — baseline and allowlist explicitly
level: critical
// Hunt: Unauthorized industrial protocol traffic crossing zones
// Ingest OT firewall / sensor logs into Sentinel via CEF/Syslog (CommonSecurityLog)
// Flag ICS protocol sessions sourced from IT subnets, the internet, or jump hosts outside approved maintenance windows
let ApprovedJumpHosts = dynamic(["10.20.30.11", "10.20.30.12"]); // <-- replace with your approved OT jump host IPs
let ICSPorts = dynamic([502, 102, 20000, 44818, 4840, 789, 1911, 9600]); // Modbus, S7comm, DNP3, EtherNet/IP, OPC UA, Redlion Crimson, Niagara Fox, Omron FINS
CommonSecurityLog
| where TimeGenerated > ago(7d)
| where DestinationPort in (ICSPorts)
| where not (SourceIP in (ApprovedJumpHosts))
| extend SourceZone = iff(SourceIP startswith "10.40.", "OT_Internal", iff(SourceIP startswith "10.10.", "IT_Corporate", "External_or_Unknown")) // <-- adjust subnets to your architecture
| where SourceZone != "OT_Internal"
| summarize SessionCount = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated), Destinations = make_set(DestinationIP, 25), Ports = make_set(DestinationPort, 10) by SourceIP, SourceZone, DeviceAction
| order by SessionCount desc;
// Hunt: ICS write/command function codes observed on Modbus from rare sources
// Modbus FC 5/6/15/16 (write coils/registers) and FC 8 diagnostics are the disruptive subset
CommonSecurityLog
| where TimeGenerated > ago(7d)
| where DestinationPort == 502
| where Message has_any ("0x05", "0x06", "0x0F", "0x10", "function code 5", "function code 6", "function code 15", "function code 16", "write_coil", "write_register")
| summarize WriteCmdCount = count(), Targets = make_set(DestinationIP, 25) by SourceIP, bin(TimeGenerated, 1h)
| order by WriteCmdCount desc;
// Hunt: New or unexpected process execution on hosts tagged as OT-adjacent (HMI, EWS, historian)
DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where DeviceName has_any ("HMI", "EWS", "ENG-WS", "HIST", "SCADA", "OT-") // <-- align to your naming convention
| where FileName in~ ("powershell.exe", "cmd.exe", "wscript.exe", "cscript.exe", "rundll32.exe", "mshta.exe", "bitsadmin.exe", "certutil.exe", "psexec.exe", "anydesk.exe", "teamviewer.exe", "ngrok.exe", "chisel.exe", "rustdesk.exe")
| project TimeGenerated, DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine, SHA256
| order by TimeGenerated desc;
-- Velociraptor hunt: OT DMZ jump host integrity sweep
-- Run against Windows jump hosts, engineering workstations, and HMI servers.
-- Surfaces persistence artifacts, unauthorized RMM tooling, and unexpected network listeners in one pass.
-- Part 1: Unsigned or anomalous processes with outbound command lines
SELECT Pid, Name, Exe, CommandLine, Username, CreateTime
FROM pslist()
WHERE CommandLine =~ '(?i)(anydesk|teamviewer|screenconnect|rustdesk|ngrok|chisel|frpc|plink|-e powershell|encodedcommand|downloadstring|iex)'
OR Exe =~ '(?i)(appdata|programdata|temp|users\\\\public)\\\\.*\\.exe$'
-- Part 2: Run-key and service persistence referencing non-standard paths
SELECT Name, FullPath AS KeyPath, { SELECT * FROM parse_json(data=to_dict(item=Data)) } AS Values
FROM glob(globs='HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Run/*',
accessor='registry')
WHERE Name =~ '(?i)update|service|agent|helper'
-- Part 3: Listening sockets owned by unexpected binaries (catch reverse-shell / RAT listeners)
SELECT Pid, Name, ProcessExe AS Exe, Laddr, Lport, Status
FROM netstat()
WHERE Status =~ 'LISTEN'
AND Lport in (22, 3389, 5900, 5938, 6568, 4444, 8443, 8080)
AND NOT ProcessExe =~ '(?i)(svchost|termservice|system32\\\\(sshd|winrm))'
# OT Jump Host / Engineering Workstation Hardening & Verification Script
# Run elevated on Windows hosts in the OT DMZ. Read-only audit + optional -Remediate switch.
# Purpose: verify no unauthorized RMM tooling, no exposed ICS listeners, no rogue admin accounts.
param([switch]$Remediate)
$report = @{ Host = $env:COMPUTERNAME; Time = (Get-Date).ToString('s'); Findings = @() }
# 1) Audit for unauthorized remote access tooling
$ratNames = 'anydesk','teamviewer','screenconnect','rustdesk','ngrok','chisel','frpc','radmin','ammyy'
$procs = Get-Process | Where-Object { $ratNames -contains $_.ProcessName.ToLower() }
if ($procs) {
$report.Findings += "RMM_RUNNING: $(($procs | Select-Object -Expand ProcessName) -join ',')"
if ($Remediate) { $procs | Stop-Process -Force }
}
$ratServices = Get-CimInstance Win32_Service | Where-Object {
$n=$_.Name.ToLower(); $p=($_.PathName ?? '').ToLower();
($ratNames | Where-Object { $n -like "*$_*" -or $p -like "*$_*" })
}
if ($ratServices) {
$report.Findings += "RMM_SERVICE: $(($ratServices | Select-Object -Expand Name) -join ',')"
if ($Remediate) { $ratServices | ForEach-Object { Stop-Service $_.Name -Force; Set-Service $_.Name -StartupType Disabled } }
}
# 2) Verify no ICS protocol ports listening on Windows hosts (they should live on PLCs, not servers)
$icsPorts = 502,102,20000,44818,4840,789,1911,9600
$listeners = Get-NetTCPConnection -State Listen -ErrorAction SilentlyContinue | Where-Object { $icsPorts -contains $_.LocalPort }
foreach ($l in $listeners) {
$own = (Get-Process -Id $l.OwningProcess -ErrorAction SilentlyContinue).ProcessName
$report.Findings += "ICS_LISTENER: port $($l.LocalPort) owned by $own (PID $($l.OwningProcess))"
}
# 3) Audit local administrators for unauthorized additions
$expected = @('Administrator','DOMAIN\OT-Admins','DOMAIN\SVC-OTMonitoring') # <-- replace with approved list
$actual = Get-LocalGroupMember -Group 'Administrators' -ErrorAction SilentlyContinue | Select-Object -Expand Name
$rogue = $actual | Where-Object { $_ -notin $expected }
if ($rogue) { $report.Findings += "ROGUE_ADMIN: $($rogue -join ',')" }
# 4) Confirm Windows Firewall blocks inbound ICS ports from non-OT subnets
$fw = Get-NetFirewallRule -Direction Inbound -Action Allow -Enabled True -ErrorAction SilentlyContinue |
Get-NetFirewallPortFilter -ErrorAction SilentlyContinue |
Where-Object { $_.LocalPort -in $icsPorts }
if ($fw) { $report.Findings += "FIREWALL_GAP: inbound allow rule exists on ICS ports — review immediately" }
# 5) Verify LSA/SMB hardening posture relevant to lateral movement into OT
$lsa = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name RunAsPPL -ErrorAction SilentlyContinue).RunAsPPL
if ($lsa -ne 1) {
$report.Findings += 'LSA_PPL_DISABLED'
if ($Remediate) { Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name RunAsPPL -Value 1 }
}
$report | ConvertTo-Json -Depth 4
# Baseline this output per host. ANY delta in findings on an OT jump host is an investigation trigger.
Remediation
No patch closes this gap — the fix is architectural and operational. Prioritize in this order:
-
Eliminate direct internet exposure of OT assets — this week. Scan your external footprint (and your subsidiaries' and integrators') for ICS ports 502, 102, 20000, 44818, 4840 and web-facing HMI/PLC panels. Use your own Shodan/Censys queries against your ASN and IP ranges. Anything reachable that shouldn't be gets pulled behind a VPN-and-jump-host architecture with MFA today. Iran-linked actors find these via public scan data within hours of exposure.
-
Enforce concentric segmentation per IEC 62443 zones and conduits. Control networks must not be reachable from corporate IT except through a monitored OT DMZ with brokered access (jump host, session recording, time-bounded vendor access). Deny-by-default firewall policy between zones; permit only the specific protocol/port pairs operations require.
-
Rotate every credential in the OT environment — assume compromise. PLC passwords, HMI service accounts, historian databases, remote access gateways, cellular modem admin interfaces. Default vendor credentials on control equipment are the single most exploited condition in these campaigns. Where devices can't support strong auth, isolate them behind an access-enforcing conduit.
-
Deploy passive OT network monitoring. You cannot detect unauthorized control commands with IT tooling alone. Deploy passive ICS-aware monitoring (protocol dissection of Modbus/DNP3/S7/EtherNet-IP function codes) at the control-zone aggregation point. Alert on write function codes from any source outside the approved engineering workstation list.
-
Lock down engineering workstations and HMI servers. Application allowlisting, no internet access, USB control, LSA protection, and removal of all tooling not required for operations. These hosts are the blast-radius multiplier — protect them like domain controllers.
-
Build and rehearse an OT-specific incident response plan. A four-day outage happens when restoration requires validating every logic block and setpoint under adversarial uncertainty. Maintain offline, integrity-verified backups of PLC logic, HMI configurations, and historian data. Rehearse manual-operation procedures — can you run the plant safely with the SCADA system untrusted? Align the plan to NIST SP 800-82r3 and CISA's Cross-Sector Cybersecurity Performance Goals.
-
Engage government coordination channels now, not during the incident. UK operators should connect with the NCSC and their sector ISAC; US and allied operators should review CISA's joint advisories on Iranian state-sponsored cyber actors targeting critical infrastructure (including the joint advisory on Iranian actors exploiting PLC/HMI exposures) and the CISA Known Exploited Vulnerabilities catalog for any edge devices in your remote access path. Report suspected intrusions early — attribution and campaign linkage depend on shared telemetry.
-
Pressure-test with a scoped OT assessment. Have a qualified red team emulate this exact scenario: external recon → exposed remote access → pivot to OT DMZ → control logic access. If your detection stack can't catch the Sigma and KQL behaviors above in a controlled exercise, it won't catch them during the real thing.
The strategic lesson from this incident is that adversaries have moved from proving they can disrupt power generation to demonstrating they can do it repeatedly, at a tempo and duration that matters operationally. Distributed energy operators are now front-line critical infrastructure. Defend accordingly.
Related Resources
Security Arsenal Red Team Services AlertMonitor Platform Book a SOC Assessment pen-testing Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.