信息技术(IT)领域的网络安全夺旗赛(CTF)在全球范围内频繁举行,但专注于运营技术(OT)的CTF仍然相对较少且不易参与。与强调Web应用程序或网络漏洞的传统IT CTF不同,OT CTF的挑战围绕着诸如PLC、SCADA、RTU和工业控制系统(ICS)等系统展开。这些场景要求参与者具备专业的ICS知识,能够识别漏洞、利用错误配置以及防御通常在电网、制造环境、运输和水处理设施中发现的关键基础设施。OT CTF提供了一个独特的机会,可以将IT和OT安全连接起来,将网络安全技能与对Modbus、DNP3、S7Comm和IEC 61850等工业协议的深刻理解相结合。
关键基础设施安全对决(CISS)是为数不多的每年为参与者提供专用OT CTF平台的国际赛事之一,该赛事在新加坡科技与设计大学(SUTD)举行,由iTrust研究中心组织。CISS提供了一个绝佳的机会,汇集了全球CTF专家来应对真实的OT网络安全挑战。有关更多详细信息,请访问CISS 2024 website。
在本文中,我将介绍我为去年CISS设计的一个IT-OT混合挑战(该挑战是CISS 2024中最受欢迎的三个挑战之一),并逐步介绍解决它的步骤。如果您有兴趣参加OT CTF比赛,请不要错过即将到来的CISS 2025:https://itrust.sutd.edu.sg/ciss-2025/。
# Author: Yuancheng Liu
# Created: 2024/06/02
# version: v_0.1.3
挑战介绍:Palantir Control
每年,CISS CTF都会有一个富有创意的故事情节来激发挑战设计。2024年版采用了“The Orthanc Obstacles”主题,该主题基于The Lord of the Rings: The Two Towers。(如下图CISS2024海报和奖牌所示)
Figure-00 CISS2024海报和奖牌截图
在这种背景下,我设计的挑战——Palantir Control——借鉴了萨鲁曼使用Palantír控制Orthanc塔的标志性场景,如下图所示:
Figure-01 The Lord of the Ring Saruman
这个挑战模拟了一个迷你的OT ICS环境(SCADA层网络),以说明基于IT的网络攻击如何破坏和崩溃OT系统。它具有可编程逻辑控制器(PLC)和远程控制界面(如HMI),模拟简化的SCADA系统。参与者的任务是使用IT渗透技术渗透网络,提升权限,并最终操纵OT系统以检索flag。
在Palantir Control挑战中,参与者将经历多个攻击阶段:
-
IT渗透 – 网络扫描
-
IT渗透 – UDP端口探测
-
IT漏洞利用 – HTTP Web服务器CGI漏洞
-
IT攻击 – Web管理员密码暴力破解
-
OT攻击 - PLC错误配置利用
-
OT攻击 – PLC虚假数据注入
这个挑战不仅强调了IT和OT领域的技术技能,还反映了现实世界中的风险,即IT层面的妥协可能导致OT故障。准备好突破Orthanc,揭开隐藏在其网络墙内的秘密。该挑战基于我的一个PLC蜜罐项目设计:https://www.linkedin.com/pulse/python-plc-honeypot-project-yuancheng-liu-vks8c
挑战背景故事和问题
CTF挑战背景故事
在Isengard的阴影下,白袍萨鲁曼利用了Palantír的黑暗力量,这是一个神秘的黑水晶球,可以远程控制位于Orthanc塔顶的火焰之眼。随着他发出的每一个命令,眼睛都会移动和燃烧,引导他无情的兽人军队走向统治。
但希望依然存在。在甘道夫的秘密情报的武装下,Sam和Frodo开始了一项危险的任务,以破坏萨鲁曼的邪恶控制系统。他力量的关键在于一个隐藏的运营技术(OT)网络:
-
Orthanc塔内的可编程逻辑控制器(PLC)根据传入的远程命令操纵眼睛。
-
一个远程控制器,由萨鲁曼通过Palantír操作,使用专门的OT协议发送这些命令。
-
眼睛的状态通过PLC保持寄存器改变,萨鲁曼通过Palantír的响应数据监控反馈。
为了阻止黑暗的蔓延,霍比特人必须迅速行动,如下图所示:
Figure-02 挑战背景故事概述
-
Sam必须渗透到塔中,突破控制系统,并操纵火焰之眼背后的逻辑。
-
Frodo冒着一切风险,必须接近萨鲁曼的领域,并发现一个隐藏的后门,以直接从黑水晶中提取数据。
只有通过破坏这个关键的控制链,他们才能拯救中土世界免于毁灭。
CTF挑战问题
挑战 1 – Sam’s Mission [IT Challenge]
目标:帮助Sam渗透到Orthanc塔中,并揭开控制系统的内部运作。
任务:
-
扫描网络以识别Orthanc Tower Controller (PLC)。
-
找到设备的基于Web的管理界面。
-
绕过身份验证以访问内部配置数据。
Flag位置:隐藏在PLC Web界面中,可能编码或嵌入在诊断或配置页面中。
挑战 2 – Frodo’s Mission [OT Challenge]
目标:协助Frodo破坏萨鲁曼和Orthanc塔之间的通信。
任务:
-
发现萨鲁曼通过Palantír使用的远程OT控制器。
-
与它交互以检索操作数据。
-
执行虚假数据注入或类似破坏以操纵火焰之眼的行为。
Flag位置:嵌入在控制器的反馈数据中,在破坏其正常运行后可访问。
🖧 网络配置
网络配置部分将不会提供给参与者,他们需要使用网络扫描工具来找出网络拓扑,并且每个团队的配置可能不同。
这个挑战环境由三个虚拟机(VM)组成——两个用于IT-OT模拟,一个用于参与者访问。所有VM都位于同一子网内,以允许直接通信。拓扑结构如下所示:
Figure-03 挑战环境网络拓扑
IP地址配置:
-
PLC控制器(远程控制程序)IP:
172.23.155.208
-
PLC设备IP:
172.23.155.209
-
参与者VM IP:
172.23.144.1
在这个挑战中,参与者与一个模拟的IT-OT环境交互,该环境模拟了一个简化的SCADA系统。设置包括:
-
通过Modbus-TCP控制的PLC设备
-
一个充当萨鲁曼Palantír界面的远程控制器VM
-
一个事务VM (Ubuntu 20.04),该VM先前已被入侵
关键场景细节
-
远程控制器定期向PLC发送Modbus-TCP指令,根据PLC梯形逻辑触发操作(例如,线圈激活)。
-
IT支持工程师VM可供参与者访问,具有完整的
sudo
权限,但无法直接访问以监视或控制PLC。 -
但是,远程控制器公开了一个开放的UDP端口,参与者可以通过该端口与查询PLC的当前运行状态(例如,输出线圈状态)。
-
参与者必须编写一个自定义的UDP客户端,以从控制器提取实时状态数据。
-
使用IT渗透和OT操纵技术,参与者将尝试破坏或更改PLC的预期行为,以使控制器收到意外或错误的响应。
最终目标是导致逻辑故障或不一致,从而使远程控制器生成状态错误代码,其中包含flag。
挑战设计
参与者将使用transaction VM来安装工具或开发自定义攻击脚本,这些脚本是与IT-OT环境交互和利用该环境所必需的。虽然一个高级的system workflow控制着交互序列,但在CTF期间,不会向参与者公开,如下所示:
Figure-04 Challenge environment system workflow diagram
挑战的核心集中在一个PLC模拟器上,它执行一个隐藏的梯形逻辑程序。PLC模拟器VM向网络公开两个关键服务:
-
Modbus-TCP Service: 端口
TCP:502
-
Web Interface (HTTP): 端口
TCP:5000
每隔2秒,测试环境模拟一个OT操作周期:
-
远程控制器VM随机从其内部数据库加载一个预定义的PLC保持寄存器配置和相应的预期线圈输出状态。
-
它发送一个Modbus-TCP写入请求来更新PLC模拟器中的保持寄存器。
-
PLC模拟器更新其内部寄存器值,执行其梯形逻辑,并相应地更新其线圈输出状态。
-
然后,远程控制器查询PLC的线圈,以验证响应是否与预期结果匹配。
-
基于此匹配,远程控制器确定PLC测试是通过还是失败。
✅ 正常操作(测试通过):
如果PLC以正确的线圈状态响应,则认为系统运行正常。当参与者发送一个包含getstate
的UDP数据包到remote controller的端口UDP:3000
时,他们将收到如下响应:
state:normal;;;...
❌ 故障情况(测试失败):
如果PLC的响应does not match预期的线圈输出,则远程控制器会标记一个错误。在这种情况下,当参与者发送getstate
到UDP:3000
时,他们将收到:
state:error;{error-code-xxxxxxxxxxxxxxxx}
{error-code}
是CTF flag。
如果通信挑战断开连接,控制器将响应消息"PLC rejected connection
"。
如果参与者没有发送正确的字符串"getstate",控制器将响应"Error: Input request invalid
" 。
🎯 挑战目标
CTF参与者必须创建一个攻击,导致PLC的输出状态偏离预期结果,从而触发远程控制器中的错误情况。
示例场景:
-
控制器将PLC的8个保持寄存器设置为:
[0, 1, 1, 0, 1, 0, 0, 1]
-
梯形逻辑应产生输出线圈1 - 4为:
[1, 0, 0, 1]
-
如果远程控制器读取到:
[1, 0, 1, 1]
对于这些线圈,它会标记错误并通过UDP返回flag。但是参与者需要快速读取,因为1秒后控制器将重置并开始另一个新的循环执行。
参与者必须发现如何disrupt the logic chain——无论是通过错误配置、竞争条件、未经授权的输入还是注入——以便PLC以不正确的线圈状态响应。我们为参与者留下两秒钟的时间来进行错误数据注入攻击,大约一秒钟的时间让他们读取flag,时钟时间间隔如下所示:
Figure-05 Inject time stamp and the clock time interval diagram
解决挑战的步骤
现在让我们详细了解解决挑战的步骤。参与者需要首先解决IT挑战,然后才能开始进行OT挑战部分。
解决Sam的任务 [IT挑战]
步骤1:发现PLC Web和Modbus-TCP服务
首先使用fping
或任何nmap主机扫描方法识别子网上的活动主机。一旦识别出来,扫描可疑的PLC IP以枚举其开放端口:
nmap -sS -Pn -T5 -p- 172.23.155.209
典型的扫描会显示PLC VM上打开的Modbus-TCP (port 502)和HTTP Web Interface (port 5000),如下所示:
Figure-06 Nmap port scan result
由于transaction VM是Ubuntu-server版本(没有桌面),您需要将web界面端口转发到您的本地机器:
ssh -L 127.0.0.1:5000:172.23.155.209:5000 -J @ @172.23.144.1
现在,在本地浏览器上打开URL http://127.0.0.1:5000
以导航到PLC的web界面。参与者可以浏览故事和挑战介绍页面,如下所示:
Figure-07 Challenge PLC VM web interface home page
步骤2:调查Web UI并找到隐藏的提示-1
从web上阅读挑战详情后,单击顶部导航栏中的“Login”按钮以查看登录表单:
Figure-08 Challenge PLC VM web interface authorization page
现在你需要暴力破解密码,但在那之前你需要弄清楚用户名是什么。图片中兽人的消息突出了Saruman,如果你尝试saruman
(或其他通用帐户,例如admin
)以及一些密码,例如"1234567
",该站点返回登录拒绝消息:Login account does not exist
。
Figure-09 Challenge PLC VM web interface login fail screen shot
一定有一些关于帐户的线索,再次查看登录页面,底部有一个可疑的下拉按钮,标记为"Gandalf's Message"。当下拉框展开时,我们可以得到一些消息,如下所示:
Figure-10 Challenge PLC VM web interface login page Gandalf's Message
看看这个字符串,似乎Gandalf没有提供任何有用的消息,但是等等,他消息下面的“线”看起来很可疑!也许甘道夫的消息已损坏,让我们检查一下web源代码:
Figure-11 Challenge PLC VM web interface login page html source
这条“线”实际上是一个名为hint01
的5像素高的图像。检查页面源代码以显示图像:
Figure-12 Challenge PLC VM web interface login page reveal Gandalf's Message
是的!现在甘道夫出现了,并给了我们一个打开门的URL:
http://tower_ip:5000/userlogin/xxxx/xxxx
如果参与者在浏览器中尝试该URL,它将显示凭据是否正确,如下所示:
http://172.23.155.209:5000/userlogin/Saruman/xxxx
这将返回一个登录错误:User name or password incorrect!
(如下所示)
Figure-13 Challenge PLC VM login API test
这证实了端点有效并支持基于URL的凭据注入,但该URL仍然没有用!因为它与登录页面相同,我错过了什么吗?让我们检查一下新的web源:
Figure-14 Challenge PLC VM login CGI response source
有一个不可访问的段落:
Sarumanscrow said:
Sarumanscrow said:
Sarumanscrow
可能是有效的用户名吗?尝试使用它登录:
Figure-15 Find the correct login user name
登录拒绝错误更改为User password incorrect!
。我们可以确认有一个用户帐户“Sarumanscrow”可用于登录PLC网站。
步骤3:暴力破解密码并检索Flag
有了发现的用户名(Sarumanscrow
),并且确认了凭据注入端点,您现在可以使用Python执行基于字典的暴力破解攻击:
import time
import urllib
import urllib.request
ipAddr = "172.23.155.209"
passwordDictFile = "solveCTFScripts\\10-million-password-list-top-1000000.txt"
passwordList = []
with open(passwordDictFile, 'r') as fh:
passwordList = fh.readlines()
for password in passwordList:
password = password.strip()
url = "http://%s:5000/userlogin/Sarumanscrow/%s" %(ipAddr, password)
response = urllib.request.urlopen(url)
message = str(response.read())
print(message)
if 'User name or password incorrect!' in message:
time.sleep(0.1)
continue
else:
print("Find password: %s" %str(password))
break
在实际的CTF中,密码是从字典中随机选择的。例如,在本测试运行中,它是admin
,如下所示:
Figure-15 Brute force attack to get the password
成功通过身份验证后,PLC Web界面将更改为登录状态,并且PLC Web界面将以蓝色显示祝贺消息:
“恭喜,您已解决了IT挑战。从页面中搜索flag。”
简介下方的左侧导航栏将显示Fiery Eye Control和Orthanc Tower Control,如下所示:
Figure-17 Challenge PLC VM web interface login successful
当参与者切换到Fiery Eye Control(PLC梯形逻辑页面)时,将找到IT挑战flag:
Figure-18 Find the IT challenge flag in the Fiery Eye Control page
我们可以获得IT挑战flag CISS2024_SAM_FLAG(在真正的比赛中,这将是一个随机生成的flag字符串)
- 现在,IT挑战已解决!
解决Frodo的任务[OT挑战]
步骤1:发现控制器的UDP服务
根据PLC梯形逻辑页面中的梯形逻辑网页Hints02
(如下所示),参与者需要在PLC控制器节点(172.23.155.208)上找到打开的UDP服务端口,以获取当前的PLC操作验证状态。
Figure-19 Get the hint02 from the PLC web
为此,创建一个简单的Python脚本来扫描控制器VM上的UDP端口,如下所示:
import time
from socket import *
host = "172.23.155.208"
s = socket(AF_INET, SOCK_DGRAM)
for port in range(10,65532):
try:
print("Try port %s" %str(port))
data = b"Test Message"
s.sendto(data,(host,port))
s.settimeout(1)
print ((s.recvfrom(1024)))
print("Find opened port: %s" %str(port))
break
except:
pass
运行UDP端口扫描程序并获取结果:
Try port 2991
Try port 2992
Try port 2993
Try port 2994
Try port 2995
Try port 2996
Try port 2997
Try port 2998
Try port 2999
Try port 3000
(b'Error: input request invalid: Test Message', ('172.23.155.208', 3000))
Find opened port: 3000
已确认UDP端口3000已打开。
步骤2:构建UDP客户端连接到PLC控制器
发现UDP服务端口后,使用梯形逻辑页面中的Hint03(如下所示)将getstate
字符串发送到控制器VM并检索PLC状态:
Figure-20 Get the hint03 from the PLC web
您可以使用攻击脚本https://github.com/LiuYuancheng/PLC_and_RTU_Simulator/blob/main/Modbus_PLC_Simulator/src/udpCom.py作为示例,以保持发送UDP消息:
Figure-21 Get the normal response from PLC controller VM
运行客户端将返回线圈C0到C3的当前状态。如果PLC线圈结果验证通过,则控制器将识别PLC运行正常,您将在响应消息中看到“normal”世界。
步骤3:构建虚假数据注入(FDI)攻击脚本
OT挑战要求参与者覆盖PLC保持寄存器以引起故障。根据OT挑战flag提示:参与者需要弄乱PLC操作,以使远程控制器检测到PLC工作错误,然后读取错误代码。现在,参与者切换到PLC梯形逻辑页面以了解梯形逻辑,这里有8个PLC保持寄存器用于梯形逻辑[HR0 - HR7](如下所示):
Figure-22 Analyze the PLC ladder logic diagram
如果参与者可以在某些寄存器中注入虚假数据,则输出可能会更改。例如,如果更改状态HR6,HR0或HR7可能会更改线圈的输出,因为它们位于“AND”门逻辑中。(如果在“OR”门逻辑中更改寄存器的单个状态,例如HR1,HR4可能不会影响输出,等效电路图如下所示)
Figure-23 Analyze the circuit diagram
参与者可以使用https://github.com/LiuYuancheng/PLC_and_RTU_Simulator/blob/main/Modbus_PLC_Simulator/src/modbusTcpCom.py作为示例,创建简单的PLC FDI攻击脚本程序以覆盖保持寄存器的值。
但是,如果他们仅直接运行脚本,则会显示攻击失败消息(寄存器值更改请求被拒绝):
Figure-24 PLC false data injection failed
问题是攻击VM的IP 172.23.144.1
不在PLC寄存器“允许读取”和“允许写入”IP地址列表中。因此,所有虚假数据注入请求均被PLC拒绝。
点击滑块条上的 "Orthanc Tower Control",它将变为如下所示的 "PLC Configuration",参与者需要在允许写入 IP 地址中添加攻击 VM 的 IP(如下所示):
Figure-25 Challenge PLC VM web configuration page
在文本字段中填写攻击 VM 的 IP 地址,然后按绿色的 "Add" 按钮,攻击者的 IP 将被添加到允许写入 PLC 的地址列表中,如下所示:
Figure-26 Add the allow write IP address to PLC configuration
现在参与者可以再次运行攻击程序,他们可以看到设置结果返回 true,FDI 攻击程序正在更改 PLC 的保持寄存器的值:
Figure-27 PLC false data injection accepted
现在可以使用虚假数据注入攻击程序了。
步骤 4:触发控制器错误并检索 OT 标志
要完成挑战:
-
还要将transaction VM 的 IP 添加到Allow Read IP List,以便我们可以获取保持寄存器状态
-
修改你的脚本为:
-
读取
HR0–HR7
的当前值 -
反转每个位 (1 → 0, 0 → 1)
-
将反转后的值写回 PLC
-
这将扭曲线圈输出,并且控制器逻辑将检测到异常状态。由于注入时间也需要准确,因此攻击者需要同时运行 FDI 程序和控制器状态读取程序。过一段时间后,他们将看到如下所示的错误代码:
我们可以获得 OT 挑战标志 PLC_EXECUTE_ERROR_FLG(在真正的比赛中,这将是一个随机生成的标志字符串)
- 现在 OT 挑战已解决!
你已成功使用虚假数据注入攻击破坏了 Palantir Control 逻辑,并检索了操作错误标志。
备注:
参与者提出了两个关于他们是否可以使用其他解决方案来“绕过”挑战的问题:
Q1: Can I use False command injection to modified the coils output directly ?
答:PLC Configuration 未提供 PLC 线圈“允许读取”和“允许写入”设置 API,用户无法直接修改 PLC 的线圈。
Q2: Can I use ARP spoofing and MITM attack to modify the controller's Modbus request or Modbus response message directly ?
答:在比赛期间,我们允许参与者下载一些 ARP 欺骗/mitm 工具,例如 ettercap,但参考网络配置部分中的网络拓扑,我们在中间交换机上配置了静态 ARP 条目,因此大多数 ARP 欺骗/mitm 工具将无法工作。
结论
Palantir Control 挑战展示了 IT 漏洞如何级联到 OT 系统故障,从而暴露关键基础设施风险。通过结合 Web 漏洞利用、协议操纵和虚假数据注入,参与者弥合了 IT/OT 安全领域——这是防御工业环境的关键技能。如果您对关键基础设施 CTF 竞赛感兴趣,请不要错过 9 月 1 日的 CISS2025:https://itrust.sutd.edu.sg/ciss-2025/
感谢您花时间查看文章详情,如果您有任何问题和建议或发现任何程序错误,请随时给我留言。非常感谢您能提供一些评论并分享任何改进建议,以便我们能够改进我们的工作~
上次编辑者:LiuYuancheng([email protected]) 于 2025 年 6 月 6 日,如果您有任何问题,请给我留言。