Siemens PLC指纹提取方法汇总

2019-10-24  本文已影响0人  VllTomFord

随着信息技术和智能制造技术的发展,越来越多的工控厂商如西门子、ABB、研华等在内的各类工业控制设备或系统暴露在互联网的网络空间中,易被黑客利用其设备漏洞进行攻击,引发严重后果。

为了对接入互联网内的工控设备或系统进行快速搜索监测,掌握其设备的种类、规模及地理分布,迫切需要采用相关技术对联网工控系统或设备进行识别。

由于联网工控设备和系统在网络上具有其相应的特定属性:主要包括使用的IP地址,相应的端口和基于TCP/IP协议的特定工业通信控制协议,所以目前识别联网工业控制系统或设备的通用方法是:

现有技术中采用IP和端口直接进行TCP的三次握手连接,成功则发送工控设备指纹探测数据包,失败则进入下一个IP+端口的设备探测,导致主机不可到达或端口未开放带来的TIMEOUT(超时)时间过长问题,同时没有构建完善的工控设备指纹库,导致不能快速准确识别工控设备的类型和型号等。

目前亟待解决的技术难题是:针对上述存在的问题,提供一种快速识别联网工控设备的方法。因此,本文以西门之PLC为例进行探讨Siemens PLC指纹识别方法。

方法一:Nmap指纹识别

nmap -p102 -n 192.168.163.1/24 --open

方法二:PLC连接测试工具

方法三:基于Wireshark流量分析获取PLC指纹信息

方法:打开wireshark,筛选cotp,点击S7 PLC连接工具“连接”,此时Wireshark抓到一些数据包。

编号217号数据包:请求通讯;

编号220号数据包:配置通讯;

编号224号数据包:发送数据进行通讯;

编号226号数据包中可以看到PLC的CPU型号、序列号等指纹信息。

方法四:自定义Python脚本探测PLC指纹

讲以上请求报文复制为hex stream.

import socket
from binascii import unhexlify,hexlify

def getSZL001c(Respons):
    for i in range(int(len(Respons)/68)):
        data = Respons[i*68+4:i*68+68].replace("00","")
        try:
            if unhexlify(data).decode("utf-8", "ignore") != "":
                print (unhexlify(data).decode("utf-8", "ignore"))
        except:
            pass
def getSZL0011(Respons):
    for i in range(int(len(Respons)/56)):
        data = Respons[i*56+4:i*56+56].replace("00","")
        try:
            if unhexlify(data).decode("utf-8", "ignore") != "":
                print (unhexlify(data).decode("utf-8", "ignore"))
        except:
            pass

def main():
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.connect(("192.168.163.137",102))
    sock.send(unhexlify("0300001611e00000000100c0010ac1020100c2020102"))
    sock.recv(1024)
    sock.send(unhexlify("0300001902f08032010000080000080000f0000001000101e0"))
    sock.recv(1024)
    sock.send(unhexlify("0300002102f080320700000a00000800080001120411440100ff090004001c0000"))
    Respons = (hexlify(sock.recv(1024)).decode())[82:]
    getSZL001c(Respons)
    sock.send(unhexlify("0300002102f080320700000a00000800080001120411440100ff09000400110000"))
    Respons = (hexlify(sock.recv(1024)).decode())[82:]
    getSZL0011(Respons)
    sock.close()

if __name__ == '__main__':
    main()

方法五:plcscan脚本探测

下载链接:https://github.com/yanlinlin82/plcscan

总结

由于我的技术水平有限,所写文章难免有不足之处,恳请各位大佬批评和指正,今后还会继续分享有关工控安全技术文章。 在此,特别感谢烽台科技灯塔实验室举办的工业互联网安全知识分享讲座,跟着几位大佬学到了很多知识,PPT和现场实验演示都准备的很精心,让我收获颇丰,以后还会继续跟随大佬们的脚步努力学习,感谢!

参考链接

http://www.xjishu.com/zhuanli/62/201611189629.html

http://plcscan.org/blog/2017/03/fingerprint-identification-technology-of-industrial-control-system/

本文中使用到的仿真+采集工具,请在公众号回复"工控指纹"获得。

关注我们

Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,目前聚集了十多位专业的安全攻防技术研究人员,专注于网络攻防、Web安全、移动终端、安全开发、IoT/物联网/工控安全等方向。

想了解更多Tide安全团队,请关注团队官网: http://www.TideSec.net 或长按二维码关注公众号:

上一篇 下一篇

猜你喜欢

热点阅读