工控安全-PLC指纹提取的几种方法
前言:PLC为可编程逻辑控制器,采用S7协议。其硬件本身存在许多漏洞,可以利用kali里面的漏洞模块或者modbus工具对其进行攻击,甚至直接可以进行未授权访问,只要其开启对外网的端口服务,那么我们就可以利用其私有协议进行指纹提取、模糊测试、漏洞利用来最终达到控制PLC。指纹提取占据比较重要的位置,因为我们只要把指纹提取的工作做好,那么我门就可以针对什么版本的PLC进行1day的打击。因为工控硬件的更新换代始终很慢。
这里采用的是一个西门子PLC的仿真软件来进行实验的。
0x01 nmap指纹识别
在虚拟机中开启西门子S7 PLC仿真软件,ip不用改,如果nmap扫不出,再改成本地ip

nmap扫描整个网段中开放102端口的存活ip
nmap -p102 -n 192.168.163.1/ --open
先看看启动了PLC的虚拟机的ip

然后在物理机上扫描

发现整个内网中开放102端口的ip
接下来就可以用nmap的s7-info.nse脚本探测其指纹信息
nmap -p102 -n 192.168.1.116 --open --script=s7-info.nse

0x02 PLC连接信息采集工具
下载PLC连接测试工具对PLC的信息进行采集,获取到详细的指纹,ip地址填plc所在的ip,即存在plc仿真软件的虚拟机

然后连接,即可获取很详细的指纹信息

0x03 wireshark抓包进行流量分析获取PLC指纹信息
打开wireshark,开始抓包,筛选cotp

然后打开PLC连接工具进行连接

然后就捕获到了s7协议的包
747号的包是物理机向PLC请求通讯;749号数据包是物理机向plc请求配置通讯;等750号plc同意之后;752号物理机开始发送数据进行通讯;
下面从plc的ip192.168.1.116发送到物理机192.168.1.100的数据包就是plc的指纹信息,比如说755号的数据包。

可以看到PLC的CPU型号、序列号等指纹信息。
当然还有几种方法可以获取到PLC的指纹信息,比如说可以利用python模拟抓包来获取。但以上三种是最为常用方便的。
附上TideSec安全团队总结(更全面):
http://mp.weixin.qq.com/s?__biz=Mzg2NTA4OTI5NA==&mid=2247484526&idx=1&sn=92b6b46bd6471ba2bc7b51cad1c86fe1&chksm=ce5e260ff929af19db8a74f7c0309049c4eabc4b972d9ac03810bc3a4a791b6384864942294f&mpshare=1&scene=23&srcid=1024zQya2YBwrCEztoHnVbyn&sharer_sharetime=1571891653504&sharer_shareid=45176a46e594e1ff053abe513bfce4be#rd
工控安全-PLC指纹提取的几种方法的更多相关文章
- android 让一个控件按钮居于底部的几种方法
android 让一个控件按钮居于底部的几种方法1.采用linearlayout布局:android:layout_height="0dp" <!-- 这里不能设置fill_ ...
- [Android] Android 让UI控件固定于底部的几种方法
Android 让UI控件固定于底部的几种方法1.采用linearlayout布局:android:layout_height="0dp" <!-- 这里不能设置fill_p ...
- 给Repeater控件里添加序号的5种方法
Repeater是我们经常用的一个显示数据集的数据控件,经常我们希望在数据前显示数据的序号,那么我们该怎么为Repeater控件添加序号呢?下面编辑为大家介绍几种常用的为Repeater控件添加序号的 ...
- 利用来JS控制页面控件显示和隐藏有两种方法
利用来JS控制页面控件显示和隐藏有两种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在页面上占空位. 方法一: 1 2 document.getEle ...
- [转]android 让一个控件按钮居于底部的几种方法
本文转自:http://www.cnblogs.com/zdz8207/archive/2012/12/13/2816906.html android 让一个控件按钮居于底部的几种方法 1.采用lin ...
- Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法
在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方 ...
- 解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
目前比较流行的是使用SWFUpload控件,这个控件的详细介绍可以参见官网http://demo.swfupload.org/v220/index.htm 在使用这个控件批量上传文件时发现中文文件名都 ...
- QT 窗体控件的透明度设置(三种方法)
整个窗体 当设置QT的窗体(QMainWindow, QDialog)时,直接用 targetForm->setWindowOpacity() 函数即可实现,效果为窗体及窗体内所有控件都透明 ...
- pictureBox控件获得图片路径的三种方法及自适应大小属性
1.绝对路径: this.pictureBox2.Image=Image.FromFile("D:\\001.jpg"); 2.相对路径: Application.StartupP ...
随机推荐
- Go语言实现:【剑指offer】二维数组中的查找
该题目来源于牛客网<剑指offer>专题. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一 ...
- Spark中的RDD和DataFrame
什么是DataFrame 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格. RDD和DataFrame的区别 DataFrame与RDD的主要区别在 ...
- css 纯css轮播图 示例
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- pytoch之 encoder,decoder
import torch import torch.nn as nn import torch.utils.data as Data import torchvision import matplot ...
- ELF文件之二——使用链接脚本
main.c int main() { ; } 编译:sparc-elf-gcc.exe -c main.c -o main.o 链接:sparc-elf-ld.exe main.o -nostart ...
- 杭电-------2051Bitset(C语言)
#include<stdio.h> ] = { }; int main() { int m; ; while (~scanf("%d", &m)) { whil ...
- 封装dropdown模块(使用到之前写好的动画组件,封装下拉菜单)
用 showhide 改写dropdown 模块: 1.首先在 css中新增动画相关样式 /*showhide组件的样式*/ .fadeOut{ opacity:; visibility: hidde ...
- Maven 阿里云仓库地址
https://maven.aliyun.com/mvn/view 一般使用聚合仓库(group),path是仓库地址.可点击右上角“使用指南”: 附 目前阿里云仓库的地址 https://mav ...
- warning Unexpected use of undefined no-undefined
报错翻译:警告意外使用未定义的no-undefined(谷歌这次翻译的不行) 报错原因undefined直接使用了,如下↓ 其实报错的意思就是这样不安全,看下面一个例子 var foo = undef ...
- PHP0024:PHP 博客项目开发