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