工控系统渗透测试-一-

127 阅读1小时+

工控系统渗透测试(一)

原文:annas-archive.org/md5/80b080100a57bf810954ab78196440b9

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

工业网络安全行业近年来有了显著增长。为了真正保护今天的关键基础设施,红队必须不断测试和利用公司员工、流程和产品的安全性。本书与大多数书籍的不同之处在于,它帮助你获得与实际设备的动手经验,这些设备你将在实际工作中遇到。这样,你将能够理解工业设备如何在运营环境中相互作用和操作。

本书从帮助你掌握工业过程的基础开始,然后向你展示如何创建和破坏这一过程,同时收集开源情报,为你的潜在客户创建一个威胁环境。随着学习的深入,你将了解如何安装并使用专业黑客常用的进攻性技术。全书内容包括工业设备、开源情报收集、端口和服务发现、跳跃攻击,最后对工业网络中的系统发起攻击。

在本书结束时,你不仅能理解如何分析和应对工业控制系统ICS)的复杂性,还将获得重要的进攻性和防御性技能,以积极保护工业网络免受现代网络攻击。

本书的读者对象

本书最初只是一本工业渗透测试的手册,旨在帮助那些想了解工业渗透测试的人;然而,随着很多人向我询问如何进入操作技术OT)安全领域,它逐渐发展成了一本涵盖两个领域融合的书。我想尽量涵盖 OT 和 IT 人员这两个方面的内容。希望进行工业渗透测试的 IT 安全人员,将学习到工业渗透测试中的自动化和控制方面的知识;而想更好理解潜在威胁环境的自动化/控制工程师,则将学习更多关于 IT 网络方面的知识。

本书涵盖的内容

第一章使用虚拟化,将带你了解虚拟化的基本构建模块,然后逐步构建一个支持我们虚拟 ICS 实验室的虚拟机监控器(hypervisor)。

第二章硬件路由,介绍了设置可编程逻辑控制器PLC)的原理,并进一步讲解如何将该 PLC 连接到我们新创建的虚拟机监控器上的虚拟机。

第三章我爱我的比特 – 实验室设置,将带领我们完成编写、下载并上传第一个程序到 PLC 的步骤。

第四章开源忍者,教你如何运用 Google-Fu 技巧,在 LinkedIn 上过度分享,在 Shodan.io 上查找暴露设备,浏览 ExploitDB,最后利用国家漏洞数据库。

第五章如果你能做到,拦截我,教你关于 SPAN 和 TAP 的知识,以及它们如何在渗透测试中得到应用,接着我们将深入探讨入侵检测系统。

第六章数据包深入分析,带你了解典型数据包的结构,教你如何从网络中捕获数据包,并分析这些数据包中的关键信息。

第七章扫描 101,从构建一个实时 SCADA 系统开始,然后使用 NMAP、RustScan、Gobuster 和 feroxbuster 对我们的实时 SCADA 系统进行扫描技术操作。

第八章协议 202,深入探讨 Modbus 和 Ethernet/IP 协议以及我们如何利用这些协议在工业控制系统内执行渗透测试任务。

第九章忍者 308,利用 FoxyProxy 和 Burp Suite 分析并攻击 SCADA 用户界面。

第十章我可以做到 420,从安装和配置公司侧的防火墙开始,以提供更完整的实验室设置。然后,我们继续进行扫描、利用漏洞,最后获得反向 shell。

第十一章哇……我得深入,现在我们已经得到了 shell,探讨了如何运行后渗透模块以获取网络内部数据。我们将提升我们所攻破机器的权限,然后向下进行 pivot,深入到更低的网络段。

第十二章我看到了未来,通过带你了解如何利用前一步发现的凭证,并接入 SCADA 界面,从而实现对系统的最终控制,探讨了凭证重用的危险。

第十三章被攻陷但有悔意,讨论了核心交付物——报告。如果没有证据,测试真的发生了吗?我们将为未来的评估/渗透测试准备一个模板,然后讨论报告中包含的关键信息,最后,记录可以供蓝队未来保护其系统使用的建议。

为了充分利用这本书

你应该尽量获得一台能够支持 32GB 以上内存并至少有两个以太网端口的迷你 PC。Intel NUC、GIGABYTE BRIX 和 Zotac Z-Box 是适合运行虚拟镜像的非常有用的设备示例。

如果您使用的是本书的数字版本,我们建议您自己输入代码或通过本书的 GitHub 仓库获取代码(链接将在下一节中提供)。这样可以帮助您避免由于复制和粘贴代码而导致的潜在错误。

行动中的代码

本书的《行动中的代码》视频可以在 bit.ly/3iZpT2f 上观看。

下载彩色图像

我们还提供了包含本书中使用的截图和图表的彩色图像的 PDF 文件。您可以在此处下载:www.packtpub.com/sites/default/files/downloads/9781800202382_ColorImages.pdf

使用的约定

本书中使用了许多文本规范。

文本中的代码:表示文本中的代码词汇、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 账户。例如:“继续打开标记为 4SICS-GeekLounge-151021.pcap 的 PCAP 文件,使用 Wireshark。”

一块代码设置如下:

def run_async_server():

store = ModbusSlaveContext(

di=ModbusSequentialDataBlock(0, [17]*100),

co=ModbusSequentialDataBlock(0, [17]*100),

hr=ModbusSequentialDataBlock(0, [17]*100),

当我们希望您特别关注代码块的某个部分时,相关行或项会用粗体显示:

import logging

FORMAT = ('%(asctime)-15s %(threadName)-15s'

'%(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')

logging.basicConfig(format=FORMAT)

log = logging.getLogger()

log.setLevel(logging.DEBUG)

任何命令行输入或输出都如下所示:

tcpdump -i -v -X

粗体:表示新术语、重要词汇或您在屏幕上看到的词汇。例如,菜单或对话框中的词汇以 粗体 显示。示例:“我们将设置端口镜像,请从左侧菜单中选择 监控 选项,然后选择 端口镜像。”

提示或重要说明

以这种形式出现。

联系我们

我们始终欢迎读者的反馈。

一般反馈:如果您对本书的任何内容有疑问,请发送电子邮件至 customercare@packtpub.com,并在邮件主题中注明书名。

勘误表:尽管我们已尽一切努力确保内容的准确性,但错误仍然会发生。如果您在本书中发现错误,请报告给我们。请访问 www.packtpub.com/support/err… 并填写表单。

盗版:如果您在互联网上发现任何非法复制的本书作品,请提供该材料的网址或网站名称。请通过 copyright@packt.com 联系我们,并提供链接。

如果你有兴趣成为作者:如果你在某个领域有专业知识,并且有兴趣撰写或参与编写书籍,请访问authors.packtpub.com

分享你的想法

一旦你读完渗透测试工业控制系统,我们很想听听你的想法!请点击此处直接前往亚马逊的书籍评论页面并分享你的反馈。

你的评论对我们以及技术社区非常重要,将帮助我们确保提供优质内容。

第一部分 - 入门指南

工业控制系统ICS)是关键基础设施的核心。理解它们所影响的过程有助于深入了解所选供应商和运行的设备。由于 ICS 领域涵盖了多个行业,如电力、能源、化学、水务、制造业、交通、建筑管理和游乐园等,而这些主要行业下又有细分领域,如生产/发电、配送/分配和精炼等,因此构建一个全面的实验室变得困难。然而,出于所有目的,我们将构建一个测试实验室,作为探索战术、技术和流程的起点。这个入门实验室将帮助你建立一个基础,随着设备在多年中逐步积累,这个基础将具备可扩展性。

本节将涵盖以下章节:

  • 第一章使用虚拟化

  • 第二章硬件布线

  • 第三章我爱我的比特——实验室设置

第一章:使用虚拟化

本书的第一章涉及虚拟化的相关性以及熟悉不同版本的重要性,包括 VirtualBox、Hyper-V、KVM、VMware 等。然而,在本书中,我们将专注于 VMware,特别是 ESXi Hypervisor,因为它是免费的,并且在生产环境中能看到的东西的一个缩小版本。我们将启动 Hypervisor 来创建我们自己的实验室,在其中安装一些虚拟机VM),并尝试模仿虚拟监控与数据采集SCADA)环境。

在本章中,我们将涵盖以下主要内容:

  • 理解虚拟化是什么

  • 探索 VMware 是什么

  • 打开所有内容

  • 路由和规则

技术要求

对于本章,您将需要以下内容:

  • 支持虚拟化和双接口的计算机

  • VMWare ESXi

  • VMWare Fusion

  • Ubuntu 镜像

  • Windows 7 镜像

  • Kali Linux 镜像

以下是您可以导航到下载软件的链接:

理解虚拟化是什么

虚拟化,通俗来讲,是通过纯软件的方式模拟任意硬件和软件组合的方法。这使得任何人都可以运行和测试无数个主机,而无需承担硬件要求的财务负担和成本。如果您有发行版承诺问题,这将特别有用。

我无法强调理解虚拟化内部工作原理的重要性有多大。这项技术已经成为所有开发和测试都进行和构建的基础。我参与的每个项目都有其基础设施的大部分在某种虚拟化平台上运行。了解虚拟化如何运作的具体知识对于任何项目至关重要,您可以在您的受害者组织或技术上执行侦察,并在您的虚拟实验室内重现它。

通过进行一些简单的开源情报OSINT)工作,你可以轻松发现一个组织正在使用的网络设备,包括他们的防火墙技术、终端保护以及公司安装的操作技术入侵检测系统OT IDS)。有了这些信息,你可以访问你新发现的情报的官方网站,下载该软件的虚拟机实例,并将其与新搭建的本地虚拟环境一起运行。从这里,你可以规划每一个攻击角度,设计多种妥协场景,确定如何以及在哪里进入网络的低层段,构建利用已知漏洞的有效载荷,并最终获得王国的钥匙。这个技巧将在后续章节中进一步讨论,但要知道,它是构建攻击路径、渗透组织基础设施的关键。

虚拟化的一个最重要特性是使用快照。如果在任何时候,你“弄坏”了一台设备,你可以将其恢复到之前的状态,从头开始,记录下失败的尝试,并最终避免在实际操作中遇到同样的问题。这样,你可以尝试各种攻击方式,而不必太担心结果,因为你知道可以恢复到一个稳定的副本。我在职业生涯中接触过许多虚拟化厂商/产品,包括VMwareVirtualBoxHyper-VCitrixKVM。每个都有其优缺点。我默认使用 VMware,并将在本书中继续使用他们的各种产品。

无论如何,这绝不是对 VMware 的任何销售推广;只需要知道,VMware 更容易使用,因为其在整个产品生态系统中的集成几乎是无缝的,几乎让人感到恼火,因此它已经成为组织在其环境中采纳的中介。

理解虚拟化在渗透测试中的重要作用,将有助于你加强新兴的职业生涯。练习在每个平台上启动基本的虚拟机,将帮助你理解每个平台的细节,并学习虚拟硬件依赖关系的复杂性。作为奖励,通过熟悉每个虚拟化平台,你将能够找出你更喜欢哪款软件,并深入挖掘其细节。说到这里,我将使用 VMware 来构建实验室。

发现 VMware 是什么

VMware 成立于 1998 年,并于 1999 年推出了他们的首个产品,VMware workstation。公司成立三年后,他们将 GSXESX 推向了服务器市场。Elastic Sky XESX)一直保留该名称,直到 2010 年。之后,VMware 投入时间和资金对操作系统进行升级并现代化用户界面,增加了 "i" 字母,产品也因此被称为 ESX 集成ESXi)。如果你正在阅读这篇文章,我想我可以合理地假设你已经浏览过几本相关书籍,因为大多数书籍都涉及 桌面虚拟化管理程序,如 PlayerWorkstation 和/或 Fusion。接下来,我想更进一步,带你进行一些实际操作和 ESXi 的实践体验。

好吧,也许这有点像营销宣传,但我可以诚实地说,我从未为 VMware 工作,也没有因宣传他们的技术而获得任何版税。然而,我觉得如果不带你亲身体验一下这项技术,我会对你不公平,因为你在实际工作中一定会遇到它。我个人在石油和天然气、能源、化工、制药、消费品生产、离散制造和主题公园等领域遇到过 VMware,仅举几个例子。

一个典型的生产解决方案包括以下内容:

  • 分布式资源调度器DRS

  • 高可用性HA

  • 整合备份

  • VCenter

  • 虚拟机

  • ESXi 服务器

  • 虚拟机文件系统VMFS

  • 虚拟对称多处理SMP

若想更好地了解这些特定组件,请参考以下网页:www.vmware.com/pdf/vi_architecture_wp.pdf

我不打算深入探讨 VMware;相反,我只是想让你了解一些在参与工作时会遇到的技术组成部分。然而,我确实想强调核心技术栈,包括 vCenter、ESXi 服务器和虚拟机(VM)。这些几乎是大规模组织中所有虚拟化实施的基础。vCenter 控制着 ESXi 服务器,而 ESXi 服务器是虚拟机存在的地方。了解这一点将帮助你理解权限提升的路径,一旦你在公司运营层的虚拟机上站稳脚跟。多年来,我与安全人员进行了许多关于职责分离SoD)的讨论,负责应用程序的团队也乐意向我解释他们为遵守保密性完整性可用性CIA)所付出的巨大努力和艰难历程。在与这些团队进行桌面演练时,问他们“谁控制着你们应用所在的 ESXi 服务器?”然后接着问,“如果你们的 vCenter 被攻破,你们的暴露面有多大?”,你会发现,大多数情况下,他们的回答会让你震惊,甚至让你感到不寒而栗。我挑战你去问问你的 IT/OT 团队——或者任何管理你虚拟基础设施的人——每台服务器上运行了多少虚拟机。然后继续问,“你们上一次进行灾难恢复DR)故障转移测试是什么时候?” 知道关键控制是否运行在一个资源紧张的超负荷服务器上,从风险缓解的角度来看是非常有用的,但本书的目的是利用系统中一个被忽视的组件的弱点。

下图展示了我们之前提到的不同组件之间的关系,以及它们如何相互集成:

图 1.1 – VMware 基础架构

图 1.1 – VMware 基础架构

我曾为一家蒸汽辅助重力排水SAGD)重油公司工作,他们的部分声明内容是将Rockwell PlantPAX DCS虚拟化。这一切都建立在ESXi 集群之上,运行在一个强大的vSphere平台上。理解 VMware 的最大收获是,在企业级别,vSphere 是平台,而 ESXi 是虚拟机监控程序。在本书中,我将展示VMware Fusion的截图,它是 macOS 专用的桌面平台,还有 ESXi 的截图。如果你使用 Windows,有两个选择——VMPlayerVMWorkstation。我将重点介绍 ESXi,因为我认为理解这项技术是进行工业渗透测试的关键任务。

在本节中,我们介绍了 VMware 的基本概念,讲解了构建虚拟化栈的核心组件,并分享了一些你在实际环境中可能遇到的实例。接下来,我们将直接进入正题,启动所有服务。我们将从 VMware Fusion、VMware ESXi 和虚拟机的安装过程开始,为后续章节中的测试创建一个虚拟的 监控控制与数据采集SCADA)环境。

启动所有服务

既然我们已经简要了解了虚拟化是什么,下一步是通过安装 VMware Fusion、VMware ESXi 服务器和四个虚拟机来构建实验室的核心,以模拟 SCADA 环境。这更像是一个话题的引入或是我想全盘托出的声明,如果前两个部分让你觉得困难,那么接下来只会更难,并且有许多写得很好的资源可以参考或在深入探讨这个主题之前阅读。

话虽如此,让我们开始搭建实验室的虚拟部分。我不想当一个“数字土豪”,也不想在处理器、RAM、存储和其他琐事上浪费时间。不过,谈论硬件是不可避免的——换句话说,我们拥有的核心数和内存越多,就越好。我发现即使在配备 8 GB RAM 的Mac上运行Fusion也是可行的,但它非常受限,如果你打开 Google Chrome 进行任何研究,那就得准备好接受系统崩溃的现实,开始分页(请参阅下面的提示,了解这是什么意思)。

重要提示

当计算机内存不足时,系统会将部分内存内容从 RAM 移动到磁盘空间中,以释放内存供计算机继续运行。这一过程称为分页。Google Chrome 是导致这一问题的主要罪魁祸首之一。

由于这是一次痛苦的个人经历,我建议至少配备 16 GB 的 RAM 和 4 个核心。如今大多数系统默认都配备了这个配置。如果我说我在看新的PowerBook,它可以处理 64 GB 的 RAM 和 8 个核心,那我就是在说实话。现在,启动 ESXi 需要更强大的系统。我最初是用Dell PowerEdge R710开始我的实验室的。我四处寻找可以以最低成本获取的旧设备(或停用的设备),并发现了一些不错的交易。从那时起,我转向了Gigabyte BrixIntel NUC,它们的体积从厨房桌子的大小变成了手机的大小,噪音比吹风机低到图书馆里掉下的针一样,这些因素毫无疑问是让我选择 Brix 或 NUC 来运行 VMware ESXi 的原因。我还得说,我一直在关注SuperMicro IOT服务器,它允许使用服务器级内存,同时保持与 Gigabyte Brix 和 NUC 相似的小巧外形和低噪音比。未来的 ESXi 设置中,我将使用一个回收的加密矿机来构建我的服务器,因为我有几个这样的设备,可以让我向系统中添加更多内存。

快速规格如下:

  • AMD Ryzen 7 3800X

  • 128 GB RAM

  • 2 TB 或磁盘

这些并不是你必须遵循的要求。它们只是我从剩余的零部件中拼凑出来的。我个人推荐任何配备 16 GB 或更多 RAM 和至少两个网络接口的 Intel NUC 产品。

这是一个链接,你可以访问它来浏览他们的产品线:simplynuc.com/9i9vx/

在本节中,我们将涵盖以下子主题:

  • 如何安装 Fusion

  • 如何安装 Hypervisor

  • 启动 Ubuntu 作为伪可编程逻辑控制器PLC

  • 启动 Ubuntu 作为伪 SCADA

  • 启动 Windows 工程工作站

  • 启动 Kali Linux

  • 设置网络分段,以模拟类似于普渡大学的模型

开始吧!

如何安装 Fusion

安装 Fusion 的第一步是从以下链接下载 Fusion:

www.vmware.com/products/fusion/fusion-evaluation.html

这个过程应该是直接的,因为你可以选择使用 Fusion PlayerFusion Pro。我个人使用 Fusion Pro,因为在我使用的所有工具中,它被证明是最有效的。

一旦你安装了 Fusion,我们将继续安装 ESXi Hypervisor。我们将在本章稍后讨论实验室的网络设置。现在,请继续下载 Hypervisor。

如何安装 ESXi

安装 ESXi 的第一步是从以下链接下载 ESXi:my.vmware.com/en/web/vmware/evalcenter?p=free-esxi7

请注意,我将使用版本 6.7,因为我在为我的实验室拼装设备时遇到了硬件兼容性问题。

如何安装虚拟化软件

