工控系统渗透测试-三-

133 阅读48分钟

工控系统渗透测试(三)

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

译者:飞龙

协议:CC BY-NC-SA 4.0

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

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

本章节将涵盖以下内容:

  • 第十二章我看到了未来

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

第十二章:我看到未来

在上一章之后,如果您按照编写顺序阅读本书,那么我们已经通过防火墙在企业网络中进行了转向,现在在我们的 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 并立即申请。我们与成千上万的开发者和技术专业人士合作,帮助他们与全球技术社区分享他们的见解。你可以提交一个一般申请,申请我们正在招聘作者的特定热门话题,或者提交你自己的创意。

分享你的想法

现在你已经完成了渗透测试工业控制系统,我们非常希望听到你的想法!如果你是从亚马逊购买的这本书,请点击这里直接进入该书的亚马逊评论页面,分享你的反馈或在你购买的站点上留下评论。

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

你可能会喜欢的其他书籍

你可能会喜欢的其他书籍