Siemens PLC指纹提取方法汇总

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

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

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

  • 首先明确联网设备所在IP地址段;
  • 针对该IP地址段中的每一个IP及相关端口,依次根据各类联网工控系统和设备工控协议所对应的端口发起相应数据包,建立控制协议连接;
  • 如主机不可到达或端口不开放则主机和端口不存活,需等待TIMEOUT(超时)时间,如主机可到达或端口开放,主机和端口存活,联网工控系统或设备返回数据包;
  • 接收到返回数据包,解析其内容,根据内容中的关键报文与工控设备指纹库里的指纹进行匹配并进行工控系统或设备进行识别;
  • 如没有接收到返回数据包,则依次使用下一工控协议,对IP和端口建立控制协议连接。

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

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

方法一:Nmap指纹识别

  • 开启西门子S7 PLC协议仿真软件
  • 发现网段中开放102端口的ip
nmap -p102 -n 192.168.163.1/24 --open
  • 如果是西门子PLC,可以进一步使用Nmap的s7-info.nse脚本进行指纹探测

方法二:PLC连接测试工具

  • 还可以使用PLC采集软件进行连接,获取PLC详细指纹

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

  • 使用Wireshark获取PLC指纹信息

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

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

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

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

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

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

  • Python脚本提取指纹

讲以上请求报文复制为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脚本探测

  • 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 或长按二维码关注公众号:

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 加密协议 安全性 工控 ICS 协议分类 标准协议: Modbus DNP3 IEC104 IEC61850 私有...
    yunpiao阅读 12,347评论 0 5
  • 后期整理字体以及排版问题,修订不适合的翻译 “A wealth of information. Smart, ye...
    iamzzz阅读 4,136评论 0 0
  • Nmap扫描原理与用法 1Nmap介绍 Nmap扫描原理与用法PDF:下载地址 Nmap是一款开源免费的网络发现(...
    y0ungta1a阅读 10,788评论 0 50
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    JasonShi6306421阅读 5,033评论 0 1
  • 默 是一位医生 还是在医院实习的那种 某日 是的科室来了母女两个医患 但是从来不说话 默特意观察过母女两个 每次巡...
    南城有酒阅读 2,738评论 0 1

友情链接更多精彩内容