你需要执行以下步骤:

  1. 与工作站或 Fusion 不同,你需要创建一个VMware 账户。一旦你创建了账户并验证了身份,你就可以继续下载。你将进入以下页面,页面上会展示四个选项:一个是ISO文件,第二个是包含 VMware 工具的 ISO 包,一个是本地ZIP格式包,另一个是README文件:图 1.2 – 虚拟化软件下载列表

    图 1.2 – 虚拟化软件下载列表

    下载 ISO 文件后,你可以将其刻录到 USB 闪存盘上,然后用该 USB 闪存盘启动并执行裸机安装。这两种格式的主要区别在于,ZIP 格式允许用户进行微调并添加第三方驱动程序来发布和构建自定义 ISO。

    重要提示

    裸机安装指的是一台没有任何操作系统的机器,这是第一次在机器硬盘上安装操作系统。

    如果你打算在消费者级 PC 上执行裸机安装,这点尤为重要,因为标准的 ISO 包中并不涵盖所有网络驱动程序,且需要在发布前将它们添加到基础包中。我们在本书中不会涉及此内容。

  2. 选择 ISO 文件后,你将被引导到一个链接,提供哈希列表。这是良好的安全习惯,因为它为用户提供了哈希值列表,以验证下载包的有效性:图 1.3 – 文件完整性检查

    图 1.3 – 文件完整性检查

    如果我们没有通过运行哈希检查来确认文件的完整性,那我们就不是合格的安全从业人员了。这一点非常重要,以确保文件在传输过程中没有被篡改。现在,一些关注新闻的人可能会说,供应链攻击能够绕过这种验证。一个供应链攻击的例子是SolarWinds Orion,当时有人怀疑一个 APT 组织,名为Cozy Bear,更新了 Orion 的代码库,并使哈希检查失效,因为开发者发布了包含恶意软件和清洁代码的哈希值,然后验证它是否为真实来源。无论如何,始终检查文件的哈希值仍然是一个好的做法,可以防止脚本小子在你的实验室内立足。

    重要提示

    通常,脚本小子是一些经验不足的黑客,他们下载了一款软件,但并不完全理解运行该软件后的结果是什么,只是因为他们并不关心攻击的结果或影响,只要它能做点什么,他们就会运行它。

  3. 通过运行哈希检查来检查你新下载的 ISO 文件。正如以下截图所示,我进行了SHA-1检查,并将其与 VMware 提供的SHA1SUM检查进行了比较:图 1.4 – SHA-1 校验和

    图 1.4 – SHA-1 校验和

  4. 现在我们已经确认哈希匹配,我们需要将此内容刻录到USB 密钥上,以便可以从 USB 密钥启动并在服务器上安装 ESXi。我已经非常依赖balenaEtcher来创建可启动的 USB 密钥。一旦你手动制作了几百个,甚至上千个 USB 密钥,Etcher带来的简便性真的是一种福音。

  5. 访问balenaEtcher官网并下载软件,可以通过以下链接进行下载:www.balena.io/etcher/

  6. 下载balenaEtcher并启动工具。你将看到以下界面。你需要点击选择镜像并选择虚拟化管理程序镜像:图 1.5 – 选择要烧录的镜像

    图 1.5 – 选择要烧录的镜像

    由于balena会搜索 ISO 文件中的GPTMBR 分区表,如果未能找到,它会提醒用户,因此会出现以下警告。你可以继续闪存到 USB 密钥,因为从密钥启动应该没有任何问题:

    图 1.6 – 缺少分区表警告

    图 1.6 – 缺少分区表警告

  7. 点击继续后,工具会带你进入下一个界面,整个过程只需要几分钟。趁此机会休息一下,去补充你的咖啡或其他偏好的饮品,等你回来时,它应该已经完成。一旦完成,拔出 USB 密钥并插入你将要进行裸机构建的机器:图 1.7 – 刷写 USB 密钥

    图 1.7 – 刷写 USB 密钥

    过去,我在Intel NUCGigabyte BrixSupermicro IoTDell PowerEdge等服务器上构建过各种虚拟化管理程序服务器。为了演示,我决定重新利用一些以前用于加密货币挖矿的旧设备,但这是另一个话题,可能会在另一本书中讨论。根据你的实验室预算,我在eBay上找到了很多不错的设备,效果很好。我刚做了个快速搜索,找到了几台大约 $150.00 美元的 1U 服务器。

  8. 接下来,我假设你有合适的设备,可以从 USB 密钥启动并进行裸机安装虚拟化管理程序。一旦你开机,系统将从你新制作的 USB 密钥启动。你接着需要设置用户名密码,如以下截图所示,然后设置 IP 地址,可以通过 DHCP 获取动态地址,或者设置静态地址。一旦设置好了管理 IP 地址,你就可以打开网页浏览器并访问 GUI:图 1.8 – VMware ESXi 登录

    图 1.8 – VMware ESXi 登录

  9. 使用在安装过程中配置的用户名密码登录。认证通过后,您将看到 ESXi 的主机管理页面,如下截图所示:

图 1.9 – VMware ESXi 仪表盘

](image/Figure_1.09_B16321.jpg)

图 1.9 – VMware ESXi 仪表盘

如果您通过最小的努力已经到达这里,那么说明一切顺利。至此,我们已成功在实验室硬件上安装了 VMware Fusion 和 VMware ESXi。我们距离建立一个完全运行的工业控制系统ICS)实验室又近了一步。在接下来的章节中,我们将在新服务器上安装虚拟机(VM)。

将 Ubuntu 启动为伪 PLC/SCADA

我们将模拟一个虚拟的可编程逻辑控制器PLC)和SCADA组合,建立一个测试平台,以帮助我们在本书中逐步形成我们的操作方法。PLC 通常是一个小型的、坚固耐用的计算机,用于控制工业过程。这些过程可以从机场的人员搬运设备,到控制SpaceX 的猎鹰 9;从非常简单的开关任务,到非常复杂的级联控制任务。我们可以在石油和天然气、能源生成、传输和分配中找到自动化系统,确保我们可以给 iPhone 和 Android 设备充电;食品和饮料生产,例如可口可乐;化学混合和灌装;制药制造,例如辉瑞疫苗的生产;交通运输中的飞机电子设备用于控制飞机飞行系统;医院用于监控患者;以及更多的行业。PLC 无处不在,这些设备控制着我们日常生活中习以为常的事物。SCADA 是一个广泛的系统,用于控制一组更大范围的已定义过程。以人员搬运设备为例,您可以使用一个单独的 PLC 来控制人员搬运设备的本地开关行为和速度。然后,这些数据会被发布并由 SCADA 系统控制,允许操作员远程控制这个过程的运行。PLC 和 SCADA 的组合对于单一过程而言可能是过度的,但 SCADA 真正展现优势的地方是当您希望控制机场、购物中心,甚至是拉斯维加斯大道上的所有人员搬运设备时。SCADA 系统可以启动或停止单独的过程,或者同时启动或停止所有过程。它的强大之处在于,在设计安全防护时,确保保护该系统应该是最重要的。

现在这段简短的介绍结束了,我选择使用Ubuntu作为我的Linux 发行版。它由Canonical开发,并且是一个维护良好的发行版。熟悉它将有助于你前进,因为 Canonical 已经开发了UbuntuCore,它是一个支持物联网IoT)生态系统的操作系统。我提到这个是因为运营技术OT)行业正在慢慢转向采用物联网技术来替代传统设备。许多大厂商正在这个领域进行创新,以丰富他们的产品组合。好吧,未来的闲聊就到这里;让我们进入下载阶段:

  1. 首先,导航到以下链接以开始下载:ubuntu.com/download/desktop

    这将带你到一个类似这样的网页:

    图 1.10 – Ubuntu 软件下载

    图 1.10 – Ubuntu 软件下载

  2. 点击下载按钮,然后坐下来等它完成。根据你的网络连接,下载可能需要一些时间。

    下载完成后,我们可以继续安装操作系统。有多种方法可以做到这一点。一种方法是在 Fusion 上安装,然后连接到服务器,将虚拟机从 Fusion 上传到 ESXi。另一种选择是将 ISO 文件传输到 ESXi 的数据存储中,并从那里配置一个新的虚拟机,将 Ubuntu ISO 挂载在虚拟 DVD 驱动器上。我们将使用数据存储方法,因为我们希望尽可能少地使用本地资源,不想通过托管多个虚拟机来消耗本地计算机的资源。我们将登录到 GUI,在主机管理界面上,点击存储下的数据存储选项,如下图所示:

    图 1.11 – 存储数据存储

    图 1.11 – 存储数据存储

    根据你的设置,你可能只有一个磁盘多个磁盘。这种配置超出了本书的范围,但最终,这取决于你个人的偏好。

  3. 接下来,我们将点击数据存储浏览器按钮。屏幕上会弹出一个模态窗口,如下所示:图 1.12 – 上传浏览器

    图 1.12 – 上传浏览器

  4. 在这里,你需要选择将上传 ISO 文件的那个数据存储。然后,我喜欢创建一个目录,将所有 ISO 文件放在其中,便于以后快速调用。你可以看到创建名为iso_folder的目录的示例,见下图:图 1.13 – 创建新目录

    图 1.13 – 创建新目录

  5. 现在,您需要选择新创建的目录并点击上传按钮。这将打开一个Finder/Explorer窗口,您可以在其中选择刚刚下载的ISO文件。选择后,您将看到一个进度条,指示文件的完成情况,如以下截图所示:图 1.14 – 上传进度

    图 1.14 – 上传进度

    一旦文件上传完成,您将看到新上传的虚拟机出现在iso_folder中:

    图 1.15 – 已上传的 ISO

    图 1.15 – 已上传的 ISO

  6. 下一步是从屏幕左侧的导航器菜单中选择虚拟机。然后点击屏幕右侧的创建/注册虚拟机按钮,如以下截图所示:图 1.16 – 虚拟机仪表盘

    图 1.16 – 虚拟机仪表盘

  7. 一旦点击,这将弹出一个模态窗口,显示三个不同的选项:

    a. 创建新的虚拟机

    b. 从 OVF 或 OVA 文件部署虚拟机

    c. 注册现有虚拟机

    您可以在以下截图中看到这一点:

    图 1.17 – 创建虚拟机

    图 1.17 – 创建虚拟机

    我们将在这里选择创建新的虚拟机选项。这将弹出另一个窗口。从这里,我们需要填写名称兼容性客户操作系统系列客户操作系统版本等选项。兼容性是一个选项,允许虚拟机访问特定版本的虚拟硬件。我们可以在以下截图中看到这是什么样子的:

    图 1.18 – 兼容性选择

    图 1.18 – 兼容性选择

  8. 点击下一步。您将进入一个新界面,您可以在其中选择希望在哪个数据存储中启动新的PLC 虚拟机。我选择了VM-Storage并点击了下一步图 1.19 – 选择存储页面

    图 1.19 – 选择存储页面

    下一屏幕允许您自定义我们正在加载的虚拟机。由于这台虚拟机将模拟一个 PLC,我们希望保留与真实现成设备相同的资源配置。关键点将是我们加载到CD/DVD 驱动器 1中的Datastore ISO文件。

    如下截图所示,我选择的规格是1CPU,1GB RAM,40 GB 磁盘空间,VM 网络Datastore ISO(Ubuntu ISO):

    图 1.20 – 自定义设置页面

    图 1.20 – 自定义设置页面

    我们将在下一节配置网络,使其遵循准普渡模型。普渡模型是用于分段工业网络的理论框架。已经出版了许多书籍,详细记录了根据普渡模型对网络进行建模的实用性,因此我强烈推荐你拿一本来阅读。普渡模型是一种应用标准进行分段的方法,尽管已经创建了许多其他标准,而且许多都是行业特定的。在北美,针对公用事业行业的北美可靠性公司关键基础设施保护NERC CIP)是一套可靠性标准,用于遵循安全最佳实践。化学设施反恐标准CFATS)是专门为化学工业制定的,但这些标准之间有很多重叠。国际标准化组织ISO/IEC)27000 系列,特别是 ISO-27002,已经在北美以外地区采用,此外还有国际自动化学会ISA)99 或 ISA 62443,这是普渡模型的最终来源。

  9. 现在,点击完成。这将把已配置的虚拟机放入数据存储区。然后,我们将运行该虚拟机,它将引导我们进入 Ubuntu 安装过程。我们可以通过点击以下截图中显示的绿色开机按钮来完成:图 1.21 – PLC 虚拟机

    图 1.21 – PLC 虚拟机

  10. 点击开机按钮后,您将看到如下页面:图 1.22 – 启动虚拟机

    图 1.22 – 启动虚拟机

  11. 按照通常安装任何 Linux 发行版的方式安装Ubuntu。安装完成后,您应该会看到如下所示的登录界面:

图 1.23 – PLC 虚拟机的登录界面

图 1.23 – PLC 虚拟机的登录界面

我们将重复所有步骤,创建名为 PLC 的虚拟机:

  1. 创建一台新虚拟机。

  2. 加载存储区中的 Ubuntu ISO DVD。

  3. 选择 1 个 CPU、4GB 内存、40GB 硬盘和一个虚拟机网络接口。

  4. 点击开机按钮。

  5. 如同之前一样进行安装。

现在,将虚拟机命名为 SCADA。现在你有了两台 Ubuntu 虚拟机——一台名为 PLC,另一台名为 SCADA——接下来的步骤将是更新虚拟机,并添加我们希望用来模拟虚拟 PLC的关键软件包。

首先,登录到PLCSCADA虚拟机,并运行以下命令:

sudo apt update

sudo apt upgrade

这将确保你拥有最新版本的核心软件包,构成你的 Ubuntu 机器。接下来,我们将安装特定软件包,以便能够创建虚拟 OT 实验室

需要安装的关键软件包如下:

sudo apt install git

sudo apt install vsftpd

sudo apt install telnetd

sudo apt install openssh-server

sudo apt install php7.4-cli

sudo apt install python3-pip

pip3 install twisted

pip3 install testresources

pip3 install pytest

pip3 install cpppo

pip3 install pymodbus

下一步我们必须做的是克隆一个特定的工具。

运行以下命令:

git clone github.com/sourceperl/…

cd mbtget

perl Makefile.PL

make

sudo make install

几乎每个软件包都有独立的书籍来详细介绍,所以在这里我不会深入细节,而是会解释每个软件包的背后原因。

它们如下所示:

  • git:我们将使用这个工具克隆一个用Perl 编写的简单 Modbus 客户端,名为 mbtget

  • vsftpd:这是一个非常简单的 FTP 守护进程,允许我们模拟网络中的配置文件传输。

  • telnetd:这是一个 Telnet 守护进程,也将帮助我们模拟网络中的配置文件传输。

  • openssh-server:这允许我们通过 ssh 连接到 PLC 进行命令和控制。

  • php7.4-cli:这将帮助我们在本书后面模拟 PLC 接口。

  • python3-pip:这是一个专门用于 Python 3 的包管理器。

接下来的软件包是专门为 Python 编写的:

  • twisted:一个网络引擎,是 pymodbus 的依赖。

  • testresources:一个单元测试包,是 pymodbus 的依赖。

  • pytest:一个测试引擎,并且是 Cpppo 的一个依赖。

  • cpppo:一个用于测试各种工业协议的有用引擎。在本书中,我们将重点介绍 Ethernet/IP。

  • pymodbus:这是一个可以作为客户端/服务器使用的 modbus 引擎。

下一个软件包是 mtbget,它是Perl 特定的。它是一个 modbus 客户端,非常有用于现场测试设备。

目前我们在 ESXi 服务器中运行着两台完全更新的 Ubuntu 机器。我们还安装了各种软件包,这些软件包将帮助我们模拟 PLC 与 SCADA 之间的关系。我们还可以通过不同的协议生成远程连接,这将在后续章节中派上用场。接下来,我们将构建一个工程工作站和一个 Kali Linux 攻击盒子。

启动 Windows 工程工作站

如果你能够顺利完成安装,那么我们就离拥有一个完善的虚拟实验室更近了一步。接下来,我们需要获取一个Windows 7 镜像。这很重要,因为我们配置和与物理硬件通信所需的软件大部分是为 Windows 开发的。严格来说,它最初是为 Windows XP 开发的,后来升级到了 Windows 7\。

按照我们构建 Ubuntu 虚拟机的步骤,我们将创建我们的 Windows 7 机器:

  1. 创建一个新的虚拟机。

  2. 加载存储库中的 Windows7 ISO 的 DVD。

  3. 选择 1 个 CPU,4 GB 内存,40 GB 硬盘和一个 VM 网络作为接口。

  4. 点击开机按钮。

  5. 安装 Windows。

安装并登录 Windows 后,你应该看到一个类似于以下的界面:

图 1.24 – Windows 7 虚拟机

图 1.24 – Windows 7 虚拟机

现在我们的 Windows 7 虚拟机已经运行,我们将继续安装 Kali Linux。

启动 Kali Linux

Kali Linux是一个专为安全研究评估渗透测试等设计的 Linux 发行版。尽管名称自检查软件包以来有所变化,但它仍然是市场上最广泛使用的安全工具之一。

点击这里下载您的 Kali Linux 副本:www.kali.org/downloads/.

我们将使用Kali Linux对实验室中的设备进行测试,包括虚拟和物理设备。这是一个全面的平台,包括gpg 签名的软件包,并有一个庞大的开发社区。还有许多其他显著的渗透测试框架,如现在的controlthings.io,以前称为SamuraiSTFUControlThings提供了一系列专门针对 ICS/OT 环境的工具,还包括了用于测试目的的pcaps回放功能。此外,它们还提供了无数的仿真器,使您可以真正磨练评估技能。Parrot OS是一个安全平台,因其用户友好的界面、低内存消耗和默认的匿名浏览功能而广受欢迎。它是您渗透测试工具库中的一个强大框架。

Kali Linux 有一个简单直接的安装过程。

您需要按照之前为 Ubuntu 和 Windows 7 执行的相同步骤,将 Kali ISO 上传到数据存储,并将 ISO 挂载到 DVD 驱动器上并引导虚拟机。

接下来,根据您所在地区的选项进行安装设置。虚拟实验室的一个很棒的部分是,一旦启动了一台机器,您可以调整其硬件设置。以下截图显示了我开始使用的硬件配置设置:

图 1.25 – Kali Linux 配置

图 1.25 – Kali Linux 配置

安装过程的最后一步是选择要安装的软件。我个人选择了large版本以预装更多工具。这个选择如下截图所示:

图 1.26 – 软件选择

图 1.26 – 软件选择

接下来,使用在初始安装过程中设置的用户登录Kali系统。

提示

一些关于BackTrack/Kali凭据的快速历史是,root:toor自我开始使用BackTrack 4以来一直是默认凭据。现在,它们已经更改为kali:kali。所以,如果你恰好是Blue Team阵营的一员,请确保为这些已知凭据建立一个入侵检测规则IDR)。

你将看到一个登录屏幕,如下截图所示:

图 1.27 – Kali Linux 登录界面

图 1.27 – Kali Linux 登录界面

接下来,我们将像在 Ubuntu 中一样更新 Kali,并安装与之前安装的类似的软件包。

关键软件包使用以下命令安装:

  • sudo apt install python3-pip

  • pip3 install pymodbus

  • pip3 install cpppo

  • git clone (github.com/sourceperl/mbtget.git)

  • cd mbtget

  • perl Makefile.PL

  • make

  • sudo make install

现在,如果没有出现错误,您应该在您的虚拟化平台上安装了四个虚拟机,如下截图所示:

图 1.28 – 虚拟机

图 1.28 – 虚拟机

在本节中,我们安装了一个 Windows 7 工程工作站和一个将在实验室中模拟攻击者的 Kali Linux 主机。我们将从这里启动各种枚举、利用和攻击。在下一节中,我们将继续通过设置与 Purdue 模型 相关的 层次 来设计和实施网络分段。

路由和规则

在设置我们的 虚拟实验室网络 时,我们希望尝试模仿真实世界的分段策略。话虽如此,谈论 OT 网络时很难不提及 Purdue 模型。这个模型已被几乎所有行业用作构建网络分层基线的参考方法。这些层次如下:

  • Level 5: Enterprise

  • Level 4: Site Business Systems

  • Level 3: Operations and Control

  • Level 2: Localized Control

  • Level 1: Process

  • Level 0: I/O

因此,忠于原则,我们将在我们的实验室中采取相同的方法。我们将首先将虚拟 PLC 放入 Level 1,将 SCADA VM 放入 Level 2,将 Windows 7 工程工作站放入 Level 3,最后将我们的 Kali Linux 攻击主机放入 Level 5。我们需要登录 ESXi 并点击 Networking。这将显示一个屏幕,显示与 ESXi 网络基础设施相关的多个选项卡,如下所示:

图 1.29 – 网络仪表板

图 1.29 – 网络仪表板

我们将在 Virtual switches 选项卡上创建一个新的交换机。首先填写 vSwitch Name 选项并将 Link discovery Mode 更改为 Both,如下截图所示。这允许有关物理和虚拟交换机的详细信息被发布并可用:

图 1.30 – 配置虚拟交换机

图 1.30 – 配置虚拟交换机

我们将返回并在第五章中更改 Promiscuous modeSpan Me If You Can,当我们讨论 入侵检测系统(IDS) 时。完成后,您应该看到您的新虚拟交换机。

接下来,我们想进入端口组标签。从这里,我们点击添加端口组,这将弹出一个窗口,在这里我们可以设置名称VLAN,并将端口组与虚拟交换机关联。对于端口安全性,我们将默认继承之前步骤中创建的vSwitch1的安全设置。所有这些细节可以在以下截图中看到:

图 1.31 – 端口组配置

