Siemens PLC指纹提取方法汇总
字数 1048 2025-08-18 11:39:04

Siemens PLC指纹提取方法详解

1. 工控设备识别背景

随着工业控制系统(ICS)与互联网的融合,西门子、ABB等工控设备暴露在互联网中,面临安全风险。识别联网工控设备的主要依据是其网络特征:

  • 特定IP地址段
  • 开放端口(如西门子S7协议常用102端口)
  • 基于TCP/IP的工业通信协议特征

传统识别方法存在超时等待时间长、指纹库不完善等问题,亟需更高效的识别技术。

2. Siemens PLC指纹识别方法

方法一:Nmap扫描识别

步骤:

  1. 扫描开放102端口的设备:
    nmap -p102 -n 192.168.163.1/24 --open
    
  2. 使用Nmap的S7脚本获取详细信息:
    nmap --script s7-info.nse -p102 <target_ip>
    

特点:

  • 快速识别网络中开放的S7服务
  • s7-info.nse脚本可提取PLC型号、模块信息等

方法二:PLC连接测试工具

使用专用PLC采集软件(如西门子STEP7、TIA Portal)连接设备,可直接获取:

  • PLC型号
  • 固件版本
  • 模块配置
  • 设备序列号

方法三:Wireshark流量分析

操作流程:

  1. 启动Wireshark,设置过滤器为cotp
  2. 使用PLC连接工具建立连接
  3. 分析捕获的数据包:
    • 217号包:请求通讯
    • 220号包:配置通讯
    • 224号包:发送数据
    • 226号包:包含CPU型号、序列号等关键信息

关键点:

  • 226号数据包包含完整的设备指纹信息
  • 需理解S7协议通信过程才能准确解析

方法四:Python自定义脚本

代码解析:

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:
            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:
            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))
    
    # S7协议握手过程
    sock.send(unhexlify("0300001611e00000000100c0010ac1020100c2020102"))
    sock.recv(1024)
    
    # 请求通信参数
    sock.send(unhexlify("0300001902f08032010000080000080000f0000001000101e0"))
    sock.recv(1024)
    
    # 获取设备标识(SZL 0x001C)
    sock.send(unhexlify("0300002102f080320700000a00000800080001120411440100ff090004001c0000"))
    Respons = (hexlify(sock.recv(1024)).decode())[82:]
    getSZL001c(Respons)
    
    # 获取模块信息(SZL 0x0011)
    sock.send(unhexlify("0300002102f080320700000a00000800080001120411440100ff09000400110000"))
    Respons = (hexlify(sock.recv(1024)).decode())[82:]
    getSZL0011(Respons)
    
    sock.close()

if __name__ == "__main__":
    main()

关键点:

  • 实现了S7协议的完整握手过程
  • 通过SZL 0x001C和0x0011请求获取设备详细信息
  • 需要处理十六进制数据转换和解析

方法五:plcscan工具

使用方式:

  1. 下载工具:
    git clone https://github.com/yanlinlin82/plcscan
    
  2. 扫描目标:
    python plcscan.py <target_ip>
    

特点:

  • 专为工控设备设计的扫描工具
  • 内置多种工控协议支持
  • 可识别设备类型、固件版本等信息

3. 技术要点总结

  1. S7协议通信过程:理解三次握手和SZL数据请求是开发自定义工具的基础

  2. 关键指纹信息

    • CPU型号和序列号
    • 固件版本信息
    • 模块配置信息
  3. 优化方向

    • 减少超时等待时间
    • 构建完善的指纹库
    • 多协议并行探测
  4. 安全注意事项

    • 仅对授权设备进行扫描
    • 避免影响正常工业控制流程
    • 遵守相关法律法规

4. 资源获取

5. 扩展学习

建议进一步研究:

  • S7协议详细规范
  • COTP协议解析
  • 其他工控协议(如Modbus、DNP3等)的识别方法
  • 工控设备漏洞研究

通过综合运用上述方法,可以建立完善的工控设备识别系统,为工业网络安全防护提供基础数据支持。

Siemens PLC指纹提取方法详解 1. 工控设备识别背景 随着工业控制系统(ICS)与互联网的融合,西门子、ABB等工控设备暴露在互联网中,面临安全风险。识别联网工控设备的主要依据是其网络特征: 特定IP地址段 开放端口(如西门子S7协议常用102端口) 基于TCP/IP的工业通信协议特征 传统识别方法存在超时等待时间长、指纹库不完善等问题,亟需更高效的识别技术。 2. Siemens PLC指纹识别方法 方法一:Nmap扫描识别 步骤: 扫描开放102端口的设备: 使用Nmap的S7脚本获取详细信息: 特点: 快速识别网络中开放的S7服务 s7-info.nse脚本可提取PLC型号、模块信息等 方法二:PLC连接测试工具 使用专用PLC采集软件(如西门子STEP7、TIA Portal)连接设备,可直接获取: PLC型号 固件版本 模块配置 设备序列号 方法三:Wireshark流量分析 操作流程: 启动Wireshark,设置过滤器为 cotp 使用PLC连接工具建立连接 分析捕获的数据包: 217号包:请求通讯 220号包:配置通讯 224号包:发送数据 226号包:包含CPU型号、序列号等关键信息 关键点: 226号数据包包含完整的设备指纹信息 需理解S7协议通信过程才能准确解析 方法四:Python自定义脚本 代码解析: 关键点: 实现了S7协议的完整握手过程 通过SZL 0x001C和0x0011请求获取设备详细信息 需要处理十六进制数据转换和解析 方法五:plcscan工具 使用方式: 下载工具: 扫描目标: 特点: 专为工控设备设计的扫描工具 内置多种工控协议支持 可识别设备类型、固件版本等信息 3. 技术要点总结 S7协议通信过程 :理解三次握手和SZL数据请求是开发自定义工具的基础 关键指纹信息 : CPU型号和序列号 固件版本信息 模块配置信息 优化方向 : 减少超时等待时间 构建完善的指纹库 多协议并行探测 安全注意事项 : 仅对授权设备进行扫描 避免影响正常工业控制流程 遵守相关法律法规 4. 资源获取 仿真和采集工具:通过公众号回复"工控指纹"获取 参考链接: 工控系统指纹识别技术 相关专利说明 5. 扩展学习 建议进一步研究: S7协议详细规范 COTP协议解析 其他工控协议(如Modbus、DNP3等)的识别方法 工控设备漏洞研究 通过综合运用上述方法,可以建立完善的工控设备识别系统,为工业网络安全防护提供基础数据支持。