第1页
Exploit
PLC
on
the
internet
Z-‐0ne
第2页
什么是PLC 为什么会联网
概述
第3页
PLC
• Programmable
Logic
Controller
– 电源 – CPU – 存储 – I/O – 网络模块
第4页
• PLC功能
– 顺序控制 – 逻辑控制
PLC功能
• PLC应用
– 自动化控制 – 过程控制
第5页
• PLC内核
– Codesys – ProConos
• 底层操作系统
– Linux – Vxworks – WinCE
• 通信协议
– 通用
• Modbus
– 私有
• S7 • Omron
F INS
其他
第6页
• 串行
– RS232/485
• 专用
– MPI
• 以太网
– TCP/IP – UDP
PLC通信
第7页
网络武器的目标
• Stuxnet作为网络武器其最终的目标也是西 门子PLC
– 劫持通信 – 注入自己的逻辑程序
第8页
联网的隐患(1)
• PLC暴露在互联网是比SCADA更大的安全隐 患
– 未授权访问 – 设备的用户等级保护缺失 – 通信协议的脆弱性
第9页
联网的隐患(2)
• PLC暴露在互联网是比SCADA更大的安全隐 患
– 控制流程工艺 – 位于更底层
ERP
信息层
– 可能为关键基础设施
APPLICATION MES应用
管理层
控制层
P L
P L
P L
P L
设备层
第10页
联网的趋势
• 远程数据通信/远程维护催生了联网的需求
– 方便、快捷 – 减少了现场运维的成本 – 统一管理
第11页
联网的解决方案(1)
第12页
联网的解决方案(2)
第13页
联网的解决方案(2)
第14页
西门子PLC全球统计报告 西门子PLC公网蜜罐统计 西门子S7协议 蜜罐应用案例 联网的风险案例
PLC
ON
THE
INTERNET
第15页
S7-‐1200硬件形态
第16页
S7-‐300硬件形态
第17页
西门子PLC
CPU模块全球统计报告(1)
• 使用S7协议(TCP/102)对互联网进行扫描探测
– http://www.zoomeye.org/search?q=port%3A102 – https://www.shodan.io/search?query=Module+po
rt%3A102
• 全球数据 (能成功读出模块型号的数据)
– ZoomEye à 1446
– Shodan à 2749 – Plcscan.org
à 2215
第18页
西门子PLC
CPU模块全球统计报告(2)
• 使用S7协议(TCP/102)对互联网进行扫描探测
– Nmap à s7-‐enumerate.nse(TSAP:0102) – PG
mode – Rack:0
Slot:2
第19页
西门子PLC
CPU模块全球统计报告(3)
• 国家排行
– 德国 350 – 意大利 255 – 美国 179 – 西班牙 146 – 土耳其 124 – 波兰 113 – 法国 108 – 捷克 74 – 丹麦 67 – 奥地利 64
第20页
西门子PLC
CPU模块全球统计报告(4)
• 模块货号排行
– 6ES7
214-‐1AG31-‐0XB0 – 6ES7
214-‐1AE30-‐0XB0 – 6ES7
212-‐1HE31-‐0XB0 – 6ES7
315-‐2AG10-‐0AB0 – 6ES7
151-‐8AB01-‐0AB0 – 6ES7
315-‐2EH14-‐0AB0 – 6ES7
315-‐2AH14-‐0AB0 – 6ES7
214-‐1BG31-‐0XB0 – 6ES7
314-‐6EH04-‐0AB0 – 6ES7
313-‐5BF03-‐0AB0
145 142 129 129 121 120 88 74 74 73
第21页
西门子PLC
CPU模块全球统计报告(5)
• 固件版本排行
– Version:
3 .0.2 – Version:
2 .2.0 – Version:
2 .6.0 – Version:
4 .0.0 – Version:
2 .6.11 – Version:
3 .2.10 – Version:
3 .2.6 – Version:
3 .3.8 – Version:
3 .2.3 – Version:
3 .2.8
472 142 113 96 76 76 69 59 59 55
第22页
西门子PLC
CP模块全球统计报告(1)
• 使用S7协议(TCP/102)对互联网进行扫描探测
– Nmap à s7-‐enumerate.nse(TSAP:0100) – Rack:0
Slot:0
• 全球数据(能成功读出模块型号的数据)
– Plcscan.org
à 486
第23页
西门子PLC
CP模块全球统计报告(2)
• 使用S7协议(TCP/102)对互联网进行扫描探测
– Nmap à s7-‐enumerate.nse(TSAP:0100) – PG
mode – Rack:0
Slot:0
第24页
西门子PLC
CP模块全球统计报告(3)
• 国家排行
– 意大利 91 – 德国 76 – 西班牙 32 – 法国 29 – 瑞士 26 – 捷克 25 – 丹麦 23 – 美国 18 – 波兰 14 – 中国 14
第25页
西门子PLC
CP模块全球统计报告(4)
• 模块货号排行
– 6GK7
343-‐1CX10-‐0XE0 – 6GK7
343-‐1EX30-‐0XE0 – 6GK7
343-‐1CX00-‐0XE0 – 6GK7
343-‐1EX11-‐0XE0 – 6GK7
443-‐1EX20-‐0XE0 – 6GK7
443-‐1EX11-‐0XE0 – 6GK7
343-‐1EX21-‐0XE0 – 6GK7
343-‐1EX20-‐0XE0 – Unknown – 6GK7
343-‐1GX21-‐0XE0
305 70 19 18 16 14 14 13 4 3
第26页
西门子PLC
CP模块全球统计报告(5)
• 固件版本排行
– Version:
3 .0.23 – Version:
2 .3.2 – Version:
2 .0.16 – Version:
2 .6.0 – Version:
2 .1.14 – Version:
2 .2.20 – Version:
1 .1.5 – Version:
2 .5.0 – Version:
1 .2.3 – Version:
1 .0.26
104 79 60 56 31 22 15 14 9 8
第27页
西门子PLC全球分布图形化统计
第28页
西门子PLC
蜜罐统计报告(1)
• Conpot
– 不推荐默认配置 – 特征
• S7(TCP/102)
– Serial
number
of
module:
88111222
• 全球数据
– ZoomEye à 48 – Shodan à 61 – Plcscan.org
à 30
第29页
西门子PLC
蜜罐统计报告(2)
第30页
西门子S7协议 蜜罐应用案例(1)
• 通过监听TCP/102端口并仿真S7协议收集扫 描信息
– 记录连入端口的IP、时间 – 回复伪装的模块信息 – 输出协议操作的详细日志
第31页
西门子S7协议 蜜罐应用案例(2)
2015-‐07-‐09
09:27:20
[71.6.167.142]
C lient
added 2015-‐07-‐09
09:27:20
[71.6.167.142]
T he
client
requires
a
P DU
size
of
480
bytes 2015-‐07-‐09
09:27:20
[71.6.167.142]
C lient
added 2015-‐07-‐09
09:27:21
[71.6.167.142]
T he
client
requires
a
P DU
size
of
480
bytes 2015-‐07-‐09
09:27:21
[71.6.167.142]
R ead
S ZL
request,
ID:0x0011
INDEX:0x0001
-‐-‐>
O K 2015-‐07-‐09
09:27:21
[71.6.167.142]
R ead
S ZL
request,
ID:0x001c
INDEX:0x0001
-‐-‐>
O K 2015-‐07-‐09
09:27:21
[71.6.167.142]
C lient
disconnected
by
peer 2015-‐07-‐09
09:27:25
[71.6.167.142]
C lient
disconnected
by
peer C:\Users\Administrator>nslookup
71.6.167.142 服务器:
google-‐public-‐dns-‐a.google.com Address:
8.8.8.8
名称:
census9.shodan.io Address:
71.6.167.142
第32页
西门子S7协议 蜜罐应用案例(3)
2015-‐05-‐06
19:53:49
[5.61.38.11]
C lient
added 2015-‐05-‐06
19:53:55
[5.61.38.11]
C lient
added 2015-‐05-‐06
19:53:58
[5.61.38.11]
T he
c lient
requires
a
PDU
size
of
480
b ytes 2015-‐05-‐06
19:53:58
[5.61.38.11]
C lient
disconnected
by
peer 2015-‐05-‐06
19:53:59
[5.61.38.11]
R ead
S ZL
request,
ID:0x0011
I NDEX:0x0000
-‐-‐>
OK 2015-‐05-‐06
19:53:59
[5.61.38.11]
R ead
S ZL
request,
ID:0x001c
INDEX:0x0000
-‐-‐>
OK 2015-‐05-‐06
19:54:00
[5.61.38.11]
R ead
S ZL
request,
ID:0x0132
I NDEX:0x0004
-‐-‐>
OK 2015-‐05-‐06
19:54:02
[5.61.38.11]
B lock
o f
type
OB
list
requested
(start
sequence)
-‐-‐>
NOT
AVAILABLE 2015-‐05-‐06
19:54:03
[5.61.38.11]
B lock
o f
type
FB
list
requested
(start
sequence)
-‐-‐>
NOT
AVAILABLE 2015-‐05-‐06
19:54:03
[5.61.38.11]
B lock
o f
type
FC
list
requested
(start
sequence)
-‐-‐>
NOT
AVAILABLE 2015-‐05-‐06
19:54:03
[5.61.38.11]
B lock
o f
type
DB
list
requested
(start
sequence)
-‐-‐>
OK 2015-‐05-‐06
19:54:04
[5.61.38.11]
B lock
i nfo
requested
DB
1
-‐-‐>
OK 2015-‐05-‐06
19:54:04
[5.61.38.11]
B lock
i nfo
requested
DB
2
-‐-‐>
OK 2015-‐05-‐06
19:54:05
[5.61.38.11]
B lock
i nfo
requested
DB
3
-‐-‐>
OK
第33页
针对数据的验证(1)
第34页
针对数据的验证(2)
第35页
针对数据的验证(3)
第36页
针对数据的验证(4)
第37页
针对数据的验证(5)
第38页
针对数据的验证(6)
第39页
S7-‐300
PLC的等级保护功能 S7-‐300
PLC的等级保护功能缺陷 S7协议对口令密码传输的缺陷 S7-‐300
PLC内部程序字节码的转换 利用TCP/UDP连接功能实现端口扫描 利用通信功能块实现特定Socket通信
EXPLOITS
S7
PLC
第40页
S7-‐300的等级保护(1)
• 口令保护
– 来自Step7帮助文件
• “保护CPU中的用户程序,防止未授权的修改(写保 护) ”
• “保护用户程序的编程技术内容(读保护) ” • “防止将会干涉进程的在线功能”
第41页
S7-‐300的等级保护(2)
• 口令保护帮助
第42页
S7-‐300的等级保护缺陷
• 帮助文件对口令保护注意事项的定义
– “无法限制过程控制、监视和通信功能。例如, 无法使用口令保护来防止对"设置时间/日期"功 能的访问。 ”
• 其他“例如”
– 启用LV2/LV3也可以操作CPU工作状态
第43页
S7协议对口令密码传输的弱加密(1)
第44页
S7协议对口令密码传输的弱加密(2)
• Hydra已集成基于S7协议的口令破解模块
第45页
S7-‐300
MC7字节码的传输
第46页
MC7
字节码转换(1)
• 研究目的与意义
– 脱离官方编译器S7kafapx.exe实现对PLC程序的 转换与修改
– S7协议大量字段已被解码但是程序下载功能未 被解码
– Stuxnet核心功能
• 故事
第47页
MC7
字节码转换(2)
• S7-‐300
PLC程序块解析
– 组织块(OB)(主程序块负责所有FC程序块的调用) – 数据块(DB)(用于存放用户和系统定义的变量数据) – 程序块(FC)(由用户编写的程序块) – 功能块(FB)(由用户编写的专用数据块) – 系统程序块(SFC)(调用系统某些功能时自动创建) – 系统功能块(SFB)(调用系统某些数据功能时自动创
建) – 系统数据块(SDB)(由编程软件自动生成主要存放
PLC的硬件组态等信息,用户无法直接打开和更改)
第48页
MC7
字节码转换(3)
• 70
70
//MC7开始头部标志 • 01
01
• 02
//块创建的语言 hex:0x02
LAD
(KOP) • 08
//块类型 hex:0x08
OB • 00
01
//块编号 hex:0x00,0x01
• 00
00
00
96
//块总长度 • 00
00
00
00
//是否设置密码 • 03
22
C8
2E
2C
20
//最后修改时间 • 03
9D
CB
0C
11
4C
//上次修改时间 • 00
1C
//内部块数据表长度 • 00
30
• 00
14
//本地数据长度 • 00
02
//MC7执行代码长度
第49页
STL: A
M
8.0 AN
T
6 L
S5T#3S SD
T
0 NOP
0 NOP
0 NOP
0 NOP
0 STL: A
T
0 =
L
20.0 A
L
20.0 BLD
102 =
Q
124.0 A
L
20.0 L
S5T#3S SD
T
1 NOP
0 NOP
0 NOP
0 NOP
0
MC7
注入实例(1)
第50页
MC7
注入实例(2)
第51页
MC7
注入实例(3)
第52页
MC7
注入实例(4)
• 在无等级保护的情况下修改定时器的时间 为1秒
第53页
S7
300
PLC支持多种连接方式
• 多种连接方式
– S7连接 – 冗余的S7连接 – 点对点连接 – FMS连接 – FDL连接 – ISO传输连接 – ISO
on
TCP连接 – TCP连接 – UDP连接 – 电子邮件连接
第54页
S7
300
PLC支持多种连接对象
• 多种连接连接对象
– 相同型号PLC
CPU与PLC
CPU之间通信 – 不同型号PLC
CPU与PLC
CPU之间通信 – PLC与上位机之间通信 – PLC与其他以太网设备通信
第55页
S7
300
CP的FC5/6功能
• 通信功能块
– FC5à “AG_SEND“ – FC6à “AG_RECV“
• 异步通信方式 • 类似传统Socket通信
– SEND功能 – RECV功能
第56页
CP的自定义Socket通信
• 选择连接方式
– S7 – TCP/UDP – 激活连接的建立
• 调用FC5/FC6
– FC
• 使用DB构建收发缓冲区
– 背景数据块
第57页
自定义Socket通信实现(1)
第58页
自定义Socket通信实现(2)
• FC5
STL:
CALL
"AG_SEND"
ACT
:=L20.0 ID
:=1 LADDR
:=W#16#100 SEND
:=P#DB99.DBX0.0
BYTE
38 LEN
:=38 DONE
:=M99.1 ERROR
:=M99.2 STATUS:=MW100
• FC6
STL: CALL
"AG_RECV"
ID
:=1 LADDR
:=W#16#100
RECV
:=P#DB199.DBX0.0
BYTE
1024
NDR
:=M99.3 ERROR
:=M99.4 STATUS:=MW102 LEN
:=DB99.DBW38
第59页
自定义Socket通信实现(3)
第60页
自定义Socket通信实现(4)
第61页
自定义Socket通信实现(5)
第62页
自定义Socket通信实现(6)
• Black
Hat
USA
2015
– INTERNET-‐FACING
PLCS
-‐ A
NEW
BACK
ORIFICE
• FB65
"TCON" • FB63
"TSEND“ • FB64
"TRCV“ • 通过S7-‐300
PLC的内部通信块实现Socks5代理功能 • 更高级、更灵活
第63页
S7
PLC特性 如何构造测试工具
RELEASED
EXPLOITS
TOOLS
第64页
S7
PLC特性
• 非标签方式寻址 • 功能块按照数字编号排序
– FC
1
– SDB
1001
• 变量数据是按地址寻址
– M0.0àbit
0000 – M0.1àbit
0001 – DB1.DBX1~
• 方便遍历测试而不需要进行枚举
– For
i in
range(000000,001234)
第65页
通用性增强
• 可设置连接模块与槽号
– Rack – Slot
• S7连接的初始化方式
– PG – OP – S7
第66页
工具实现
• S7
Fuzz
Tools
– Get
Module
info – Set
CPU
Run/Stop – Fuzz
Set
Value – Fuzz
DB
Data – Fuzz
Block
第67页
S7
Fuzz
Tools
测试用例与效果(1)
• 测试设备
– CPU:
6ES7
313-‐5BG04-‐0AB0 – CP:
6GK7
343-‐1CX10-‐0XE0
• 启用等级保护 • 用例:
– Rack:0
Slot:2
• 结果
第68页
S7
Fuzz
Tools
测试用例与效果(2)
• 测试设备
– CPU:
6ES7
313-‐5BG04-‐0AB0 – CP:
6GK7
343-‐1CX10-‐0XE0
• 不启用等级保护 • 用例:
– Rack:0
Slot:2
• 结果
第69页
MC7Code
Inject测试用例与效果(1)
• 测试设备
– CPU:
6ES7
313-‐5BG04-‐0AB0 – CP:
6GK7
343-‐1CX10-‐0XE0
• 不启用等级保护 • 用例: • 结果
第70页
总结
第71页
• site:
– plcscan.org
About