图 1.31 – 端口组配置

现在,我们想通过添加剩余的网络来完成该过程:

  • 企业

  • 站点业务系统

  • 操作与控制

  • 本地化控制

完成后,您将看到与专用交换机关联的端口组。请注意,完成分段并遵循普渡模型有多种方式:

图 1.32 – 端口组仪表盘

图 1.32 – 端口组仪表盘

如您所见,我们的所有虚拟机仍与 VM 网络关联。下一步是将虚拟机移入各自的独立段,并手动设置它们的 IP 地址和范围。我们将从 PLC 虚拟机开始,因此我们需要从导航栏选择虚拟机,然后点击PLC 虚拟机。点击编辑按钮,这将带您到以下页面:

图 1.33 – 端口组选择

图 1.33 – 端口组选择

我们想将网络适配器VM 网络切换到Level 1: 进程,然后点击保存。接下来,我们需要手动设置 PLC 的 IP 地址。所以,我们需要打开控制台,登录 PLC,并导航到网络设置

您将看到以下页面:

图 1.34 – 网络设置

图 1.34 – 网络设置

从这里,我们可以点击有线设置选项。然后,会弹出一个窗口。接下来,您需要选择位于紫色滑块旁边的齿轮图标,如以下截图所示:

图 1.35 – 有线网络接口

图 1.35 – 有线网络接口

在这一点上,我们应该花点时间讨论我们的 IP 地址方案。

在这里,我们将每个网络段拆分为专用的 IP 范围,如下表所示:

现在,我们可以为我们构建的虚拟机预先分配 IP 地址。

我们将分配以下 IP 地址:

  • PLC**: **192.168.1.10

  • SCADA**: **192.168.2.10

  • **工作站: **192.168.3.10

  • Kali**: **172.16.0.10

我们可以通过在基于 Linux 的发行版上运行ip addr命令来检查机器,以确保 IP 地址已生效,如以下截图所示:

图 1.36 – 检查网络地址

图 1.36 – 检查网络地址

在此,选择 IPv4,然后选择 手动 选项。为所有三个 – PLC、SCADA 和 Kali 设置 Linux 基础的发行版 IP 地址的选项应出现在 地址 下,如以下截图所示:

图 1.37 – Ubuntu 手动 IP 配置

图 1.37 – Ubuntu 手动 IP 配置

现在,我们可以继续进行 Windows 7 配置,并在那里手动设置 IP 地址。Windows 7 配置如下所示:

图 1.38 – Windows 7 网络配置

图 1.38 – Windows 7 网络配置

确保 PLC、SCADA 和工作站能够互相 ping 通,通过运行 ping 命令,如以下截图所示:

图 1.39 – 检查虚拟机之间的通信

图 1.39 – 检查虚拟机之间的通信

我们现在已经成功地设置了网络分段,使其代表 Purdue 模型。所有 IP 地址都已静态设置,并且我们已经测试了各个层级和虚拟机之间的通信。

概述

在本章的介绍中,我们涵盖了相当多的细节。我们提到了虚拟化的重要性,以及熟悉不同平台提供商的必要性。通过安装自己的 Fusion 桌面和 ESXi 服务器,我们对 VMware 进行了深入了解。然后,我们下载并安装了四个独特的虚拟机,并配置了网络方案,使其与 Purdue 模型对齐。

经过这一系列努力,我们现在已经为构建实验室奠定了坚实的基础。接下来,我们将通过根据需要添加软件并利用攻击虚拟机运行我们设计的场景,继续构建这个实验室。

在下一章中,我们将通过安装与我们的硬件 PLC 通信的工程软件,构建实验室的物理组件。

第二章:路由硬件

本章将带你踏上理解如何将物理硬件连接到虚拟基础设施的精彩旅程。了解一台运行ESXi的机器如何将通信路由到本地可编程逻辑控制器PLC)、人机界面HMI)及其他类似设备。首先,本节将使用Koyo Click软件和硬件,因为 Koyo Click PLC 是一个非常具成本效益的选择,而其工程编程软件是免费的,这与其他主流厂商需要支付高额费用来获得编程软件许可证的做法不同。需要注意的是,本章讨论的原理和方法也适用于其他自动化厂商,如西门子、罗克韦尔、施耐德、欧姆龙、三菱等。如果获取 Koyo Click 比较困难,你可以选择你自己的 PLC 进行学习。请注意,你需要获得所选厂商的工程编程软件。我们将安装Click 软件,设置物理PLC,并最终配置虚拟机与物理 PLC 之间的通信。

熟悉工业技术的编程方式将极大提高你在渗透测试中的成功率。了解软件的反应机制、它所使用的资源以及通信方式将帮助你发现潜在的入口点。

本章将涵盖以下主要内容:

  • 安装 Click 软件

  • 设置 Koyo Click

  • 配置通信

技术要求

本章所需的设备:

安装 Click 软件

欢迎来到本章的第一个主题。在本节中,我们将一步步演示如何安装 Koyo Click 软件。这个软件将帮助我们与 Koyo Click PLC 进行通信,并上传和下载程序。

在开始之前,我想再次强调,这不是 Koyo Click 或 AutomationDirect 的销售宣传;它只是一个非常灵活、多功能、全面且具有成本效益的 PLC 选择。此外,AutomationDirect 是一个一站式商店,你可以在这里下单并获得构建完整实验室所需的一切。

在我们开始之前,让我们访问 AutomationDirect 网站。请点击以下链接:www.automationdirect.com/support/software-downloads?itemcode=CLICK

我们将下载来自 AutomationDirect 的 Koyo Click 编程软件。一旦你访问了上述链接,你将看到以下界面:

图 2.1 – 点击软件下载

图 2.1 – 点击软件下载

接下来,点击绿色的下载按钮,系统会弹出通知并要求输入电子邮件地址,如图 2.2所示,随后需要进行电子邮件地址确认以继续操作:

图 2.2 – 电子邮件确认

图 2.2 – 电子邮件确认

一旦你的电子邮件地址确认无误,软件开始下载。现在你应该已经下载好了软件。你需要将其传输到我们在第一章中创建的Windows 7 虚拟机上,使用虚拟化。有很多方法可以做到这一点——在虚拟机上建立第二个接口并将其放置在ESXi 虚拟化主机的网络段中是一种可行的方式。传输文件有多种不同的协议/工具。我通常选择最简单的方式,这已经成为我的第二天性。在评估过程中,我通过简单地启动一个Python 3 网络服务器,并让Windows 7 机器访问该文件并下载,完成了许多文件传输和反向 shell 推送操作。

以下是启动 Python 3 网络服务器的命令:

图 2.3 – 启动 python3 网络服务器

图 2.3 – 启动 python3 网络服务器

当客户端连接时,你可以看到 HTTP 200 OK 成功状态响应代码,如下所示:

图 2.4 – 成功状态的响应代码

图 2.4 – 成功状态的响应代码

如你所见,Windows 7 机器已连接并下载了软件文件。下图显示了本地服务器上托管的目录列表

图 2.5 – Python HTTP 服务器目录列表

图 2.5 – Python HTTP 服务器目录列表

我提到这个是因为将来建立这种习惯会非常有用,它将在未来的渗透测试工作中派上用场,特别是当你需要在主机和你试图破解的机器之间移动文件时。

该截图展示了可以提取的CD 镜像,以启动安装过程:

图 2.6 – Koyo Click CD 镜像

图 2.6 – Koyo Click CD 镜像

现在我们已经将软件下载到 Windows 7 虚拟机VM)上,我们需要提取光盘镜像并运行随后的安装选项:

图 2.7 – 安装点击软件

图 2.7 – 安装点击软件

这时会弹出一个用户帐户控制UAC)对话框,如图 2.8所示,我们需要点击按钮。点击后,软件将生成一个对话框,允许我们安装CLICK 编程软件

图 2.8 – 接受 UAC 安装验证

图 2.8 – 接受 UAC 安装验证

接下来的截图将引导你完成安装点击编程软件。我们首先点击安装软件按钮,如下图所示:

图 2.9 – 点击编程软件

图 2.9 – 点击编程软件

现在你应该能看到如图 2.10所示的页面。点击下一步 >按钮继续执行InstallShield 向导,此时会弹出一个对话框提示你在 Windows 7 机器上禁用防病毒软件,因为它会导致编程软件无法正确和完全安装:

图 2.10 – 点击 InstallShield

图 2.10 – 点击 InstallShield

要启用此功能,只需点击确定,确认防病毒软件未开启,理论上它不应该开启,因为我们在第一章中并未安装任何防病毒软件,使用虚拟化

图 2.11 – 防病毒检查

图 2.11 – 防病毒检查

在下一个截图中,我们要接受许可协议并点击下一步 >

图 2.12 – 许可协议

图 2.12 – 许可协议

这将导致出现如图 2.13所示的页面。在框中填写用户名公司名称。从图 2.13中你可以看到,我使用了我的名字保罗·史密斯ICS Lab作为公司名称。这是一个示例,你需要填写你自己的信息:

图 2.13 – 配置客户信息

图 2.13 – 配置客户信息

现在将加载以下页面:

图 2.14 – 选择目标位置

图 2.14 – 选择目标位置

在这个页面上,你将选择软件安装的目标位置。我个人保持了默认文件夹结构,如图 2.14所示,在更改按钮的左侧。然后,点击**下一步 >**按钮,接着会生成另一个对话框,让你继续点击如下:

图 2.15 – 安装程序

图 2.15 – 安装程序

安装程序完成后,InstallShield 会询问您是否要创建桌面图标,如图 2.16所示。我选择了此选项,因为以后更容易找到:

图 2.16 – 创建桌面图标

图 2.16 – 创建桌面图标

最后,我们完成了安装,过程应该不算太痛苦。点击完成,如图 2.17所示,然后启动软件:

图 2.17 – 完成安装

图 2.17 – 完成安装

双击CLICK 编程软件图标启动程序。它应该会像下面这样显示在您的桌面上:

图 2.18 – CLICK 编程软件图标

图 2.18 – CLICK 编程软件图标

这将启动以下对话框,允许我们开始一个新项目打开现有项目连接到 PLC

图 2.19 – 开始一个新项目

图 2.19 – 开始一个新项目

一旦我们到达这里,一切都已设置完毕,准备就绪。

现在,如果我不指出明显的问题,那就对不起你了,也许你正问自己同样的问题:哈希在哪里? 这是水坑攻击的典型例子。水坑攻击是一种攻击手段,攻击者通过毒害软件包或更新,并将其发布到一个网站上,供设备或软件的用户下载这个已损坏的文件。这与我们在第一章中简要提到的SolarWinds攻击非常相似,使用虚拟化。如果一个广泛使用的技术被入侵,这种攻击可能带来非常深远且广泛的影响。

因此,今后,请特别留意获取工业控制系统ICS)设备的软件来源以及它对您的 SCADA/ICS 系统可能产生的控制影响。现在我们将继续进行硬件设置,但稍后我们将回到软件部分。

设置 Koyo Click

我有几种不同型号的设备,但我将重点介绍C0-10ARE-D型号,这是以太网基础 PLC 单元。如果您没有 Koyo Click,也可以使用任何其他类型或型号的 PLC 和工程软件来进行操作。选择使用 Koyo 是因为它是我手头有的少数几台备用控制器之一,而且它没有被用于项目中。然而,更重要的是,这台设备专门用于该 PLC 的以太网通信端口,并且其工程软件是免费的。此外,它利用离散 I/O 来驱动和断开线圈的电流,并将有助于在我们ICS实验室中建立实际过程与设备之间的关联。

默认情况下,Koyo Click 配备了两种本地协议:

  • Modbus

  • 以太网/IP

如果你还记得上一章,我们安装的工具专注于这些协议,以便我们通过本地通信路径与设备进行交互。现在,关于Koyo Click的另一个吸引人的特点是设计可扩展性,Click 的模块化使其能够添加不同的控制功能,从模拟到数字,再到继电器控制和专用模块。你可以将它们堆叠在一起,扩展控制范围,适应几乎任何项目,并且拥有无限的 I/O。

以下链接将带你到AutomationDirectCLICK PLC设备:www.automationdirect.com/adc/overview/catalog/programmable_controllers/click_series_plcs/

现在,你可以为 PLC 运行自己的电源,但是考虑到 C0-01AC 的价格,将它们打包在一起同样方便。我建议选择 01AC 而不是 00AC 电源的原因是,你可以为实验室做好未来规划,而 01AC 具有 1.3A 的电流,能够支持并驱动完全扩展的控制器。

这是C0-01AC电源的图片:

图 2.20 – C0-01AC 电源

图 2.20 – C0-01AC 电源

这是我将在实验室使用的 Koyo Click 型号C0-10ARE-D的图片:

图 2.21 – 控制器

图 2.21 – 控制器

一旦你在实验室里有了电源和 PLC,确保将墙壁上的端子接到电源上,再将电源连接到控制器的底部。

你将看到为控制器提供电源所需的端子。现在我们已经为控制器提供了电源,接下来连接一根以太网线,将 PLC 与计算机连接起来。这可以通过直接连接或通过交换机完成。

下一步是打开 CLICK 编程软件,选择连接到 PLC,这时会弹出一个Windows 安全警告对话框,询问你是否允许这种连接类型在私人网络和公共网络上进行。由于这是一个实验室并且是隔离的,我选择启用这两个选项,如下截图所示:

图 2.22 – 防火墙访问

图 2.22 – 防火墙访问

一旦你点击了屏幕底部的允许访问,将会弹出一个对话框,允许你连接到CLICK PLC。在这里,你需要选择端口类型,有三种选择:

  • USB

  • 串行

  • 以太网

我们当然会选择以太网,然后继续选择下一个选项,即选择特定的网络适配器。根据你的系统,可能会有多个适配器。选择一个与CLICK PLC有连接路径的网络适配器。如果在 PLC 和 Windows 7 虚拟机之间存在路径,你应该能看到 PLC 的IP 地址子网掩码部件号固件模式状态MAC 地址,如以下截图所示:

图 2.23 – 连接到 PLC

图 2.23 – 连接到 PLC

从这里,你可以选择 PLC 并点击连接按钮。这时会显示另一个Windows 安全警报,但这次是针对通信服务器,并允许它在私有或公共网络上进行通信。你可以在以下截图中看到它的样子:

图 2.24 – 允许防火墙访问

图 2.24 – 允许防火墙访问

点击屏幕底部的允许访问。一旦点击,你应该会看到一个网络不匹配的错误,如下图所示,因为我们仍然需要通过ESXi配置到 PLC 的网络连接,并将 PLC 置于正确的网络中:

图 2.25 – 子网匹配错误

图 2.25 – 子网匹配错误

这引导我们进入本章的下一部分,在这一部分中,我们将配置硬件以进行通信,并确保位于正确的子网中。

配置通信

现在我们知道有一条路径通向物理 PLC,但我们无法与之通信。解决方案是,我们需要调整 Windows 7 虚拟机的 IP 地址,使其与 PLC 所在的子网对齐。这将允许我们直接连接到 PLC 并将地址配置为与上一章中为虚拟 PLC 设定的子网对齐。

通过查看图 2.26,我们需要确保为 Windows 7 提供一个可以 ping 通 Koyo CLICK 的IP 地址。我决定任意选择192.168.0.20,因为我的 CLICK 的默认地址是192.168.0.10,然而根据你的 Koyo CLICK 的默认地址,你需要适当地调整它:

图 2.26 – 配置 Windows 界面

图 2.26 – 配置 Windows 界面

一旦设置了 IP 地址,你可以启动 CLICK 编程软件并点击连接到 PLC,然后选择你看到的 PLC。如果一切配置正确,你应该会看到如图 2.27所示的页面。此步骤将允许你读取 PLC 中的现有项目,或直接跳过读取:

图 2.27 – PLC 中的预先存在的项目

图 2.27 – PLC 中的预先存在的项目

提示/重要说明

始终从 PLC 读取项目是一个良好的做法。很有可能没有人备份当前运行的项目文件,而这次连接可能是唯一获取副本的机会。

如果攻击者在此级别取得立足点,能够访问 PLC 并读取/写入项目文件,他们不必是 L337 高手也能造成重大破坏。他们只需要将一个空白项目文件写入 PLC,过程就会停止。如果他们没有本地备份,这可能意味着数百万美元的损失,因为停机时间。大公司通常会将这些备份的责任和管理交给他们外包的第三方工程公司,这些公司负责设备的运行和维护。

在下方的截图中,你可以看到有两个选项呈现给我们。如前所述,我们将选择从 PLC 读取项目

图 2.28 – 读取项目文件

图 2.28 – 读取项目文件

现在,你应该看到一个空白项目摆在你面前。我们将去更改 PLC 地址信息,以便与我们在第一章中提到的设计相对接,使用虚拟化。你需要点击设置,然后选择通信端口设置,如以下截图所示:

图 2.29 – 通信端口设置

图 2.29 – 通信端口设置

这将向你展示 CLICK PLC 的布局,并让你选择两个可用端口的设置。继续选择端口 1设置,这将是以太网端口,如以下截图所示:

图 2.30 – Koyo Click COM 端口设置

图 2.30 – Koyo Click COM 端口设置

从这里,你可以看到如以下截图所示的两个选项:

  • 使用默认固定地址

  • 手动设置:

图 2.31 – 通信端口设置详情

图 2.31 – 通信端口设置详情

我们将手动设置这些信息,所以选择手动设置选项,如图 2.32所示。

这将打开IP 地址子网掩码默认网关

图 2.32 – 设置 IP 地址

图 2.32 – 设置 IP 地址

根据第一章中提到的使用虚拟化,我们知道我们的虚拟 PLC 位于第 1 级:过程中,正如以下表格所示:

接下来,我们将为我们构建的虚拟机预先分配 IP 地址。

我们将分配以下 IP 地址:

  • PLC192.168.1.10

  • SCADA192.168.2.10

  • 工作站192.168.3.10

  • Kali172.16.0.1

我们将设置物理 PLC 与虚拟 PLC 在同一子网中,设置如下:

  • CLICK192.168.1.20

  • 设置 IP 地址192.168.1.20

  • 设置子网掩码255.255.0.0

  • 设置网关192.168.1.1

现在,要提交更改,你需要将项目写入 PLC,导航到 PLC 菜单,选择写入项目到 PLC...,如下图所示:

图 2.33 – 写入项目到 PLC

图 2.33 – 写入项目到 PLC

如果你跟着操作,编程软件应该会抛出一个像这样的错误:

图 2.34 – 语法错误

图 2.34 – 语法错误

如果你查看输出窗口,你应该会看到一个有用的提示,内容是主程序中没有无条件的 END 指令,如下所示:

图 2.35 – 调试窗口

图 2.35 – 调试窗口

如果出于某些原因,你没有看到输出窗口,请导航到视图 | 窗口 | 输出来开启它,以下截图演示了这一点:

图 2.36 – 视图选择

图 2.36 – 视图选择

在这里,我们需要向某个梯级添加一个无条件结束。查看指令列表,滚动直到你找到End功能,如下所示:

图 2.37 – 指令列表

图 2.37 – 指令列表

接下来,将End功能拖到其中一个( NOP )输出位置,如下所示:

图 2.38 – 梯形图

图 2.38 – 梯形图

你应该看到END功能替换了( NOP )作为输出:

图 2.39 – 指令替换

图 2.39 – 指令替换

现在,让我们返回到写入项目到 PLC,回顾一下,这个选项在PLC菜单项下。现在我们的项目应该可以编译并显示一个对话框,展示我们对端口 1所做的更改。点击新更改的 Port1 配置底部的按钮,按钮上标有使用此设置,如下所示:

图 2.40 – 设置项目详情

图 2.40 – 设置项目详情

一旦点击,它会显示一个错误,指出 Windows 7 虚拟机与 CLICK 之间的通信将丢失,以下截图展示了这一点:

图 2.41 – 确认更新

图 2.41 – 确认更新

点击确定,并继续到写入项目到 PLC界面,如下所示:

图 2.42 – 写入项目详情

图 2.42 – 写入项目详情

在这里,我们会被提示进行最终检查,在将更改推送到 PLC 之前。如果没有错误,点击确定,完成后你将看到一个传输完成的对话框,如下所示:

图 2.43 - 传输完成

图 2.43 - 传输完成

