跳到主要内容

工程实践:开发 Yakit 插件利用西门子 PLC

· 阅读需 4 分钟
Yak Project
网络安全垂直语言团队

Yakit&IRTeam

Yakit是基于yak语言开发的网络安全单兵工具,旨在打造一个覆盖渗透测试全流程的网络安全工具库。受限于Yak使用形式,用户必须学习 Yak 语言并同时具备对安全的一定理解。为了让 Yak 本身的安全能力更容易被大家接受和使用,为Yak编写了gRPC服务器,并使用这个服务器构建了一个客户端:Yakit,通过界面化GUI的形式。

IRTeam作为国内一支工业安全红队,主要致力于PLC/DCS工业控制系统的脆弱性研究和攻击链打造,此次受360漏洞云与Yakit联手活动邀请,针对Yakit单兵工具尝试把IRTeam现有成果中一款针对西门子S7-200 SMART的Payload移植到Yakit工具上。

系统结构和参数

1、一台西门子PLC(S7-200 SMART) IP:192.168.2.10/24

2、一台TPLINK二层交换机

3、一台安装Yakit的PC(Windows 10)IP:192.168.2.110/24

安装过程:

https://www.yaklang.io/products/quickstart

评测过程

01

PLC探测

1、进入Yakit工具后,选择“基础安全工具”中的“扫描端口/指纹”

2、在指纹IP扫描目标中填入被扫描PLC的IP,此评测中我直接输入PLC的IP。

3、在“扫描端口”里填入常用PLC开放的端口,例如 80/102/443/3389 等。

4、然后点击开始扫描。

可以看到上图192.168.2.10这个设备上端口的状态,只有102端口开放,其余都是关闭的。如果是多个IP地址,还可以在扫描结果页面直观看到所有资产开放的端口号。如下图:

但在工控指纹这部分,并没有集成ICS的NSE,也希望Yakit在指纹部分开放用自己挂载的NSE脚本,方便某些特殊领域的资产识别。

从上图也可以看到端口102开放,西门子的PLC常用端口是102,所以可以初步确定PLC的厂商。

02

开发IRTeam插件

进入插件仓库,移植一个西门子PLC的Payload到Yakit工具插件上,因为Yakit插件支持Yak语言(近似Golang语言),所以简单看了一下语法和API和参数声明和调用,都是比较简单的,另外对于TCP库封装可以说近乎疯狂的地步。

Yak模块名:IRTeam (这个是我们团队的名字,同时代表工业控制的意思)

描述:就是针对西门子S7-200 SMART此款PLC的运行和停止控制

参数:IP 就是PLC的IP地址(字符串类型),PORT就是PLC开放服务端口(INT类型),CMD就是你exploit时候的发出控制PLC命令(BOOL类型,TRUE就是运行,FALSE就是停止)

源码部分实现起来也是十分简单,首先通过cli.string等操作获取参数里的内容,然后通过TCP.connect连接PLC并且打开102端口,然后就是先发送2个西门子PLC自有的TASP握手包建立session,然后在判断CMD的数值后发送运行或者停止的Payload。具体结构见下图:

经过Yak源代码Payload编写后,选择保存插件。返回到插件仓库可以看到一个YAK的插件,上面写着IRTeam和这个插件的描述,在模块详情中还可以看到作者的名字以及关键字。

同时在参数上,修改为真实PLC的IP/端口和命令,然后选择“开始执行”,就可以看到西门子PLC的状态会根据你下发的控制命令而改变。如下图:

PoC视频:

EDN

感谢剑思庭大佬给我们写的投稿文章,大家感兴趣可以加大佬微信交流~

我们的投稿活动还在进行中,走过路过不要错过,参加即可获得精美小礼物,投稿还有稿费噢~进交流群和投稿添加以下微信即可。


本文首发于 Yak Project 公众号,阅读原文