现在你可以看到 IP 地址已经改变,所以点击 Figure 2.44 中显示的 连接 按钮,你应该会收到超时错误。这没关系,因为我们移动了子网:

Figure 2.44 – PLC 连接

Figure 2.44 – PLC 连接

现在,如果你回忆起我们的 ESXi 网络架构,你会注意到 未设置物理适配器,如 Figure 2.45 所示。这意味着虚拟 PLC 和物理 PLC 之间无法通信:

Figure 2.45 – vSwitch 拓扑结构

Figure 2.45 – vSwitch 拓扑结构

我们可以通过登录到虚拟 PLC 快速测试这一点,并尝试 ping 物理 PLC,如下所示:

Figure 2.46 – Ping 连接测试

Figure 2.46 – Ping 连接测试

正如你所见,主机无法访问。我们需要做的是向虚拟交换机添加一个上行链路。选择 vSwitch1,并点击 添加上行链路,如下截图所示:

Figure 2.47 – 添加上行链路

Figure 2.47 – 添加上行链路

现在我们可以看到 Uplink 1 显示了一个下拉菜单,列出了物理网络适配器的列表。这完全取决于你的硬件设置。我决定保持一致性,vSwitch0 关联 vmnic0vSwitch1 关联 vmnic1,如下所示:

Figure 2.48 – 将物理 PLC 连接到虚拟交换机

Figure 2.48 – 将物理 PLC 连接到虚拟交换机

现在当你查看拓扑结构时,你应该看到一个物理适配器与你的 vSwitch 关联,并连接到在 Chapter 1 中创建的端口组,使用虚拟化

Figure 2.49 – 带有物理连接的 vSwitch 拓扑结构

Figure 2.49 – 带有物理连接的 vSwitch 拓扑结构

现在尝试从虚拟 PLC 到物理 PLC 发送 ping。你应该收到回复,如下截图所示:

Figure 2.50 – 连接测试

Figure 2.50 – 连接测试

现在稍作整理。由于我给 Windows 7 VM 添加了一个辅助适配器,以通过 VM 网络连接到 Koyo CLICK,我打算返回并断开该适配器,测试一下我是否仍然可以通过 vmnic1 连接到 CLICK:

Figure 2.51 – 连接到 PLC

Figure 2.51 – 连接到 PLC

瞧!我们已经从 Windows 7 到 CLICK PLC 有了一条路径。现在,对于阅读本书的网络专家们,我知道你们可能在暗自窃笑,心想,嗯,我们在使用 B 类子网掩码!当然,我们可以在子网之间通信! 首先,感谢你们阅读本书,这对我意义重大。其次,我觉得这是最省力的方式,而不是将防火墙装配到虚拟机中并编写策略,因为那可能需要一本专门的书来讲述。

摘要

我们已经在 Windows 7 虚拟机上安装了 Koyo Click 编程软件。我们还将电源连接到 Koyo Click PLC,并将其开启。我们成功地配置了 Koyo Click PLC 的物理网络,使其能够通过 ESXi vSwitch 与 Windows 7 接口的网络接口进行通信。

本章总结,我们已经成功运行了位于 Level 1: Process 网络段的 Koyo CLICK PLC,并在位于 Level 3: Operations network 网络段的 Windows 7 虚拟机上安装并测试了 CLICK 编程软件。我们还测试了虚拟 PLC 和物理 PLC 之间的网络通信。我们为前一章节中配置的 ESXi 虚拟交换机添加了一个物理适配器上行链路。

现在,我们对自动化工程师在开始项目时如何分配时间有了更清晰的了解。了解如何协调和安装软件将帮助你在未来的渗透测试中提升和磨练你的技能。

在下一章节中,我们将编写我们的第一个 PLC 程序并将其下载到 Koyo CLICK 上。

第三章:我爱我的比特 – 实验室设置

到目前为止,我们主要配置了网络的连接性。现在,我们将进入下一阶段。在本章中,我们将配置一个简单的程序,并使用安装在 Windows 7 虚拟机VM)上的软件,物理地改变 PLC 上的I/O。这一过程会通过虚拟机接口,通过虚拟交换机,到达物理适配器。然后,它会传递到物理管理交换机,并最终连接到 PLC。本章将扩展我们之前在第二章中开始设置的实验室,硬件路由。我们将通过一个演示方法,使用Koyo Click PLC人机界面HMI)I,将其连接到物理 I/O,以学习如何通过图形用户界面脚本编写实现开关灯的操作。

在本章中,我们将涵盖以下主要内容:

  • 编写和下载我们的第一个程序

  • 重写和接线 I/O

  • 控制测试

技术要求

本章所需材料:

  • 安装在 Windows 7 机器上的Koyo Click软件。

  • Koyo Click硬件电源和 PLC。

  • 一个物理网络交换机,用于在 PLC 和 ESXi 之间路由流量。

  • 一个选择开关站盒,用于切换 I/O 的电源开/关。

  • 一个工业信号塔灯,用于显示视觉反馈。

  • 一只电压表用于测试连通性。

  • 一根 14 号线,用于将选择开关站盒和信号塔灯连接到 PLC。

  • 剪线钳和剥线钳,用于处理和准备安装电线。

  • 螺丝刀(十字头和一字头)用于打开和关闭接线端子的紧固螺丝。

你可以在这里查看本章代码的实际操作:bit.ly/3v5w61B

编写和下载我们的第一个程序

现在到了令人兴奋的部分——编写我们的hello world自动化程序。我们将介绍如何构建一个简单的梯形逻辑程序,用于通电或断电一个线圈。这将帮助我们更深入地理解 Koyo Click 软件的工作原理。这一点很重要,因为每个 PLC、SCADA 和分布式控制系统DCS)都遵循相同的标准和准则。说到标准,有一个特别的标准你应该熟悉,那就是IEC 61131-3,它帮助定义了五种核心编程语言,如下所示:

  • 梯形图

  • 功能块图

  • 结构化文本

  • 指令列表

  • 顺序功能图

类似于软件编程语言,其中核心基本原理在所有语言中是相同的,主要变化在于语法,这五种语言中,有三种是基于图形的,两种是基于文本的。CLICK 编程软件使用梯形图作为核心编程语言,也叫做梯形逻辑,这是在过程自动化领域最常见的语言。它模仿电路,允许左侧的输入驱动右侧的输出。

首先,我们将打开在 Windows 7 机器上的 Koyo Click 软件,如下图所示:

图 3.1 – Koyo Click 软件

图 3.1 – Koyo Click 软件

从菜单栏中点击文件选项,然后选择新建项目…,如下所示:

图 3.2 – 新建项目…

图 3.2 – 新建项目…

接下来,您将看到一个对话框,如下图所示。您需要双击启动新项目图标:

图 3.3 – 启动新项目

图 3.3 – 启动新项目

现在,我们将进入选择 CPU 模块窗口,如下图所示。我们将在实验室使用在上一章推荐的 CPU。现在,您可能会问自己,“等等,这不是有更简单的方法吗?”,您是对的。在上一章,我们只需连接到 PLC,软件会自动检测并为我们选择正确的 CPU。然而,我想向您展示,建立项目的方式不止一种。话虽如此,您将看到类似以下的屏幕,您需要选择C0-10ARE-D,这是我们在上一章中讨论的:

图 3.4 – 选择实验室 CPU

图 3.4 – 选择实验室 CPU

在这里,您可以查看关于 CPU 的详细信息。我们有八个交流输入和六个继电器输出,以及关于功耗的信息。现在,点击确定继续 CPU 选择过程。

一旦点击,您将被带回到编程界面,如下所示:

图 3.5 – 主程序

图 3.5 – 主程序

在开始添加梯形图指令之前,我们需要配置一些小细节。选择设置菜单选项,然后点击系统配置,如下所示:

图 3.6 – 系统配置…

图 3.6 – 系统配置…

这将带我们到下面的屏幕,显示了我们PLC 机箱的图形布局。在这里,您可以看到我们之前选择的 CPU,并显示警告,指示我们没有足够的电源供应给 CPU。这仅仅是因为我们尚未在此屏幕上设置电源供应单元PSU):

图 3.7 – 系统配置窗口

图 3.7 – 系统配置窗口

点击第一列(P/S列)中的选择按钮,如前面的屏幕截图所示。您将看到选择电源的选项,如下面的屏幕截图所示。选择您购买并安装在实验室中的电源:

图 3.8 – 选择电源窗口

图 3.8 – 选择电源窗口

类似于我们之前看到的用于 CPU 的屏幕,我们可以看到有关我们购买的电源的更多细节,例如输入和输出电压以及生成的最大功率。继续点击确定以选择并应用电源到机箱概览。您现在应该看到一个代表连接到 CPU 的电源的图像。您会看到警告已经消失,因为电源足以为 CPU 供电:

图 3.9 – 更新的系统配置窗口

图 3.9 – 更新的系统配置窗口

现在,点击确定并立即进入程序。我们想创建一个简单的程序,允许我们按下按钮并点亮灯。但是,在我们开始之前,我想快速介绍一些术语:

  • 梯形图横梁:梯形图用于表示电气布线框架中的控制程序。电源是垂直线(梯形),而控制电路是水平线(横梁)。

  • 指令列表:这是用于设计程序电路的图形控件列表。

  • 接点:接点是二进制选择器的图形表示,类似于墙上的开关,没有更好的定义。

  • NO**/**NC常开常闭是我们想要控制 I/O 状态的接点的术语。常开接点意味着当接点打开时电路运行,反之亦然。

现在我们对布局和术语有了更好的理解,下一步是将一个 NO 接点拖到第一横排。然后,我们应该通过点击右侧的地址按钮来选择地址,如下面的屏幕截图所示:

图 3.10 – 插入一个接点

图 3.10 – 插入一个接点

会出现一个对话框,允许我们从 Koyo Click 提供的地址列表中选择所需的地址。在下面的截图中,我们可以看到列表选项,包括地址数据类型昵称等:

图 3.11 – 地址选择器

图 3.11 – 地址选择器

双击第一个地址;也就是X001。这将填充您的地址选择,如下截图所示:

图 3.12 – 选择的地址

图 3.12 – 选择的地址

点击确定按钮后,您应该看到您现在在横梁 1 上有一个地址为X001的接触输入,如下截图所示:

图 3.13 – 接触 X001

图 3.13 – 接触 X001

现在,既然我们有了一个输入,我们将需要一个输出。在用户界面右侧的指令列表菜单的线圈部分下,找到Out功能,并将其拖动到右侧的( NOP )位置,如下截图所示:

图 3.14 – 线圈输出

图 3.14 – 线圈输出

Out功能拖动到横梁 1 末端的( NOP )位置,如下所示:

图 3.15 – 输出

图 3.15 – 输出

一旦功能锁定,将创建一个对话框,要求程序员配置位内存寻址,如下所示:

图 3.16 – 线圈地址

图 3.16 – 线圈地址

点击内存地址选择器图标;将会出现一个地址选择器对话框,类似于我们在 NO 输入接触步骤中遇到的对话框。下面的截图显示,地址选择器会自动显示真实世界的输出地址列表:

图 3.17 – 地址选择器

图 3.17 – 地址选择器

选择Y001作为我们放置在横梁 1 上的线圈的输出地址,并选择确定。如下截图所示,它已经自动填充了**位内存地址 1:**的选择。您应该看到地址旁边有一个绿色的勾号,表示该地址是一个有效的内存位置:

图 3.18 – 位内存地址

图 3.18 – 位内存地址

点击确定继续并将线圈添加到输出位置,如下截图所示:

图 3.19 – 线圈输出

图 3.19 – 线圈输出

如果您想知道为什么我们选择X001Y001作为输入和输出地址,请看看您的 CLICK PLC 的正面。在端子条上,找到标有X1Y1引脚输出标签。这些地址直接与这些 I/O 端子相关联,如下图所示:

图 3.20 – 端子引脚

图 3.20 – 端子引脚

接下来,我们需要添加一个END功能,告诉程序我们已经完成所有操作。从指令列表菜单中,在程序控制标题下,选择并拖动END功能到第 2 横排末尾的( NOP )位置,如下截图所示:

图 3.21 – 添加 END 功能

图 3.21 – 添加 END 功能

添加END功能后,我们要检查语法错误。定期运行语法检查是个好习惯,这样您可以在将来开发更复杂的程序时捕捉任何错误之前,避免它们变成重大问题。在程序选项卡上,双击梯形图程序文件夹中的语法检查选项,如下所示:

图 3.22 – 语法检查

图 3.22 – 语法检查

输出窗口中,您应该看到语法检查的结果。如果您一直在紧密跟随,您应该有类似的结果:

图 3.23 – 语法检查

图 3.23 – 语法检查

如您所见,目前有0 个错误0 个警告。此时,您应该保存程序,然后将项目写入 PLC。要将项目写入 PLC,请从PLC菜单中选择**将项目写入 PLC…**选项,如下截图所示:

图 3.24 – 将项目写入 PLC…

图 3.24 – 将项目写入 PLC…

完成后,您将看到一个对话框,简要介绍了一个diff功能,我们将在当前 PLC 项目与您将写入 PLC 的项目上使用,如下所示:

图 3.25 – 将项目写入 PLC 窗口

图 3.25 – 将项目写入 PLC 窗口

如果一切顺利,您应该看到一个传输完成对话框,如下所示:

图 3.26 – 传输完成

图 3.26 – 传输完成

接下来,您将被要求将PLC 模式设置从停止更改为运行,如下所示:

图 3.27 – PLC 模式窗口

图 3.27 – PLC 模式窗口

如果一切正常,您应该看到以下指示器:

  • 一个绿色的运行状态

  • 没有PLC 错误消息

  • 蓝色突出显示的END功能

  • 输出窗口将项目写入 PLC…

  • 输出窗口传输完成

这些指示器显示在以下截图中:

图 3.28 – 运行指示器

图 3.28 – 运行指示器

在这一部分,我们学习了如何使用输入和输出创建一个简单的程序,该程序包含常开触点和线圈。我们进行了语法检查,并将项目写入我们的 PLC。这使我们更深入地理解了编程软件的工作原理,并获得了创建和写入项目的实践经验。这些是学习的基础,是任何自动化和控制项目的构建模块。在下一部分,我们将模拟输入上的信号,使我们的程序产生输出。然后,我们将为程序中创建的线圈提供电能。

覆盖和接线输入输出

在上一部分,我们创建了一个简单的Hello World程序,并将其写入 PLC。在这一部分,我们将模拟输入触点上的信号,为输出端的线圈供电。我们将深入了解 CLICK 编程软件的功能,熟悉数据视图,并覆盖输入以产生一个通电的线圈。为此,我们将使用一个名为数据视图的工具,它允许我们读取和写入我们在上一部分中为常开触点选择的内存地址。

为此,请从监视器菜单中打开数据视图窗口,如下图所示:

图 3.29 – 数据视图选择

图 3.29 – 数据视图选择

您将看到一个空白表格,如下所示:

图 3.30 – 数据视图工具

图 3.30 – 数据视图工具

现在,我们将选择001行中的地址单元格,然后点击对话框左上角的编辑按钮,这将允许您选择我们之前使用的地址选择器。在这里,我们为触点输入线圈输出分配了地址。接下来,您将看到自动填充的地址空间,从X001开始,在第一个内存地址中,您应该会看到X001已使用列中显示。这是反馈,告诉我们在程序中使用了X001。如下图所示:

图 3.31 – 地址选择器

图 3.31 – 地址选择器

继续选择X001并按下确定按钮。这样将填充我们的数据视图工具中的编号 **001行。您将看到昵称设置(如果之前给它设置了),我们的当前值**,新值写入(用于反馈),查看格式,以及您可能添加的任何地址评论。如下图所示:

图 3.32 – 选择的 X001 地址

图 3.32 – 选择的 X001 地址

现在,尝试选择新值列中的ON按钮。写入列中将出现一个图标,允许你将输入值写入 PLC。双击该图标,看看会发生什么。此时应该什么都没有发生。图标确实将值写入 PLC 的内存空间,但针脚 I/O 是主导的,PLC 上的物理输入没有发生变化,因此什么都没有改变。正是因为这种行为,我们必须启用Override。在对话框中,我们会看到查看 Override的选项。你需要启用此选项。启用后,你将看到在写入图标旁边新增了一列。添加了一个OVR按钮,如下图所示:

图 3.33 – Override

图 3.33 – Override

双击OVR按钮,这将启用此 I/O 的Override功能。CLICK 编程软件会在主窗口中打开Override指示器,并在数据视图窗口中将OVR按钮高亮显示为黄色:

图 3.34 – 启用 Override

图 3.34 – 启用 Override

现在,尝试重新运行我们之前运行的操作,在新值列中选择ON按钮,并双击写入图标。你应该能听到 PLC 上线圈的通电声音,并且可以看到线圈上的指示灯亮起,同时编程软件显示X001被高亮显示,以及Y001,如下所示:

图 3.35 – 通电线圈

图 3.35 – 通电线圈

如果你没有看到高亮显示的输入和输出,如图所示,请确保选择了状态监视器。你可以在监视器菜单中找到它,选择状态监视器后:

图 3.36 – 状态监视器

图 3.36 – 状态监视器

继续双击新值列中的OFF按钮,如下图所示。你应该会注意到,通过双击按钮,我们节省了一步;这只是为了显示有多种方式可以快速覆盖输入:

图 3.37 – 输入关闭

图 3.37 – 输入关闭

到目前为止,我们做的所有操作都是软件相关的。现在,我们将使用选择开关站框,如图所示:

图 3.38 – 选择开关站框

图 3.38 – 选择开关站框

这种开关,或类似的开关,可以在亚马逊上购买。我们将使用短时按键,即绿色按钮,并将其接线到我们在上一节中编程并寻址的X001输入接点。

使用你的菲利普斯螺丝刀拆下四个面板螺丝和面板。当你打开控制箱时,你会看到三个开关模块,每个模块里都有四个接线端子。专注于瞬时开关,两个接线端子组与开关的动作相关联。因为我希望按下按钮时电流能够通过开关,所以我将使用底部的接线端子。你可以使用电压表测试接线端子,并测试模块两侧的连续性。按下开关,看看接线端子是否产生短路,导致电压表发出蜂鸣声。我认为,使用电压表检查连续性已经成为我数百个项目中的主要用途,现在想想其实有些可惜,因为电压表还有很多其他功能和特性。一旦你确认使用的是正确的接线端子,剪下并剥去两根电线的绝缘层。将每根电线的一端连接到接线端子两侧。然后,一侧连接到电源,另一侧将这根电线连接到X1PLC输入/输出端。可以参考以下图示:

图 3.39 – 接线图

图 3.39 – 接线图

在输入/输出端子上,你会看到C1C2,分别代表公共端 1公共端 2。将公共端 1 接地。如果所有接线都正确,按下瞬时开关将激活线圈,你应该会看到红色指示灯亮起,如图所示:

图 3.40 – 实物接线

图 3.40 – 实物接线

现在我们有了一个控制X001输入的按钮,并且在Y001上有了视觉反馈。接下来,我们将为工业信号塔灯接线输出,其外观类似于下图:

图 3.41 – 工业信号塔灯

图 3.41 – 工业信号塔灯

重要提示

接线输出将需要你修改程序,通过复制第 1 行并为信号塔灯中的每盏灯创建一行。我使用的是一个四灯系统,包含红色黄色绿色蓝色灯。

以下图示展示了如何将信号塔灯连接到输出通道。因为我使用的是一个四灯系统,所以我将红色接到Y001,黄色接到Y002,绿色接到Y003,蓝色接到Y004,如图所示:

图 3.42 – 输出接线到塔灯

图 3.42 – 输出接线到塔灯

到目前为止,你应该已经接好了输出并更改了程序以适应新的灯光输出,并将更改写入 CLICK PLC。这个过程与上一节中我们写入 PLC 的单个梯形图程序相同。你的程序应该如下所示,应该有四个新的独立输入来自X001X004,以及四个新的独立输出来自Y001Y004

图 3.43 – 四灯接线程序

图 3.43 – 四灯接线程序

在本节中,我们学习了如何重写输入值以模拟控制器输出端的信号。我们将一个按钮开关接入 X001,并将四灯信号塔灯接入 Y001、Y002、Y003 和 Y004。现在,我们有了一个完整的物理演示,并且对自动化工程师在接手新项目和新组件时所面临的挑战有了一定了解。在下一节中,我们将学习如何通过编写和启动脚本与我们的实验室进行交互。

控制测试

在上一节中,我们学习了如何重写输入并在接触点 X001 上模拟信号,从而触发 Y001 线圈上的输出。接着,我们将 PLC 的输入端接到开关,并用物理输入再现相同的结果。最后,我们接线了四灯信号塔。在本节中,我们将通过使用在第二章中安装的MBtget工具,从DataView和我们的 SCADA 虚拟机测试信号塔

你需要执行以下步骤:

  1. 打开DataView1,正如我们在上一节中所做的那样;作为复习,请查看以下截图,你将在监视器| 数据视图部分找到它:图 3.44 – 数据视图

    图 3.44 – 数据视图

  2. 这将弹出数据视图窗口。正如我们之前所做的,添加你在上一节中创建的新接点。这些接点是地址空间中的X002X003X004。确保启用视图重写选项。如果一切顺利,你的屏幕应该类似于以下内容:图 3.45 – 数据视图

    图 3.45 – 数据视图

  3. 现在,继续切换输入并逐步移动每个值,确保你的物理灯塔打开与你为输出配置的匹配灯光。你会注意到你可以看到 CLICK 上的视觉反馈,和你在软件中看到的一样,如下所示:图 3.46 – 重写灯光

    图 3.46 – 重写灯光

  4. 现在我们已经将所有灯光打开,打开之前我们创建的 SCADA 虚拟机。前往 Navigator** > **Virtual Machines** > **SCADA 来查找它,如下所示:

图 3.47 – SCADA 虚拟机

图 3.47 – SCADA 虚拟机

启动 SCADA 控制台并打开您的 终端 程序。使用 mbtget -h 命令查看有关 mbtget 工具的详细信息,如下所示:

图 3.48 – mbtget 工具

图 3.48 – mbtget 工具

这是解释 mbtget 的一个好时机

mbtget 是一个用 Perl 编写的工具,允许我们通过 ModbusTCP 在端口 502 上直接与 Koyo Click 交互。有关更多详细信息,请访问以下链接并查看 GitHub 上的项目:github.com/sourceperl/mbtget

好的,让我们回到正常的编程工作。现在我们已经将 mbtget 安装在 SCADA 机器上,我们可以通过运行以下命令检查我们在上一部分中配置的四个线圈的位:

mbtget -r1 -a 0 192.168.1.20

让我们来看一下命令中包含的参数。我们将在 第八章*,协议 202* 中更详细地介绍 modbus 协议。现在,我们需要知道我们正在使用的线圈的内存地址,以及我们是要读取还是写入该内存地址:

  • -r1:读取功能 1 的位

  • -a:地址 0

  • PLC 地址是 192.168.1.20

如果您已经清除了编程软件中设置的所有覆盖项,您应该看到以下输出,其中地址 1 的值为 0

图 3.49 – 地址 0 读取输出

图 3.49 – 地址 0 读取输出

现在,使用以下命令将值写入线圈:

mbtget -w5 1 -a 0 192.168.1.20

以下是命令中包含的参数:

  • -w5:将功能值 1 写入以开启

  • -a:地址 0

  • PLC 地址是 192.168.1.20

如果一切正常,您应该已经点亮了信号塔中的第一个/最上面的灯,并获得以下结果:

图 3.50 – 写入值到线圈

图 3.50 – 写入值到线圈

现在,为了使用 mbtget 确认输出,请再次运行读取线圈命令:

mbtget -r1 -a 0 192.168.1.20

以下是命令中的参数:

  • -r1:读取功能 1 的位

  • -a:地址 0

  • PLC 地址是 192.168.1.20

如果一切正常,您应该看到以下输出:

图 3.51 – 读取线圈地址 0

图 3.51 – 读取线圈地址 0

您应该看到地址值已经更改为 1,并且灯亮了。继续测试塔中的其余灯光,按照我们之前的步骤进行操作。将 1 写入下一个地址,读取线圈位,并确保输出符合预期。

你可能注意到,通过一个简单的命令行功能随机设置一个比特是多么容易,可能会想知道安全特性在哪里。为什么你可以覆盖一个线圈而不需要输入密钥密码?这真的是工业环境如此不安全吗?嗯,我得说是的,也不是。是的,工业环境传统上一直如此不安全,但在提升对该领域存在的安全问题的意识方面,已经取得了很大进展。厂商们已经听取了反馈,并开始将安全层嵌入到他们的系统中。然而,这并不意味着客户已经将其遗留系统升级为新技术。现在,对于那些好奇的你们,可能已经意识到发生了什么……是的,你们抓到了我——之所以能够这么做,是因为我们在编程软件中仍然启用了覆盖功能。移除覆盖功能后,再尝试通过强制控制线圈来测试 mbtget。结果如何?你应该看不到任何结果——什么也不会发生。这是因为我们已经告诉 PLC 只对本地输入做出反应。

总结

在本章中,我们构建了一个介绍性功能实验室,在这里我们可以在 PLC 中开发逻辑,并连接到现实世界的输入输出,观察在特定环境测试下事物如何反应。这有助于传达工业系统如何运作和工作的基本理解。基于这些核心概念,我们可以将实验室扩展到更复杂的场景。我们使用工程软件强制输入,然后我们通过 mbtget 在远程复制相同的行为,以说明如何轻松改变控制器上的简单开/关输入。

想象一下其他行业流程是如何运作的,例如水厂上开关阀门,或是打开氢氧化钠(也称为烧碱)储罐的阀门,并允许它流入水处理单元,这与 2021 年 2 月 5 日发生的佛罗里达市供水黑客攻击类似。然而,佛罗里达市供水黑客攻击更为复杂,因为它涉及在操作员屏幕上更改浓度数值。这一更改通过食谱逻辑块传递,最终指示阀门保持更长时间开启,直到浓度水平匹配新的设定值。这是一个实际世界中,因小小的逻辑更改而可能产生重大影响的例子。这是双刃剑,也是渗透测试任务中的警示故事。非常容易破坏并导致客户流程停机,从而造成严重的生产和收入损失。

在下一章中,我们将暂时停止构建我们的 ICS 实验室,并讨论开源情报OSINT)收集,因为这是任何渗透测试任务中的关键步骤。

第三章:第二节 - 理解裂缝

收集足够的前期接触数据可能决定渗透测试工作的成败。在启动会议前就发现一些重大漏洞是完全可能的。深入了解客户的行业、流程、员工、设备和技术对于取得成功至关重要。

本节将涵盖以下章节:

  • 第四章开源忍者

  • 第五章尽可能扩展我

  • 第六章数据包深度分析

第四章:开源忍者

本章将带领你,读者,通过 Google-Fu 的艺术,研究公司、设施、流程、控制、合同或其他形式的公开共享信息。这让你了解如何在接触之前尽可能多地获取信息。关键的一点是,员工们喜欢反复发布有关其组织的信息。通常公司不公开分享的信息可能包括用于分段的防火墙、端点保护、网络访问控制NAC)信息、入侵检测系统IDS)产品的实施情况,以及许多其他揭示策略。然而,随着连接需求的增加,像 LinkedIn 这样的社交网站可能会揭示一个组织正在使用的技术。

现在我们已经了解了关于我们追求的组织的一些惊人细节,我们可以问一个问题:什么是侧载? 如果我们知道这家公司是 Rockwell,我们能在 Rockwell 的支持网络上创建账户吗?我们能否设计工具和人员,更深入地渗透到这个组织中?

本章将涵盖以下主要内容:

  • 理解 Google-Fu

  • 搜索 LinkedIn

  • 尝试使用 Shodan.io

  • 使用 漏洞数据库exploit-db)进行调查

  • 浏览 国家漏洞数据库NVD

技术要求

本章所需的工具:

  • 一台带有浏览器的计算机,用来访问本文讨论的网站

  • 拥有一个 LinkedIn 账户将对本章内容非常有帮助

理解 Google-Fu

谷歌必须是市场上最著名的搜索引擎之一。我个人在 Netscape 时代就使用过 WebCrawler。我记得第一次在 2002 年听到“你谷歌过了吗?”这句话时,我正在修理某人的 PalmPilot。可能已经不言自明,任何阅读这篇内容的人都曾在某个时刻使用过 Google 搜索引擎。尽管如此,我仍然想传达一些事实:谷歌搜索引擎是一个庞大的索引器,基本上是在爬取互联网,记录并保存它所遇到的数据。现在,这个接下来的统计数字纯粹是推测,并没有量化的证据;然而,我相当确信 99% 的谷歌用户从未真正拥抱谷歌提供的高级功能。

Google dorkingGoogle hacking 只是利用 Google 的高级搜索功能从互联网上获取敏感信息的一种方法。将多个高级搜索功能结合起来使用,可以让用户快速获取公开索引的信息。使用这些高级功能是完全合法的;然而,当索引的数据被用来破坏和利用所有者的数据时,合法性便受到挑战。这类似于发现漏洞。发现一个漏洞并不违法——今天的软件到处都是漏洞,因此我们不断进行更新。然而,如果新的漏洞被用来利用使用相同软件的其他客户,这就是违法的。话虽如此,在进行渗透测试pentest)或进行研究时,使用 Google dorking 获取敏感信息需要负责任的披露。

注释

负责任的披露是一个过程,安全人员通过此过程将其研究中发现的漏洞报告给相关方,如软件或硬件供应商、敏感数据已暴露的公司以及本地计算机应急响应小组CERT)。

在免责声明说明完毕后,接下来我们继续。这里有一个Google Hacking 数据库GHDB)的链接,记录了许多可以使用的高级功能:www.exploit-db.com/google-hacking-database

一旦您导航到该网站,它将如下所示:

图 4.1 – GHDB

图 4.1 – GHDB

以下是 Google dorking 的一些高级功能简要列表。还有许多其他功能可以在前面的链接中找到,但我不想陷入一个无休止的兔子洞:

  • site: (仅在提供的网站中搜索)

  • inurl: (在提供的统一资源定位符URL)中搜索关键词)

  • intitle: (在网页标题中搜索关键词)

  • intext: (在网页正文中搜索关键词)

  • filetype: (根据提供的关键词搜索文件)

  • ext: (根据提供的关键词搜索文件)

这些功能可以在 Google 浏览器中运行,专注于与您的客户相关的信息。例如,您可以运行以下截图所示的搜索:

图 4.2 – 高级搜索

图 4.2 – 高级搜索

这将搜索 www.cdc.gov/ 网站,查找可能可访问的任何公开面向的文件传输协议FTP)服务器。这是一个非常简单的示例,有助于演示 Google 搜索引擎提供的高级功能的能力。可以搜索其他服务和托管的文件共享,示例如下:

  • Web 分布式创作与版本控制WebDAV):intitle:"Directory Listing For /" + inurl:webdav tomcat

  • 结构化查询语言SQL): intitle: "index of" "admin/sql/"

  • VTScada**: **intitle:'VTScada Anywhere Client'

一个更复杂的功能可能类似于这里展示的内容:

图 4.3 – 复杂功能

图 4.3 – 复杂功能

你将看到一系列 Rockwell 的可编程逻辑控制器PLC)及其暴露到互联网上的网页访问接口。查看图 4.3中展示的命令,你会发现我们正在寻找 URL 中index.html标题里的Rockwell Automation这个词,最后是特定的设备名称。很多设备都可以通过这种方式被发现。

使用标准查询和这些高级功能,你可以开始构建客户的个人资料。构建个人资料是渗透测试工作中的关键步骤,它能让你深入了解客户的基础设施,这对收集信息并取得测试成功至关重要。从公司名称开始,确定该客户所在的行业。这一点非常重要,因为某些工业控制系统ICS)供应商在特定行业中占有较强的市场份额。一个典型的例子是Schweitzer Engineering LaboratoriesSEL),他们的产品几乎可以满足所有类型的行业需求;然而,你会发现它们主要集中在能源领域。如果你参与的是能源生产、传输或分配相关的客户,你可以确信会接触到 SEL 的技术。这只是一个技术绑定于某个行业的例子,实际上还有很多类似的例子,通过我们之前介绍的搜索功能可以很容易地找到。

在这一部分,我们介绍了谷歌高级搜索功能的强大,以及通过编写高度聚焦的查询语句能够捕获的详细信息。我们可以利用发现的数据,在甚至还未进入会议之前,先构建客户的个人资料。在下一部分,我们将回顾“人员”这一部分,并探索如何有效使用 LinkedIn。

搜索 LinkedIn

LinkedIn 无疑是全球最大的职业社交网络平台。该平台总用户超过 7.4 亿。根据 LinkedIn 公开的统计数据,平台上列出了超过 5500 万家公司,相关数据可以通过以下链接找到:news.linkedin.com/about-us#Statistics

由于平台上有大量的用户和公司,我们有很大机会在渗透测试过程中发现一些有价值的信息。因为这个网站基本上是一个专业人士的实时虚拟简历,用户的大量信息以易于搜索的文本格式存储。关于公司规模、公司所在行业、公司使用的技术以及公司雇佣的人员等数据点,都是通过搜索输入轻松获取的。

在 LinkedIn 上搜索可以精确到以下细节:

  • 人员

  • 工作

  • 公司

  • 群组

  • 学校

  • 帖子

  • 事件

当你搜索一个客户的公司时,搜索结果将与公司的相对规模相关,如下图所示:

图 4.4 – 公司搜索

图 4.4 – 公司搜索

从这些信息中,我们可以知道员工的居住地和他们的学习经历。我们能够通过职称、关键词或学校来搜索员工。现在,对于那些观察细致的朋友,你可能已经注意到了一个漏洞!LinkedIn 显示有 24,887 名员工,并且标注有 25,042 名员工住在美国US)。人工智能AI)总有一天会接管这个世界,但朋友们,还没有到时候。我们可以通过寻找一般性的关键词来开始缩小搜索范围。从**监控与数据采集(SCADA)**开始,我们找到了 476 名在个人资料中列出 SCADA 的员工,如下图所示:

图 4.5 – SCADA 子搜索

图 4.5 – SCADA 子搜索

针对特定技能关键词进行搜索,如telvent,将有助于缩小搜索范围,找到该示例公司使用的系统以及可能拥有这些系统凭证的人。你可以在下图中看到返回的结果:

图 4.6 – Telvent 技能集

图 4.6 – Telvent 技能集

当你聚焦于一部分个人并研究他们的当前职位及其工作场所的成就时,你可以找到许多有趣且具体的细节,如下图所示,其中出于礼貌公司名称已被编辑掉:

图 4.7 – 系统上的公开信息

图 4.7 – 系统上的公开信息

如你所见,在这一部分,使用 LinkedIn 填补空白,可以轻松建立公司的整体档案。LinkedIn 的搜索功能允许我们列出员工和职位,深入了解公司使用的技术,并最终列出一份可能具有该技术访问权限的凭证账户短名单(如前截图所示)。为了建立显示,用户需要在Telvent-DMS配电管理系统)和SCADA-EMS能源管理系统)上拥有账户。利用这些随时可用的数据对于任何成功的项目都是至关重要的。在下一部分中,我们将探索 Shodan.io,并查看使用该搜索引擎收集的见解如何帮助完善那些容易获取的技术信息。

使用 Shodan.io 进行实验

如其主页所宣称,"Shodan 是全球首个互联网连接设备的搜索引擎。"在过去的两个部分中,我们使用了不同的搜索策略,免费获取了关于一个组织的结构和组织方式的见解,并揭露了可能对公众开放的任何服务。这使我们能够为客户建立关于他们所处行业、雇用员工以及——如果幸运的话——他们使用的技术的档案。在本部分中,我们将通过使用 Shodan.io 更深入地探索服务和技术。

如果你访问以下链接,你将看到如下一张搜索引擎窗口的截图:

图 4.8 – Shodan.io 搜索引擎

图 4.8 – Shodan.io 搜索引擎

点击探索按钮将带我们到以下屏幕:

图 4.9 – 探索 Shodan.io

图 4.9 – 探索 Shodan.io

接下来,我们点击顶部的分类,工业控制系统,你将被带到一个如下所示的页面:

图 4.10 – 工业控制系统

图 4.10 – 工业控制系统

如果你向下滚动页面,你会注意到系统是通过搜索引擎发现的协议来记录的。这些协议是面向公众的,如下所示:

图 4.11 – 面向公众的协议

图 4.11 – 面向公众的协议

现在,我们跳过了直接查看工业控制系统部分,但如果这是一次真实的项目,你应该首先搜索公司名称,查看是否有任何“低挂的项目”存在。此外,我建议你养成习惯,在登录页面的搜索输入框中查找企业互联网协议IP)范围。

故事时间

我之所以这样说,是因为在一次任务中,我刚到达客户的总部。我的团队已经在里面,所以我迅速将笔记本连接到手机,并简单地查了一下客户的 IP 范围,结果发现了一个Citrix 虚拟专用网络VPN访问门户。我用手机打电话给接待员,通过社交工程获取了 VPN 门户的凭据。我迅速登录并意识到,可以通过一个简单的“自助服务终端突破”来利用这个门户,而且整个门户是在域控制器上以域管理员身份运行的。更不用说,这次为期两周的任务进行得非常顺利。

现在,免责声明时间再次到来。点击任何协议的探索按钮是完全无害的,查看屏幕上共享的信息也是可以的。进入所发现的 IP 地址则进入了一个非常灰色的区域,因为本应公开的信息可能不该公开。尽管如今在 Shodan 上找到完整的操作员控制台已经很少见,但并非不可能。如果你遇到一个天然气管道的 SCADA 系统,如果突然间压缩机站关闭或主线截止阀关闭,你肯定会面临责任问题。还记得我们在GE-XA21 LinkedIn 用户中发现的 SCADA 系统吗?它使用分布式网络协议 3DNP3)进行通信,并且还使用了其他各种协议。如果你查看协议部分,你会看到DNP3按钮。点击它,你将被带到以下屏幕:

图 4.12 – DNP3 被发现

图 4.12 – DNP3 被发现

在浏览时,你会发现有很多选项可以进行过滤和搜索。你可以按国家、城市、组织、设备、服务、端口等进行过滤。出于好奇,我们来搜索一下我们在实验室中设置的Koyo CLICK PLC,并查看结果,如下所示:

图 4.13 – Koyo CLICK

图 4.13 – Koyo CLICK

如你所见,Shodan 已经抓取了那些开放到互联网的 Koyo CLICK 设备。

注意

我想强调的是,作为蓝队成员,你应该定期检查 Shodan.io 上你组织的 IP 空间和技术。这将帮助你提前发现任何不合规的漏洞,并迫使渗透测试人员在执行任务时更加努力。

在本节中,我们简要介绍了使用 Shodan.io 查找暴露在互联网上的工业技术的强大功能。在渗透测试过程中,使用 Shodan.io 是必须的,因为您可能会发现一些有趣的客户设备和/或在线服务。到目前为止,在正常的渗透测试过程中,您应该已为客户组建了一个全面的资料。您将拥有与客户相关的公司、行业、技术和人员。接下来的部分,我们将回顾 exploit-db,我们之前通过 Google 黑客技术提到过它,但这次我们将深入探讨如何将技术与已发现并记录的漏洞关联起来。

使用 ExploitDB 进行调查

ExploitDB 是一个庞大的共享发现档案库,涉及软件缺陷、漏洞利用和安全漏洞。它允许安全研究人员和渗透测试人员以易于搜索的格式分享已知的安全漏洞。访问 www.exploit-db.com,您将进入主页,看到最新记录的漏洞,如下图所示:

图 4.14 – ExploitDB

图 4.14 – ExploitDB

如果您注意到,右侧有一个搜索输入框。输入 SCADA 并按 Enter 键。在本书印刷时,您会看到 50 个与各种 SCADA 系统相关的漏洞,如下图所示:

图 4.15 – SCADA 漏洞

图 4.15 – SCADA 漏洞

如您在屏幕上看到的,我们有八个标题,概述如下:

  • 日期:漏洞被添加到 ExploitDB 的日期。

  • 下载:这是您可以下载的代码,用于执行漏洞利用。

  • 应用:这是漏洞利用所针对的易受攻击应用程序的副本。

  • 已验证:这是一个批准通知,表明该漏洞利用已被验证有效。

  • 标题:漏洞利用描述。

  • 类型:漏洞利用类型。

  • 平台:漏洞利用所针对的系统。

  • 作者:这是漏洞利用代码的作者。

对于许多漏洞,作者已经提供了代码,帮助您快速审查和增强您的环境。这种查看代码结构以进行 概念验证(POC) 工作的技巧将在后续章节中深入讨论,但现在,您只需知道,您可以访问各种代码,帮助您在客户的技术栈中找到立足点。我们将仔细看看一个简单的漏洞。如果我们查看以下截图,您会发现 Rockwell SCADA 在 2018 年有一个列出的漏洞利用:

图 4.16 – Rockwell 漏洞利用

点击描述,查看以下屏幕:

图 4.17 – Rockwell SCADA 漏洞利用

图 4.17 – Rockwell SCADA 漏洞利用

如果你注意到,CVE(即常见漏洞和暴露)被标记为 2016-2279,意味着这个漏洞追溯到 2016 年——或者至少是 2016 年报告的——但并不一定意味着它是在 2016 年被发现的;它可能是在更早的日期被发现的。如你所见,这个漏洞影响的不同版本都有记录,并且脚本的最末端有一个简单的 PoC 示例,这意味着通过 图形用户界面GUI),我们可以运行简单的 跨站脚本攻击XSS)来劫持用户会话或窃取敏感的系统信息,不过我们稍后会详细讨论这个问题。现在我们知道可以通过 exploit-db 搜索任何已知的漏洞和相关代码,这些代码利用了这些缺陷。所有这些都可以在参与前进行。接下来,我想快速查看 NVD,以了解 exploit-db 中找到的漏洞代码的来源和驱动程序。

遍历 NVD

NVD 是开放源代码领域中记录漏洞的最大联合体。访问 nvd.nist.gov/vuln/search 会带你进入以下页面:

图 4.18 – NVD

图 4.18 – NVD

现在,搜索我们之前在 Exploit DB 中找到的 Rockwell SCADA 的 CVE。该 CVE 是 2016-2279。在搜索输入框中键入这个 CVE 并按下 Enter,你将看到以下页面:

图 4.19 – NVD CVE 2016-2279

图 4.19 – NVD CVE 2016-2279

现在,点击结果窗口中 Vuln ID 字段中的链接,你将看到以下页面:

图 4.20 – CVE-2016-2279 详情

图 4.20 – CVE-2016-2279 详情

这里收集并展示了大量信息。最值得注意的是受影响的系统及其附带的风险评分。审查这些数据非常重要,因为你可以了解发现这些控制器及其版本在客户环境中的影响深度和广度。为了查看更相关的内容,返回主页面并对 Rockwell 技术进行查询。你应该能看到以下漏洞:

图 4.21 – Rockwell 漏洞

图 4.21 – Rockwell 漏洞

在这里,你可以看到与 Rockwell 相关的 94 条记录。最后发布的日期是2021 年 3 月 3 日,该记录的 CVE ID 为CVE-2021-22681。审查这个漏洞时,你会发现它的风险等级是严重——这完全正确,因为它表明未经过身份验证的攻击者可以绕过认证,直接在控制器上进行更改。这是非常可怕的,因为攻击者可以更改工艺的设定点,导致非计划停机、失去控制,甚至是工艺失败。这对渗透测试者来说是个好消息,因为它为访问关键基础设施提供了一个起点。

免责声明

在处理有物理访问权限的输入/输出I/O)层面的过程控制漏洞时,应该进行记录,而不是立即采取行动,除非你确切知道利用已知漏洞的后果是什么,因为事情往往会变得不可预测或出现严重问题,所有这些结果都可能非常令人恐惧。

在本节中,我们了解了 NVD 是什么,以及我们可以在哪里找到更多关于已记录已知漏洞的知识。这是至关重要的,因为我们可以在评估报告中构建支持证据,并利用已记录的漏洞来获取对客户基础设施的访问权限。

总结

在本章中,我们讨论了许多开源情报OSINT)主题,特别关注于 ICS 领域。我们研究了 Google-Fu,以及如何研究我们的客户,以发现行业细节和可能的用户。为了深入挖掘,我们转向 LinkedIn,查看是否有员工在上面发布了与雇主和使用的技术相关的敏感信息。

接下来,我们查看了 Shodan.io,探索在公开可访问的网络上运行的技术,看看这些技术是否属于我们的客户。之后,我们访问了 ExploitDB,查看是否有任何公开的代码,能够利用我们在前面步骤中发现的技术漏洞。最后,我们直接查看了 NVD,了解我们收集的系统中存在哪些漏洞。通过收集并记录这些信息,我们对客户的行业、人员、流程和技术有了全面的了解。

在下一章中,我们将学习跨越并捕获流量的重要性,这些流量可以帮助我们发现哪些真实设备在网络上进行通信。

第五章:如果你能做到,给我加个 SPAN

在上一章中,我们讲解了如何使用开源研究来构建客户、公司、用户和技术的档案。在本章中,我们将进一步深入讨论带外网络监控。在过去几年中,入侵检测系统IDS)一直主导着工业网络安全领域。

像 Security Matters(被 ForeScout 收购)、Indegy(被 Tenable 收购)、Sentryo(被 Cisco 收购)、CyberX(被 Microsoft 收购)、Claroty、Nozomi Networks、SCADAfence 等公司蓬勃发展。来自风险投资VC)和投资银行IB)的资金已经注入到被动监控领域,以提高对自动化技术重要性的认识,同时它对关键基础设施的影响也在不断增加。

所有这些技术都依赖于网络基础设施,能够使用交换端口分析仪SPAN)或测试接入点TAP)来捕获流量并将其发送到 IDS 技术。理解如何使用上述方法进行带外监控非常重要,并且在渗透测试过程中,如果客户已经投资了特定的 IDS 供应商,了解这一点尤为关键。

在本章中,我们将回顾什么是 SPAN 以及如何将流量镜像到端口,什么是 TAP 以及如何在渗透测试中使用它,并讨论在工业领域中利用 SPAN 的各种 IDS 技术,以及在遇到这些技术时应如何应对。

在本章中,我们将讨论以下主要内容:

  • 安装 Wireshark

  • 什么是 SPAN 以及如何配置它

  • 在参与活动中使用 TAP

  • 导航 IDS 安全监控

技术要求

本章所需的内容:

安装 Wireshark

经过一番深思熟虑的辩论后,我决定将这一部分移到本章的开头。原本我计划将其放在下一章,但在回顾后,我觉得它与接下来的内容衔接得很好。话虽如此,还是让我们直接开始吧。Wireshark 是网络工程师和安全人员都在使用的事实标准工具,用于监控通过网络传输的所有数据位。当出现问题时,个人或团队首先做的就是打开笔记本电脑并启动 Wireshark。我无法过分强调这一点;Wireshark 基本上是安全行业中最重要的工具之一,具有讽刺意味的是,人们很少将它归类为安全工具。Wireshark 是你为渗透测试工作组装的工具包中的必备之物。

访问 www.wireshark.org/#download,你将被带到 Wireshark 的稳定版本下载页面。在撰写本文时,当前的稳定版本是 3.4.4,发布于 2021 年 3 月 10 日。现在,对于一些“终端爱好者”,“CLI 行家”和“shell 武士”,或者那些可能在 Apple 笔记本或 Linux 发行版上使用“Brew”的用户,下面的命令适合你们。

macOS

你可以使用 Brew 来安装 Wireshark,如下所示:

brew install wireshark

Linux 发行版

你可以使用 apt-get 来安装 Wireshark,如下所示:

sudo apt-get install wireshark

Windows 10

我只是简单地给你这个链接:en.wikiversity.org/wiki/Wireshark/Install

安装过程很简单,有很多 YouTube 视频、维基百科、博客和论坛可以作为参考。

注意

在安装过程中,你需要确保安装额外的或互补的组件。此时,TShark、解码器插件、Editcap、Mergecap 以及其他关键组件就派上用场了。在接下来的几章中,我们将会涉及到其中的一些项目。

一旦你安装了 Wireshark,通过双击桌面图标打开程序,并确保你能看到所有的网络接口,如下图所示:

图 5.1 – Wireshark 捕获接口

](image/Figure_5.01_B16321.jpg)

图 5.1 – Wireshark 捕获接口

在这里,你将能够选择一个接口并开始监听网络流量。关键是,你看到的网络流量只会是广播、组播和单播流量,这些流量直接与该接口相关。例如,如果你选择你的 Wi-Fi 接口,你将看到很多设备通过组播和广播通信在网络上进行交流,尤其是如果你像我一样,拥抱物联网IoT)。我特别指出这一点,因为它引出了下一部分,我们将看看更有趣的数据。我的意思是,来自特定设备之间单播通信提供的数据。你必须访问 SPAN/镜像端口或在设备之间安装 TAP 才能捕获这些数据。

在这一部分中,我们学习了如何根据操作系统的不同使用不同的方法安装 Wireshark。我们确保查看了可以用来捕获流量的网络接口列表。最后,我们注意到,仅通过监听网络端口获取的信息并不能提供完整和详细的图景。我们需要访问 SPAN 或 TAP 才能看到真实的设备间单播通信。在下一部分中,我们将讨论什么是 SPAN/镜像,并学习如何在一个简单的管理交换机上配置这一功能。

什么是 SPAN,如何配置它?

在上一部分中,我们快速安装了 Wireshark 以捕获网络流量。现在,我们可以使用 Wireshark 来验证我们的结果。我们将能够做到这一点,一旦我们在这一部分配置了一个简单的 SPAN/镜像端口。那么,什么是 SPAN,它的作用是什么?SPAN 允许用户将一个或多个端口上的所有流量复制到同一交换机上的一个或多个端口,前提是该交换机支持 SPAN/镜像。这通常被称为本地 SPAN。这是将数据馈送到 IDS 的主要方法。SPAN 有一些扩展,称为远程 SPANRSPAN)和封装远程 SPANERSPAN)。

RSPAN 允许用户将远程网络流量与专用 VLAN 关联,然后将这些数据通过额外的交换机进行中继。然而,这需要付出一定的代价,因为你需要为 RSPAN 流量专门分配交换机端口。你将无法再将这些端口用于正常流量,因此减少了可以用于操作交换的端口数量。然而,利用 RSPAN 在渗透测试中非常有用,因为可以捕获并利用通过网络传输的关键信息来突破系统。凭证数据、操作系统、端口和服务以及其他有用信息通过网络传输,并通过 SPAN 直接传输到你的计算机,使用 Wireshark、TShark 或 Tcpdump 捕获。

注意

使用本地 SPAN 或 RSPAN 会导致交换机负载增加。如果交换机负载过重,也就是有大量流量通过交换机,使用 SPAN 可能会导致数据包丢失及其他不希望的行为,例如生产中断。由于交换机超负荷工作而开始丢包导致的停机造成的收入损失,是渗透测试中最糟糕的结果。因此,在对你不完全控制或不了解的交换机执行此操作时,务必小心。

请注意,SPAN 和端口镜像是可以互换使用的术语,因为它们本质上意味着相同的事情。所以,如果你在问我为什么写 SPAN/镜像,那是因为它们本质上是相同的,而 SPAN 其实是一个以 Cisco 为中心的术语。在技术要求部分提到的交换机——TP-Link TL-SG108E 智能交换机——使用了端口镜像。以下图所示为本地 SPAN 的典型设置或架构:

图 5.2 – SPAN 流量

图 5.2 – SPAN 流量

你可以使用任意数量的交换机来测试这个设置。我们将检查端口设置;在以下截图中,你可以看到这是一台简单的八端口交换机。四个端口正在被使用——三个以 1 GHz 运行,一个以 100 MB 运行:

图 5.3 – 端口设置屏幕

图 5.3 – 端口设置屏幕

看到某个端口正在以较低的速度协商,安全地说,该端口用于 PLC 通信,并且该端口是端口 2。虽然我知道这是因为我设置了实验室,但在实际的渗透测试中,如果你恰好获得了这种级别的访问权限,可以安全地假设较低的速度是由于工业硬件通信造成的。

在查看了交换机的端口设置后,我们清楚地了解了哪个端口用于 PLC,以及哪些端口是开放的,可以用来将通信镜像回我们的主机。接下来,我们将设置端口镜像。从左侧菜单中选择监控选项,然后选择端口镜像。你将进入以下屏幕:

图 5.4 – 端口镜像屏幕

图 5.4 – 端口镜像屏幕

从这里开始,我将选择启用端口镜像功能,并选择镜像端口,它将是端口 1,然后点击应用按钮,如下截图所示:

图 5.5 – 启用端口镜像

图 5.5 – 启用端口镜像

接下来,我们要选择要监控的端口。通过检查端口设置,我们发现端口 2 已连接到 PLC。所以,点击端口 2,并启用入口流量和出口流量,如下所示:

图 5.6 – 端口 2 镜像

图 5.6 – 端口 2 镜像

如果一切按照前面的步骤进行操作,表格将显示 端口 2 已启用 IngressEgress 流量,如下图所示:

图 5.7 – 确认端口 2 镜像

图 5.7 – 确认端口 2 镜像

如果你跟着操作并且已经拿到了 Koyo Click,那么继续并打开我们在第二章中安装的 CLICK 编程软件,路由硬件,在 Windows 7 主机上连接到你的 PLC。如果你使用的是其他厂商的设备,例如 Rockwell,确保你打开 Studio 5000 或 RSLogix 并连接到你的硬件。工程软件和 PLC 之间的通信将在我们的交换机的端口 2 上创建流量。这正是我们想要的,因为复制的数据包会被镜像到端口 1。将一根电缆连接到端口 1 和你的主机之间。

在你的主机上,打开 Wireshark 并选择你想要监控的接口。在我的例子中,我的 Mac 上有一个 Thunderbolt 适配器,我使用的是标记为 en6 的接口,如下图所示:

图 5.8 – 接口选择

图 5.8 – 接口选择

选择后,你将看到工程软件和 PLC 之间的通信,如下图所示:

图 5.9 – Wireshark

图 5.9 – Wireshark

深入分析 Wireshark 日志超出了本书的范围,但我们将在接下来的几章中简要触及一些关键方面。点击任意数据包并查看源地址和目标地址。如果一切设置正确,你将看到 MAC 地址解析为 KoyoElec_##:##:##

Wireshark 只是查看网络流量的一种图形化方式。如果你想通过终端查看相同的数据,可以使用 Tcpdump。打开终端并找到连接到端口 2 的接口。输入以下命令:

tcpdump -i -v -X

Tcpdump 是捕获镜像流量的应用程序。命令中的 i 允许你选择要监听的接口。在我的案例中,这是 en6 接口。v 命令告诉 Tcpdump 显示详细数据。最后,X 显示每个数据包的头部和数据,以十六进制和 ASCII 形式显示,如下图所示:

图 5.10 – Tcpdump 命令

图 5.10 – Tcpdump 命令

Tcpdump 的输出应与通过 Wireshark 查看时看到的捕获数据一致。比较两者,确保你看到的是相同的信息。该捕获数据如下面的截图所示:

图 5.11 – Tcpdump 输出

图 5.11 – Tcpdump 输出

现在,你可能在想,这与我和我的渗透测试未来有何关系? 可以理解的是,访问交换机控制台并花时间设置一个 SPAN 会话可能会显得非常奇怪,因为在这个访问级别上可以做很多其他有趣的事情。我只是简单地介绍了 IDS 用来吸收数据的核心构建块。这一点非常重要,因为在过去的五年左右,工业自动化领域被动监控的采用量激增。你将在某种形式上遇到 IDS 解决方案,理解它们的工作原理和功能是关键。我们将在本章稍后部分详细讨论这一点。

本节中,我们讨论了理解 SPAN/端口镜像的重要性以及它所启用的技术。我们讲解了如何配置镜像端口,并使用 Wireshark 和 Tcpdump 来查看和捕获 Koyo CLICK PLC 与工程软件之间的流量。在接下来的部分,我们将讨论 TAP 是什么,它与 SPAN 流量的比较。我们还将讨论当你有物理访问权限时,TAP 在渗透测试中的重要性。

在一次渗透测试中使用 TAP

在上一节中,我们讨论了 SPAN 是什么以及如何配置和使用它。在本节中,我们将回顾 TAP 是什么、TAP 的不同类型以及它们如何在渗透测试中使用。通常,TAP 是硬件设备,插入在两个通信链路之间,以便我们能够执行完整的包复制。TAP 可以将流量复制到单一目的地或多个目的地,这称为 再生,或者 TAP 可以提供汇总流量,这被称为聚合。

TAP 和 SPAN 之间有很多不同之处,但在我看来最重要的一点是,SPAN 并不是一种真正的被动解决方案,因为它会在交换机上产生额外负担。话虽如此,TAP 会生成流量的完整副本,而不会影响交换机的性能或使其崩溃。缺点是,为了访问数据包,你必须更换电缆,这可能会导致服务的短暂中断。

TAP 主要有两种类型——主动和被动。被动 TAP 之间的接口没有物理断开,这样即使 TAP 出现故障,通信也能继续进行。而主动 TAP 则使用电源复制接口之间的通信,允许其以 1,000 M 的速度运行,而被动 TAP 仅支持 10/100 M 网络。在千兆网络上使用被动 TAP 会导致网络性能下降并产生性能问题。正如你在前一部分中回顾的那样,我们看到 PLC 通信默认在 100 M 下运行。这使得我们在进行渗透测试时可以使用被动 TAP,而不必担心引起性能问题,但我再次强调,在将植入物安装到网络之前,你必须确切了解网络的运行情况。这是一个警示故事,因为在过去的渗透测试中,我确实曾破坏过关键网络。在我们的实验室环境中,你无需担心会影响任何关键服务。这也是拥有实验室来进行测试和观察行为的一大魅力。

一款流行的被动 TAP 是 Great Scott Gadgets 的 Throwing Star LAN TAP。它可以在 greatscottgadgets.com/throwingstar/ 找到:

图 5.12 – Throwing Star LAN TAP

图 5.12 – Throwing Star LAN TAP

Throwing Star 上有四个连接器,标为 J1 – J4,其中 J1 和 J2 是内联连接,J3 和 J4 是监控端口。在我们的实验室中,我们将 J1 连接到 Koyo CLICK PLC,然后使用一根电缆将 J2 连接到交换机。完成后,将 J3 连接到你的笔记本电脑,并使用 Wireshark、TShark 或 Tcpdump 来捕获流量,正如我们在前一部分中所做的那样。在这个示例中,我们将使用 TShark 来捕获并显示流量。正如你在安装 Wireshark 部分回顾的那样,TShark 是一个可选组件,可以在安装过程中添加。输入以下命令进行操作:

Tshark -i

与 Tcpdump 类似,-i 选项允许你选择用于捕获过程的接口。我将使用我们之前使用的相同接口,即 en6。你可以在下面的截图中看到相应的命令:

图 5.13 – Throwing Star LAN TAP 捕获

图 5.13 – Throwing Star LAN TAP 捕获

捕获的数据包将与我们之前看到的格式相同。我这里附上一张截图,方便你与之前的 Tcpdump 捕获进行对比:

图 5.14 – TShark 数据包捕获

图 5.14 – TShark 数据包捕获

在这里,您可以看到使用 TAP 对于深入了解网络非常有用。如果您可以物理接入交换机,只需插入 TAP 即可开始捕获该端口上的数据交换。这将使您能够理解正在使用的协议,并可能捕获正在网络上传递和交换的独特和敏感信息。

许多供应商出售 LAN TAPs,但我建议看看 Hak5 在这个领域提供了什么。这里是他们商店的链接和特别的植入工具:shop.hak5.org/collections/implants

您可以找到 Throwing Star LAN TAP、Throwing Star LAN TAP Pro 以及其他出色的植入工具,如 Packet Squirrel 和 Plunder Bug LAN TAP。Plunder Bug LAN TAP 可以实时捕获流量,与 Throwing Star LAN TAP 完全相同的方式,直接捕获到 USB-C。我希望简要提到 Packet Squirrel,因为它可以留在工作中;您可以在以后的某个日期恢复它。我们可以设置有效载荷自动生成 PCAPs,在您希望发现网络中漂浮的可能凭据时非常有帮助。我知道这严格来说不是 TAP,但您可以将其连接到 Hak5 Cloud C2 进行管理和数据外流,从而可以访问感兴趣的网络流量:

图 5.15 – Packet Squirrel

图 5.15 – Packet Squirrel

如果您查看有效载荷选择开关,您将看到可以启动多个预先制作的漏洞利用。您也可以花时间编写自己的自定义有效载荷。

故事时间

2016 年秋天,我去了加利福尼亚州去 Hak5 办公室玩耍。他们正在举办一个名为Pentest with Hak5的红队培训活动。有很多人参加了培训活动,我们与 Darren Kitchen、Sebastian Kinne、Rob "Mubix" Fuller 和 Shannon Morse "Snubs"一起度过了时间。我们花了一周时间进行实践培训,学习如何使用 Wi-Fi Pineapple、LAN Turtle、Rubber Ducky 和深入 Metasploit。我们练习使用提供给我们的工具,并在一周结束时,我们的任务是试图阻止邪恶机器人删除互联网上所有的猫图像。Hak5 团队正在开发新的有趣工具,可以在实际工作中使用。我强烈建议查看他们的装备并熟悉它。– ThunderCats 2016

到目前为止,我们讨论了便携式“植入”类型的 TAP。然而,还有一些商业级 TAP 是公司用来构建带外安全监控网络的。这个领域有一些重要的厂商,其中最著名的之一是 Gigamon。这些更大型的“主动”TAP 解决方案可以支持 1G 和 10G 网络,从而将所有流量复制到监控设备上。我们将特别在“核电”安装中看到这些设备,可能根据企业安全预算的不同,它们也会出现在能源及其他重要工业领域。我之所以这么说,是因为硬件的成本和安装的庞大体量通常对于大多数组织来说是个不可接受的因素,因此,SPNA/镜像端口实际上成为了 IDS 被动监控解决方案的默认选择。

在本节中,我们讨论了如何在你整个职业生涯中以某种形式遇到 TAP,无论是通过渗透测试访问带外网络,还是通过植入设备留下后门。非常重要的一点是,要熟悉这一领域的不同厂商,并在实验室中使用它们。我们安装了一个 Throwing Star LAN TAP,并使用 TShark 验证我们是否成功捕获了 Koyo Click PLC 与我们在第二章中安装的工程软件之间的单播通信,路由硬件。这为下一节做了铺垫,我们将在下一节中讨论 IDS 及其在工业网络中开始扮演的重要角色。

导航 IDS 安全监控

到目前为止,我们已经安装了 Wireshark,了解并配置了 SPAN/镜像端口,并安装了“被动”TAP。这一切都为本节内容铺平了道路。对于那些怀疑被动监控真实性的“纯粹主义者”,请注意,各种厂商的技术已经被广泛采用,并且在几乎所有的渗透测试工作中都会遇到。我想这可以反映出公司安全成熟度的一些信息:随着他们参与第三方渗透测试,可以肯定的是,这些公司会投资新的监控工具来监控他们的工业网络。

在本节中,我们将讨论 IDS 安全监控领域的各种厂商,提供一个高层次的概述,讲解他们通常检测什么,如何将其融入更广泛的安全工具套件中以进行事件和警报监控,并学习如何在渗透测试过程中绕过这些产品,避免被检测到。因为如果 IDS 检测到你的 IP 地址并向网络访问控制NAC)发送 API 调用,然后该 NAC 推送一组新的安全组标签SGT),实质上会将你的 MAC 地址丢弃在所有交换机上,这会让你感到非常沮丧:

图 5.16 – IDS

图 5.16 – IDS

IDS 的理念和实施自 1980 年代以来就已存在。这项技术的推动力来源于对加强网络安全的需求。在过去的 40 年里,许多公司要么被收购,要么被出售,或逐渐消失。IDS 的发展非常有趣且历史悠久,但我希望将焦点集中在 IDS 对工业领域的直接影响上。1998 年,“Snort”问世,它是一个“开源”网络 IDS。像大多数技术一样,“Snort”允许爱好者和其他初创公司利用基于规则的引擎,开发更深层次的检测。快进到下一个十年,像 Digital Bond 和 Industrial Defender 这样的公司开始使用针对工业设备定制的规则,以检测恶意活动和攻击。

2009 年,一家名为“Security Matters”的公司在荷兰成立,专注于工业网络检测。11 年前的 2010 年 3 月,爱达荷国家实验室的三位研究人员发布了一篇名为《Sophia 概念验证报告》的论文。其目的是通过简单地监听网络流量来可视化地指纹化工业网络。

2013 年,成立了两家公司——一家位于美国,名为“Dragos”,另一家位于瑞士,名为“Nozomi Networks”,这两家公司都在被动监控领域推出了产品。前者“Dragos”推出了名为 Cyberlens 的产品,后者“Nozomi Networks”推出了名为 SCADAguardian 的产品。

2014 年,工业入侵检测市场爆发,十多家公司推出了此类系统。大多数公司来自以色列,由前 8200 以色列国防军成员推动,尽管值得一提的还有 Indegy、SCADAFence 和 Claroty。Sentryo 也于 2014 年成立,总部位于法国。所有这些公司都在进行“协议分析器”竞赛,竞赛的目标是看哪家公司能为资产发现提供最丰富、最全面的工具。

在下一章中,我们将深入探讨协议及其结构,但目前最重要的要点是,IDS 监控设备执行深度包检测,并分析流量中的恶意行为。之前提到的所有系统都会追踪新关键元素的出现,例子包括:

  • 网络中检测到新的 MAC 地址

  • 网络中检测到新的 IP 地址

  • 网络中检测到新的协议

  • 网络中检测到新的通信路径

在从企业端到工业网络的过程中,你应该将这些元素牢记在心。知道你的机器会被检测和指纹识别将帮助你开发不同的技术和策略来掩盖你的踪迹。在这一点上,我们知道如果这些系统检测到新设备和新通信,它们将生成一个事件或警报,取决于每个系统的命名约定。了解 IDS 如何处理警报至关重要;系统是否与 NAC 或防火墙集成?集成是否会导致在网络中深入遍历时出现问题?防火墙是否会阻止我们连接到较低级别系统?NAC 是否会向其管理的交换机推送 SGT,最终丢弃数据包?在浏览网络时,所有这些都是重要问题需要解决。

然而,并非一切都失去了,即使系统完全调整并部署了最新的数据包规则、YARA 规则、签名和集成。幸运的是,这些 IDS 监控系统在其装甲中存在我们可以利用的弱点。以下是我们可以使用的一些可利用的策略的简短列表,以颠覆被动监控:

  • 节点许可饱和

  • 警报耗尽

  • 其他协议或不常见端口

  • 加密协议的使用

  • 生存于土地

如果我让你认为所有 IDS 都容易受到这些攻击的影响,那我就有所失职了。这些只是通过以前的参与和研究发现的一些策略,它们以不同的方式影响各种 IDS 设备。

节点许可饱和

这种技术通过向网络引入大量新节点,最终导致监控解决方案达到许可节点计数。之后,你可以引入你的攻击策略,因为 IDS 解决方案不会检测和/或警报你的设备,当你在网络中深入时。通过这样做,你有效地使系统无法查看你的活动。

警报耗尽

这类似于节点许可饱和,但 IDS 解决方案不容易受到许可计数限制的影响。相反,它只是制造了大量噪音,使最终用户永远找不到活动。再次,这引入了大量新节点和活动到网络中,这很容易在系统中创建数十万个警报。

其他协议或不常见端口

这通过利用不常见的端口将攻击传递到系统中。根据监控系统,如果端口尚未与解析器关联,IDS 将标记流量为“其他”,并且不会对其进行进一步分析。一个例子是通过非标准端口传递 HTTP。

加密协议的使用

这是专门用于通过网络进行反向外壳的端口443或 HTTPS 的参考或利用。通过端口443进行通信通常是允许的,因为它被标记为 HTTPS 通信,因此通常不会对链接进行进一步分析,从而使我们能够无法检测地通过。

生存于自然

这是在进行渗透测试时最具隐蔽性的策略,因为我们可以利用网络中已经存在的设备和协议来实现不被检测。过去非常突出的攻击利用了这种策略,并导致某个核计划受到破坏 - 是的,这是对“Stuxnet”的引用。访问 HMI、数据历史记录或操作员工作站使我们能够通过正常方法和操作发送设定点更改或配置更改。通过 HMI 打开和关闭阀门似乎是正常行为,并且在网络中不会被注意到。

在本节中,我们讨论了什么是 IDS 以及工业 IDS 演变的历史。我们讨论了 IDS 是如何发现和检测的,我们还介绍了一些用于掩盖我们攻击的方法。了解并利用这些细节将有助于您在未来的客户参与中。

摘要

在本章中,我们了解了什么是 SPAN/镜像和 TAP,以及了解它们如何融入 ICS 生态系统的重要性。了解如何查看网络上的内容以及如何与之交互对于取得成功至关重要。发现哪些流量正在通信和交换数据使我们能够构建客户在其网络中拥有的资产的网络拓扑。在参与过程中,需要利用诸如 Wireshark、TShark 和 Tcpdump 等技术实时监听和审查流量。本章列出的 IDS 供应商等更先进的技术甚至会披露自动发现的漏洞。

在下一章中,我们将讨论如何监听网络上的 SPAN 或 TAP,我们将构建数据包捕获,以便分析和解剖网络上传输的协议。这是 IDS 公司用来开发产品的秘密武器。这是协议解析器的一场军备竞赛。在下一章中,第六章*,数据包深入解析*,我们将深入研究数据包和数据包捕获。

第六章:数据包深度剖析

之前,我们讨论了什么是交换机端口分析仪SPAN)/镜像测试接入点TAP),以及如何使用 Wireshark、Tcpdump 和 TShark 配置镜像端口,以监听工程软件与我们的 Koyo Click 可编程逻辑控制器PLC)之间的通信流量。我们还回顾了入侵检测系统IDS)技术如何利用 SPAN/Mirror 和 TAP 对工业网络流量进行 深度数据包分析。此外,我们还简要提到了一些在渗透测试过程中绕过 IDS 监控的方式和策略。

在本章中,我们将更深入地了解软件与 PLC 之间的通信路径,并将使用 Wireshark 更详细地分析这些数据包。在渗透测试中,捕获和分析流量对于成功至关重要,正如上一章所提到的。此外,理解环境、资产、活动和协议是至关重要的。本章将帮助你通过捕获流量并分析这些流量提取出关键信息,为未来的成功奠定基础。

在本章中,我们将涵盖以下主要内容:

  • 数据包是如何形成的?

  • 捕获网络中的数据包

  • 分析数据包中的关键信息

技术要求

本章你将需要以下内容:

你可以在此查看本章的代码实际操作:bit.ly/3veDRlW

数据包是如何形成的?

为了全面理解网络中发生的事情,让我们快速了解一下数据包基础知识。数据包是字节大小的数据中继,它们在源资产和目标资产之间传递信息。以推动互联网流量的协议为例,传输控制协议TCP)和互联网协议IP)组成了著名的缩写 TCP/IP。这些数据中继通过一系列交换机路由,并重新组装,使我们能够发送电子邮件、浏览网站、下载软件补丁、观看电影、监控电梯、管理火车、制造产品、生产能源,以及许多其他有趣和动态的事情。

为了全面理解数据包及其工作方式,了解它们如何在开放系统互联OSI)模型的各层之间流动至关重要。OSI 模型在 80 年代中期被创建并采用,旨在为描述系统通过网络进行通信所使用的七个层次设定标准。从最上层开始,逐层向下,您可以在以下图表中查看各层的列表:

图 6.1 – OSI 模型

图 6.1 – OSI 模型

现在,参考前面的图表,我们将逐层解析每个层,并简要说明每个层的功能以及它如何为 OSI 模型做出贡献。

应用层

这一层为用户提供直接交互,例如承载 SCADA 接口的网页浏览器、人机接口HMIs)、数据历史记录器,以及任何其他可直接查看和控制的软件。与此层相关的协议包括httpftpdns

表示层

这是数据编码、加密和解密发生的层,以便数据从会话层传递到应用层。

会话层

当设备如 RTU、PLC、流量计算机、控制器、气相色谱仪GCs)、服务器和其他设备需要相互通信时,通信通道会被创建。这些被称为会话。该层负责打开这些通道,确保它们正常工作,并在数据通过时保持开启。

传输层

在传输层,会就速度、数据速率、流量控制和错误检查进行协商。TCP 和 UDP 就是在这一层运行的。

网络层

这是通过利用 IP 地址在网络上源节点和目标节点之间传输数据的路由层。

数据链路层

与这一层相关的有两个部分,逻辑链路控制LLC)和媒体访问控制MAC),它们提供直接的节点对节点通信。网络交换机通常在这一层工作。

物理层

再次回到用户的手中。这一层指的是物理连接,例如插入以太网端口的电缆或在网络上通信的无线网卡。

现在我们大致了解了 OSI 模型及各层之间的关系,接下来我们将快速概述 IPv4 数据包的结构。

注意

如果你跟我走到这里,你可能会问自己:“为什么要讲这些基础内容?”说实话,当我开始写这本书时,我的想法是写一本关于工业渗透测试的介绍,主要面向来自 IT 安全领域的人。最近,我和很多在自动化领域工作的朋友进行了对话,他们希望转行做安全。因此,我正在努力弥合这两类不同背景的读者之间的差距。我希望能为我的朋友们提供一本参考书,他们可以跳过自己已经熟悉的部分,快速了解他们第一次接触的主题。

好的,既然免责声明已经说完,我们现在来看一下数据包的结构。以下是一个 IPv4 数据包的一般设计:

图 6.2 – 一个 IPv4 数据包

图 6.2 – 一个 IPv4 数据包

上图中概述的头部字段详细说明如下:

  • 版本:这个字段始终设置为4,因为这是最新的 IP 版本。

  • IP 头长度(IHL):这个字段表示 IP 头的长度,以 32 位为单位。

  • 服务类型(ToS):这个字段用于确定服务的质量或优先级。

  • 总长度:这个字段表示数据包的整体大小,以字节为单位。

  • 标识:网络使用这个字段来重新组装任何被分片的数据包。

  • 标志:这个字段用于控制数据包的分片。它由 3 位组成;第一位为 0,第二位是“不要分片”位,第三位是“更多分片”位。

  • 片段偏移:这个字段确定数据包片段的位置。

  • 生存时间(TTL):这个字段用作防止数据包循环的机制。

  • 协议:这个字段用来表示协议类型。TCP 的值为6,UDP 的值为17

  • 头部校验和:这个字段用于存储校验和,并用于错误处理。

  • 源地址:这个字段包含源 IP 地址。

  • 目的地址:这个字段包含目的 IP 地址。

  • 选项:这个字段通常不会使用。

  • 数据:这部分包含要发送给节点的信息。

这是对 IPv4 数据包结构的简要概述,关于这个特定主题还有更多可以研究的信息。我只是想提供一些背景知识,这样当我们开始在 Wireshark 中查看帧和数据包时,你能够理解引用的内容以及为什么细节和信息以这种方式显示。Wireshark 参考资料的直接链接可以在 www.wireshark.org/docs/wsug_h… 找到。

在这里,我截取了 Wireshark 的“数据包详情”面板的截图:

图 6.3 – 数据包详情面板

图 6.3 – 数据包详情面板

现在,在你的系统上,尝试扩展与我们先前讨论的各层相关的元素。我将扩展的第一个元素是以太网 II元素,如下图所示:

图 6.4 – 以太网层

图 6.4 – 以太网层

这个以太网 II元素与前面讨论过的数据链路层直接相关。我们可以看到我们有目的地MAC 地址、MAC 地址、类型填充。与 MAC 地址的前 3 个字节相关的组织唯一标识符OUI)非常有趣。在这里,你可以看到 Wireshark 正在解析 OUI,并且 VMware 和我们的 KoyoElec PLC 都已解析。在以下的截图中,我们可以看到网络层:

图 6.5 – 网络层

图 6.5 – 网络层

在这一层,我们可以直接将先前概述的 IPv4 布局映射到我们捕获到的在 Koyo Click PLC 和工程软件之间传输的包。以下是网络层中重要字段的列表:

  • 版本:4

  • IHL:20 字节

  • TOS:0x00

  • 总长度:43

  • 标识:0x61ff

  • 标志:0x00

  • 片偏移:0

  • 生存时间:128

  • 协议:UDP(17)

  • 头部校验和:0x5354

  • 源地址:192.168.3.10

  • 目的地址:192.168.1.20

我们接下来要审查的是传输层。在这一层,应用程序通过端口与彼此通信。以下截图显示了传输层:

图 6.6 – 传输层

图 6.6 – 传输层

在这里,我们可以看到使用了源端口:54782目的端口:25425。最后,我们将查看 Wireshark 数据包详情面板中的数据元素/应用层。这就是可以找到应用程序数据的地方。通常,这是数据包中最有趣的部分,因为像凭证这样的内容通常以明文形式出现在这里。以下截图代表了应用层:

图 6.7 – 应用层

图 6.7 – 应用层

这里的数据尚未解析为清晰的元素,因为我没有运行专用的 Koyo Click 协议解析器。我们可以查看数据包字节面板中的 ASCII 转换,如下所示:

图 6.8 – 数据包字节面板

图 6.8 – 数据包字节面板

如前面截图所示,4b 4f 50开始了数据部分。如果你查看 ASCII 转换,你会看到它包含了KOP的字符。这是 Koyo Click 协议的直接标记。

在本节中,我们介绍了 OSI 模型和数据包结构。然后,我们将 OSI 模型和数据包结构的理论与我们实时捕获的流量进行了关联。这帮助我们在理论和实际应用之间建立了联系。在下一节中,我们将更详细地观察在我们的工程软件中运行命令,通过镜像端口使用 Wireshark 捕获流量,然后更深入地分析KOP 协议。这个分析将帮助我们在未来的渗透测试中,因为我们可以开始构建并提高分析未知协议的技能——这是你在职业生涯中一定会遇到的挑战。

在网络中捕获数据包

在上一节中,我们讨论了 OSI 模型是什么,以及构成和构建该模型的各层。我们回顾了数据包是如何构建的,然后直接将数据包结构与 PLC 与工程软件之间的通信交换进行比较。在本节中,我们将更深入地探讨 Wireshark,并关注我在参与项目时常用的一些关键功能来捕获流量。回顾一下,在*第五章**《如果你能找到我》*中,我们使用 Wireshark 验证了我们的镜像端口是否已正确设置和配置。

现在,我想在即将到来的内容中强调两个非常重要的点,并向同行的安全专家们致敬,同时也向我个人过去曾用来提高技能的资源致谢:

这两个资源提供了不同类型的内容。我将Wireshark 101 by Laura Chappell 作为我的核心图书馆的一部分,第一个链接是向 Laura 致敬,她为提供专注于使用 Wireshark 进行网络故障排除和安全取证的内容做出了出色的贡献。第二个链接是指向一个专门讲解 Wireshark 的房间。如果你想进行互动式的实操训练,我强烈推荐这个网站和房间。这个网站是红队领域任何人都可以利用的一个好资源。我个人花时间在这个网站上更新由社区分享的新战术。

话不多说,我们直接开始。我们将打开 Wireshark 并选择我们的捕获接口。你应该会看到一个可能的接口列表,类似于以下屏幕截图:

图 6.9 – 捕获接口

图 6.9 – 捕获接口

在上述截图中,我希望聚焦于**…使用此过滤器**输入字段。这使我们在捕获流量时能够提供精确的焦点。如果我们特别寻找唯一的主机、一系列主机、协议或与参与相关的任何特定内容,这就是我们可以定义捕获过滤器的地方。

注意

捕获过滤器不应与显示过滤器混淆。捕获过滤器会丢弃或忽略超出过滤条件的数据包,而显示过滤器仅隐藏数据包但允许您保留它们以进行更深入的分析。在参与时,如果您不清楚自己正在捕获的内容,我建议捕获所有内容,然后稍后使用显示过滤器。

捕获过滤器

在现场使用的一些简单的捕获过滤器示例包括以下内容:

  • 主机: 这将捕获与给定主机相关的所有通信。在本例中,所有源自或指定为192.168.120的通信将被捕获,所有其他流量将被丢弃。如果您的客户对非常专注的渗透测试有限制,这将非常有用。您可以使用以下命令来实现这一点:

    主机 192.168.1.20

  • 网络: 这将捕获与给定子网相关的所有通信。本例仅捕获目标为或来自192.168.1.0/24子网的流量。如果您的客户不希望您与其他网络或通信交互,这非常方便。这通常被称为灰盒或白盒渗透测试,我们将在下一章节详细介绍。您可以使用以下命令:

    net 192.168.1.0/24

  • 端口: 这将捕获与给定端口相关的所有通信。在本例中,我们将专注于通过端口502进行的Modbus流量通信。当我们想追踪特定流程内相关的特定协议时,这非常方便。您可以参考以下命令:

    端口 502

如果您想专门跟踪文件传输协议FTP)、网络文件系统NFS)、SMB 文件传输、TELNET 或基本的 HTTP 认证,还有许多更复杂的过滤方法可以使用。使用捕获过滤器可以让您专注于关键数据包,并在实现目标后将数据保持在可管理的大小。一切可以通过捕获过滤器做的事情,您也可以通过显示过滤器来完成。捕获过滤器与显示过滤器之间最显著的区别是,在相同捕获时间下,文件大小的变化。在非常嘈杂的网络中,只需几秒钟就可以捕获到数百万个数据包。在达到目标之前,可能已经捕获了数 GB 的数据。虽然使用捕获过滤器的好处是您确实可以得到小且易于管理的数据包捕获,但您会失去其他流量中可能隐藏的宝贵信息。接下来,在本书的剩余部分,我们将专注于显示过滤器。这是因为它们能够捕获所有数据包,从而让我们对有趣的攻击向量进行进一步的取证分析。如果使用捕获过滤器,可能会错过这些向量,因为捕获过滤器只会保留符合过滤条件的数据包。

显示过滤器

停止当前的 Wireshark 捕获,移除捕获过滤器,并重新选择您的接口。这将允许我们记录网络上的每个数据包。现在,您应该能够看到您的 Koyo Click PLC 或您在实验室中设置的任何 PLC 与工程软件进行通信的情况。以下是您应该看到的示例截图:

图 6.10 – PLC 与工作站之间的通信

图 6.10 – PLC 与工作站之间的通信

我想重点介绍显示过滤器输入栏,如以下截图所示:

图 6.11 – 显示过滤器

图 6.11 – 显示过滤器

这里是分析发生的地方。对于这个特定部分,我将讨论在渗透测试过程中使用的关键过滤器。为此,我认为最好的方法是专注于一些特别有趣的协议,这些协议能够帮助我们在操作技术OT)环境中获得立足点。在网络内部,会有很多以工业控制系统(ICS)为中心的协议,如 Modbus、Ethernet/IP、DNP3、S7、HART 等。下一章将更详细地介绍这些内容。然而,在本节中,我希望关注一些容易获取的内容。这些特定协议在我的渗透测试过程中帮助最大,它们在网络中携带了大量信息,并且在穿透客户的基础设施时非常有用。

HTTP

从 HTTP 协议中可以获取许多信息,这也是为什么每个人在安全领域都在推动实现 HTTPS 的原因。对我们来说,幸运的是,在工业控制系统(ICS)领域,有 SCADA 系统、HMI、RTU、PLC、流量计算机和 GC 等设备使用传统的 Web 界面来提供信息和/或执行控制。HTTP 协议中包含了许多重要的数据点。你可以通过基本认证提取凭证,可以找到更复杂的混淆形式并在http.authorization中过滤摘要,可以捕获请求方法,可以捕获资产细节以及在内部网络中通信的设备等等。以下是一些重要的 HTTP 过滤器:

  • http.authbasic: 这个过滤器用于查找基本认证,我们可以轻松地提取并解码,因为用户名和密码是 Base64 编码的。根据公司的安全成熟度,这些数据仍然可以在未更新的旧系统中轻松找到。

  • http.authorization: 这是一个可以用来提取授权和摘要访问的过滤器,用于协商凭证,然后使用hashcatJohn the Ripper等工具进行暴力破解凭证。我们将在下一章中介绍如何暴力破解密码。

  • http.request.method: 这个过滤器提供了很多有趣的信息,因为它会提取所有的GETPOSTPUTDELETE方法。如果你在寻找应用程序编程接口API)调用和命令,这将非常有用。

    故事时间

    我曾参与过多个与机场相关的项目。这个特定的机场项目恰好在其公共 Wi-Fi 上使用了一个平面网络;虽然他们并不认为这是平面网络,但就实际情况而言,它确实是一个平面网络。通过简单地嗅探 Wi-Fi 的广播和多播流量,很明显他们没有更改网关的默认凭证。通过设置远程嗅探会话,我能够捕获到通过他们的公共 Wi-Fi 传输的所有内部网络通信。结果发现,他们没有在SIEM上启用 HTTPS,而且他们使用一个账户记录并访问所有进出其 SIEM 的数据。一旦我获取了这些使用 Base64 编码的凭证,稍微解码并启用日志记录,我就能够看到机场的整个基础设施,包括所有航站楼、行李处理、暖通空调、自动扶梯、照明等。

由于 HTTP 包含大量数据,这是我使用 Wireshark 时的首选过滤器。我希望看到它所包含的所有简单数据并记录下来,以便以后利用。接下来,我将使用 FTP 作为显示过滤器,深入分析数据,寻找有趣的信息。

FTP

作为 ICS 网络中最常被探索的协议之一,FTP 几乎被自动化供应商滥用。事实上,FTP 的整个前提是使用非加密协议传输文件,这意味着通过该协议传输的所有内容都容易受到利用。我们有一些供应商使用 FTP 来更新固件或可编程逻辑。试想一下,如果你能够伪造一个明文文件,轻松触发从稳定的固件版本降级到之前的脆弱固件版本。所有这些都可能发生,因为比喻来说,他们并没有提到他们只是试图为流感贴个创可贴。

尝试在 Wireshark 中使用以下显示过滤器:

  • ftp.request.command == "USER"

  • ftp.request.command == "PASS"

该过滤器直接针对试图访问该主机并失败的用户和密码。它可以找到使用 Hydra 等工具进行的暴力破解尝试,或者如果非常幸运,可能会找到有效用户的真实凭证。

ftp-data:使用此过滤器,你可以解析通过 FTP 协议在设备之间传输的文件。如果你发现一个数据共享,其中包含一些敏感信息的文件,这个过滤器会非常有用。

由于 FTP 在工业领域仍然被广泛使用,因此在捕获网络数据包时,它是一个需要分析的关键因素。可以提取和重复使用凭证和文件,从而为网络中的潜在更深层次的攻击提供可能性。谁知道,这本身可能就能验证一项完成的渗透测试,因为有些公司内部的文件共享中可能存在滞留的知识产权。继续探讨文件共享的主题,我们接下来将分析 NFS。

NFS

这是另一个在工业自动化的程序交付端使用的动态协议。编写一个简单的 Python 脚本,能够匿名认证到远程共享,并通过 NFS 上传一个损坏的固件版本,实际上可能会影响并使所有在可访问子网中的控制器无法工作。免责声明:权力越大,责任越大。尽管这是可能的,但在渗透测试中绝不应采用这种策略。我只是指出一些仍然存在于行业中的传统实现的基本缺陷,并且这些缺陷已经被全球采用。因此,我不仅关注 NFS 作为固件交付方法,还因为root_squashing。在某些情况下,你可能会发现root_squashing已被关闭,能够迅速找到这一点可以帮助我们在 OT 环境中的机器上快速提升权限。以下是一些可以用来缩小可能暴露的系统范围的显示过滤器:

  • nfs.readdir.entry:此过滤器帮助提取通信内容,以显示是否存在可被利用的文件共享。在协议内部,明文显示的文件列表将帮助我们绘制出现有资产,并可能指示进入系统的入口点。

  • nfs.access_rights:下一个过滤器允许我们筛选出被锁定的文件共享。如果我们运行此过滤器,它将提取与特权访问相关的数据包,如读取(READ)、查找(LOOKUP)、修改(MODIFY)、扩展(EXTEND)删除(DELETE)。这些信息非常重要,能够帮助你节省时间并减少在渗透测试过程中遇到的麻烦。

本部分中,我们讨论了如何使用 Wireshark 捕获网络流量。我们缩小了捕获过滤器的定义,讲解了它们的优势以及在渗透测试中的应用方法。我们还讨论了捕获过滤器与显示过滤器之间的区别。接着,我们深入探讨了一些关键的显示过滤器,它们可以帮助你发现网络内部的有价值信息,并且可以用于资产识别、潜在的利用途径、权限提升途径,以及可能的网络中转点。在下一部分,我们将通过使用显示过滤器分析数据包捕获文件,实际演练如何提取关键流量信息。

分析数据包中的关键信息

在前面的部分,我们讨论了如何使用显示过滤器分析httpftpnfs等协议。了解如何应用这些过滤器并提取关键数据,对成功进行渗透测试至关重要。此外,理解网络中谁与谁进行通信,并迅速应用过滤器聚焦于关键信息,是必不可少的技能,并且需要不断练习,才能提高流量分析的能力。在前面的部分,我提供了一些链接,我想再次强调,你需要不断练习,提高你的技能。人们通常将渗透测试人员称为网络武士或数字忍者:他们每天都在练习,以加强并精通自己的技能。在本部分中,我们将对多个数据包捕获文件进行分析,展示如何处理网络数据包捕获文件,并提取成功进行评估所需的关键信息。

注意事项

渗透测试者成功的关键要素之一不仅仅是能够攻破系统,而是能够清晰简明地沟通安全漏洞所在,以及你是如何利用这些漏洞获取环境访问权限的。这是我第一次真正谈论这个话题。但现在我们深入到流量分析中,并会遇到很多有趣的信息,我必须强调,你需要保持一个便签本,记录下看到的资产、捕获的信息、可以被利用的枢纽点,以及在网络中嗅探到的凭证。所有这些信息都需要记录下来,并确保在需要提交最终报告时可以轻松查阅。你会感谢自己开始做笔记并记录下你在网络中发现的那些有趣的信息。

现在,如果你回顾一下技术要求部分,我发布了一个关于 4SICS Geek Lounge 数据包捕获的链接。为了复习,这里再次给出链接:www.netresec.com/?page=PCAP4SICS

现在你可以利用你拥有的任何 PCAP 文件。这些文件在行业中是开放的,可以帮助我们真正发挥显示过滤器的强大功能。

继续用 Wireshark 打开名为4SICS-GeekLounge-151021.pcap的 PCAP 文件。你应该能看到大约 120 万个数据包被加载到 Wireshark 中。我希望你能尝试上一节中提到的第一个显示过滤器。使用http.authbasic过滤器,你应该能看到类似以下截图的输出:

图 6.12 – http.authbasic 显示过滤器

图 6.12 – http.authbasic 显示过滤器

如果你注意到Authorization: Basic YWRtaW46YWRtaW4=字段和值,你可以通过运行以下命令,运用你的命令行技能:

echo YWRtaW46YWRtaW4= | base64 -d

在你的命令行中,你将使用admin:admin凭证。

如果你更倾向于使用工具,那么我强烈推荐CyberChef,可以在gchq.github.io/CyberChef/找到。

CyberChef 是一个很棒的图形工具,用于执行编码/解码、密码学分析和转换等操作。简单来说,它有输入、输出和配方。在我们的案例中,我们希望将基本哈希值放入输入部分并应用From Base64配方。在输出部分,你将看到admin:admin凭证,如下图所示:

图 6.13 – 从 Base64 解码的 CyberChef

图 6.13 – 从 Base64 解码的 CyberChef

我个人喜欢使用命令行中的 Base64 来进行解码和其他任务,只在进行更复杂的任务时依赖 CyberChef,比如在 Base64 中编码 Node.js 反向 Shell 并将其注入到格式错误的 Web 门户中,不过我有点跑题了。现在在查看该过滤器时,你应该会注意到第二组凭证;你能找到它们吗?

第二组凭证将是Authorization: Basic cm9vdDpyb290,即root:root

现在,记得我之前建议你做笔记吗?让我们通过运行一个简单的显示过滤器来回顾一下我们发现了什么。我们得到了以下信息:

  • 资产192.168.2.42通过 HTTP 与192.168.88.2580端口进行通信,凭证为admin:admin

  • 资产192.168.2.88通过 HTTP 与192.168.88.4980端口进行通信,凭证为root:root,用户代理表明它可能是运行 Firefox 的 Ubuntu Linux x86_64。

所有这些信息都非常有用。我们知道有两个不同的子网,并且.2可以与.88通信。我们知道有两个 web 服务器在运行,并且它们使用的是一种旧的认证方式,这让我相信这两个服务器可能容易受到进一步的利用。和下面的图示类似,我还习惯于绘制连接图,以便后续作为视觉参考:

图 6.14 – HTTP 访问的视觉辅助图

图 6.14 – HTTP 访问的视觉辅助图

接下来,我们想要将过滤器从http.authbasic更改为http.request.method,此时你应该会看到大约 5,800 个包含GETPOSTOPTIONS 请求的数据包。在这里,我可以快速扫描信息列,寻找任何特别有趣的内容,比如文件名、DELETEPUTPOST 请求、授权尝试,或者任何能够提供更多网络细节和见解的内容。由于我们可以看到POST请求,我将调整过滤器,专注于POST请求,如下图所示:

图 6.15 – POST 请求

图 6.15 – POST 请求

现在,我们已经将 5,800 个数据包过滤为 15 个。请查看信息列,如下图所示,看看是否能找到任何可能感兴趣的内容:

图 6.16 – 信息列

图 6.16 – 信息列

我们可以从过滤器中看到有一些有趣的 URL 正在被 POST 到:

  • /goform/svLogin

  • /home.asp

  • /view/

点击第一个/goform/svLogin** **POST 请求并导航到application/x-www-form-urlencoded部分,我们可以看到表单项以明文传递,如下图所示:

图 6.17 – /goform/svLogin POST 请求

图 6.17 – /goform/svLogin POST 请求

我们现在找到了另一组root:dbps凭证。记下这些信息后,我们可以继续添加以下内容:

  • 资产192.168.2.42正在通过 HTTP 与192.168.88.115的端口80进行通信,后者是一个使用root:dbps凭证的 Digiboard 设备。

下一个数据包将是POST请求,目标为/home.asp。如果我们查看数据包的详细信息,会发现一个非常有趣的发现,那就是Cookie,如下面的截图所示:

图 6.18 – Cookie 字段

图 6.18 – Cookie 字段

在这里,我们可以看到另一组凭证:

  • AccountName508=admin

  • Password508=0192023a7bbd73250516f069df18b500

这非常有趣,因为该密码看起来像是加密的。我们可以使用几种不同的方法来确定它可能的加密类型。我个人在hash-identifierhaiti之间切换。对于这个例子,我们将使用hash-identifier,并在我们的 Kali 实例上运行以下命令,这是我们在*第一章**,使用虚拟化中安装的:

echo 0192023a7bbd73250516f069df18b500 | hash-identifier

你应该会收到类似以下的响应:

图 6.19 – Hash ID

图 6.19 – Hash ID

现在我们知道这个哈希值可能是 MD5 哈希,我们可以尝试使用多种工具进行破解,如hashcatJohn the Ripper。但是,我将访问crackstation.net,加载哈希并快速检查它是否已被破解。果然,它已经破解了,如下图所示:

图 6.20 – crackstation.net MD5

图 6.20 – crackstation.net MD5

现在,我将逐一检查这些请求,提取哈希值并在crackstation.net上检查。你应该会看到以下结果:

图 6.21 – CrackStation 找到的密码

图 6.21 – CrackStation 找到的密码

发现的凭证对如下:

  • admin:admin123

  • user:user123

  • admin:123

  • admin:ADMIN123

  • root:root123

现在需要注意的是,并非所有这些凭证都有效,我们需要更深入地查看设备之间的通信,以找出哪些凭证是真实的,哪些是无效的。我们可以通过高亮显示其中一个数据包并右键单击它来做到这一点。然后,我们可以选择跟踪 | HTTP 流,如下面的截图所示:

图 6.22 – 跟踪 | HTTP 流

图 6.22 – 跟踪 | HTTP 流

这个接收到的数据包输出如下:

图 6.23 – HTTP 302 重定向

图 6.23 – HTTP 302 重定向

因为我们看到一个 HTTP/1.0 302 重定向,我们可以合理推测提供的凭据是错误的。如果你继续以这种方式分析数据包,你应该会看到一个 HTTP/1.0 200 OK 响应,这表示凭据是有效的,用户已经在网页门户中通过认证:

图 6.24 – HTTP 200 OK

图 6.24 – HTTP 200 OK

现在,我们应该回去更新之前的图示,并确保更新我们的笔记。以下是新图示的样子:

图 6.25 – HTTP 数据检测

图 6.25 – HTTP 数据检测

在这里,我们仅使用了两个特定于 HTTP 的过滤器,并且已经发现了可以在交换机技术中使用的有效凭据,这让我们能够深入网络。还有更多广泛的过滤器可以用来解析出更大量的信息;我只是想展示在非常短的时间内获取关键信息有多么容易。在最后一节中,我们将讨论 FTP 协议并展示该协议的显示过滤器。使用相同的 PCAP 文件,更新你的显示过滤器,仅仅查找所有的 FTP 流量,如下图所示:

图 6.26 – FTP 流量

图 6.26 – FTP 流量

选择第一个数据包,即 No.** **480883,查看数据包信息,我们可以迅速找到非常相关且易于识别的资产详情,如下所示:

图 6.27 – AXIS 206 网络摄像头

图 6.27 – AXIS 206 网络摄像头

在这里,我们碰巧找到了一个 AXIS 网络摄像头,该摄像头在数据包内发布了资产型号和版本号。现在回想一下我们讨论开源情报的章节;我们应该能够打开 www.exploit-db.com/ 并在搜索框中输入 axis network camera。你应该能看到以下结果:

图 6.28 – Exploit 数据库

图 6.28 – Exploit 数据库

让我们点击看到的第一个条目,Axis 网络摄像头 - .srv 到 parhand 远程代码执行(Metasploit)。查看该条目的详细信息后,我们发现有一个很好的 Metasploit 模块,可以让我们对这个摄像头进行远程执行。太棒了!让我们将其添加到图示和文档中。有了这些新信息,让我们回到笔记中,看看我们现在发现了什么。以下是更新后的图示:

图 6.29 – HTTP 服务器与 AXIS 网络摄像头

图 6.29 – HTTP 服务器与 AXIS 网络摄像头

请注意,通过使用 HTTP 过滤器,我们发现了一个位于 IP 地址192.168.88.49的 Web 服务器,凭证为root:root。现在,在运行 FTP 显示过滤器后,我们可以看到另一个设备与该先前的资产进行通信。然而,我们现在有了更多的资产信息,可以确定该端点是一个网络摄像头,于是我们更新了我们的笔记,并记录下我们发现的漏洞。打开接下来的两个 PCAP 文件,并运行我们在4SICS-GeekLounge-151021.pcap上使用的相同过滤器,确保记录下你的发现。

在这一部分,我们深入探讨了显示过滤器和可以提取的数据。我们使用了在www.netresec.com/?page=PCAP4SICS上公开发布的 PCAP 文件。然后,我们通过使用各种 HTTP 和 FTP 显示过滤器来探索数据。我们能够捕获正在网络上使用的有效凭证,并识别出一些具有战略意义的易受攻击资产。这一部分帮助我们理解了为什么捕获和分析网络流量对于渗透测试至关重要,因为可以从网络中提取到更多有用和关键的数据。

总结

在本章中,我们通过回顾 OSI 模型并理解模型中存在的各种层次,了解了数据包的形成方式。我们进一步分析了 IPv4 数据包的结构,并与从实验设备上捕获的数据包进行了对比。在对数据包是什么以及它们如何构建有了更好的理解后,我们使用 Wireshark 捕获了这些数据包。我们利用了上一章中创建的镜像端口,并讨论了捕获过滤器和显示过滤器之间的区别。

最后,我们从一个开源的 ICS 实验室下载了一些 PCAP 文件,并使用 Wireshark 分析了我们在这些数据包捕获中发现的流量。我们利用显示过滤器来缩小关键网络数据的范围,如有效凭证、操作中的 Web 门户和工作中的网络摄像头。理解并实践这些技术和方法将使你在未来的渗透测试中取得非常成功的成果。

在下一章,我们将把迄今为止学到的所有内容应用到实验中。我们将讨论多个主题,如枚举、协议深度分析、利用和权限提升。这些都是成功进行渗透测试所需的关键要素。