随时、随地、随心阅读

当当云阅读

版权信息

书名：Web渗透测试实战:基于Metasploit 5.0

作者：(印)哈伯利特·辛格(Harpreet Singh),(印)希曼舒·夏尔马(Himanshu Sharma)

排版：辛萌哒

出版社：机械工业出版社

出版时间：2021-07-01

ISBN：9787111686279

本书由北京华章图文信息有限公司授权北京当当科文电子商务有限公司制作与发行。

— · 版权所有 侵权必究 · —

译者序

在IT行业工作了20年，这是我翻译的第三本信息安全类专业书籍，也是为机械工业出版社华章公司翻译的第一本书，值得纪念。我将会尽量利用我的业余时间多翻译一些优质的国外图书，也希望能通过这种方式对我国的信息安全产业做出贡献。

我曾在RAPID7工作6年，可以说每天都在和MetasploitMetasploit是RAPID7的一个产品。打交道，这个“神器”也绝非浪得虚名，在渗透测试工具领域无疑占据领导地位。这个工具的发明者是被称为世界十大黑客之一的HD Moore，也是我在RAPID7工作时的同事，虽然他后来离开了RAPID7开始创业，但仍然是Metasploit项目组的特别成员。熟练使用Metasploit将非常有助于提高渗透测试的效率。

本书作者都拥有丰富的行业经验。具有一定渗透测试基础，尤其是Metasploit方面基础的读者可以跳过前两章，但后面的每章内容都很精彩，也很关键。第8～10章介绍如何对主流CMS（WordPress、Joomla、Drupal）进行渗透测试，第11～13章介绍如何对主流技术平台（JBoss、Apache Tomcat、Jenkins）进行渗透测试。建议读者按照本书的章节顺序进行阅读，动手实践书中的示例，并尽量花时间做一下每章节最后的问题，这非常有助于加深读者对知识点的理解。请在实验环境下进行练习，在没有正式授权的情况下禁止在真实环境中进行攻击。

本书内容深入浅出，很适合信息安全从业者（尤其是信息安全攻防领域的从业者和渗透测试人员）、大专院校网络安全专业学生阅读。翻译过程中难免有错误和纰漏，请广大读者批评指正。

参与本书翻译的还有赵贤辉（影子）和赵越。影子具有超过15年的渗透测试实战经验，赵越长期在甲方从事渗透测试和安全评估工作，也有着丰富的从业经验。

最后，衷心感谢上海碳泽信息科技有限公司全体同人和股东的支持，感谢你们的理解和信任。

贾玉彬
上海碳泽信息科技有限公司创始人
2021年1月于北京

前言

在当今快速发展的技术世界中，信息安全行业正以惊人的速度变化，与此同时，针对组织的网络攻击数量也在迅速增加。为了保护自己免受这些来自真实世界的攻击，许多组织在其流程管理中引入了安全审计以及风险和漏洞评估机制，旨在评估与其业务资产有关的风险。为了保护IT资产，许多组织聘请信息安全专业人员，以识别组织的应用程序和网络中可能存在的风险、漏洞和威胁。对于信息安全专业人员来说，掌握并提高自己的专业技能以及熟悉最新的攻击方法至关重要。同样，为了提高效率，许多人在进行渗透测试和漏洞利用时都将Metasploit作为首选。

对于网络漏洞利用和后渗透，我们可以找到大量资源，但是就Web应用渗透测试而言，选择Metasploit的人并不多。本书将帮助安全顾问和专业人士了解Metasploit在Web应用渗透测试中的作用，使读者能够在Metasploit的帮助下更有效地进行Web应用渗透测试。

本书读者对象

本书专为渗透测试人员、白帽黑客、信息安全顾问以及对Web应用渗透测试有一定了解，并且想要了解更多相关知识或深入研究Metasploit框架的人而设计。

本书涵盖的内容

第1章　介绍Metasploit的安装和配置，以及渗透测试的生命周期、OWASP Top 10和SANS Top 25。

第2章　介绍Metasploit从安装到漏洞利用的基础知识，还涵盖基本的Metasploit术语以及Metasploit中其他较不常用的选项。

第3章　在深入探讨其他主题之前，对Metasploit社区版Web界面进行简单介绍。

第4章　介绍渗透测试生命周期中的第一个过程：侦察（reconnaissance）。从标识（banner）抓取到WEBDAV侦察，我们将借助特定Metasploit模块来说明基本的侦察过程。

第5章　着重介绍Web应用渗透测试中重要的过程之一——枚举。本章将首先介绍文件和目录枚举的基本知识，然后介绍网站爬虫和抓取，之后介绍和枚举相关的Metasploit模块。

第6章　主要介绍Metasploit框架中用于扫描Web应用的WMAP模块。

第7章　主要介绍通过Metasploit使用Nessus漏洞扫描程序对目标进行漏洞评估扫描。

第8章　主要介绍针对WordPress的漏洞枚举以及如何进行漏洞利用。

第9章　主要介绍针对Joomla的漏洞枚举以及如何进行漏洞利用。

第10章　主要介绍针对Drupal的漏洞枚举以及如何进行漏洞利用。

第11章　介绍针对JBoss服务器进行漏洞枚举、利用和获得访问权限的方法。

第12章　介绍针对Tomcat服务器进行漏洞枚举、利用和获得访问权限的方法。

第13章　介绍针对运行Jenkins的服务器进行漏洞枚举、利用和获得访问权限的方法。

第14章　主要介绍针对Web应用业务逻辑缺陷的利用，并详细介绍通过对Web应用进行模糊测试来挖掘漏洞的一些实例。

第15章　涵盖报告编写的基础知识以及如何使用不同的工具来自动执行报告编写过程。

学习本书的基本要求

对Metasploit框架和脚本语言（如Python或Ruby）有基本的了解，将有助于读者理解各章内容。

如果你使用的是本书的数字版本，建议你自己输入代码，这样做将帮助你避免任何与代码复制和粘贴有关的潜在错误。

排版约定

本书中使用了以下约定。

代码体：表示文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄。下面是一个示例：“将下载的WebStorm-10*.dmg磁盘映像文件作为系统中的另一个磁盘装入。”

代码块设置如下：

当我们希望引起你对代码块特定部分的注意时，相关行或项目会以粗体显示：

任何命令行输入或输出的编写方式如下：

表示警告或重要说明。

表示提示和技巧。

免责声明

本书中的信息仅用于合法范围。如果没有得到设备所有者的书面许可，不要使用本书中的任何信息。如果你误用书中的任何信息，出版社不承担任何责任。书中信息只能在测试环境中使用，并要得到相关负责人的书面授权。

关于作者

哈伯利特·辛格（Harpreet Singh）是Hands-On Red Team Tactics一书的作者，在白帽黑客、渗透测试、漏洞研究等方面有7年以上的经验。他还拥有OSCP（Offensive Security Certified Professional）和OSWP（Offensive Security Wireless Professional）的认证。多年来，Harpreet积累了丰富的攻防经验。他是无线和网络开发方面的专家，研究移动开发和Web应用程序开发等，并且曾作为红队成员对银行和金融集团的系统进行测试。

我要感谢我的家人和朋友们一如既往的支持，尤其要感谢我的母亲和其他重要同伴的一路支持。我还要感谢我的合著者（Himanshu）和Packt团队，让我有机会和他们一起写这本书。

希曼舒·夏尔马（Himanshu Sharma）因发现苹果、谷歌、微软、Facebook、Adobe、Uber、AT&T、Avira等公司的安全漏洞而闻名。他曾协助Harbajan Singh等找回被黑客攻击的账户。他曾在Botconf 2013、CONFidence、RSA Singapore、LeHack、Hacktivity、Hack In the Box和SEC-T等国际会议上担任演讲人和培训师。他还曾在Tedx的IEEE会议上发言。目前，他是众包安全平台BugsBounty的联合创始人。

我要感谢那些支持我的人，尤其是我的朋友、同事和父母，如果没有他们，我无法及时完成本书。我还要感谢Google、Wikipedia和Stack Overflow的持续支持。

关于审校者

Amit Kumar Sharma是一位安全宣讲师，在应用程序安全性和模糊测试方面拥有丰富的经验。他曾在电信、医疗、集成电路和汽车安全领域从事各种技术工作。

他现在是一家知名公司的安全顾问，该公司提供有关如何将安全性融入SDLC的咨询，并推广IAST、二进制分析和模糊测试等技术，以发现安全问题。目前，他的研究领域包括DevSecOps、SDLC中的安全性、Kubernetes安全性和密码管理。

我要感谢父母的指导和鼓励，他们对我取得如今的成就有巨大帮助。我要感谢我的兄弟姐妹和妻子对我的信任，没有他们的耐心，这项工作是不可能完成的。感谢我所有的朋友和导师，他们以不同方式帮助我取得了成功。

第一篇

导论

本篇将首先介绍Web应用测试的基础，然后介绍Metasploit的基础知识，之后深入介绍Metasploit Web界面。

本篇包括以下章节：

·第1章　Web应用渗透测试简介

·第2章　Metasploit基础知识

·第3章　Metasploit Web界面

第1章
Web应用渗透测试简介

在当今世界，有许多自动化工具和SaaS解决方案可以用来测试系统或应用程序的安全性。但是当需要对应用程序的业务逻辑进行测试时，自动化往往会失败。了解渗透测试人员如何帮助组织领先于网络攻击，以及为什么组织需要遵循严格的补丁管理周期来保护其资产非常重要。

在本书中，你将学习如何使用著名的Metasploit框架对基于不同平台构建的Web应用进行渗透测试。我们大多数人都知道该工具及其在常规渗透测试中的重要地位，本书将重点介绍如何使用Metasploit框架对各种Web应用进行渗透测试，例如内容管理系统（CMS）和内容交付与内容集成系统（CD/CI）。要了解有关工具和技术的更多信息，我们首先需要了解渗透测试的基础知识。

本章涵盖以下内容：

·什么是渗透测试？

·渗透测试有哪些类型？

·渗透测试分为哪些阶段？

·重要术语。

·渗透测试的方法学。

·通用缺陷列表（Common Weakness Enumeration，CWE）。

1.1　什么是渗透测试

渗透测试（penetration testing）是对计算机系统的一种授权攻击，旨在评估系统/网络的安全性，执行测试以识别漏洞及其带来的风险。典型的渗透测试过程一般分为五个阶段，主要包括识别目标系统、检测存在的漏洞以及每个漏洞的可利用性。渗透测试的目标是找到尽可能多的漏洞，并交付客户可以接受的通用格式报告。在下一节中，我们将介绍不同类型的渗透测试。

1.2　渗透测试的类型

根据客户的需求，渗透测试可以分为三种类型：

·白盒（white box）

·黑盒（black box）

·灰盒（gray box）

下面将逐个介绍。

1.2.1　白盒渗透测试

白盒渗透测试又称作玻璃盒渗透测试或透明盒渗透测试。通常在这种类型的渗透测试中，客户会分享关于目标系统、网络或应用的全部信息和细节，例如系统的登录账户和密码、网络设备的SSH/Telnet登录信息以及需要测试的应用的源代码。这些信息关系到客户的系统、网络、应用，因此非常敏感，所以建议对这些信息进行加密处理。

1.2.2　黑盒渗透测试

黑盒渗透测试是模拟攻击者的测试，测试人员将充当真实的攻击者，没有目标系统、网络或应用程序的内部信息。这种类型的测试实际上专注于渗透测试的第一阶段——侦察。测试人员可以获得的有关目标组织的信息越多，测试效果就越好。在这种类型的测试中，不会向渗透测试人员提供任何架构图、网络结构或任何源代码文件。

1.2.3　灰盒渗透测试

灰盒渗透测试介于白盒渗透测试和黑盒渗透测试之间。在典型的灰盒测试中，渗透测试人员会获得一些有关应用程序、系统或网络的信息。正是基于这个原因，这种测试往往非常有效，并且更关注有时限要求的组织。使用客户提供的信息，渗透测试人员可以将精力集中在风险更大的系统上，并节省大量用来进行前期侦察的时间。

现在我们对渗透测试类型有了清楚的认识，接下来我们看一下渗透测试的各个阶段。

1.3　渗透测试的阶段

为了更好地了解渗透测试，让我们看一下渗透过程的各个阶段。

·阶段1：侦察。

·阶段2：枚举。

·阶段3：漏洞评估和分析。

·阶段4：漏洞利用（包括后渗透阶段）。

·阶段5：报告。

如图1-1所示。

图　1-1

每个阶段都有一系列的工具和技术可用于执行有效的测试。

1.3.1　侦察和信息收集

侦察是执行渗透测试的第一个阶段。在这个阶段，渗透测试人员将尝试识别相关系统或应用程序，并尽可能多地收集信息。这是黑盒渗透测试的最关键阶段，因为在这一阶段，测试人员可以锁定攻击面。相反，对于白盒测试来讲，侦察可能就不重要了，因为客户会提供有关范围内目标的所有信息。

黑盒测试在很大程度上依赖于此阶段，因为没有信息提供给测试人员。在对Web应用进行渗透测试时，我们将专注于确定Web应用所使用的技术、域/子域信息、HTTP协议侦察和枚举以及任何其他可以帮助我们提高效率的细节。通常在此阶段确定目标的测试范围和目的。

以下是可用于对Web应用进行侦察的工具列表：

·识别在非标准端口（用户自定义端口）上运行的应用：Amap、Nmap等。

·识别DNS和子域名：dnsenum、dnsmap、dnswalk、dnsrecon、dnstracer、Fierce、dnscan、Sublist3r等。

·识别技术平台：BlindElephant、Wappalyzer、WhatWeb等。

·识别内容管理系统：WPScan、Joomscan、CMScan、Drupscan等。

接下来看枚举阶段。

1.3.2　枚举

在枚举阶段，测试人员将扫描在上一阶段（侦察）中识别的每个应用、系统或网络，以查找不同的攻击面——例如，枚举Web应用的文件和目录以及网络设备的端口和服务。本阶段将帮助测试人员识别攻击媒介（切入点）。攻击媒介是攻击者获得访问权限或入侵目标系统的路径或方法。渗透测试人员使用的最常见的攻击媒介是网络钓鱼电子邮件、恶意软件和未修补的漏洞。

渗透测试人员可以执行文件和目录枚举、HTTP方法枚举、主机枚举以及其他一些枚举动作，以查找可能存在漏洞的切入点。在白盒测试中，由于所有详细信息都已经提供给测试人员，因此该阶段并不会真正发挥重要作用，但这并不意味着你不应该经历此阶段。即使提供了所有详细信息，执行枚举和扫描始终是一个好习惯。这将帮助测试人员找到应用程序不支持的过时的攻击途径，但可能会帮助测试人员渗透网络。

该阶段对于黑盒和灰盒测试非常关键，因为渗透测试人员可以通过对目标系统或应用程序执行侦察从而获取所有需要的信息。手工进行枚举可能会很烦琐，因此可以使用公开可用的工具和一些Metasploit模块来快速完成这部分工作。

以下是可用于对Web应用进行枚举的工具列表：

·文件和目录枚举：Dirsearch、dirb、dirbuster、Metasploit框架、BurpSuite、gobuster等。

·HTTP协议支持的方法枚举：Nmap、BurpSuite、Metasploit框架（MSF）、wfuzz等。

·速率限制测试：BurpSuite、ffuf、wfuzz等。

1.3.3　漏洞评估与分析

一旦确定了攻击媒介，就需要进行漏洞扫描，这就发生在渗透测试阶段。对Web应用进行漏洞评估，以识别网页、目录、HTTP协议方法、HTTP标头等是否存在漏洞。可以使用免费或付费工具来完成扫描。所有类型的测试（白盒、黑盒和灰盒）都依赖此阶段。

漏洞扫描完成后，我们需要评估和分析发现的每个漏洞，然后过滤掉误报信息。筛选出误报信息可以帮助渗透测试人员处理实际存在的漏洞，而不是处理因时间延迟或扫描工具错误而误报的漏洞。所有漏洞过滤都在此阶段进行。

以下是可用于对Web应用执行漏洞评估和扫描的工具列表：

·系统和网络漏洞评估：Nexpose、Nessus、OpenVAS等。

·Web应用漏洞评估：AppSpider、Nikto、Acunetix、BurpSuite、Nessus等。Nexpose和AppSpider为新增的评估扫描工具。——译者注

1.3.4　漏洞利用

漏洞利用阶段是侦察阶段之后的第二个关键阶段。此阶段用于证明在先前阶段发现的某个漏洞是否可以利用。如果渗透测试人员可以利用发现的漏洞，那么他们基本就可以确定该渗透测试项目是成功的。可以使用某些工具（例如Metasploit Framework和Canvas）自动进行漏洞利用。这是因为我们不知道使用攻击载荷时Web应用或系统会做出什么样的响应行为。

通常，在所有类型的测试中，我们需要从客户那里确认是否被授权执行基于内存的漏洞利用，例如进行缓冲区/堆溢出和运行内存损坏。这样做的好处是，我们可以通过运行特定漏洞利用程序来访问目标系统（仅在目标系统易被此特定漏洞利用的情况下才有效）。利用此类漏洞时存在的一个问题是，可能会导致系统/服务器/Web应用崩溃，从而造成业务连续性问题。

成功对系统或Web应用进行漏洞利用之后，我们可以选择就此停止，也可以进行后渗透工作（如果已经获得客户的授权），比如进行内网渗透并定位关键业务服务器。

请确保所有攻击载荷、Web Shell、文件和脚本均已上传到目标系统以进行漏洞利用，并在获取适当的概念验证（PoC）屏幕截图后将其清除。一定不要忘记这个清理工作，否则真正的攻击者可能会找到Web Shell并轻松使用它们来进行攻击。

1.3.5　报告

报告阶段是渗透测试过程的最后阶段，将汇总在目标（测试范围内）中发现的每个漏洞。报告的漏洞将根据通用漏洞评分系统（CVSS）定义的严重性级别列出，CVSS是一个用于漏洞评估的免费、开放的标准。

作为渗透测试人员，我们需要知道这个阶段对于客户而言非常重要。测试人员在客户的系统上所做的所有工作都应以结构化格式进行报告。报告应包括关于测试的简短介绍、测试范围、测试规则、简洁明了的摘要、发现的漏洞以及每个漏洞的PoC，并从参考链接中提供一些建议和修复方案。

有一些公开的工具，例如Serpico、Magic Tree、BurpSuite和Acunetix，可以帮助简化报告过程。由于这是渗透测试的重要阶段，因此在测试过程中发现的所有详细信息都应在报告中体现。

我们可以提供两种不同类型的报告：适合管理层的摘要报告和适合技术团队的技术报告。这可以帮助组织的管理人员和技术团队理解并修复渗透测试人员发现的漏洞。

1.4　重要术语

我们已经熟悉了一些标准，在接下来的章节中，我们大量使用以下重要术语：

·漏洞（vulnerability）：系统中的弱点，可能导致攻击者能够进行未经授权的访问。

·欺骗（spoofing）：为了获得非法利益，个人或程序成功地将数据伪装成其他内容的情况。

·漏洞利用（exploit）：一段代码，一个程序，一个方法或一系列命令，它们利用漏洞来获得对系统/应用程序的未授权访问。

·载荷（payload）：在利用漏洞期间/之后，在目标系统上执行任务所需的实际代码。

·风险（risk）：任何可能影响数据的机密性、完整性和可用性的因素。未打补丁的软件、配置错误的服务器、不安全的Internet使用习惯等都会造成风险。

·威胁（threat）：任何可能对计算机系统、网络或应用程序造成严重伤害的因素。

·黑盒（black box）：一种测试方法，在测试之前不向测试人员提供有关系统内部架构或功能的信息。

·白盒（white box）：一种测试方法，在测试之前，会向测试人员提供系统的内部架构和功能的全部信息。

·Bug悬赏（bug bounty）：Bug悬赏计划是许多网站和开发人员提供的一项协议，允许个人因报告Bug（特别是与漏洞利用和漏洞相关的Bug）而受到奖励。

·SAST（Static Application Security Testing，静态应用程序安全性测试）：一种安全性测试形式，主要是对应用程序源代码进行检查。

·DAST（Dynamic Application Security Testing，动态应用程序安全测试）：一种用于检测处于运行状态的应用程序中是否存在安全漏洞的技术。

·模糊测试（fuzzing）：一种自动测试技术，将无效、非预期的或随机数据作为输入提供给应用程序。

我们已经知道了这些重要术语的定义，接下来我们继续学习测试方法。

1.5　渗透测试方法学

众所周知，对于渗透测试而言，目前还没有统一的标准。但是安全社区引入了一些标准，供所有安全人员参考和遵循。有一些众所周知的标准包括《开源安全测试方法手册》（Open Source Security Testing Methodology Manual，OSSTMM）、《渗透测试执行标准》（Penetration Testing Execution Standard，PTES）和信息系统安全评估框架（Information Systems Security Assessment Framework，ISSAF）。

1.5.1　OSSTMM

OSSTMM的定义在其官方网站https://www.isecom.org/OSSTMM.3.pdf可以找到：

这是一本经过同行评审的安全测试和分析手册，可提供经过验证的事实。这些事实提供了具有可操作性的信息，可以显著提高你在安全方面的操作能力。

使用OSSTMM，将在运营层面通过审计提供准确的安全评估，以清除假设和不可靠的证据。它适用于全面的安全性测试，并且旨在保持一致性和可重复性。作为一个开源项目，它对所有安全测试贡献者开放，鼓励进行越来越准确、可行和高效的安全测试。

OSSTMM包括以下关键部分：

·运营安全指标（operational security metric）。

·信任度分析（trust analysis）。

·人性安全测试（human security testing）。

·物理安全测试（physical security testing）。

·无线安全测试（wireless security testing）。

·通信安全测试（telecommunications security testing）。

·数据网络安全测试（data network security testing）。

·合规要求（compliance regulation）。

·使用安全测试审计报告（Security Test Audit Report，STAR）进行交付。

1.5.1.1　运营安全指标

OSSTMM的这一部分涉及需要保护的内容以及攻击面的暴露情况。可以通过创建RAV（对攻击面的无偏离事实描述）来衡量。

1.5.1.2　信任度分析

在运营安全中，信任是通过活动范围内目标之间的相互影响来衡量的，任何有恶意的人都可以利用这种信任。为了量化信任度，我们需要理解并进行分析，以做出更合理和合乎逻辑的决策。

1.5.1.3　人性安全测试

人性安全（Human Security，HUMSEC）是物理安全（Physical Security，PHYSSEC）的一个组成部分，并加入了对心理活动（Psychological Operation，PSYOPS）的利用。要测试这一方面的安全性，需要与可以物理访问受保护资产的个人（例如，门卫）进行沟通。

1.5.1.4　物理安全测试

物理安全是指物理区域内的物质安全。要进行这方面的测试，需要与为保护资产而设置的障碍和人员（如守卫人员）进行非直接的沟通和交互。

1.5.1.5　无线安全测试

频谱安全（Spectrum Security，SPECSEC）是一种安全类别，包括电子安全（Electronics Security，ELSEC）、信号安全（Signals Security，SIGSEC）和辐射安全（Emanations Security，EMSEC）。进行这方面的测试时，需要让测试人员处于距离目标的一定范围之内。

1.5.1.6　通信安全测试

通信安全是ELSEC的子集，它描述了组织的有线通信情况。这方面的测试涵盖了分析师与目标之间的互动。

1.5.1.7　数据网络安全测试

在数据网络安全性（通信安全性[COMSEC]）测试中，测试人员需要与有权访问运营数据（用来控制访问资产）的个人进行交互。

1.5.1.8　合规要求

所需的合规类型取决于地区和当前的政府、行业和业务类型以及支持性法规。简而言之，合规性是立法或行业定义的一组通用要求，这些要求是强制性的。

1.5.1.9　使用STAR进行报告

STAR（Security Test Audit Report，安全测试审计报告）的目的是作为执行摘要，阐明在特定范围内测试的目标所暴露的攻击面。

1.5.2　OSSTMM测试类型

OSSTMM根据测试人员掌握的信息量将测试类型分为六大类：

·盲测（blind）：测试人员不了解目标，但目标了解测试人员的所有详细信息。这可以视为对测试人员技术水平的测验。

·双盲（double-blind）：测试人员不了解目标的任何信息，如目标的防御情况、资产等，目标也不会收到任何通知。这类测试用于检查渗透测试人员的知识和技能，以及目标针对未知威胁的准备情况。双盲测试也称为黑盒测试。

·灰盒（gray box）：测试人员对目标的防御知识了解有限，但对目标的资产和运作情况有全面的了解。在这种情况下，目标已经为测试做好了充分准备，并且知道的全部细节。这类测试也称为漏洞测试。

·双灰盒（double gray box）：这也称为白盒测试。目标对测试范围和时间有预先的了解，但不了解攻击载荷和测试方法。

·协力（tandem）：这也称为内部审计或水晶球测试。在这类测试中，目标和测试人员都知道测试的全部细节，但是这类测试不会检查目标针对未知情况或测试方法的准备情况。

·反向（reversal）：在这类测试中，攻击者完全了解目标的流程和安全运营情况，但是目标对何时何地进行测试却一无所知。这也称为红队练习。

图1-2展示了这些类型的关系。

图　1-2

资料来源：https://www.isecom.org/OSSTMM.3.pdf

授权许可：https://creativecommons.org/licenses/by/3.0/

1.5.3　ISSAF

ISSAF不太活跃，但是提供的指南却非常全面。这个框架旨在评估信息安全策略以及组织对IT行业标准、法律和法规要求的遵守情况。

框架涵盖以下阶段：

·项目管理。

·准则和最佳实践——评估前、评估中和评估后。

·评估方法学。

·信息安全策略和安全组织评估。

·风险评估方法的评价。

·技术控制评估。

·技术控制评估——方法学。

·密码安全。

·密码破解策略。

·UNIX/Linux系统安全性评估。

·Windows系统安全性评估。

·Novell Netware安全评估。

·数据库安全评估。

·无线安全评估。

·交换机安全评估。

·路由器安全评估。

·防火墙安全评估。

·入侵检测系统（IPS）安全评估。

·VPN安全评估。

·防病毒系统安全评估和管理策略。

·Web应用安全评估。

·存储区域网络（Storage Area Network，SAN）安全评估。

·互联网用户安全。

·IBM AS400系统安全。

·源代码审计。

·二进制审计。

·社会工程学。

·物理安全评估。

·事件分析。

·日志/监视和审计流程评估。

·业务连续性计划和灾难恢复。

·安全意识培训。

·外包安全问题。

·知识库。

·安全评估项目在法律方面的考量。

·保密协议（Non-disclosure Agreement，NDA）。

·安全评估合同。

·征求建议书模板。

·桌面安全检查清单——Windows。

·Linux安全检查清单。

·Solaris操作系统安全检查清单。

·默认端口-防火墙。

·默认端口-IDS/IPS。

1.5.4　PTES

该标准是使用最广泛的标准，几乎涵盖了所有与渗透测试相关的内容。

PTES分为七个阶段：

·测试前交互。

·情报收集。

·威胁建模。

·漏洞分析。

·漏洞利用。

·后渗透利用。

·报告。

下面简要看一下每个阶段都包含哪些内容。

1.5.4.1　测试前交互

测试前交互是在项目开始之前进行的交流，例如定义测试范围，通常涉及确定目标IP、Web应用程序、无线网络等。

确定测试范围之后，将在测试双方之间建立沟通渠道，并确定事件报告流程。这些交互还包括状态更新、电话通话、法律程序以及项目的开始和结束时间。

1.5.4.2　情报收集

情报收集过程用于收集有关目标的尽可能多的信息。这是渗透测试中最关键的环节，因为我们拥有的信息越多，可用于执行的攻击媒介就越多。如果是白盒测试，客户会提供所有这些信息给测试团队。

1.5.4.3　威胁建模

威胁建模是一个过程，通过该过程可以识别和枚举潜在威胁，并可以确定缓解的优先级。威胁建模取决于所收集信息的数量和质量；利用这些信息，可以将过程分为多个阶段，然后使用自动化工具和逻辑攻击来执行这些阶段。

图1-3所示是威胁模型的思维导图。

图　1-3

资料来源：http://www.pentest-standard.org/index.php/Threat_Modelling。

授权许可：GNU自由文档许可证1.2。

下面来看漏洞分析。

1.5.4.4　漏洞分析

漏洞分析是发现攻击者可以利用的缺陷的过程。这些缺陷可能涉及从开放端口和服务错误配置到SQL注入的任何问题。有许多工具有助于执行漏洞分析，例如Nmap、Acunetix和Burp Suite。基本上每隔几周都会有新工具发布。

1.5.4.5　漏洞利用

漏洞利用是指通过规避基于脆弱性评估的保护机制来获得对系统进行访问的过程。漏洞利用可以是公开的，也可以是0-Day（未公开的）。

1.5.4.6　后渗透利用

后渗透利用的目标是确定危害的严重性，然后保持访问权限以备将来使用。这个阶段必须始终遵循保护客户和保护自己的原则（根据活动需要来掩盖痕迹）。

1.5.4.7　报告

报告是最重要的阶段之一，因为修复所有问题完全取决于报告中提供的详细信息。报告必须包含三个关键要素：

·漏洞的严重性。

·复现该漏洞所需的步骤。

·补丁建议。

总而言之，渗透测试生命周期的阶段可以通过图1-4所示的方式呈现。

图　1-4

在下一节中，我们将讨论通用缺陷列表（Common Weakness Enumeration，CWE）和两个顶级CWE。

1.6　通用缺陷列表

在本节中，我们将讨论通用缺陷列表（CWE）。CWE是一个通用的在线词典，它收录了在计算机软件中发现的缺陷。本节将介绍两个著名的CWE——OWASP Top 10和SANS Top 25。

1.6.1　OWASP Top 10

OWASP（开放Web应用安全项目）是一个公开的组织，为计算机和Internet应用提供公正、现实且具有成本效益的信息。

2020年的Top 10列表如下：

·注入（injection）。

·认证暴破（broken authentication）。

·敏感数据泄露（sensitive data exposure）。

·XML外部实体（XML External Entities，XXE）。

·访问控制暴破（broken access control）。

·错误的安全配置（security misconfiguration）。

·跨站脚本（Cross-Site Scripting，XSS）。

·不安全的反序列化（insecure deserialization）。

·使用含有已知漏洞的组件（using component with known vulnerability）。

·日志记录和监控不足（insufficient logging and monitoring）。

1.6.2　SANS Top 25

SANS Top 25是由SANS研究所、MITRE与美国和欧洲的许多顶级软件安全专家合作完成的。它包含以下漏洞：

·SQL命令中特殊元素的不当使用（SQL注入，SQL injection）。

·OS命令中特殊元素的不当使用（OS命令注入，OS command injection）。

·使用缓冲区复制时不检查输入的大小（经典缓冲区溢出，classic buffer overflow）。

·跨站脚本（Cross-Site Scripting，XSS）。

·缺少对关键功能的验证（missing authentication for a critical function）。

·缺少授权（missing authorization）。

·使用硬编码凭证（use of hardcoded credential）。

·敏感数据未加密（missing encryption of sensitive data）。

·不限制上传危险类型的文件（unrestricted upload of a file of a dangerous type）。

·安全决策中依赖不受信任的输入（reliance on untrusted inputs in a security decision）。

·以不必要的特权执行（execution with unnecessary privilege）。

·跨站请求伪造（cross-site request forgery，CSRF）。

·路径遍历（improper limitation of a pathname to a restricted directory，path traversal）。

·下载的代码未经完整性检查（the downloading of code without an integrity check）。

·不正确的授权（incorrect authorization）。

·包含来自不受信任的控制领域的功能（inclusion of a functionality from an untrusted control sphere）。

·关键资源的权限分配不正确（incorrect permission assignment for a critical resource）。

·使用具有潜在危险的功能（use of a potentially dangerous function）。

·使用损坏或有风险的密码算法（use of a broken or risky cryptographic algorithm）。

·缓冲区大小计算错误（incorrect calculation of buffer size）。

·过度的身份验证尝试限制不当（improper restriction of excessive authentication attempts）。

·URL重定向到不受信任的站点（URL redirection to an untrusted site，open redirect）。

·不受控制的字符串格式（uncontrolled format string）。

·整数上溢或下溢（integer overflow or wraparound）。

·使用无盐的单向散列（use of a one-way hash without a salt）。

·在本书的后续章节中，我们将详细介绍其中一些漏洞。

1.7　小结

在本章中，我们首先介绍了渗透测试及其类型和阶段，以及渗透测试的方法和生命周期，并学习了一些重要的术语。然后，我们学习了OWASP Top 10和SANS Top 25缺陷列表。

在下一章中，我们将学习Metasploit的基础知识，包括Metasploit框架、安装和设置。

1.8　问题

1.是否有一个数据库可以维护CWE列表？

2.在哪里可以找到OWASP Top 10和SANS Top 25缺陷列表？

3.执行渗透测试所需的工具是否免费？

4.基于OSSTMM和PTES的渗透测试有何不同？

1.9　拓展阅读

·安全与开放方法研究所（ISECOM）：http://www.isecom.org/。

·渗透测试标准网站：http://www.pentest-standard.org/index.php/Main_Page。

第2章
Metasploit基础知识

Metasploit项目是用于渗透测试以及IDS签名捕获的工具。此项目下有Metasploit Framework子项目，该子项目是开源的，可以免费使用。它具有针对目标开发和执行漏洞利用代码的能力。Metasploit最初由H.D Moore于2003年创建，并于2009年被RAPID7收购。Metasploit Framework（MSF）是近十年来使用最广泛的工具之一。无论你是进行前期侦察还是后渗透利用，几乎都会用到Metasploit。

在本章中，我们将首先介绍MSF，并研究其相关术语。然后，我们将在不同的平台上安装和设置Metasploit，以便可以学习如何使用一些基本命令与MSF进行交互。

本章涵盖以下内容：

·MSF简介。

·MSF术语。

·Metasploit的安装和设置。

·MSF入门。

2.1　技术条件要求

以下是学习本章内容所需的技术条件：

·Metasploit Framework v5.0.74（https://github.com/rapid7/metasploitframework）。

·基于*nix的系统或基于Microsoft Windows的系统。

·Nmap。

2.2　MSF简介

每当我们想要进行渗透测试或漏洞利用时，Metasploit都会是我们想到的第一个工具。MSF是Metasploit项目的子项目。Metasploit项目可以提供有关漏洞利用的信息，帮助我们进行渗透测试。

Metasploit首次出现在2003年，由H.D Moore使用Perl语言开发，后来在2007年使用Ruby语言进行了重构。2009年10月，RAPID7收购了Metasploit项目。然后推出了Metasploit Express和Metasploit Pro两个商业版本。这是MSF演变的开始。

MSF是一个开源框架，允许我们编写、测试和执行漏洞利用代码。也可以将其视为渗透测试和漏洞利用工具的集合。

在本章中，我们将介绍安装和使用MSF的基础知识。

2.3　MSF术语

我们首先看一下MSF的基本术语，由于在本书中将经常使用这些术语，因此在深入研究MSF及其用法之前，最好对它们有全面的了解。

·漏洞利用（exploit）：Metasploit启动时，会显示框架中已经公开可用的漏洞利用模块的数量。漏洞利用是一段利用漏洞为我们提供所需输出的代码。

·载荷（payload）：载荷是一段代码，通过漏洞利用把这段代码传递到目标系统或应用程序以执行我们想要的操作。载荷实际上可以分为三种主要类型：Single、Stager和Stage。

·Single：这类载荷是独立的，通常用于执行简单的任务，例如执行notepad.exe文件和添加用户。

·Stager：这类载荷用来在两个系统之间建立连接。然后，将Stage载荷下载到受害者的机器上。

·Stage：Stage可以视为载荷的组件。它们提供了不同的功能，例如对命令shell的访问、运行可执行文件的能力以及上传和下载文件的功能，并且不受大小限制。Meterpreter就是一个Stage的例子。

其他类型的载荷如下所示：

·Inline（non-staged）：包含用来执行特定任务的完整shellcode的利用代码。

·Staged：Staged用来与Stage载荷一起执行特定任务。Stager在攻击者和受害者之间建立通信通道，并发送一个将在远程主机上执行的Staged载荷。

·Meterpreter：这是Meta Interpreter的缩写，通过DLL注入进行工作。它会加载到内存中，并且在磁盘上不会留下任何痕迹。Meterpreter在官方网站上的定义如下。

一种高级的、动态可扩展的载荷，它使用内存中的DLL注入Stager，并在运行时通过网络进行扩展。它通过Stager套接字进行通信并提供全面的客户端Ruby API。

·PassiveX：使用ActiveX控件创建IE浏览器的隐藏实例。通过HTTP请求和响应与攻击者进行通信。

·NoNX：用于绕过DEP保护。

·Ord：可以在所有Windows版本上使用的极小的载荷，但是不太稳定，并且在利用过程中依赖ws2_32.dll进行加载。

·IPv6：专门为在IPv6主机上使用而构建。

·反射式DLL注入：这是一种由Stephen Fewer创新的技术。利用这种技术，不用接触被攻破主机的硬盘驱动器，就可以将Staged载荷注入运行于内存中的进程。

·辅助（auxiliary）：MSF拥有数百个辅助模块，可用于执行不同的任务。可以将这些模块视为不进行任何漏洞利用操作的小工具。在漏洞利用过程中辅助模块能起到很大的帮助作用。

·编码器（encoder）：编码器将信息（这里是指汇编指令）转换为另一种形式，该信息在执行后将给我们相同的结果。编码器用于将载荷传送到目标系统/应用程序时绕过检测。由于组织网络中的大多数IDS/IPS都是基于签名的，因此在对载荷进行编码时，它将更改整个签名并轻松绕过安全机制。最著名的编码器是x86/shikata_ga_nai。这是一个多态XOR累积反馈编码器（polymorphic XOR additive feedback encoder），这意味着它每次都会产生不同的输出，从而加大被检测到的难度。即便与多次迭代一起使用，它也仍然非常方便。但是，必须谨慎使用迭代，并且始终必须在使用前首先对其进行测试。它们可能无法按预期工作，并且随着每次迭代，载荷的大小都会增加。

·NOP生成器：NOP生成器用于生成一系列随机字节，这些字节与传统的NOP sled（是指一系列不会有实际动作的NOP指令）等价，只是它们没有任何可预测的模式。NOP sled还可用于绕过标准IDS和IPS NOP sled签名（NOP Sled-\x90\x90\x90）。

·项目（project）：这是一个容器，用于在渗透测试活动期间存储数据和凭证。它在Metasploit Pro版本中更常用。

·工作区（workspace）：工作区与项目相同，但仅在MSF中使用。

·任务（task）：是我们在Metasploit中执行的任何操作。

·侦听器（listener）：侦听器等待来自被利用目标的传入连接并管理已连接的目标Shell。

·Shell：Shell是一个控制台，就像一个接口，它使我们可以访问远程目标。

现在我们已经了解了基本术语，接下来让我们看一下如何安装Metasploit并进行设置。

2.4　安装与设置Metasploit

安装Metasploit非常简单，并且支持不同的操作系统。Metasploit可以安装在以下操作系统上：

·基于*nix的系统（Ubuntu、macOS等）。

·基于Windows的系统。

对于所有支持的操作系统，安装Metasploit的步骤几乎相同。唯一的区别是当需要通过命令行进行安装时，所使用的命令会不同。

2.4.1　在*nix系统上安装MSF

在开始使用Metasploit之前，我们需要先安装它。安装步骤如下：

1）可以通过下载并执行适用于Linux和macOS系统的Metasploit Nightly Installer或使用以下命令（CLI）在*nix上安装Metasploit：

图2-1显示了上述命令的输出：

图　2-1

上面的命令将下载一个Shell脚本，该脚本将导入RAPID7签名密钥（PGP）并安装所有支持Linux和macOS系统所需的软件包，如图2-2所示。

图　2-2

2）一旦安装过程完成，运行Metasploit就非常简单了，只需在终端中输入以下命令：

图2-3显示了上述命令的输出。

图　2-3

注意：Metasploit Framework v5.0.0已发布，具有许多新功能。你可以在https://blog.rapid7.com/2019/01/10/metasploit-framework-5-0-released/上查看这些功能。

现在，我们应该看到MSF已启动并正常运行。首次加载MSF控制台时，它将自动使用PostgreSQL创建数据库。当我们执行扫描、漏洞利用等操作时，会使用此数据库存储收集的所有数据。

3）基本上Metasploit每周都会更新漏洞利用/辅助模块，因此，最好每两周更新一次Metasploit。可以通过使用以下命令进行更新：

图2-4显示了上述命令的输出。

图　2-4

在撰写本书时，MSF拥有1991个漏洞利用模块、1089个辅助模块、340个后渗透模块、560个载荷模块、45个编码器模块、10个nop和7个逃逸（evasion）模块。

2.4.2　在Windows上安装MSF

我们已经学习了如何在基于*nix的系统上安装MSF，接下来让我们快速看一下如何在Windows环境中安装MSF：

1）首先，需要从以下URL下载适用于Windows的Nightly安装程序：

输入此URL后，你应该可以看到图2-5所示的输出。

图　2-5

2）下载完成后，我们可以双击MSI文件进行安装，如图2-6所示，将打开一个新窗口。

3）我们需要按照标准的安装步骤（“Next”“Next”“I Agree”等）在Windows上安装Metasploit，如图2-6所示。

建议你仔细阅读该工具的条款和条件。

安装完成后，我们仍无法从命令行提示符下运行Metasploit，如图2-7所示。这是因为尚未设置环境变量，所以在执行命令时系统不知道去哪里寻找msfconsole二进制文件。

4）在本示例中，可以在以下路径中找到msfconsole二进制文件：

在图2-8中可以看到上述命令的输出。

图　2-6

图　2-7

图　2-8

5）现在，我们需要通过输入以下命令将此目录添加到环境变量中：

如图2-9所示。

图　2-9

设置好环境变量后，我们就能够通过命令提示符启动Metasploit了，如图2-10所示。

图　2-10

运行上述命令将启动Metasploit及其控制台。现在，我们已经可以访问MSF控制台，让我们开始学习MSF的基础知识吧。

2.5　MSF入门

安装完成后，我们可以先看一下MSF的用法。与MSF交互的最常见方式是使用msfconsole命令。控制台提供了所有功能和选项，可以非常简单地通过命令行使用，以进行有效的测试和利用（渗透）。

2.5.1　使用msfconsole与MSF交互

你可以使用msfconsole命令在正常模式下与MSF控制台进行交互，也可以在静默模式（quiet mode）下运行MSF控制台命令。这些模式之间的唯一区别是控制台会不会显示错误、警告和标识（banner）。在正常模式下运行将显示很酷的MSF标识。你可以通过执行msfconsole -q命令实现在静默模式下与MSF控制台进行交互，如图2-11所示。

图　2-11

根据你自己的情况和需要，还有其他MSF控制台选项可供使用。例如，想要在没有任何数据库支持的情况下运行MSF控制台，可以始终执行msfconsole -qn命令。

如果尚未初始化数据库，则无法执行任何命令或加载任何带有db_前缀的插件，如图2-12所示。

图　2-12

当你尝试从控制台加载插件时，会出现图2-13所示的未初始化错误。

图　2-13

在这里，我们在msfconsole中使用了-x选项。你可能已经猜到了，此开关用于在控制台内执行MSF支持的命令。我们还可以在控制台中执行Shell命令，因为Metasploit将这些命令作为参数传递给默认的Shell，如图2-14所示。

图　2-14

在上面的命令中，我们从MSF控制台回显了WELCOME TO METASPLOIT FRAMEWORK字符串并退出。要查看所有可用选项，可以执行msfconsole -h命令。现在，让我们看一下MSF控制台中使用的最基本和最常见的命令。

2.5.2　MSF控制台命令

MSF控制台命令可以分类如下：

·核心MSF控制台命令：这些命令是MSF控制台中最常用和通用的命令。

·模块管理命令：使用这些命令管理MSF模块。你可以在这些命令的帮助下编辑、加载、搜索和使用Metasploit模块。

·MSF作业管理命令：使用这些命令，你可以处理Metasploit模块作业操作，例如使用处理程序创建作业，列出在后台运行的作业以及取消和重命名作业。

·资源脚本管理命令：使用资源脚本时，可以通过这些命令在控制台中执行脚本。你可以执行一个存储的脚本文件，也可以将MSF控制台启动时使用的命令存储到一个文件中。

·后台数据库命令：这些命令用于管理数据库，也就是说，可以用来检查数据库连接、建立连接和断开连接、在MSF中还原/导入数据库、从MSF中备份/导出数据库，以及列出与目标有关的已保存信息。

·凭证管理命令：你可以使用creds命令查看和管理保存的凭证。

·插件命令：可以使用插件命令管理MSF控制台中的插件。这些命令可用于所有已加载的插件。

要了解如何使用msfconsole命令，请参考以下URL：https://www.offensive-security.com/metasploit-unleashed/msfconsole-commands/。

MSF控制台不仅允许我们使用其中的大量模块，还为我们提供了自定义控制台的选项。让我们看看如何自定义控制台。

2.5.2.1　自定义全局设置

在自定义控制台之前，我们需要知道当前应用到控制台的（默认）全局设置。

1）可以在MSF启动时使用show options命令完成此操作，如图2-15所示。

图　2-15

2）我们可以从这些设置中更改提示（msf文本）。要更改提示和提示字符，可以执行set Prompt和set PromptChar命令，如图2-16所示。

图　2-16

3）我们甚至可以使用一些扩展格式来设置更多高级提示，如图2-17所示。

图　2-17

表2-1是可以使用的扩展格式。

表　2-1

同样的格式也可以用于设置提示字符。

2.5.2.2　MSF中的变量操作

MSF中的变量处理可以帮助用户充分利用模块的功能。作为渗透测试人员，有时我们需要扫描很多目标，并且在几乎所有测试场景中都必须设置Metasploit模块所需的选项。这些选项（例如，远程主机IP/端口和本地主机IP/端口）是针对正在使用的特定Metasploit模块设置的。我们越早了解变量操作，就能越有效地使用模块。

datastore是一种变量，具有以下功能，使用datastore可以进行变量操作：

·将数据存储在键/值对中。

·使MSF控制台可以在模块执行时设置配置。

·使MSF可以将值在内部传递给其他模块。

各种类使用datastore来保存选项值和其他状态信息，datastore有两种类型：

·datastore模块：此datastore仅保存与已加载模块有关的信息和选项（本地声明）。在MSF控制台中，可以使用set命令保存模块选项，并使用get命令来获取已保存的值。

·全局datastore：此datastore将信息和选项保存到所有模块（全局声明）。在MSF控制台中，可以使用setg命令保存模块选项，并使用getg命令来获取。

如图2-18所示，已成功加载smb_version模块，并且RHOSTS选项设置为192.168.2.17。但是一旦我们卸载了模块（使用back命令），就不能全局设置RHOSTS选项。要全局设置这些选项，我们需要使用全局datastore。

图　2-18

从图2-19中可以看出，我们全局保存了RHOSTS选项的值192.168.2.17，这意味着在使用其他模块时，RHOSTS选项会默认使用这个值。如果使用了setg命令进行设置，那么就可以使用get或getg检索设置的值。

图　2-19

仅在模块中执行set命令将显示已保存的所有可用选项（对于模块datastore和全局datastore），如图2-20所示。

图　2-20

如果想从datastore中删除值，你始终可以使用unset和unsetg命令。

注意：如果使用setg全局设置了一个选项，则不能使用unset命令将其删除，你需要使用unsetg命令。

2.5.2.3　探索MSF模块

可以使用show命令查看MSF中可用的所有选项和模块。

1）要查看show命令的所有有效参数，你可以在MSF控制台中执行show -h命令，如图2-21所示。

图　2-21

2）要显示MSF中可用的辅助模块，可以使用show auxiliary命令，如图2-22所示。

图　2-22

3）可以使用相同的命令列出其他模块和其特定的参数。另外，你可以按两次键盘上的Tab键以查看show命令的可用参数，如图2-23所示。

图　2-23

4）对于特定模块的参数，只需加载要使用的模块，然后执行show命令即可。在本例中，我们使用了smb_version辅助模块，并按了两次Tab键以查看可用于show命令的所有参数，如图2-24所示。

图　2-24

5）我们可以使用show evasion命令查看该特定模块可用的所有逃逸选项，如图2-25所示。

图　2-25

注意：这些选项通常用于绕过网络过滤端点，例如入侵检测/防护系统（IDS/IPS）。

2.5.2.4　在MSF中运行OS命令

MSF的功能之一是可以从控制台执行普通的shell命令。你可以执行shell支持的任何命令（bash/sh/zsh/csh）。在本例中，我们从控制台执行了whoami && id命令。命令执行结果显示在控制台中，如图2-26所示。

图　2-26

我们还可以通过控制台使用/bin/bash -i命令或仅使用/bin/bash（-i开关用于以交互模式运行bash）从控制台执行交互式bash脚本，如图2-27所示。

图　2-27

注意：要在Windows中获得交互式命令行提示符，请执行控制台中的cmd.exe。

2.5.2.5　在MSF中设置数据库连接

MSF的最炫酷功能之一是使用后端数据库来存储与目标有关的所有内容。在运行MSF时，请按照以下步骤设置数据库：

1）使用控制台上的db_status命令检查数据库是否已连接到MSF，如图2-28所示。

图　2-28

2）由图2-28可知，该数据库尚未连接。我们可以使用数据库配置文件、单行命令或使用RESTful HTTP API数据服务（MSF 5的新功能）来连接到数据库。默认情况下，不会有database.yml文件，但是你可以从database.yml.example文件中复制内容。可以像图2-29中所示那样编辑文件。

图　2-29

注意：如果不初始化就安装数据库，则此方法将不会生效。更多相关信息，请访问https://fedoraproject.org/wiki/Metasploit_Postgres_Setup。

3）编辑并保存文件后，可以使用db_connect命令中的-y开关连接到数据库，如图2-30所示。

图　2-30

4）让我们再次检查状态，参见图2-31，控制台现在已连接到后端数据库。

图　2-31

2.5.2.6　在MSF中加载插件

插件是MSF中的扩展功能，通过利用Ruby语言的灵活性来扩展MSF的功能。这使插件几乎可以执行任何操作，从构建新的自动化功能到提供数据包级内容过滤以及绕过IDS/IPS。插件还可以用于将第三方软件（如Nessus、OpenVAS和Sqlmap）集成到框架中。步骤如下：

1）使用load命令加载插件，如图2-32所示。

图　2-32

2）默认情况下，Metasploit带有一些内置插件。在使用load命令后，可以通过按两次Tab键来找到它们，如图2-33所示。

图　2-33

注意：所有可用的内置插件都可以在https://github.com/rapid7/metasploit-framework/tree/master/plugins中找到。

3）让我们通过在控制台中执行load openvas命令来加载OPENVAS插件（见图2-34）。此插件将在后面的章节中介绍。

图　2-34

4）插件成功加载后，你可以在控制台中执行help命令，并查找“OpenVAS Commands”以查看该插件支持的所有命令，如图2-35所示。

图　2-35

可以通过复制<MSF_INSTALL_DIR>/plugins/目录中的.rb插件文件并执行load<插件名称>命令来加载自定义插件。

2.5.2.7　使用Metasploit模块

Metasploit模块非常易于使用。简而言之，任何人都可以按照图2-36所示的过程熟悉这些模块。

图　2-36

在本例中，我们使用smb_version辅助模块：

1）通过执行auxiliary/scanner/smb/smb_version命令，将模块加载到控制台中，如图2-37所示。

图　2-37

2）现在，我们需要根据需求来配置模块。可以使用show options命令查看smb_version的可用选项，如图2-38所示。

图　2-38

3）我们可以使用set/setg命令来配置模块选项，也可以使用smb_version的高级选项，通过使用show advanced命令显示，如图2-39所示。

4）要绕过IDS/IPS端点，可以为smb_version模块设置绕过选项。使用show evasion命令列出该模块支持的所有绕过选项，如图2-40所示。

5）配置完成后，可以在最后一次运行模块之前通过执行show missing命令检查缺少的选项，如图2-41所示。

6）在本例中，我们将设置RHOSTS为192.168.2.17，然后使用run命令或execute命令执行模块，如图2-42所示。

注意，除非已设置所有必需的配置，否则这些模块将无法运行。

图　2-39

图　2-40

图　2-41

图　2-42

2.5.2.8　在MSF中搜索模块

在Metasploit中进行搜索非常容易，search命令接受用户提供的字符串值。如图2-43所示，搜索windows字符串将列出所有适用于Windows操作系统的模块。

图　2-43

Metasploit搜索还允许我们根据模块类型进行搜索。例如，输入search windows type:exploit将显示所有Windows利用模块的列表。同样，我们可以限定CVE（Common VulnerabiCity and Exposures，通用漏洞列表）。要搜索2018年发布的Windows漏洞，我们可以输入search windows type:exploit cve:2018，如图2-44所示。

图　2-44

接下来，我们将学习如何在MSF中检查主机和服务。

2.5.2.9　在MSF中检查主机和服务

到目前为止，我们已经介绍了msfconsole的基础知识。现在，我们继续学习如何管理主机和服务。

1）要查看已添加的所有主机的列表，可以使用hosts命令，如图2-45所示。

图　2-45

2）要添加新主机，可以使用hosts -a <IP>命令，如图2-46所示。

图　2-46

3）要删除主机，可以使用hosts -d <IP>命令，如图2-47所示。

图　2-47

同样，通过services命令我们可以查看已添加到Metasploit的所有主机上可用的所有服务的列表。让我们来看一看。

1）首先，我们需要使用services命令，如图2-48所示。

图　2-48

2）要查看单个主机的服务列表，我们可以使用services <IP>命令，如图2-49所示。

图　2-49

我们不能一次添加多个端口。这样做会引发错误，如图2-49所示，只能是一个端口。

Metasploit还允许我们使用services -a -p <port number>原书中应该缺失了<IP>，即命令应为services -a <Ip> -p <port number>。——译者注命令手动添加定制服务，如图2-50所示。

图　2-50原书中此处截图是错误的，直接替换为正确的。

接下来，让我们看看如何使用MSF进行Nmap扫描。

2.5.2.10　使用MSF进行Nmap扫描

将主机添加到Metasploit后，下一步就是扫描。Metasploit具有用于Nmap的内置包装器，该包装器在Metasploit控制台中为我们提供了与Nmap相同的功能。这个包装器的好处是默认情况下可以将输出保存在数据库中。

要对主机进行扫描，我们可以使用db_nmap <IP>命令（见图2-51）。在这里，我们使用--open标志仅查看打开的端口。-v用于显示详细信息，-Pn用于执行无ping扫描，-sV用于执行服务扫描，-sC用于对发现的端口运行脚本扫描。

图　2-51

图2-52显示了在主机上运行扫描的输出。

图　2-52

Metasploit还允许我们使用db_import命令将Nmap完成的外部扫描导入其数据库，如图2-53所示。

目前，MSF支持以下格式的数据导入数据库：Acunetix、Amap Log、Amap Log-m、Appscan、Burp Session XML、Burp Issue XML、CI、Foundstone、FusionVM XML、Group Policy Preferences Credentials、IP Address List、IP360 ASPL、IP360 XML v3、Libpcap Packet Capture、Masscan XML、Metasploit PWDump Export、Metasploit XML、Metasploit Zip Export、Microsoft Baseline Security Analyzer、NeXpose Simple XML、NeXpose XML Report、Nessus NBE Report、Nessus XML（v1）、Nessus XML（v2）、NetSparker XML、Nikto XML、Nmap XML、OpenVAS Report、OpenVAS XML、Outpost24 XML、Qualys Asset XML、Qualys Scan XML、Retina XML、Spiceworks CSV Export和Wapiti XML。

图　2-53

2.5.2.11　在MSF中设置载荷操作

在启动模块之前，我们需要设置处理程序。处理程序是一个存根（stub），用于处理在MSF外部启动的漏洞利用。

1）使用use exploit/multi/handler命令加载处理程序模块，如图2-54所示。

图　2-54

2）接下来，我们使用show options命令查看可用选项，如图2-55所示。

图　2-55

如你所见，选项当前为空。一旦定义了载荷，就会加载这些选项。例如，我们将在此处使用windows/x64/meterpreter/reverse_tcp载荷，并为载荷设置标准选项，例如LHOST和LPORT。设置stageencoder和enablestageencoding选项以对处理程序发送给受害者的第二个stage进行编码，如图2-56所示。

图　2-56

首先，我们在选择编码器之前设置LHOST和LPORT，使用shikata_ga_nai编码器对Stager进行编码。我们使用Stager编码机制的原因是通过对Stager进行编码来绕过IPS/DPS，从而即时更改签名。

我们还需要通过将其值设置为true来启用Stage编码。此选项将使用我们选择的编码器启用第二个Stage编码过程。设置了stageencoding选项后，执行run -j命令以在后台启动处理程序。

运行处理程序的另一种方法是使用控制台的handler命令，并将参数传递给它，如图2-57所示。

图　2-57

因此，执行先前讨论的处理程序的单行命令将是handler -H <IP> -P <Port> -e <encoder> -P <payload>，如图2-58所示。

图　2-58

接下来，我们将研究MSF载荷的生成。

2.5.2.12　MSF载荷的生成

载荷生成是MSF中最有用的功能之一。从简单的shellcode生成到功能齐全的EXE/DLL文件，Metasploit都可以在单行命令中生成。载荷可以通过两种方式生成。

1.使用msfconsole（oneliner）生成MSF载荷

通过使用MSF控制台并执行用于生成载荷的命令，可以生成任何MSF支持的载荷。使用此技术的一个优势是你不必单独启动载荷处理程序。可以使用单行命令来完成。要生成载荷并启动处理程序，请执行以下代码：

图2-59显示了上述命令的输出。

图　2-59

上面的命令将生成reverse_https Meterpreter载荷。列出它以确认生成的载荷，并在端口9090上启动处理程序以传入连接。生成载荷的另一种方法是使用MSFvenom。

在上面的命令中，-q开关用于在静默模式下启动MSF，而-x表示启动后在控制台中执行该命令。

2.使用msfvenom生成MSF载荷

msfvenom是一个内置工具，无须启动MSF即可生成和混淆载荷。执行msfvenom -p <MSF支持的载荷> lhost = <IP> lport = <PORT> -f <输出文件格式> -o <载荷文件名>命令，可以EXE格式生成reverse_https Meterpreter载荷并保存文件，如图2-60所示。

图　2-60

在这两种情况下，我们都使用ls -alh https_2.exe。

现在，可以上传此载荷到被攻击者的系统并执行，以通过安全的HTTPS隧道将反向的Meterpreter连接返回给我们。

2.6　小结

在本章中，我们学习了MSF的基本术语，以及如何在基于*nix和Windows的系统上进行安装和配置。然后，我们研究了MSF的用法，加载了模块/辅助，设置了目标值，并针对某个主机运行。最后，我们学习了如何使用msfvenom生成载荷以进行利用。

在下一章中，我们将学习如何通过Web界面使用Metasploit，以帮助那些对命令行界面（CLI）不太了解的人。

2.7　问题

1.MSF是免费的吗？

2.我可以加密我的载荷，使它们能够规避防病毒软件吗？

3.我正在使用MySQL作为渗透测试后端数据库，可以将MySQL或其他非PostgreSQL数据库与Metasploit集成吗？

4.我的多个系统中都安装了MSF，可以集中为每个Metasploit实例使用同一个数据库吗？

2.8　拓展阅读

以下链接将帮助你找到有关Metasploit的更多信息，这些内容都来自其官方博客和文档：

·https://www.offensive-security.com/metasploit-unleashed/

·http://resources.metasploit.com/

·https://metasploit.help.rapid7.com/docs

第3章
Metasploit Web界面

在第2章中，我们学习了Metasploit框架的基础知识，并研究了可以在Metasploit中使用的一些功能。本章将重点介绍Metasploit框架的Web界面。Web界面确实可以为那些对命令行界面（CLI）经验较少的用户提供帮助。从侦察到报告，Web界面使我们可以在单个界面处理渗透测试的所有阶段。在本章中，我们将学习如何安装和使用Metasploit Web界面。然后，我们将学习如何使用Web界面侦察和访问Meterpreter载荷。

本章将涵盖以下内容：

·Metasploit Web界面简介。

·安装和设置Web界面。

·Metasploit Web界面入门。

3.1　技术条件要求

以下是本章所需的技术条件要求：

·带有Metasploit Web界面的Metasploit社区版（Community Edition，CE）。

·基于*nix的系统或基于Microsoft Windows的系统。

3.2　Metasploit Web界面简介

Metasploit Web界面是基于浏览器的界面，可以轻松访问导航菜单，并允许你为任务更改配置页面。可以在Metasploit Web界面中执行能在MSF中进行的每个任务，从使用辅助模块执行发现扫描到弹出Meterpreter。

对于喜欢使用图形用户界面（GUI）工具进行渗透测试的用户，可以选择使用Web界面的Metasploit。Web界面版本包括Metasploit社区版（免费）、Metasploit Pro（付费）、Metasploit Express（付费，已停产）和Nexpose Ultimate（付费，已停产）。不像Metasploit付费版本有许多更高级的功能，免费的社区版是最基本的版本。

3.3　安装和设置Web界面

Metasploit Web界面的安装过程非常简单。

·你可以从以下网址下载社区版：https://www.rapid7.com/products/metasploit/download/community/。

要开始安装过程，你需要填写下载Metasploit社区版所需的信息。之后，你将被重定向到下载页面，如图3-1所示。

图　3-1

注意：如果你不想填写表格，也可以直接下载Metasploit社区版，网址为https://www.rapid7.com/products/metasploit/download/community/thank-you。

你还可以从GitHub上RAPID7的存储库中下载，网址为https:///github.com/rapid7/metasploit-framework/wiki/Downloads-by-Version，但你将无法获得激活密钥。

3.3.1　在Windows上安装Metasploit社区版

为了在Windows上成功安装Metasploit社区版，请按照下列步骤操作。

1）请确保已禁用系统上的防病毒系统（AV）和防火墙。防病毒系统通常会在Metasploit社区版中检测并标记某些文件为恶意文件，如图3-2所示。

2）如果正在运行Windows，请确保将Metasploit安装文件夹放在防病毒系统和防火墙的例外列表中。这样，你生成的载荷将从防病毒系统中排除，如图3-3所示。

图　3-2

图　3-3

3）由于可以通过Web界面（通过SSL）访问Metasploit社区版，因此请确保为SSL证书生成过程提供正确的Server Name（主机名），如图3-4所示。

图　3-4

4）安装完成后，你可以查看C:\metasploit目录中的所有文件，如图3-5所示。

图　3-5

5）在开始使用Web界面之前，需要初始化用户。如果尝试使用主机名而不是localhost访问Web服务器，则会收到警告消息。要继续下一步，只需按照给出的说明进行操作，如图3-6所示。

图　3-6

6）需要通过执行C:\metasploit目录下的createuser批处理脚本来初始化用户，如图3-7所示。

7）现在只剩下最后一步了。创建用户后，你将被重定向到激活页面。要激活社区版，需要获取产品密钥，可以从注册时使用的电子邮件中检索产品密钥（因为可以通过电子邮件接收激活码，所以注册是很重要的），如图3-8所示。

8）使用注册电子邮件收到的产品密钥激活Metasploit社区版，如图3-9所示。

图　3-7

图　3-8

成功激活后，你将被重定向到项目列表（Project Listing）页面，如图3-10所示。

在开始使用Metasploit Web界面之前，你需要对界面本身有一定的了解。

注意：试用密钥无法重复使用，并且将在14天后失效。

图　3-9

图　3-10

3.3.2　在Linux/Debian上安装Metasploit社区版

要在Linux/Debian上成功安装Metasploit社区版，可以参照以下步骤：

1）下载Metasploit社区版Linux安装程序。你需要更改安装程序的执行权限，可以使用chmod命令完成此操作，如图3-11所示。

图　3-11

2）运行Linux安装程序，然后按照屏幕上显示的说明进行操作。安装完成后，将显示Web界面的URI，如图3-12所示。

图　3-12

3）你需要通过URI才能访问Web界面，如图3-13所示。默认情况下，URI为https://localhost:3790/。

图　3-13

4）安装和初始化过程完成后（通常需要几分钟），屏幕上会显示一条警告消息。按照屏幕上的说明通过diagnostic_shell脚本创建用户，如图3-14所示。

图　3-14

5）执行diagnostic_shell后，将为你的Shell设置Metasploit环境，然后就可以执行createuser脚本了。你将在Web界面中找到一个新用户设置页面，填写用户详细信息以创建一个账户，如图3-15所示。

图　3-15

6）从你的电子邮件中获取产品密钥，然后激活社区版，如图3-16所示。

注意，不支持32位Linux（包括Kali）和macOS。

接下来，我们开始使用Metasploit Web界面。

图　3-16

3.4　Metasploit Web界面入门

Metasploit Web界面非常易于使用，对于缺乏命令行经验的测试人员来说有很大的帮助。在开始测试之前，让我们先了解一下这个界面。

3.4.1　界面

Metasploit Web界面包括以下菜单：

·主菜单（main menu）

·项目标签栏（project tab bar）

·页面导航辅助（navigational breadcrumb）

·任务栏（tasks bar）

让我们逐个了解一下这些菜单。

3.4.1.1　主菜单

主菜单位于页面顶部。在主菜单中，你可以从Project菜单中访问项目设置，从Account菜单中访问账户设置，并从Administration菜单操作管理设置。

可以从通知中心查看所有告警，如图3-17所示。

让我们详细了解一下这些子菜单：

·Project菜单：用于创建、编辑、打开和管理项目。

·Account菜单：用于管理账户信息，例如更改密码、设置时区和联系信息。

图　3-17

·Administration菜单：用于进行管理设置，例如更新系统、许可证密钥、编辑用户账户和配置全局设置。

·通知中心：在通知中心，你可以找到所有告警，例如指示任务已完成或有软件更新可用。单击告警将显示一个下拉菜单，其中包含所有项目的最新告警。

接下来，我们看一下项目标签栏。

3.4.1.2　项目标签栏

项目标签栏是位于主菜单正下方的选项卡菜单。可以通过选项卡菜单管理正在运行的项目、漏洞分析、已打开的Meterpreter/shell会话、网络钓鱼活动、Web应用程序测试、模块、凭证、报告、导出和任务概述，如图3-18所示。

图　3-18

让我们详细了解一下这些选项：

·Overview（概述）：以图形的方式显示摘要信息，例如发现的主机和服务的数量以及获得的会话和凭证的数量。在我们运行扫描或导入主机之前，这里不会显示数据。

·Analysis（分析）：此选项使我们可以将大型网络/主机分类，从而更易于对它们进行管理和渗透利用。

·Sessions（会话）：显示我们在目标上的活动会话。

·Campaigns（活动）：此选项可让我们针对一组目标（包括电子邮件、网页、可移植文件等）创建、管理和进行社会工程学活动。

·Web Apps（Web应用程序）：这是Pro版本的功能，使我们可以扫描Web应用程序并识别漏洞。

·Modules（模块）：此选项使我们可以搜索可用的模块，查看其信息并在目标上执行它们。

·Credentials（凭证）：此选项使我们可以添加/编辑或删除通过渗透利用收集的凭证。

·Reports（报告）：这也是Pro版本的功能。此选项使我们可以查看和创建报告。

·Exports（导出）：此选项可以让我们将凭证之类的数据导出为多种格式，例如XML和ZIP。

·Tasks（任务）：此选项使我们可以管理当前正在运行的任务的状态。

接下来，我们将介绍页面导航辅助。

3.4.1.3　页面导航辅助

可以使用页面导航辅助（navigational breadcrumb）来标识你在项目中的当前位置，如图3-19所示。

图　3-19

页面导航辅助可以帮助我们更有效地工作。

3.4.1.4　任务栏

你可以使用任务栏（tasks bar）快速执行列出的任务，如图3-20所示。

接下来，我们将介绍如何创建项目。

图　3-20

3.4.2　项目创建

正如Metasploit使用工作区来组织收集的数据一样，社区版使用项目来分离数据集。默认情况下，社区版内部有一个默认项目。如果你不创建自定义项目，则所做的所有操作都将保存在该项目下。

3.4.2.1　默认项目

每当我们使用Web界面时，所使用的第一个项目就是默认项目。该项目将向我们显示在默认项目处于活动状态时被扫描的主机数、维护的会话以及分配给主机的任务数。图3-21显示了标题为default的项目。

图　3-21

接下来，让我们学习如何创建自定义项目。

3.4.2.2　创建一个自定义项目

Metasploit社区版允许我们创建自定义项目：

1）这可以通过单击Projects菜单并选择New Project来完成，如图3-22所示。在这里，我们将指定项目详细信息，例如项目名称（Project name）、描述（Description）和网络范围（Network range）。

图　3-22

2）单击Create Project按钮后，将导航到项目仪表板页面。在这里，你将看到目前为止已执行的任务及其结果的摘要，如图3-23所示。

图　3-23

3）回到首页，你应该可以看到两个项目。一个是default，另一个是我们刚刚创建的Web Exploitation Project，如图3-24所示。

接下来我们将介绍目标枚举。

图　3-24

3.4.3　目标枚举

现在我们已经创建了项目，让我们从枚举开始。有两种执行枚举的方法：使用Metasploit的内置扫描模块或导入由Nmap或MSF支持的其他工具完成的扫描。

3.4.3.1　使用内置的选项

Metasploit Web界面为我们提供了一些内置选项/模块，可用于在目标系统上执行枚举。请按照以下步骤使用内置选项执行枚举：

1）要使用内置选项，请在项目仪表板上单击Scan按钮，如图3-25所示。

图　3-25

2）在下一个页面中，输入要扫描的IP地址。还可以为扫描定义高级选项，例如要排除的端口和自定义范围，如图3-26所示。

图　3-26

3）可以通过单击Show Advanced Options按钮（单击后显示为Hide Advanced Options）来设置扫描的某些扩展功能，如图3-27所示。

图　3-27

4）设置完所有内容后，可以单击Launch Scan按钮启动扫描。该工具将使用你指定的选项在后台启动Nmap扫描，如图3-28所示。

5）可以通过依次单击Project→[WORKSPACE]→Hosts来查看主机，如图3-29所示。

如图3-30所示，已扫描的主机添加到了主机（Hosts）列表中。

6）要查看在扫描的主机上运行的服务，可以单击上一步中显示的主机，也可以单击Project→[WORKSPACE]→Services进行查看，如图3-31所示。

图　3-28

图　3-29

图　3-30

通过这两种方法，你都可以查看在被扫描的主机上运行的服务。但是，不建议你通过Web界面执行扫描，因为它使用的Nmap版本（版本4）很老旧。

3.4.3.2　导入扫描结果

我们也可以使用第三方工具进行枚举，并将结果导入MSF。请按照以下步骤导入扫描结果：

1）在通过Metasploit执行漏洞利用之前，最好先进行端口扫描和服务枚举。可以单独使用Nmap并使用-oX选项将扫描结果保存为XML格式，而不是使用Metasploit的内置端口扫描程序，如图3-32所示。

图　3-31

图　3-32

2）就像在msfconsole中使用的db_import命令一样，可以通过单击Import按钮在Metasploit Web界面中实现相同的功能，如图3-33所示。

图　3-33

3）单击Import按钮后，将重定向到导入数据（Import Data）页面，可以通过该页面导入数据。

4）可以从Nexpose、SonarProject Sonar是RAPID7的安全研究项目，它对不同的服务和协议进行了Internet范围内的扫描，以洞悉Internet上普遍存在的漏洞。以及第三方扫描工具（例如，Acunetix、Nessus、Nmap等）导入数据。在本例中，我们执行了完整的端口扫描，并将Nmap结果保存为XML格式，如图3-34所示。

图　3-34

5）可以启用自动标记（Automatic Tagging）功能，这项可选功能将根据主机的操作系统将主机标记为os_windows、os_linux和os_unknown。当你单击Import Data时，将导入扫描数据，如图3-35所示。

图　3-35

6）可以返回Project Overview菜单以查看更新的项目，如图3-36所示。

图　3-36

7）如图3-36所示，添加一个运行着15个服务的新主机。单击15 services detected超链接时，将转到服务（Services）页面。

8）也可以通过依次单击Project→[WORKSPACE]→Services来查看同一页面，如图3-37所示。

图　3-37

在下一节中，我们将介绍Metasploit模块，这些模块将用于进一步枚举和对目标主机进行漏洞利用。

注意：以下是可以导入的所有受支持的第三方扫描报告，包括Foundstone Network Inventory XML,Microsoft MBSA SecScan XML,nCircle IP360 XMLv3 and ASPL,NetSparker XML,Nessus NBE,Nessus XML v1和v2,Qualys Asset XML,Qualys Scan XML,Burp Sessions XML,Burp Issues XML,Acunetix XML,AppScan XML,Nmap XML,Retina XML,Amap Log,Critical Watch VM XML,IP Address List,Libpcap Network Capture,Spiceworks Inventory Summary CSV和Core Impact XML。

3.4.4　模块选择

Metasploit社区版的模块与MSF的模块相同。根据实际情况，我们可以使用辅助模块、漏洞利用模块或后渗透模块。首先让我们看一下辅助模块。

3.4.4.1　辅助模块

在本例中，我们有一个目标主机，其IP为192.168.2.17。你可以在图3-38中看到此主机上运行的服务。

图　3-38

从网络渗透测试的角度来看，攻击者肯定会研究对端口445/tcp（SMB）的利用。因此，让我们针对SMB使用一个模块：

1）单击Project中的Modules选项卡以显示模块（Modules）页面，如图3-39所示。

2）对于SMB，可以使用SMB版本检测辅助模块，通过搜索栏进行搜索，如图3-40所示。

图　3-39

图　3-40

3）选择模块后，将显示模块选项页面。你可以设置目标地址以及其他一些选项（如果需要），如图3-41所示。

4）单击Run Module（见图3-41）将执行该模块，并显示该模块的输出，如图3-42所示。

5）你可以通过Project→Analysis→Notes来确认模块找到的结果，如图3-43所示。

对目标进行枚举后，就可以使用漏洞利用模块了。

图　3-41

图　3-42

3.4.4.2　使用一个漏洞利用模块

要使用漏洞利用模块，请按照下列步骤操作。

1）单击Project项下的Modules选项，然后搜索EternalBlue利用漏洞。这是一种非常可靠的漏洞利用方法，可用于图3-44所示情况。

图　3-43

图　3-44

2）你可以在这里设置目标地址和载荷选项。执行漏洞利用后，载荷（例如，Meterpreter）将被注入内存，并且Meterpreter shell将打开，如图3-45所示。

3）单击Run Module将启动漏洞利用模块。结果将显示在屏幕上，并会将一个ID分配给任务，如图3-46所示。

成功利用漏洞后，你将收到有关新打开会话的通知。

3.4.4.3　会话交互

利用成功后，将建立一个会话，你将在项目标签栏中收到通知。

1）要查看打开的会话，需要单击项目标签栏中的Sessions选项卡，如图3-47所示。

图　3-45

图　3-46

图　3-47

2）要与任何打开的会话进行交互，只需单击会话ID。从图3-48中可以看到MSF Web界面支持的会话交互功能。

图　3-48

以下是可用于会话交互的选项：

·Collect System Data（收集系统数据）：此选项使你可以收集系统证据和敏感数据，例如密码、系统信息、屏幕截图等。此功能仅在Metasploit Pro版本中可用。

·Virtual Desktop（虚拟桌面）：此选项将注入虚拟网络计算（VNC）DLL并在给定端口上启动VNC服务，如图3-49所示。

你可以通过图3-50所示端口与目标系统的桌面进行交互。

图　3-49

图　3-50

注意：用户将被通知进入VNC连接。

·Access Filesystem（访问文件系统）：使用此选项，你可以浏览文件系统，甚至可以上传、下载和删除文件，如图3-51所示。

·Search Filesystem（搜索文件系统）：如果要搜索特定文件或执行通配符搜索，则可以使用图3-52所示选项。

·Command Shell（命令Shell）：如果要访问Meterpreter Command Shell，可以单击此按钮打开Command Shell，如图3-53所示。

你可以在给定的输入框中执行命令，结果如图3-54所示。

该窗口仅支持Meterpreter命令，可以使用shell运行系统命令，如图3-55所示。

·Create Proxy Pivot（创建代理跳板）：创建代理跳板与添加路由跳板类似，如图3-56所示。

图　3-51

图　3-52

图　3-53

图　3-54

图　3-55

如果要连接到内部网络以进一步利用漏洞，可以使用图3-57所示选项。

·Create VPN Pivot（创建VPN跳板）：你可以使用此选项在受感染的计算机上创建加密的第2层隧道，然后将所有网络流量路由到该目标计算机。这将为你提供完全的网络访问权限，就好像你在本地网络上一样，没有边界防火墙阻止你的流量。

图　3-56

图　3-57

·Change Transport（更改传输）：要更改会话的传输机制，可以使用此选项，如图3-58所示。

首先，你需要启动特定传输的处理程序；否则，该过程将失败。

·Terminate Session（终止会话）：使用此选项后，会话将终止。要与会话进行交互，你将不得不再次开始利用过程。

图　3-58

接下来，让我们看一下Web界面中可用的后渗透模块。

3.4.4.4　后渗透模块

对于后渗透，你可以使用界面中可用的后渗透模块，如图3-59所示。

图　3-59

1）我们对图3-59中显示的目标使用hashdump postexploitation模块。要使用此模块，只需检查需要为哪个会话执行这个模块，如图3-60所示。

图　3-60

2）单击Run Module以执行hashdump模块。该模块将从SAM数据库中转储（dump）NTLM哈希值。新的任务ID将分配给该模块，你可以在任务栏中查看这个任务，如图3-61所示。

图　3-61

3）可以在Project标签栏中的Credentials菜单中查看提取的哈希值，如图3-62所示。

你可以根据情况使用不同的后渗透模块。

图　3-62

3.5　小结

在本章中，我们学习了如何使用Metasploit的Web界面。我们首先安装Metasploit并进行了相应的设置，然后学习了一些模块的使用方法，例如创建项目和从其他工具导入扫描结果。在了解Metasploit Web界面中可用的后渗透模块之前，我们先研究了辅助模块和漏洞利用模块。

在下一章中，我们将学习如何使用Metasploit对不同类型的目标、协议和端口进行侦察。

3.6　问题

1.Metasploit Web界面具有哪些功能？

2.在我的组织中，必须能在任何Web服务器上使用公司的SSL证书。我可以为Metasploit Web界面提供自定义的SSL证书吗？

3.哪些Web浏览器与Metasploit Web界面兼容？

4.Metasploit是否支持RESTful API？

5.Metasploit Web界面是否支持自定义报告？

3.7　拓展阅读

有关Web界面的更多信息，可以在官方文档页面上找到，网址为https://metasploit.help.rapid7.com/docs/metasploit-web-interface-overview。

第二篇

Metasploit的渗透测试生命周期

本篇包括四章，重点介绍使用Metasploit进行Web应用程序的侦察、枚举、评估和利用。我们还将详细介绍WMAP和Nessus插件。

本篇包括以下章节：

·第4章　使用Metasploit进行侦察

·第5章　使用Metasploit进行Web应用枚举

·第6章　使用WMAP进行漏洞扫描

·第7章　使用Metasploit（Nessus）进行漏洞评估

第4章
使用Metasploit进行侦察

信息收集或侦察（recon）是渗透测试周期中最关键、最耗时的阶段。当测试一个Web应用程序时，你需要收集尽可能多的信息。拥有的信息越多越好，信息可以是任何类型的，比如Web服务器标识、IP地址、打开的端口列表、任何受支持的HTTP标头等。此类信息将帮助渗透测试人员在Web应用上执行测试检查。

在本章中，我们将学习使用Metasploit进行侦察，研究可用于执行侦察的模块。

本章将涵盖以下内容：

·侦察简介。

·主动侦察。

·被动侦察。

4.1　技术条件要求

以下是学习本章内容的技术条件要求：

·安装了Web界面的Metasploit社区版。

·基于*nix的系统或Microsoft Windows系统。

·可以访问Shodan和Censys账户以获取API密钥。

4.2　侦察简介

简而言之，侦察是一个阶段，在这个阶段中，渗透测试人员将收集与他们正在测试的Web应用程序有关的尽可能多的信息。侦察可以分为两种类型：

·主动侦察：直接从目标那里收集信息。

·被动侦察：通过第三方来源收集有关目标的信息。

在以下各节中，我们将详细介绍这两种类型。

4.2.1　主动侦察

主动侦察（或主动攻击）是侦察的一种方式，在侦察期间，测试人员可以通过自己的系统或虚拟专用服务器（VPS）与目标服务器/系统进行通信。在本章中，我们将介绍一些使用Metasploit中的内置脚本执行主动和被动侦察的方法。

4.2.1.1　标识抓取

标识（banner）抓取是一种用于获取有关网络上设备信息的技术，例如操作系统、在开放端口上运行的服务、使用的应用程序或版本号。标识抓取是信息收集阶段的一部分，Metasploit有很多可用于收集来自不同类型服务标识的模块。

在以下示例中，我们将使用http_version模块检测给定IP上基于HTTP协议运行的服务的版本号和名称。

1）单击Project→Modules，然后在Search Modules框中输入http_version，如图4-1所示。

图　4-1

2）单击模块名称，这会将我们重定向到模块选项，在这里我们可以指定目标地址和其他设置，如图4-2所示。

在本例中，我们将选择端口80，因为我们知道HTTP协议正在端口80上运行。可以将该值更改为运行HTTP的任何端口号。

3）设置完所有内容后，我们单击图4-2中所示的Run Module按钮，这将创建一个新任务。单击Project Options选项卡上的Tasks可以查看任务的状态，如图4-3所示。

4）模块执行完成后，可以返回到Analysis选项卡，然后单击运行模块所依据的Host IP，如图4-4所示。

5）我们将看到该模块已检测到并打印了SERVICE INFORMATION下在80端口上运行的标识，如图4-5所示。

接下来，让我们看看如何检测Web应用程序的HTTP标头。

图　4-2

图　4-3

图　4-4

图　4-5

4.2.1.2　HTTP标头检测

现在，让我们尝试检测Web应用程序的HTTP标头。HTTP标头可以揭示有关应用程序的许多信息，例如所使用的技术、内容长度、cookie到期日期、XSS保护等。

1）导航到Modules页面并搜索http_header，如图4-6所示。

图　4-6

2）单击模块名称将导航至选项页面，在这里我们可以指定目标地址、端口号、线程等，如图4-7所示。

3）设置完成后，单击Run Module，将启动一个新任务，如图4-8所示。

4）任务完成后，可以转到Analysis选项卡，在Notes标签下将能够看到由扫描器模块发现的所有标头，如图4-9所示。

接下来，让我们看一下Web robot页面枚举。

4.2.1.3　Web robot页面枚举

robots.txt（机器人排除标准）是网站用来与爬虫或机器人通信的方法。让我们看看枚举的步骤：

图　4-7

图　4-8

1）要阻止Googlebot爬取某个子文件夹，我们可以使用以下语法：

2）为了阻止所有机器人抓取网站，我们可以在文本文件中加入以下数据：

图　4-9

在本节中，我们将使用robots_txt辅助模块来获取网站的robots.txt文件内容：

1）首先使用robots_txt关键字搜索模块，如图4-10所示。

图　4-10

2）单击该模块会重定向到选项页面，在这里我们可以设置Target Addresses、RPORT、PATH、VHOST等。在本例中，我们以www.packtpub.com作为VHOST，如图4-11所示。

3）单击Run Module后，将创建一个新任务，我们可以在Tasks窗口中查看正在运行的脚本的状态，如图4-12所示。

4）任务完成后，我们可以返回Analysis选项卡，然后单击目标主机的Notes标签，以查看网站的robots.txt文件中列出的所有目录，如图4-13所示。

图　4-11

图　4-12

图　4-13

接下来，让我们在给定的网站上查找一些配置错误的Git存储库。

4.2.1.4　查找隐藏的Git存储库

有时，在生产服务器上从Git部署代码时，开发人员会将git文件夹保留在公共目录中。这很危险，因为它可能使攻击者可以下载应用程序的整个源代码。

让我们看一下git_scanner模块，它可以帮助我们发现网站上配置错误的存储库。

1）首先搜索git_scanner关键字，如图4-14所示。

图　4-14

2）单击该模块会重定向到模块选项页面，我们可以指定目标地址和端口，然后单击Run Module，如图4-15所示。

图　4-15

3）创建一个新任务，如图4-16所示。

图　4-16

4）任务完成后，我们可以转到Analysis选项卡，然后单击主机。在Notes标签中，我们看到辅助模块已找到存储库的config和index文件，如图4-17所示。

图　4-17

5）接下来，我们可以转到Captured Data选项卡以查看由辅助模块找到的文件的内容，如图4-18所示。

图　4-18

6）单击View查看config文件的内容，其中包含git URL、版本和一些分支信息。此信息还可用于下载应用程序的整个源代码，如图4-19所示。

接下来，我们将进行开放代理检测。

4.2.1.5　开放代理检测

这是一个非常简单的脚本，它允许我们检查在端口上找到的代理服务是否为开放代理。如果代理服务是开放式代理，则可以将服务器用作代理，尤其是在红队活动期间用来执行不同的攻击并避免被检测。可以通过以下步骤完成：

图　4-19

1）首先在Modules选项卡中搜索open_proxy关键字，如图4-20所示。

图　4-20

2）单击模块名称，将被重定向到设置IP、端口和URL的选项，以检查代理设置。

3）单击Run Module将创建一个新任务，如图4-21所示。

如果是开放式代理，我们将在任务窗口中看到一条消息，如图4-22所示。

现在，我们对使用Metasploit进行主动侦察有了进一步的了解，接下来我们将学习关于被动侦察的内容。

图　4-21

图　4-22

4.2.2　被动侦察

被动侦查是一种在不主动接触系统的情况下收集有关目标信息的方法。我们将使用间接方法，例如Shodan和Censys来收集有关目标的信息。

Metasploit有很多辅助模块，可以帮助我们进行被动侦察。在本节中，我们将介绍一些使用Metasploit辅助模块执行被动侦察的方法。

4.2.2.1　归档的域URL

归档的域URL是执行被动侦察的最佳方法之一，因为它们会告诉我们有关网站及其URL的历史。有时，虽然网站已更改，但服务器上保留了一些旧文件和文件夹。这些可能包含漏洞，并允许我们获得访问权限。Archived.org和Google Cache是我们用来搜索归档的域URL的两个途径。

Metasploit为此还专门内置了一个辅助工具：

1）我们可以在Search Modules页面中使用enum_wayback关键字来找到所需的辅助工具，如图4-23所示。

图　4-23

2）单击该模块，我们将被重定向到选项页面，你可以输入网站域名。然后，单击Run Module，如图4-24所示。

这将创建一个新任务，模块成功运行后，将在任务窗口中打印找到的输出，如图4-25所示。

4.2.2.2　Censys

Censys是用于搜索连接到Internet的设备的搜索引擎。Censys是由开发ZMap的安全研究人员于2015年在密歇根大学创建的。

Censys持续扫描和记录Internet上的设备：

1）Metasploit具有内置的辅助模块，使我们能够进行Censys扫描。我们可以在模块搜索中使用censys关键字来找到脚本，如图4-26所示。

图　4-24

图　4-25

图　4-26

2）单击该模块将导航至选项页面，但在执行此操作之前，我们需要登录到censys.io并获取将在模块中使用的API ID和Secret，如图4-27所示。

图　4-27

3）我们在模块选项中输入API ID和Secret，然后将域名指定为目标地址，此处以packtpub.com为例，如图4-28所示。

4）单击Run Module将创建一个新任务。辅助模块将搜索不同的主机及其端口。结果如图4-29所示。

Metasploit还具有用于搜索Shodan和Zoomeye数据库的模块，如图4-30所示。

图4-31显示了shodan_search模块的输出。

图　4-28

图　4-29

5）要运行Zoomeye模块，我们可以像搜索Shodan一样搜索zoomeye关键字并运行该模块，如图4-32所示。

图　4-30

图　4-31

图　4-32

4.2.2.3　SSL侦察

组织使用安全套接层（Secure Socket Layer，SSL）协议来确保服务器与客户端之间的通信是加密的。在本节中，我们将研究Metasploit的一个SSL相关的模块，这个模块使用SSL Labs的API收集相关主机上运行的SSL服务的信息：

1）我们可以在模块搜索栏中搜索ssllabs关键字以找到该模块，如图4-33所示。

图　4-33

2）单击模块名称会将我们重定向到选项页面。在这里，我们设置目标并单击Run Module，如图4-34所示。

图　4-34

这将创建一个新任务，并将显示扫描结果和输出，如图4-35所示。

图　4-35

SSL可以透露很多内容，例如证书颁发机构、组织名称、主机和内部IP。我们可以使用同一模块来了解服务器上运行的SSL版本、检查服务器允许的密码，还可以检查目标站点是否启用了HTTP严格传输安全性（HTTP Strict Transport Security，HSTS）机制。

4.3　小结

在本章中，我们学习了侦察的过程。首先使用HTTP标头进行主动侦察，然后是查找Git仓库。接着，我们继续学习了被动侦察，研究了Shodan和SSL分析，并使用归档的网页来获取与目标有关的信息。

在下一章中，我们将学习如何使用Metasploit执行基于Web的枚举，并将专注于HTTP方法枚举、文件和目录枚举、子域枚举等。

4.4　问题

1.HTTP标头检测模块未显示任何输出。这是否意味着模块没有正常工作？

2.Metasploit Web界面中的端口扫描有些问题。你有解决办法吗？

3.在Metasploit框架中使用自定义模块时，是否可以在Metasploit Web界面中加载自定义模块？

4.我的组织为我提供了安装在VPS上的Web界面版本的Metasploit。如何确定Web界面的登录页面受到保护？

4.5　拓展阅读

要了解有关这节主题的更多信息，可以查看以下URL：

·https://metasploit.help.rapid7.com/docs/replacing-the-ssl-certificate

·https://github.com/rapid7/metasploit-framework/wiki/Metasploit-Web-Service

·https://www.offensive-security.com/metasploit-unleashed/scanner-http-auxiliary-modules/

第5章
使用Metasploit进行Web应用枚举

枚举是踩点（footprinting）的一个子集，它属于渗透测试执行标准（PTES）中情报收集的第二阶段。执行枚举的主要优点是可以找到攻击端点（入口），我们从中能够发起攻击或发送伪攻击载荷。在大多数渗透测试案例中，测试人员往往需要花费大约60%～70%的时间来收集信息，测试人员将使用这些信息来识别一些新漏洞。枚举做得越好，渗透测试的效果就越好。在本章中，我们将讨论以下内容：

·枚举简介。

·DNS枚举。

·文件枚举。

·使用Metasploit进行爬行和抓取。

5.1　技术条件要求

以下是学习本章所需的前提技术条件：

·安装Metasploit社区版。

·基于*nix的系统或Microsoft Windows系统。

·枚举的通用词表（wordlist），推荐使用SecLists。

5.2　枚举简介

在枚举过程中，从初始踩点/侦察过程中收集到的所有信息都将被用到。为了对Web应用程序进行渗透测试，我们需要对枚举过程有很好的理解。侦察和枚举做得越好，就可以更快、更轻松地找到Web应用程序中的漏洞。通过枚举，我们可以找到以下信息：

·隐藏的文件和目录。

·备份和配置文件。

·子域和虚拟主机。

首先让我们看一下DNS枚举，以及如何使用Metasploit枚举DNS。

5.2.1　DNS枚举

Metasploit可以使用dns_enum辅助模块从DNS记录中获取有关主机的信息。该模块使用DNS查询来获取诸如MX（Mail Exchanger，邮件交换器）、SOA（Start of Authority，起始授权机构）和SRV（Service，服务）记录之类的信息，你可以在网络内部或外部使用这个模块。有时，DNS服务被配置为可以公开访问，在这种情况下，我们可以使用dns_enum查找内部网络主机、MAC地址和IP地址。我们将在本节探讨dns_enum的用法。

1）可以在模块搜索选项中使用enum_dns关键字来查找模块，如图5-1所示。

图　5-1

2）单击模块（Modules）名称会重定向到选项页面，如图5-2所示。

图　5-2

在这里，我们可以设置目标的详细信息，例如我们正在使用的DNS服务器、域名以及我们希望模块获取的记录。

3）单击Run Module将创建一个新任务，输出如图5-3所示。

图　5-3

现在让我们看看如何进一步改进此模块以满足我们的需求并获取更多结果。

5.2.2　更进一步——编辑源代码

Metasploit中的enum_dns模块有些过时了（我们可以通过检查TLD词表获取更新）。因此，需要定制该模块来满足我们的需求。方法是为enum_dns提供顶级域（TLD）词表，然后对条目进行解析和检查以查询记录。通过查看辅助模块的源代码，我们可以发现其查找的TLD列表中没有最近被启用的TLD，如图5-4所示。

我们可以查看modules/auxiliary/gather/enum.dns.rb文件的第302行，也可以通过以下链接在线访问该文件：

从上面的源代码中，我们可以看到TLD存储在tlds []数组中。我们通过执行以下步骤编辑代码实现TLD更新。你可以从互联网号码分配机构（Internet Assigned Numbers Authority，IANA）的网站找到最新的TLD列表，网址为http://data.iana.org/TLD/tlds-alpha-by-domain.txt。

图　5-4

1）从上面的URL下载TLD文件并删除以#开头的第一行，如图5-5所示。

图　5-5

2）在修改Metasploit模块之前，请使用以下命令备份enum_dns.rb文件：

请注意，Metasploit框架安装在/usr/local/share目录下。在本例中，我们将文件命名为enum_dns.rb.bak。

3）现在，使用任何一种文本编辑器打开enum_dns.rb文件，然后转到第29行，如图5-6所示。

图　5-6

4）让我们在代码中添加一个注册条目，以便将我们的TLD词表提供给Metasploit模块，如图5-7所示。

图　5-7

在此模块中，TLD枚举默认是被禁用的。从图5-7中可以看到，ENUM_TLD选项设置为TRUE时，可以通过将TLD替换为IANA TLD列表（旧列表）实现TLD扩展。

5）我们通过搜索ENUM_TLD字符串来查找function()，当TLD枚举选项处于启用状态时，将调用该函数。

从图5-8中可以看到，如果ENUM_TLD设置为TRUE，则将调用get_tld()函数。

图　5-8

6）现在让我们看一下get_tld()函数，如图5-9所示。

图　5-9

7）现在，我们通过添加一部分代码加载最新的TLD词表并将其保存在tlds []数组中，如图5-10所示。请注意，从图5-9中可以看出我们已经清空了TLD数组。

图　5-10

表5-1说明了图5-10中使用的函数和代码结构。

表　5-1

8）保存文件并在msfconsole中执行reload命令来重新加载框架中的模块，如图5-11所示。

图　5-11

9）使用定制的enum_dns模块并执行show options命令，如图5-12所示。

正如我们在图5-12中所看到的，我们已经把域设置为google.com来查找Google的TLD。我们还把TLD_WORDLIST选项设置为更新后的TLD词表。让我们执行它，如图5-13所示。

现在，更新后的Metasploit模块向我们显示了提供给模块本身的TLD。在下一节中，我们将使用Metasploit枚举文件和目录。

图　5-12

图　5-13

5.3　枚举文件

枚举文件和目录是枚举阶段最重要的步骤之一。服务器端的一些小的错误配置可能会让我们找到以下文件：

·隐藏文件。

·备份文件。

·配置文件。

·重复文件。

·包含丰富信息的文件，如凭证文件、密码备份、错误日志、访问日志和调试跟踪。

这些文件中包含的信息可以帮助我们计划对目标的进一步攻击。

以下是Metasploit框架中提供的一些可以帮助我们进行信息收集的辅助模块：

·dir_scanner

·brute_dirs

·prev_dir_same_name_file

·dir_listing

·copy_of_file

·Backup_file

我们来看看上述辅助模块的一些示例：

1）可以使用HTTP Directory Scanner模块查找目录列表以及隐藏的目录，还可以使用dir_scanner关键字检索模块，如图5-14所示。

图　5-14

2）单击模块名称，将导航至选项页面，在这里我们可以指定目标IP/域名和端口号，如图5-15所示。

图　5-15

3）单击Run Module将创建一个新任务，我们可以在任务窗口中看到输出，如图5-16所示。

图　5-16

图5-16显示了该模块发现的不同目录。

4）扫描完成后，我们也可以在Hosts选项卡中查看目录列表，如图5-17所示。

图　5-17

5）转到Analysis选项卡，然后选择完成扫描的主机。

6）单击Vulnerabilities选项卡，将向显示辅助模块找到的所有目录的列表，如图5-18所示。同样，我们也可以使用本节开头列出的其他模块来执行进一步的枚举。

在下一小节中，我们将学习使用Web辅助模块进行爬行（crawling）和抓取（scraping）的方法。

图　5-18

5.3.1　使用Metasploit进行爬行和抓取操作

Metasploit还允许我们使用辅助模块进行网页爬行和抓取操作。抓取对于通过定义的模式从网站的源代码中获取某些内容非常有用。它可以为我们提供有用的信息，例如从注释中提取目录、开发人员的电子邮件以及在后台进行的API调用。

1）为了进行爬行操作，我们可以使用crawl关键字来查找模块，如图5-19所示。

图　5-19

2）我们将使用msfcrawler模块，单击该模块会重定向到选项页面，并在其中定义目标、端口和深度。然后，单击Run Module，如图5-20所示。

图　5-20

3）一个新任务将被创建，我们将在任务窗口中看到页面列表，如图5-21所示。

图　5-21

4）我们也可以使用HTTP Scrape模块（auxiliary/scanner/http/scraper）来抓取网页，如图5-22所示。

图　5-22

其中，PATTERN（模式）字段用于查找所需元素的正则表达式。在本例中，我们想抓取https://prod.packtpub.com/上script标签内的所有内容，因此我们将模式设为<script\type=\"text\/javascript\"\src=\"(.*)\"><\/script>。

运行模块将创建一个新任务，模块将提取script标签中列出的所有数据，如图5-23所示。

图　5-23

接下来，我们将扫描虚拟主机。

5.3.2　扫描虚拟主机

Metasploit还允许我们扫描在同一IP上配置的虚拟主机。虚拟托管是在单个服务器上托管多个域，并且每个域名都配置有不同的服务。它允许单个服务器共享资源：

1）我们将通过Metasploit控制台使用此模块。可以使用vhost_scanner关键字搜索vhost模块，如图5-24所示。

图　5-24

2）设置rhosts和domain。在本例中，我们使用的值是域名packtpub.com和IP地址151.101.21.124，如图5-25所示。

图　5-25

3）我们通过输入run来运行模块。模块将进行扫描，并打印出找到的所有虚拟主机，如图5-26所示。

图　5-26

该辅助模块也可以用于内部网络，以查找托管在同一服务器上但配置不同域的内部应用程序。

5.4　小结

我们在本章介绍了枚举，这是渗透测试生命周期中最重要的部分。我们首先使用Metasploit模块枚举DNS，然后继续枚举文件和目录。最后，我们研究了爬虫模块以及vhost查找模块。

在下一章中，我们将学习有关使用Web应用程序扫描工具或WMAP的知识。WMAP是一个Metasploit插件，用于对目标Web应用程序执行漏洞扫描。

5.5　问题

1.是否可以用自定义词典枚举文件和目录？

2.是否可以通过自定义Metasploit载荷实现枚举自动化？

3.必须使用正则表达式来抓取HTTP页面吗？

5.6　拓展阅读

以下是一些可供进一步阅读的内容：

·https://www.offensive-security.com/metasploit-unleashed/

·https://resources.infosecinstitute.com/what-is-enumeration/

第6章
使用WMAP进行漏洞扫描

漏洞评估是识别、排序和分类网络或应用程序中漏洞的过程。它使组织可以了解其资产以及所面临的风险。使用Metasploit时，可以使用单独的辅助模块或插件来完成漏洞扫描工作。如果我们拥有自己的漏洞扫描器，则Metasploit框架还允许我们添加自己的自定义插件。

WMAP是一个Metasploit插件，用户可以使用这个插件对目标进行漏洞扫描。该插件的最佳特性之一是能够根据测试人员的要求使用尽可能多的Metasploit模块（包括自定义模块）进行漏洞扫描。测试人员可以创建多个配置文件来适应不同的场景。

本章涵盖以下内容：

·理解WMAP。

·WMAP扫描过程。

·WMAP模块执行顺序。

·向WMAP添加模块。

·使用WMAP进行集群扫描。

6.1　技术条件要求

以下是学习本章内容所需满足的前提技术条件：

·Metasploit框架（https://github.com/rapid7/metasploitframework）。

·基于*nix的系统或Microsoft Windows系统。

·适用于Metasploit的WMAP插件。

6.2　理解WMAP

WMAP是一个Web应用程序扫描插件，用于扫描Web应用程序漏洞。它不是Burp Suite或Acunetix那样的专业扫描器，但具有自己的优势。在详细介绍WMAP之前，让我们先来了解它的架构。

WMAP架构简单而强大，它是作为插件加载到MSF的微型框架。它与Metasploit数据库连接，以获取任何先前完成的扫描结果。从数据库加载的结果（例如主机名、URL、IP等）将在Web应用程序扫描中使用。WMAP使用Metasploit模块（见图6-1）进行扫描，并且这些模块可以是任何类型——辅助、漏洞利用等。一旦WMAP开始扫描目标，发现的所有辅助模块和关键信息都将存储在MSF数据库中。WMAP的最强大功能之一是其分布式（集群）扫描功能（6.6节中将介绍此功能），该功能可以帮助WMAP通过n个节点（MSF从站）扫描任意数量的Web应用程序。

图　6-1

在详细介绍如何使用WMAP之前，让我们先了解一下这个过程。

6.3　WMAP扫描过程

WMAP非常易于使用。我们在本节为想要学习如何使用这个插件的初学者定义了一个过程。这个过程分为四个阶段：数据侦察、加载扫描器、WMAP配置和启动，如图6-2所示。

让我们看一下第一阶段——数据侦察。

6.3.1　数据侦察

在这个阶段，使用爬虫、代理和任何其他资源收集与目标相关的信息，然后将数据保存在MSF数据库中以备将来使用。可以使用第三方工具（例如Burp Suite或Acunetix等）获取数据。可以使用db_import命令将数据导入MSF，因为MSF支持许多第三方工具。让我们看一个将Burp扫描导入Metasploit的例子。

图　6-2

图6-3显示了db_import命令的输出。

图　6-3

以下是导出Burp Suite数据并将其导入Metasploit的步骤：

1）打开一个先前完成的扫描，可以是主动的也可以是被动的。在本例中，我们将使用对prod.packtpub.com的被动扫描结果。图6-4中的Issues选项卡显示了Burp发现的各种问题。

2）然后，我们将选择要转移到Metasploit的问题（issue），然后单击鼠标右键，选择Report selected issues命令，如图6-5所示。

3）系统会打开一个新窗口，要求我们选择报告的格式。我们选择XML，然后单击Next按钮，如图6-6所示。

4）我们可以在报告中指定所需的详细信息，然后单击Next按钮，如图6-7所示。

图　6-4

图　6-5

5）选择是否要包含选定问题的请求和响应。我们选择这两个选项，然后单击Next按钮，如图6-8所示。

6）选择想要导出的问题，然后单击Next按钮，如图6-9所示。

7）选择目标路径和文件名，然后单击Next按钮，如图6-10所示。

图　6-6

图　6-7

图　6-8

8）现在将导出报告，导出完成后，可以关闭窗口，如图6-11所示。

9）我们可以简单地使用以下命令将Burp Suite报表导入Metasploit：

图　6-9

图　6-10

图　6-11

图6-12显示了上述命令的输出。

图　6-12

10）导入完成后，我们可以使用hosts命令查看报告中的所有主机，如图6-13所示。

图　6-13

11）要查看从Burp Suite导入的漏洞，我们可以使用vulns命令，如图6-14所示。

图　6-14

将信息导入Metasploit后，WMAP会自动检测并加载相同的信息，这意味着Metasploit中的主机现在将自动添加为WMAP模块中的站点。

6.3.2　加载扫描器

正如我们前面提到的那样，WMAP实际上是一个加载在MSF中的插件。你可以通过输入load命令并按Tab键查看MSF中插件的完整列表，如图6-15所示。

图　6-15

要开始加载过程，请按以下步骤操作：

1）使用load wmap命令加载WMAP插件，如图6-16所示。

图　6-16

2）加载插件后，可以使用问号（？）或help命令查看帮助，如图6-17所示。

图　6-17

接下来，我们将介绍WMAP配置。

6.3.3　WMAP配置

我们已经学习了如何在数据侦察阶段将目标自动添加到WMAP中。还有另一种将数据加载到WMAP中的方法，即手动定义目标。

1）我们从创建一个新站点或工作区开始执行扫描。让我们看一下所有可用于站点创建的选项。输入wmap_sites -h，如图6-18所示。

图　6-18

2）现在我们添加站点。有两种添加站点的方法，一种是直接通过URL或IP添加，可以使用以下命令执行此操作：

图6-19显示了上述命令的输出。

图　6-19

3）第二种方法是使用虚拟主机。当我们必须扫描多个虚拟主机时，这种方法会非常有用。要添加虚拟主机，可以使用以下命令：

图6-20显示了上述命令的输出。

图　6-20

4）添加站点后，我们就可以用类似的方式添加目标，可以按IP/域添加，也可以按虚拟主机（虚拟主机/域）添加。我们可以使用以下命令通过IP添加目标：

图6-21显示了上述命令的输出。

图　6-21

5）使用以下命令通过虚拟主机添加目标：

图6-22显示了上述命令的输出。

6）要查看由WMAP运行的所有模块的列表，我们可以使用wmap_modules -l命令。该命令的输出如图6-23所示。

图6-24显示了用于文件/目录测试的模块。

图　6-22

图　6-23

图　6-24

此阶段还包括配置用来执行分布式WMAP扫描的节点。可以使用wmap_nodes命令来管理和配置节点。关于这方面的更多信息将在6.6节中讨论。完成最终配置后，下一阶段就是启动WMAP。

6.3.4　启动WMAP

默认情况下，WMAP对目标运行所有模块，但是你可以更改模块的执行顺序（6.4节中将对此进行介绍）：

1）执行以下命令运行WMAP：

图6-25显示了上述命令的输出。

图　6-25

执行上述命令后，将开始运行加载的模块。WMAP没有暂停或恢复选项，因此你或者等待扫描完成，或者按Ctrl+C键来中断扫描过程。

2）要了解有关wmap_run命令的更多信息，可以使用wmap_run -h命令查看启动时可用的其他选项，如图6-26所示。

图　6-26

你甚至可以使用关键字字符串或正则表达式基于模块启动WMAP扫描。在本例中，我们使用一个字符串，该字符串将搜索已加载模块列表中的任何version关键字，如图6-27所示。

图　6-27

我们可以根据实际需要使用正则表达式。至此，我们已经了解了WMAP扫描过程的不同阶段，在下一节中我们将讨论WMAP的执行顺序。

6.4　WMAP模块执行顺序

WMAP以特定顺序运行加载的模块，此顺序由一个数值型的值决定。默认情况下，第一个用来进行Web扫描的模块是http_version，它的OrderID为0（OrderID=0），而open_proxy模块的OrderID是1（OrderID=1）。这就意味着http_version模块将首先运行，然后是open_proxy模块。测试人员可以通过更改OrderID来改变模块执行的顺序：

1）模块执行顺序可以根据我们的需要进行更改。我们可以通过执行wmap_modules-l命令获得OrderID。

图6-28显示了上述命令的输出。

2）可以在Metasploit模块代码中设置OrderID。让我们看一下http_version模块的OrderID，如图6-29所示。

可以使用register_WMAP_options()方法调整WMAP模块的执行顺序。

3）让我们使用此方法来更改http_version模块的OrderID，如图6-30所示。

图　6-28

图　6-29

图　6-30

4）现在让我们重新加载模块，如图6-31所示。

图　6-31

5）重新加载完成后，我们可以使用wmap_modules -l命令列出模块，以查看更改后的模块执行顺序，如图6-32所示。

图　6-32

从图6-31中，我们可以看到OrderID已经被更改。现在我们已经了解了模块的执行顺序，在下一节中我们将为WMAP添加一个模块。

6.5　为WMAP添加一个模块

WMAP允许我们添加自己的模块。可以是来自MSF的模块，也可以是我们重新开发的模块，下面我们将介绍一个SSL模块的例子。图6-33显示了WMAP当前正在使用的两个模块。

图　6-33

我们还可以添加另一个基于SSL的扫描模块（除了MSF中提供的SSL Labs模块）：

1）我们将使用ssllabs_scan模块，该模块通过Qualys提供的公共API使用Qualys SSL Labs的在线SSL扫描程序执行SSL扫描，如图6-34所示。

图　6-34

2）编辑该模块的源代码，以添加可以在扫描中使用的必要的库和方法，如图6-35所示。

3）在MetasploitModule类下面添加以下命令：

前面提到的WMAP库为WMAP SSL扫描程序模块提供了方法，在图6-36中可以看到，仅添加库是不够的，尝试运行模块将导致错误，如图6-37所示。

图　6-35

图　6-36

其原因是作为ssllabs_scan模块选项的HOSTNAME数据存储对象（datastore）没有被WMAP插件所使用。该插件仅定义了如图6-38所示的方法（请参阅metasploit-framework/lib/msf/core/auxiliary/wmapmodule.rb文件）。

图　6-37

在这种情况下，我们需要为WMAP找到一种方法，使ssllabs_scan模块可以识别HOSTNAME数据存储对象（datastore）。有多种解决方法，但我们将选择使用如图6-39所示的方法，因为这种方法对我们来说很方便。

图　6-38

4）我们把要使用的数据存储对象从datastore['HOSTNAME']更改为datastore['VHOST']，如图6-40所示。

图　6-39

图　6-40

用于保存来自HOSTNAME数据存储对象中数据的变量将用来保存来自VHOST数据存储对象中的数据。同时，WMAP将使用wmap_target_vhost()方法识别VHOST数据存储对象，如图6-41所示。

图　6-41

5）保存代码并返回Metasploit控制台，通过输入reload命令重新加载模块，如图6-42所示。

我们还可以使用以下命令重新加载WMAP模块：

图6-43显示了上述命令的输出。

图　6-42

图　6-43

6）让我们列出现有的模块，如图6-44所示。

你会发现模块已加载成功！

图　6-44

表6-1所示是可以在任何模块中使用的mixin类型。

表　6-1

7）更新运行中的WMAP模块，如图6-45所示。

图　6-45

由模块发现的漏洞将被保存在数据库中，可以通过执行wmap_vulns -l命令来查看，如图6-46所示。

图　6-46

在下一节中，我们将探讨WMAP的分布式扫描功能。

6.6　使用WMAP进行集群扫描

WMAP还可用于对目标进行分布式评估。此功能允许在不同服务器上运行的多个WMAP实例在主从模型下协同工作，如图6-47所示。

图　6-47

WMAP主站获取目标，并以作业的形式将其自动分发到各个从站。作业完成后，从站会向主站报告，从站的结果将存储在主站的数据库中。

1）添加一个要扫描的站点，如图6-48所示。

2）使用auxiliary/scanner/http/crawler模块在站点上执行爬虫程序；需要对选项进行相应设置，如图6-49所示。

图　6-48

图　6-49

3）运行爬虫程序收集表单和页面，如图6-50所示。

图　6-50

4）使用wmap_sites -l命令确认通过爬虫发现的页面/表单数量，如图6-51所示。

图　6-51

5）为分布式扫描配置WMAP节点，我们将使用msfrpcd -U <user> -P <password>命令在节点上运行msfrpcd，如图6-52所示。此命令将在后台启动RPC服务器，以使WMAP与Metasploit进行交互。

图　6-52

6）节点配置完成后，我们使用wmap_nodes命令来管理和使用这些节点，如图6-53所示。

图　6-53

7）我们使用以下命令将节点添加到WMAP：

图6-54显示了上述命令的输出：

8）节点连接完成后，我们可以使用wmap_nodes -l命令列出所有节点，如图6-55所示。

图　6-54

图　6-55

9）现在一切就绪，我们只需要定义扫描器的目标即可开始扫描。可以使用wmap_targets命令完成此操作，如图6-56所示。

图　6-56

在本例中，我们使用-d选项基于ID添加目标。可以使用wmap_sites -l命令来检索ID。当前设置的问题在于，节点上执行的所有模块都会将数据保存在该节点上。

10）如果要在节点上保存数据，则需要将节点连接到本地的MSF数据库。可以使用以下命令完成此操作：

图6-57显示了上述命令的输出。

图　6-57

11）使用wmap_run -e命令运行WMAP，如图6-58所示。

图　6-58

由WMAP加载的每个模块都将相应地在节点上分发和执行。

WMAP的每个节点最多只能有25个作业。这样做是为了防止节点负担过重。

12）我们可以通过输入wmap_nodes -l来查看已连接节点的列表，如图6-59所示。

图　6-59

13）我们也可以使用WMAP来仅运行一个模块。例如，如果我们要运行dir_scanner模块，则可以使用以下命令：

输出如图6-60所示。

图6-61显示了发现的目录。

14）正如我们在图6-61中所看到的，模块列出了找到的目录。要以树状结构查看输出，请使用以下命令：

图　6-60

图　6-61

图6-62显示了上述命令的输出。

15）要查看分配给节点的当前作业，可以使用以下命令：

图6-63显示了上述命令的输出。

16）可以使用以下命令删除节点：

这将从列表中删除节点1。

图　6-62

图　6-63

6.7　小结

在本章中，我们学习了WMAP以及它的架构和扫描过程。接下来，我们学习了如何将来自不同工具（例如Burp Suite）的输出导入Metasploit，以及使用WMAP模块进行加载、配置和执行扫描的过程。在本章的最后，我们学习了如何在WMAP中使用集群扫描。

在下一章中，我们将介绍WordPress的渗透测试。

6.8　问题

1.分布式扫描可以使用多少个WMAP实例？

2.WMAP插件是否支持报告功能？

3.是否可以在Metasploit中导入想要在WMAP中使用的其他服务器的日志和报告？

4.我想根据我们组织的环境进一步定制WMAP，应该怎么做？

5.WMAP支持每个节点有多少个作业？

6.9　拓展阅读

有关WMAP Web扫描器的更多信息，请参考链接https://www.offensive-security.com/metasploit-unleashed/wmap-webscanner/。

第7章
使用Metasploit（Nessus）进行漏洞评估

在本章中，我们将介绍一些使用Nessus Bridge进行漏洞评估的方法。Nessus是Tenable公司收购的漏洞扫描器产品，被广泛用于网络安全评估。Nessus Bridge允许Metasploit解析Nessus的扫描结果并将其导入其自己的数据库中，以便进一步分析和利用。我们甚至可以使用Bridge从Metasploit中启动Nessus扫描。

本章涵盖以下内容：

·Nessus简介。

·将Nessus与Metasploit结合使用。

·基本命令。

·修复Metasploit库。

·通过Metasploit执行Nessus扫描。

·使用Metasploit DB执行Nessus扫描。

·在Metasploit数据库中导入Nessus扫描结果。

7.1　技术条件要求

以下是学习本章内容的技术条件要求：

·Metasploit框架。

·基于*nix的或微软Windows的操作系统。

·Nessus Home或Professional版。

7.2　Nessus简介

Nessus是Tenable公司开发的最常见且易于使用的漏洞扫描器之一，通常用于在网络上执行漏洞评估。Tenable Research已发布138 005个插件，涵盖53 957个CVE ID和30 392个Bugtraq ID。大量的Nessus脚本（NASL）帮助测试人员扩大发现漏洞的范围。Nessus的部分功能如下：

·漏洞扫描（网络、Web、云等）。

·资产发现。

·配置审核（MDM、网络等）。

·目标分析。

·恶意软件检测。

·敏感数据发现。

·补丁审核和管理。

·策略合规审计。

可以从https://www.tenable.com/downloads/nessus下载Nessus。安装完成后，我们必须激活该工具。可以从https://www.tenable.com/products/nessus/activation-code获取激活码完成激活。

7.2.1　将Nessus与Metasploit结合使用

Nessus之所以被许多渗透测试人员使用，是因为它可以与Metasploit一起使用。我们可以将Nessus与Metasploit集成在一起，以通过Metasploit本身执行扫描。在本节中，我们将按照以下步骤将Nessus与Metasploit集成：

1）在继续下一步之前，请确保已成功安装Nessus并可以从浏览器访问Nessus的Web界面，如图7-1所示。

图　7-1

2）我们首先必须使用msfconsole中的load nessus命令来加载Nessus插件。这将为Metasploit加载Nessus Bridge，如图7-2所示。

图　7-2

3）可以在msfconsole中执行nessus_help查看插件提供的命令，如图7-3所示。

图　7-3

在使用Nessus进行漏洞扫描之前，需要先对其进行身份验证，我们将在下一节中介绍。

7.2.2　通过Metasploit进行Nessus身份验证

Metasploit使用Nessus RESTful API与Nessus核心引擎进行交互，只有在成功进行身份验证之后才能进行交互。可按如下步骤进行：

1）我们可以使用以下命令语法向Nessus进行身份验证：

图7-4显示了上述命令的输出。

我们使用用户名和密码登录Nessus Web界面。hostname可以是Nessus服务器的IP地址或DNS名称，而port是运行Nessus Web前端的RPC端口，默认情况下是TCP端口8834。

图　7-4

ssl_verify验证Nessus前端使用的SSL证书。默认情况下，服务器使用自签名证书，因此，用户应使用ssl_ignore。如果我们不想反复使用同一命令，则可以将凭证保存在配置文件中，Metasploit可以将其用于Nessus身份验证。

2）可以通过执行nessus_save命令来保存凭证，这将以YAML文件格式保存凭证，如图7-5所示。

图　7-5

该YAML配置文件的内容如图7-6所示。

图　7-6

可以在msfconsole中执行nessus_logout命令注销登录，如图7-7所示。

图　7-7

现在，我们已经成功使用Nessus RESTful API进行了身份验证，接下来可以通过执行一些基本命令开始使用Nessus。

7.3　基本命令

假设我们是一个组织的雇员，并且组织仅允许我们通过Metasploit终端访问Nessus的凭证。在这种情况下，最好运行一些基本命令来了解我们可以做什么和不能做什么。我们通过以下步骤了解这些命令：

1）我们在msfconsole中可以执行的第一个命令是nessus_server_properties。此命令将向我们提供有关扫描器的详细信息（类型、版本、UUID等）。根据扫描器的类型，我们可以设置扫描首选项，如图7-8所示。

图　7-8

2）nessus_server_status命令用于确认扫描器是否准备就绪。在组织使用基于云的Nessus和分布式扫描代理（scanner agent）的情况下会很有帮助。命令的输出如图7-9所示。

3）nessus_admin命令用于检查通过身份验证的用户是否为管理员，如图7-10所示。

图　7-9

图　7-10

4）nessus_folder_list命令用于查看Nessus中可供我们使用的目录。运行该命令的输出如图7-11所示。

5）nessus_template_list命令用于列出Nessus中所有可用的模板（注意：我们可以使用-h选项来查看有关此命令的帮助）。Subscription Only为TRUE的模板都是可访问的。要使用所有模板，我们必须在线查找订阅。图7-12显示了上述命令的输出。

图　7-11

图　7-12

图7-12中的-h标志用于查看命令的帮助。

6）可以通过执行nessus_family_list命令查看Nessus中的类别列表。执行此命令后，我们将看到所有可用的类别（Family Names）及其各自的Family ID和插件数量，如图7-13所示。

图　7-13

7）我们可以使用nessus_plugin_list <family ID>命令列出一个Family中的所有插件。这些也是Nessus中可用的所有插件，如图7-14所示。

8）要详细了解有关插件的更多信息，我们可以在msfconsole中执行nessus_plugin_ details <plugin ID>命令，如图7-15所示。

图　7-14

图　7-15

9）我们可以使用nessus_policy_list命令列出所有可用的自定义策略。这将为我们提供用于执行漏洞扫描所需的策略UUID，这些策略将被用于执行自定义扫描。策略UUID可用于区分使用多个策略执行的不同扫描，如图7-16所示。

图　7-16

在开始扫描之前，我们首先需要修复Metasploit Gem，它负责与Nessus RESTful API通信（因为官方尚未发布补丁），以解决我们在运行扫描时可能会遇到的错误。这是@kost（https://github.com/kost）开发的解决方法。如果未打补丁，Metasploit将会报错，如图7-17所示。

图　7-17

我们将在下一小节介绍Metasploit库的修复。

修复Metasploit库

从Nessus 7.0版开始，状态更改请求（例如，创建/启动/暂停/停止/删除扫描）受新的身份验证机制保护。为了使Metasploit适配最新的用户身份验证机制，我们需要修复nessus_rest RubyGem。在RubyGems目录中搜索nessus_rest.rb文件，然后可以在第152行找到无法与Nessus的新身份验证机制交互的代码，如图7-18所示。

我们需要将第152行的代码替换为图7-19所示的代码。

可以在这里找到代码：https://github.com/kost/nessus_rest-ruby/pull/7/files。

接下来我们将执行一次Nessus扫描。

图　7-18

图　7-19

7.4　通过Metasploit执行Nessus扫描

现在我们已经修复了Metasploit库，接下来让我们使用Metasploit执行Nessus扫描。

1）修复好gem之后，可以使用nessus_scan_new <UUID of Policy> <Scan name> <Description> <Targets>命令创建漏洞扫描任务，如图7-20所示。

图　7-20

2）创建任务后，我们可以通过执行nessus_scan_list命令进行确认。Sun ID将用于启动任务，因此我们需要记下它，如图7-21所示。

图　7-21

3）我们同样可以通过访问Nessus Web界面进行确认，如图7-22所示。

图　7-22

正如我们在图7-22中看到的，扫描任务已创建，但尚未启动。

4）我们通过执行nessus_scan_launch <scan ID>命令来启动扫描任务，如图7-23所示。

图　7-23

可以看到我们已经成功启动了扫描任务。

5）让我们在Nessus Web界面上确认一下，如图7-24所示。

图　7-24

6）在msfconsole中，通过执行nessus_scan_details<scan ID><category>命令，我们可以看到相同的细节，如图7-25所示。

图　7-25

可用于查看扫描详细信息的类别如下：

·信息（Information）：常规扫描信息，包括扫描状态、扫描策略、扫描名称、扫描目标以及扫描开始和结束时间。

·漏洞（vulnerabilities）：Nessus在给定目标上发现的漏洞列表，其中包括用于扫描目标的插件名称及其插件ID、插件Family（类别）以及在目标上找到的实例总数。

图7-26显示了漏洞命令的输出。

·历史记录（history）：这是同一个扫描任务的最后一次扫描记录。包括历史记录ID、扫描状态、创建日期和上次修改日期。

图7-27显示了history命令的输出。

图　7-26

图　7-27

7）我们从Nessus Web界面确认一下扫描的详细信息，如图7-28所示。

图　7-28

8）现在，让我们执行nessus_report_hosts<scan ID>命令以查看扫描的总体摘要，如图7-29所示。

图　7-29

9）要获取已识别漏洞的列表，我们可以执行nessus_report_vulns<scan ID>命令，如图7-30所示。

图　7-30

通过Metasploit使用Nessus有一个好处：可以使用Metasploit DB进行扫描。如果我们在Metasploit DB中存储了一个目标列表，并且希望对这些目标进行漏洞扫描，那么这将非常有用。

7.4.1　使用Metasploit DB执行Nessus扫描

可以使用nessus_db_scan <policy ID> <scan name> <scan description>命令将存储在Metasploit DB中的所有目标传递给Nessus。在本例中，我们将目标IP192.168.2.1存储在了Metasploit DB中。执行此命令后，Nessus将开始对该目标IP进扫描（不仅要创建任务，还要启动它），如图7-31所示。

图　7-31

按以下步骤进行操作：

1）我们首先从Nessus Web界面确认之前的操作，如图7-32所示。

图　7-32

2）正如我们在图7-32中看到的，扫描已经启动并运行。在管理Metasploit工作区时，可以使用nessus_db_scan_workspace命令。在图7-33中，我们将目标IP存储在NESSUS-WEB工作区中。

图　7-33

3）让我们执行nessus_db_scan_workspace <policy ID> <scan name> <scan description> <workspace>命令以对存储在NESSUS-WEB工作区中的IP 192.168.2.1进行扫描，如图7-34所示。

图　7-34

正如我们在图7-34中看到的，我们已经成功创建了一个扫描任务，它将扫描存储在NESSUS-WEB工作区中的所有主机。

如果要执行nessus_db_scan_workspace命令，则必须手动启动扫描任务。

4）让我们使用nessus_scan_launch <scan ID>命令启动扫描。成功启动扫描任务后，我们将再次使用nessus_scan_details命令获取扫描状态，如图7-35所示。

图　7-35

从图7-35可以看出，扫描已完成。

扫描结果不会保存在工作区中，相反，我们可以手动导入结果，也可以使用nessus_db_import命令导入结果。请记住，某些功能仅在我们使用Nessus Manager时才可用。

现在，我们已经了解了如何使用Metasploit DB执行Nessus扫描，下一小节，我们将学习如何将Nessus扫描结果导入Metasploit DB。

7.4.2　在Metasploit DB中导入Nessus扫描

当我们无法通过REST API将结果直接导入Metasploit DB时，可以使用以下方法：

1）首先，将Nessus结果导出到一个文件并下载该文件，然后使用db_import命令导入这个文件。

2）要导出结果，请使用nessus_scan_export <scan ID> <export format>命令（可选的导出格式为Nessus、HTML、PDF、CSV或DB）。在此过程中将分配一个文件ID。

3）导出就绪后，执行nessus_scan_report_download <scan ID> <file ID>命令，如图7-36所示。

正如我们在图7-36中看到的，我们已经将结果导出为Nessus格式并下载了该文件。

4）现在，使用db_import命令导入这个文件。

图　7-36

5）接下来，让我们执行vulns命令，以确认Nessus结果是否已成功导入Metasploit DB，如图7-37所示。

图　7-37

6）我们还可以通过执行hosts和services命令来确认上述方法是否有效，如图7-38所示。

图　7-38

如果使用得当，我们只需单击一下按钮即可相当有效地管理VA项目（当然，还包括用于管理项目和自动化的定制化Metasploit模块）。

7.5　小结

在本章中，我们首先介绍了Nessus Bridge。然后，我们学习了有关配置Bridge的知识。接下来，我们学习了如何从Metasploit控制台启动Nessus扫描。最后，我们研究了如何将扫描结果导入Metasploit DB以进一步使用。

在下一章中，我们将从流行的WordPress开始学习如何对内容管理系统（Content Management System，CMS）进行渗透测试。

7.6　问题

1.我是否需要在系统上安装Nessus才能通过Metasploit运行它？

2.可以在Metasploit中使用其他漏洞扫描程序代替Nessus吗？

3.Nessus Professional可以与Metasploit一起使用吗？

4.我可以通过Metasploit使用Nessus扫描多少个系统？

7.7　拓展阅读

以下链接是关于Nessus的官方博客文章，解释了为什么以及如何将Nessus与Metasploit结合使用：https://www.tenable.com/blog/using-nessus-and-metasploit-together

第三篇

渗透测试内容管理系统

内容管理系统（CMS），例如Drupal、WordPress、Magento和Joomla，都是非常受欢迎的，非常适合用来编辑Web应用的内容。然而，如果不定期维护和检查这些系统的安全性，它们也会非常容易受到黑客的攻击。本节将详细介绍如何针对CMS进行渗透测试，以及CMS中的一些常见漏洞。

本篇包括以下章节：

·第8章　渗透测试CMS——WordPress

·第9章　渗透测试CMS——Joomla

·第10章　渗透测试CMS——Drupal

第8章
渗透测试CMS——WordPress

CMS是一种用于管理和编辑数字内容的系统，它支持多个用户、作者和订阅者进行协作。互联网上有很多CMS在被广泛使用，例如WordPress、Joomla、PHPNuke和AEM（Adobe Experience Manager）。在本章中，我们将探讨一个著名的CMS——WordPress。我们将学习如何对这种CMS进行渗透测试。

本章涵盖以下主要内容：

·WordPress架构简介。

·使用Metasploit对WordPress进行侦察和枚举。

·对WordPress进行漏洞扫描。

·对WordPress进行漏洞利用。

·自定义Metasploit漏洞利用模块。

8.1　技术条件要求

以下是学习本章内容所需满足的前提技术条件：

·Metasploit框架。

·已安装WordPress CMS。

·已配置数据库服务器（建议使用MySQL）。

·Linux命令的基本知识。

8.2　WordPress简介

WordPress是一种开源的CMS，前端使用PHP，后端使用MySQL。它主要用于博客系统，但也支持论坛、媒体库和在线商店。WordPress于2003年5月27日由其创始人Matt Mullenweg和Mike Little发布。它还包括一个插件架构和模板系统。WordPress插件架构允许用户扩展其网站或博客的特性和功能。截至2019年2月，WordPress.org共有54 402个免费插件和1500多个高级插件。WordPress用户只要遵循WordPress标准，就可以自由创建和开发自己的主题。

在研究WordPress枚举和漏洞利用之前，让我们先了解一下WordPress的架构。

8.2.1　WordPress架构

WordPress架构可分为四个主要部分，如图8-1所示。

图　8-1

让我们看一下各个部分：

·Display（显示）：包含用户可见的HTML、CSS和JavaScript文件。

·Theme/Template（主题/模板）：包括表单、主题文件、不同的WordPress页面，以及注释、页眉、页脚和错误页面等部分。

·WP-Engine：该引擎负责整个CMS的核心功能，例如RSS feeds、与数据库通信、设置、文件管理、媒体管理和缓存。

·WP Backend：包括数据库、PHPMailer定时任务和文件系统。

接下来我们研究一下WordPress的目录结构。

8.2.2　文件/目录结构

通过浏览WordPress目录我们可以看到WordPress的文件/文件夹结构，如图8-2所示。

图　8-2

让我们快速浏览一下这些文件夹和文件。

根目录

根目录（base folder）包含三个文件夹，分别是wpadmin、wp-content和wp-includes，以及一堆PHP文件，其中包括一个最重要的文件wp-config.php。

根目录包含WordPress核心操作所需的所有其他PHP文件和类。

1.wp-includes

wp-includes文件夹包含前端使用的所有其他PHP文件和类，以及Wordpress Core所需的类。

2.wp-admin

这个文件夹包含WordPress仪表板（Dashboard）的文件，这些文件用于执行所有管理任务，如撰写帖子、审核评论以及安装插件和主题。仅允许注册用户访问仪表板。

3.wp-content

wp-content文件夹包含所有用户上传的数据，该文件夹有三个子文件夹：

·themes。

·plugins。

·uploads。

themes目录包含WordPress网站上安装的所有主题。默认情况下，WordPress带有两个主题：Twenty Twelve和Twenty Thirteen。

同样，plugins文件夹用于存储WordPress网站上安装的所有插件。自网站上线之后，我们上传的所有图像（和其他媒体文件）都将存储在uploads目录中，它们按天、月和年分类。

现在，我们已经对WordPress的架构和文件/目录结构有了基本的了解，让我们开始进行渗透测试。

8.3　对WordPress进行侦察和枚举

在开始利用WordPress的任何plugin/theme/core漏洞之前，第一步是确认网站是否基于WordPress。有多种方法可以检测是否使用了WordPress CMS：

·在HTML页面源中搜索wp-content字符串。

·查找/wp-trackback.php或/wp-linksopml.php文件名——如果使用了WordPress，则会返回XML。

·你也可以尝试/wp-admin/admin-ajax.php和/wp-login.php。

·查找静态文件，例如readme.html和/wpincludes/js/colorpicker.js。

确认站点运行在WordPress上之后，下一步就是确定目标服务器上正在运行的WordPress的版本。为此，你需要了解检测版本号的不同方法。之所以要检测版本号，是因为基于目标服务器上安装的WordPress版本，我们可以测试是否存在基于插件或WordPress-core的漏洞利用，这些漏洞利用可能是公开的，也可能是未公开的。

8.3.1　版本检测

每个WordPress都附带一个版本号。尽管最新的WordPress默认隐藏版本号，但是我们仍然可以枚举版本号。在本节中，我们将学习一些识别正在运行的WordPress版本的方法。

最常见的侦察技术是Readme.html、元生成器（meta generator）、feed（RDF、Atom和RSS）、插件和主题（JS和CSS ver）以及散列匹配。

8.3.1.1　Readme.html

最简单的技巧是访问readme.html页面，这个页面会泄露版本号。这个文件的最初目的是向第一次使用CMS的用户提供有关如何继续安装和使用WordPress的信息。安装和设置完成后，应该将其删除。使用包括Metasploit在内的任何工具时，请在执行任何形式的漏洞利用之前检查WordPress的版本号。

请确保自己知道要测试的是哪个版本。图8-3展示了一个readme.html的例子。

图　8-3

8.3.1.2　元生成器

带有generator名称属性的meta标记通常被描述为用于生成文档/网页的软件。确切的版本号可以在meta标记的content属性中看到。基于WordPress的网站通常在其源中带有此标记，如图8-4所示。

图　8-4

接下来，我们将介绍如何通过JavaScript和CSS文件获取版本号。

8.3.1.3　通过JavaScript和CSS文件获取版本

另一种查找版本号的方法是查看以下文件的源代码。以下文件请求JS和CSS文件：

·wp-admin/install.php

·wp-admin/upgrade.php

·wp-login.php

它们在其ver参数中显示了确切的版本号，如图8-5所示。

图　8-5

接下来，你将看到如何通过feed获取版本。

8.3.1.4　通过feed获取版本

有时，版本信息也可能会从网站的feed中泄露。以下文件路径可能会泄露版本信息：

·/index.php/feed/

·/index.php/feed/rss/

·/index.php/feed/rss2/

·/index.php/comments/feed/

·/index.php/feed/rdf/（本地下载文件）

·/index.php/feed/atom/

·/?feed=atom

·/?feed=rss

·/?feed=rss2

·/?feed=rdf

图8-6显示了通过feed披露的版本号。

图　8-6

8.3.1.5　使用大纲处理标记语言

大纲处理标记语言（Outline Processor Markup Language，OPML）是一种用于大纲（定义为树形结构，其中每个节点包含一组带字符串值的命名属性）的XML格式。以下文件允许WordPress从其他网站导入链接，只要它们是OPML格式即可，但是访问此文件也会泄露版本信息（位于HTML注释标记之间）：

如图8-7所示。

接下来，我们将介绍高级指纹识别。

8.3.1.6　独特/高级指纹识别

独特/高级指纹识别是对WordPress进行指纹识别，以找出其确切版本的另一种方法。顾名思义，该技术非常独特。通过计算静态文件的哈希值并将它们与不同版本的WordPress中的相同静态文件的哈希值进行比较来完成。可以通过执行图8-8所示的命令进行操作。

图　8-7

图　8-8

要比较哈希值，请参考https://github.com/philipjohn/exploit-scanner-hashes上的GitHub存储库。

8.3.2　使用Metasploit进行WordPress侦察

Metasploit有一个用于获取WordPress版本号的扫描模块wordpress_scanner。

让我们为该模块设置选项，如图8-9所示。

图　8-9

一切就绪后，就可以运行这个模块了，如图8-10所示。

图　8-10

这是一个非常简单的扫描程序，它尝试使用前面提到的技术来查找版本号。

现在我们有了版本号，就可以参考接下来要介绍的案例，了解如何枚举和利用WordPress漏洞。我们会对给出的漏洞进行详细解释。

8.3.3　使用Metasploit进行WordPress枚举

以下是我们可以集中时间进行枚举的攻击面：

·用户名（Username）。

·主题（Theme）。

·插件（Plugin）。

请按以下步骤使用Metasploit模块auxiliary/scanner/http/wordpress_login_enum：

1）我们可以尝试对用户名进行暴力猜测，也可以枚举用户名，如图8-11所示。

图　8-11

2）让我们把选项仅设置为枚举用户名并运行模块，如图8-12所示。

图　8-12

3）现在，可以尝试使用字典进行暴力破解。该模块的默认选项使其能够执行暴力破解攻击，如图8-13所示。

图　8-13

4）现在我们来设置选项，我们已经设置了从之前的枚举方法中找到的用户名，如图8-14所示。

5）对于密码字典，请使用set PASS_FILE <file>命令并运行模块，如图8-15所示。

图　8-14

图　8-15

在下一节中，我们将研究漏洞评估扫描。

8.4　对WordPress进行漏洞评估

虽然Metasploit没有用于执行漏洞评估扫描的模块，但你可以自己编写一个Metasploit模块作为第三方漏洞评估扫描工具（如WPscan）的包装器。

我们已经编写了一个自定义的Metasploit模块，该模块在执行时将运行WPscan，解析输出并进行打印。尽管该模块只是一段粗糙的包装器代码，但是你可以根据需要对其进行进一步修改。以下是自定义Metasploit模块的示例代码：

1）我们将从添加所需的库开始，如下所示：

2）然后，我们添加Metasploit Auxiliary类：

3）定义模块的信息部分：

4）在这里，我们将为模块添加options部分，可以在其中添加需要测试的目标URL：

5）接下来，我们定义target_url方法，该方法将存储用户选项TARGET_URL：

6）我们还需要定义find_wpscan_path方法，该方法将在系统中查找wpscan文件：

7）接下来，我们添加辅助模块执行方法，运行并检查系统上是否安装了wpscan：

如果找到了wpscan，该模块将首先创建一个包含随机字符的临时文件：

8）以下是wpscan执行块，将使用用户选项创建一个wpscan进程：

执行完成后，模块将读取包含wpscan输出的临时文件：

9）现在，我们添加用来解析JSON输出的代码块：

在JSON输出中寻找interesting_findings数组，我们将使用此数组打印WordPress目标站点中发现的漏洞的详细信息：

10）通过在JSON输出中查找版本数组并对其进行解析，我们添加了用于检查WordPress版本的代码块：

解析wpscan发现的漏洞总数并进行打印（包括参考和CVE链接）：

11）添加代码块以使用wpscan检查已安装的主题：

添加使用wpscan枚举已安装插件的代码块：

12）然后，我们添加代码块来查找已安装插件中发现的漏洞，并根据CVE和参考URL（包括exploit-db URL）进行映射：

13）完成所有操作后，删除此模块创建的临时文件：

以下是WPscan辅助模块的完整代码：

运行我们刚刚创建的自定义模块的步骤如下：

1）将模块复制到<path_to_metasploit>/modules/auxiliary/scanner/wpscan.rb并启动Metasploit，如图8-16所示。

图　8-16

2）设置选项并运行模块，如图8-17所示。

这个模块还解析插件信息，如图8-18所示。

这个模块不会将信息保存在数据库中，因此你可以根据需要对其进行自定义设置。此模块的唯一目的是枚举插件、主题和WordPress版本并查找漏洞。在下一节中，我们将介绍漏洞利用。

图　8-17

图　8-18

8.5　WordPress漏洞利用第1部分——WordPress任意文件删除

既然我们知道了如何识别WordPress的版本，那么让我们详细了解一些WordPress漏洞利用的方法。我们还将讨论漏洞利用过程的工作原理。

我们首先来看一下WordPress任意文件删除漏洞。此漏洞允许任何经过身份验证的用户从服务器删除文件，攻击者可以使用它执行命令。我们来看一下这个漏洞利用的工作原理以及如何执行命令。

图8-19显示了在本地主机上运行的基于WordPress的博客系统。

图　8-19

该漏洞实际上是一个二阶（second-order）文件删除，我们上传并编辑一个图像文件，然后将文件的路径放入元数据中。当图像文件被删除后，WordPress会调用unlink函数来自动删除包含指向我们文件路径的元数据。我们来看一下基本的漏洞流（vulnerability flow）。

8.5.1　漏洞流和分析

我们将更深入地研究这个漏洞的根本成因（root cause）。查看wp-admin/post.php文件，如图8-20所示，我们能看到来自用户的未经处理的输入存储在$newmeta中。

图　8-20

在wp-includes/post.php文件中，相同的输入传递到wp_update_attachment_metadata()以作为序列化值meta_key存储在数据库中，如图8-21所示。

图　8-21

当用户点击删除媒体（delete media）按钮时，以下代码要求从数据库中输入内容，并将其存储在$thumbfile中。然后，调用unlink函数以删除指定的文件。缩略图链接（thumb link）元数据被删除，因为它包含指向wp-config的路径，如图8-22所示。

图　8-22

接下来，我们介绍如何使用Metasploit进行漏洞利用。

8.5.2　使用Metasploit利用漏洞

Metasploit有一个内置的利用模块，可以删除服务器上的任意文件。我们将使用wp-config文件的示例，讨论如何利用此漏洞将Shell上传到服务器。

通过在msfconsole中运行以下命令来使用这个模块：

auxiliary/scanner/http/wp_arbitrary_file_deletion

如图8-23所示，我们输入RHOST、WordPress的用户名和密码以及配置文件的路径。在进行漏洞利用之前，让我们看一看WordPress数据库wp_postmeta表中的当前条目，如图8-24所示。

图　8-23

图　8-24

到目前为止，wp-config.php文件还在服务器上，如图8-25所示。

图　8-25

执行模块后，Metasploit使用它对WordPress进行身份验证，然后将.gif文件上传到服务器，如图8-26所示。

图　8-26

通过查看wp_postmeta表的条目，我们再次看到附件依然存在，并且附件的元数据以序列化格式存储。元数据包含文件名、宽度、高度和EXIF标头等详细信息，如图8-27所示。

图　8-27

接下来，漏洞利用程序将尝试编辑附件，并将thumb参数设置为我们要删除的文件的路径，如图8-28所示。

这将生成一个代码为302的响应，我们会被重定向回帖子页面，如图8-29所示。

让我们看看在这个请求之后数据库是如何更新的。再次查看wp_postmeta表，我们将看到两个新的字符串已被添加到序列化的meta_value列中。这些值是一个thumb和配置文件的路径，如图8-30所示。

图　8-28

图　8-29

图　8-30

该漏洞利用的下一步是删除上传的附件，这将强制调用unlink()函数，从而导致配置文件被删除，如图8-31所示。

我们想到的下一个问题是：删除配置文件如何让我们在服务器上进行远程代码执行（Remote Code Execution，RCE）？

一旦wp-config.php文件被删除，WordPress就会将站点重定向到setupconfig.php，即默认的安装启动页面，如图8-32所示。

图　8-31

图　8-32

我们的思路是在自己的服务器上创建一个数据库，然后用我们的数据库再次设置WordPress。

图8-33显示了在我们自己的服务器上创建MySQL数据库的SQL命令。WordPress需要访问该服务器，因此我们必须确保MySQL正在运行并允许远程登录。

图　8-33

现在，我们单击Continue按钮，并提供数据库连接的详细信息，如图8-34所示。

图　8-34

下一步是创建WordPress用户，如图8-35所示。

图　8-35

我们可以用刚刚创建的WordPress用户登录。现在服务器上的WordPress实例已连接并配置成了我们自己的数据库，如图8-36所示。

由于我们拥有WordPress CMS的管理员权限，因此可以使用Metasploit模块上传Shell到网站上。命令如下所示：

图　8-36

图8-37显示了上述命令的输出。

图　8-37

让我们设置此漏洞利用使用的选项，如图8-38所示。

现在，让我们执行模块并等待结果出现，如图8-39所示。

现在，我们在服务器上有可访问的meterpreter。因此，可以实现远程代码执行（RCE），如图8-40所示。

图　8-38

图　8-39

图　8-40

这是一个非常简单的漏洞利用。然后可以进一步破解哈希密码以访问管理面板，或者一旦我们获得明文密码，就可以使用WordPress Shell上传模块上传一个meterpreter到目标上。在下一节中，我们将介绍Google Maps插件中未经身份验证的SQL注入。

8.6　WordPress漏洞利用第2部分——未经身份验证的SQL注入

我们来看一下另一种SQL注入的情况，它是在WordPress Google Maps插件中被发现的。Metasploit已经有一个内置的漏洞利用模块，可以从数据库中提取wp_users表：

在运行该模块之前，让我们看一下插件的源代码并了解问题出在哪里。

8.6.1　漏洞流和分析

通过查看class.rest-api.php的源代码，我们可以看到用户输入作为一个名为fields的get参数传递给了explode函数。explode函数用于将一个字符串按指定的字符串拆分为多个片段，如图8-41所示。

图　8-41

然后，将输入存储在$imploded变量中，使用implode()组合回去，并直接传递给SELECT查询语句，如图8-42所示。

$imploded变量就是这里的注入点，我们也可以通过使用Metasploit模块来利用此漏洞。

图　8-42

8.6.2　使用Metasploit利用漏洞

针对目标进行漏洞利用，我们可以获得存储在wp_users表中的数据，如图8-43所示。

图　8-43

接下来，我们将研究WordPress利用的第3部分，也是最后一部分。

8.7　WordPress漏洞利用第3部分——WordPress 5.0.0远程代码执行

在本节中，我们将研究WordPress 5.0.0及更低版本中存在的RCE漏洞。此漏洞通过链接两个不同的漏洞实现代码执行（路径遍历和本地文件包含）。Metasploit已经具有用于此漏洞的模块。

8.7.1　漏洞流和分析

第一个漏洞是CVE-2019-8942，它将覆写post元字段，如图8-44所示。

图　8-44

然后，未经处理的用户输入将传递给wp_update_post()，后者不会检查不允许的post元字段，如图8-45所示。

图　8-45

攻击者可以将_wp_attached_file post meta-key覆写到其恶意文件中。至此，我们利用了CVE-2019-8942漏洞。现在我们控制了可以在post元条目中覆写的内容，接下来我们利用下一个漏洞CVE-2019-8943（路径遍历漏洞）。使用这个漏洞，我们可以将上传的恶意文件的路径从以前利用的漏洞（CVE-2019-8942）更改为我们为RCE选择的路径。

wp_crop_image()函数无须任何文件路径验证即可调用get_attached_file()函数。因此，上传到服务器上的恶意图像文件将在调用wp_crop_image()函数时（在裁剪图像时）传递给get_attached_file()函数，如图8-46所示。

图　8-46

我们可以利用此漏洞来更改上传的恶意文件的路径，并将图像的裁剪版本保存在默认主题目录中，即wp-content/themes/<default_theme>/<cropped-image>.jpg，如图8-47所示。

图　8-47

正如我们在图8-47中看到的，恶意图像被保存到了默认的主题文件夹中。现在恶意图像文件就位了，我们可以通过浏览帖子（request post）来执行PHP载荷，从而引起远程代码执行。

8.7.2　使用Metasploit利用漏洞

可以使用以下命令在Metasploit控制台中选择该模块：

图8-48显示了上述命令的输出。

我们来设置一下所需的选项，如图8-49所示。我们需要WordPress博客上的低权限账户，因为此漏洞需要身份验证以及上传和编辑图像的权限。

图　8-48

图　8-49

利用过程分为几个步骤，Metasploit模块要做的第一步是检查所提供的targeturi是否正确，如图8-50所示。

成功获取HTTP 200响应代码后，即可确认targeturi路径，如图8-51所示。

该模块将继续进行下一步——身份验证，这一步将会用到用户名和密码。在通过WordPress网站进行身份验证时，该模块还会请求重定向到不存在的页面，如图8-52所示。

图　8-50

图　8-51

图　8-52

HTTP响应将是重定向（302）到不存在的页面。这样做只是为了从服务器获取会话cookie。此步骤后面的所有操作都需要使用这些cookie来完成，如图8-53所示。

让我们确认一下数据库的状态，如图8-54所示。

现在，我们已经从服务器获得会话，在下一步中，模块将请求media-new.php页面。此页面用来上传图像（media）到WordPress站点，如图8-55所示。

我们的目标是上传一张嵌入了载荷的图像，如图8-56所示。

然后，模块上传嵌入了载荷的图像，如图8-57所示。

图　8-53

图　8-54

图　8-55

图　8-56

图　8-57

正如我们在图8-57中看到的那样，嵌入在图像中的载荷为<?=`$_GET[0]`;?>。我们使用这种压缩过的载荷是因为没有太多空间可以用来执行载荷。另外请注意，载荷仅嵌入在扫描头之后的两个不同位置以及EXIF元数据中。它被嵌入两次主要是为了确保载荷得到执行。

WordPress支持PHP的两个图像编辑扩展：GD Library和Imagick。GD Library压缩图像并剥离所有EXIF元数据。Imagick不会剥离任何EXIF元数据，这正是模块将载荷嵌入两次的原因。

上传时的路径和post元数据存储在数据库中，如图8-58所示。

一旦恶意图像被上传，就将在响应中包含分配给该图像的ID及其完整路径，如图8-59所示。

图　8-58

图　8-59

该模块检查WordPress站点是否易受CVE-2019-8942和CVE-2019-8943攻击。通过以下步骤完成检查操作：

1）它通过查询所有附件来确认是否上传了图像。

2）它可以确保以400×300的尺寸保存恶意图像（这将有助于完成伪裁剪）。

3）它在编辑恶意图像时获取更新的wp_nonce和文件名。

4）它检查是否可以将图像的POST元数据条目从.jpg覆写为.jpg?/x。如果覆写成功，则表明该WordPress网站容易受到CVE-2019-8942漏洞的攻击。

5）它会通过裁剪图像（此处为伪裁剪）来检查WordPress网站是否容易受到CVE-2019-8943（路径遍历漏洞）的攻击。

6）一旦模块确认漏洞存在，便通过将POST元数据从.jpg覆写为.jpg?/../../../../themes/#{@current_theme}/#{@shell_name}来利用CVE-2019-8942漏洞，如图8-60所示。

图　8-60

图8-61显示了meta_value列更新后的值。

图　8-61

我们从图8-62中可以看到，默认模板已更改为cropped-zAdFmXvBCk.jpg。

图　8-62

然后，该模块请求带有post ID的默认模板，并将0参数附加到要为RCE执行的命令，如图8-63所示。

图　8-63

命令输出为图8-64所示的响应。

图　8-64

接下来，模块执行以下操作：

1）确认系统中是否存在Base64程序。

2）将PHP meterpreter转换为Base64，并使用echo <base64_of_PHP_meter-preter> | base64 -d> shell.php将其上传到服务器。

3）要求上传的PHP Shell可以访问meterpreter。

4）图8-65显示了将Base64编码的meterpreter代码写入PHP文件。

图　8-65

图8-66显示从服务器得到了一个成功的meterpreter连接。

图　8-66

在下一节中，我们将自定义Metasploit漏洞利用模块。

8.8　更进一步——自定义Metasploit漏洞利用模块

对于我们在8.7节中使用的Metasploit模块exploit/multi/http/wp_crop_rce，需要设置用户名和密码才能正常工作。但是，如果在身份验证时遇到验证码（reCAPTCHA）怎么办？该模块肯定不能正常工作，因为它没有办法获取会话cookie。

1）我们需要修改模块，使其也可以与COOKIE数据存储对象一起工作，如图8-67所示。

图　8-67

我们可以在图8-68中看到更新后的模块选项。

图　8-68

2）让我们为COOKIE数据存储对象定义一个函数，如图8-69所示。

图　8-69

3）我们还需要根据响应代码来验证cookie。因此，定义一个validate_cookie()函数，这将使用HTTP 200响应代码来验证cookie，如图8-70所示。

图　8-70

4）我们在exploit()函数中包含一个fail-safe fail_with()方法，以确保如果缺少用户名或密码，漏洞利用会失败，如图8-71所示。如果没有设置cookie，也需要执行此操作。

图　8-71

5）如果缺少用户名和密码，该模块将尝试使用COOKIE。让我们更新模块并为其设置COOKIE选项，如图8-72所示。

图　8-72

6）现在，让我们运行模块并等待结果，如图8-73所示。

图　8-73

我们使用COOKIE成功获得了meterpreter。

8.9　小结

在本章中，我们首先介绍了WordPress的架构，然后研究了其目录结构。接下来，我们学习了如何手动和自动对WordPress进行侦察。之后，我们研究了一些漏洞利用的示例，并对整个漏洞利用过程（手动操作和使用Metasploit模块）进行了介绍。

在下一章中，我们将学习如何对基于Joomla的内容管理系统（CMS）进行渗透测试。

8.10　问题

1.对于WordPress所有版本，侦察步骤都一样吗？

2.我找到了wp-admin目录，但是该目录本身无法访问。在这种情况下，我该怎么办？

3.WordPress是否可以免费下载？

8.11　拓展阅读

以下链接可用于了解有关WordPress的漏洞利用方法和最新发布的漏洞：

·https://wpvulndb.com/

·https://wpsites.net/wordpress-tips/3-most-common-ways-wordpress-sitesare-exploited/

·https://www.exploit-db.com/docs/english/45556-wordpress-penetrationtesting-using-wpscan-and-metasploit.pdf?rss

第9章
渗透测试CMS——Joomla

在上一章中，我们学习了如何对WordPress进行渗透测试（pentesting）。就像WordPress一样，还有另一种内容管理系统（CMS）被组织广泛用于管理其门户网站，这就是Joomla。在本章中，我们将学习Joomla及其架构，以及可用于测试基于Joomla的网站安全性的模块。以下是本章将涉及的内容：

·Joomla简介。

·Joomla架构。

·侦察和枚举。

·使用Metasploit枚举Joomla插件和模块。

·对Joomla进行漏洞扫描。

·使用Metasploit对Joomla进行漏洞利用。

·上传Joomla Shell。

9.1　技术条件要求

以下是学习本章内容所需满足的前提技术条件：

·Metasploit框架（https://github.com/rapid7/metasploitframework）。

·Joomla CMS（https://www.joomla.org/）。

·数据库，推荐使用MySQL（https://www.mysql.com/）。

·Linux命令的基本知识。

9.2　Joomla简介

Joomla是由Open Source Matters于2005年8月17日创建的免费开源CMS，作为Mambo的分支，用于发布Web内容。它基于模型-视图-控制器（MVC）Web应用程序框架，可以独立于CMS使用。

Joomla有数千个扩展和模板，其中很多都是免费提供的。Joomla的一些功能包括：

·支持多语言。

·提供了开箱即用的搜索引擎优化（SEO），并且对搜索引擎友好（SEF）。

·可以根据通用公共许可证（GPL）免费使用。

·具有访问控制列表，可以管理网站的用户以及不同的组。

·具有菜单管理功能，可以根据需要创建任意多个菜单和菜单项。

我们已经简要介绍了Joomla，下面看一下它的架构，以便更深入地研究该软件。

9.3　Joomla架构

Joomla的架构基于MVC框架，我们可以将其架构分为四个主要部分：

·外观显示：这是前端，用户访问网站时会看到，包含HTML和CSS文件。

·扩展：扩展可以进一步细分为五种主要类型，如下所示。

　·组件：组件可以看作小型应用程序，它们面向用户和管理员。

　·模块：这些是小而灵活的扩展，可以用来呈现页面。登录模块就是一个例子。

　·插件：这些是更高级的扩展，也称为事件处理程序。这些事件可以从任何地方触发，并执行与该事件关联的插件。

　·模板：模板负责网站的外观，通常使用两种类型的模板——前端和后端。后端模板由管理员使用，用于实现监视功能，而前端模板则向访问者/用户显示网站。

　·语言：这些语言处理网站文本的翻译，Joomla支持70多种语言。

·框架：框架由Joomla核心组成。这些是负责应用程序主要功能的PHP文件，例如配置文件。

·数据库：数据库存储用户信息、内容等。Joomla支持MySQL、Microsoft Server SQL（MSSQL）和PostgreSQL等。

文件和目录结构

Joomla中的目录名称非常简单，我们可以通过查看目录名称来猜测目录的内容。Joomla文件和目录具有以下结构：

·Root：这是我们提取Joomla源代码的地方。它包含一个执行安装过程的索引文件。

·Administrator：这个文件夹包含Joomla管理员界面的所有文件（组件、模板、模块、插件等）。

·Cache：这个文件夹包含Joomla缓存的文件，以提高CMS的性能和效率。

·Components：此文件夹包含所有用户组件（不包括管理员），包括登录和搜索。

·Images：此目录包含Joomla界面使用的所有图片以及用户上传的图片。

·Includes：这个目录包含核心Joomla文件。

·Installation：这个文件夹包含安装Joomla所需的文件。安装后应将其删除。

·Language：此文件夹包含所有语言文件。Joomla以简单的基于INI的文件格式存储翻译素材。

·Libraries：此文件夹包含整个核心库以及Joomla的第三方库。它包含描述文件系统、数据库等的文件。

·Logs：此文件夹包含应用程序日志。

·Media：此目录存储所有媒体文件，如flash和视频。

·Modules：模块放置在Joomla模板中，例如面板。此文件夹包含前端模块的所有文件。一些常见的模块包括登录、新闻和投票。

·Plugins：此文件夹包含所有插件文件。

·Templates：此文件夹包含所有前端模板文件。每个模板均按名称组织在文件夹中。

·Tmp：此文件夹存储Joomla管理员和用户界面使用的临时文件和cookie。

现在我们已经了解了Joomla的架构。接下来，我们将研究侦察和枚举。

9.4　侦察和枚举

在使用Joomla之前，要执行的第一步是确认Web应用程序是否由它驱动。有多种检测CMS安装的方法，其中一些方法如下所示：

·搜索<meta name="generator" content="Joomla!–Open Source Content Management" />。

·探索X-Meta-Generator HTTP标头。

·检查RSS/atom feeds: index.php?format=feed&type=rss/atom。

·使用Google Dorks: inurl: "index.php?option=com_users。

·查找X-Content-Encoded-By: Joomla标头。

·查找joomla.svg/k2.png/SOBI2.png/SobiPro.png/VirtueMart.png。

接下来，让我们找出安装了Joomla的哪个版本。

9.4.1　版本检测

现在我们对Joomla有了足够的了解，可以开始对CMS进行渗透测试了（第8章中介绍了这方面的内容）。对Joomla CMS进行渗透测试的第一步是找到目标服务器上安装的版本。以下是检测安装了哪个版本的方法：

·通过meta标记检测。

·通过服务器标头检测。

·通过语言配置检测。

·通过README.txt检测。

·通过manifest文件检测。

·通过唯一关键字进行检测。

9.4.1.1　通过meta标记检测

generator（meta标记）通常被描述为用于生成文档或网页的软件。确切的版本号在meta标签的content属性中可以看到，基于Joomla的网站通常在其源中带有此标记，如图9-1所示。

图　9-1

9.4.1.2　通过服务器标头检测

Joomla版本号经常在应用程序所在服务器的响应标头中披露，例如，可以在X-Content-Encoded-By标头中看到，如图9-2所示。

图　9-2

接下来，我们将研究通过语言配置进行的检测。

9.4.1.3　通过语言配置检测

Joomla所支持的70多种语言中，每个语言包都有一个公开版本信息的XML文件，如图9-3所示。

图　9-3

可以通过/language/<language-type>/<language-type>.xml访问此页面。在本例中，我们搜索British English（en-GB）格式。

9.4.1.4　通过README.txt检测

通过README.txt进行检测是最简单、最基本的技巧。我们要做的就是访问README.txt页面，将看到版本号，如图9-4所示。

图　9-4

该文件包含用户首次接触Joomla需要了解的各种信息。

9.4.1.5　通过manifest文件检测

位于/administrator/manifests/files/joomla.xml的Joomla manifest文件包含与服务器上安装的CMS有关的基本信息，以及正在运行的模块、版本号、安装日期等。这也是查找正在运行的CMS版本号的好地方。图9-5显示了包含版本号的manifest文件。

9.4.1.6　通过唯一关键字进行检测

确定在Web服务器上运行的Joomla版本的另一种方法是在以下文件中查找特定的关键字。这些关键字是特定于版本的，其中一些在此代码块后面的表格中列出：

图　9-5

Joomla版本的唯一关键字详细信息如表9-1所示。

表　9-1

图9-6显示了en-GB.ini文件中的一个关键字，这意味着版本是1.6。

图　9-6

9.4.2节将介绍如何使用Metasploit对Joomla进行侦察。

9.4.2　使用Metasploit对Joomla进行侦察

我们已经了解了检测基于Joomla的目标的不同方法，可以使用Metasploit框架提供的Metasploit模块进行侦察。我们将使用的第一个模块是joomla_version模块。可以使用use auxiliary/scanner/http/joomla_version命令，如图9-7所示。

图　9-7

设置完模块所需的所有信息（即RHOSTS和RPORT）后，我们可以使用run命令执行模块，如图9-8所示。

图　9-8

该模块将使用我们在版本检测部分介绍的不同方法，返回在目标实例上运行的Joomla的版本。在9.5节中，我们将学习如何使用Metasploit枚举Joomla插件和模块。

9.5　使用Metasploit枚举Joomla插件和模块

我们还可以使用Metasploit的内置辅助模块来执行Joomla枚举。以下是Metasploit中可用的枚举Joomla的类别：

·页面枚举。

·插件枚举。

9.5.1　页面枚举

第一种是页面枚举。这个辅助模块扫描Joomla中存在的公共页面，例如readme和robots.txt。

要使用辅助模块，可以使用以下命令：

然后，我们使用show options命令查看各个模块选项，如图9-9所示。

图　9-9

设置RHOSTS和RPORT并运行该模块。模块运行后，将打印发现的页面，如图9-10所示。

图　9-10

下一步是使用另一个Metasploit模块枚举Joomla插件。

9.5.2　插件枚举

可用于枚举插件的Metasploit辅助模块是joomla_plugins。辅助模块使用单词列表查找目录路径，以检测Joomla使用的各种插件。我们可以执行以下命令来使用插件枚举模块：

图9-11显示了上述命令的输出。

图　9-11

show options的输出如图9-11所示。执行完模块后，脚本将返回其发现的插件的名称，如图9-12所示。

图　9-12

默认情况下，单词列表https://github.com/rapid7/metasploit-framework/blob/master/data/wordlists/joomla.txt由辅助模块使用，我们也可以使用自定义单词列表。在9.6节中，我们将对Joomla进行漏洞扫描。

9.6　对Joomla进行漏洞扫描

Metasploit目前还没有用于Joomla特定漏洞评估的内置模块。这给了我们两个选择；就像我们在第8章中对WordPress所做的那样，要么自己为Joomla制作包装器或插件，要么使用JoomScan或JoomlaVS等已经在线可用的其他工具。在本节中，我们将介绍一个可用于对Joomla进行漏洞评估的出色工具。

Joomla的GitHub官方Wiki页面上包含以下描述：

JoomlaVS是一个用Ruby开发的应用程序，可以帮助自动化评估Joomla的脆弱性。它支持基本的指纹识别，可以扫描组件、模块和模板中的漏洞以及Joomla自身存在的漏洞。

可以从网址https://github.com/rastating/joomlavs下载JoomlaVS。

通过执行以下命令来运行该工具：

运行不带任何参数的工具将打印帮助部分，如图9-13所示。该工具支持不同的扫描类型，例如只扫描模块、模板或组件。

图　9-13

要对一个URL的所有扩展进行扫描，可以使用以下命令：

工具将开始运行，它发现的所有细节都将打印在屏幕上，如图9-14所示。

图　9-14

一旦获得了有关可用的漏洞利用、插件和版本号的信息，就可以继续进行漏洞利用过程。

9.7　使用Metasploit对Joomla进行漏洞利用

完成所有枚举和版本检测后，就可以进行漏洞利用了。在本节中，我们将探讨可以对Joomla进行漏洞利用的一些方法。第一个是Joomla中众所周知的SQL注入漏洞，该漏洞用于获得远程代码执行（RCE）。有一个Metasploit模块适用，我们可以通过执行use exploit/unix/webapp/joomla_comfields_sqli_rce命令来使用这个模块，如图9-15所示。

在执行漏洞利用之前，让我们看看它是如何工作的。

漏洞利用是如何工作的

将以下SQL查询发送到服务器，如图9-16所示，服务器将返回表名前缀的Base64编码值：

图　9-15

图　9-16

发送到Web服务器的请求如图9-17所示。

图　9-17

Web服务器返回表名前缀的Base64编码值，在ABC之间的显示如图9-18所示。

图　9-18

图9-19显示了用于转储用户会话的SQL查询。

图　9-19

具体如下所示：

使用send_request_cgi()方法发送请求。服务器将发出一个内部服务器错误（代码为500）作为响应，但我们可以使用十六进制值，即#{start_h}和#{fin_h}作为一个正则表达式在输出中查找会话。图9-20显示了在十六进制值之间查找会话的代码。

图　9-20

图9-21显示了发送到服务器以转储会话信息的SQL查询。

图　9-21

图9-22显示了Web服务器的响应，其中可以看到用户的会话。

从图9-23中可以看出，该会话是从数据库中检索到的，但是在本例中，我们遇到了一个问题——出现了一个字符限制。

通过查看数据库中的值，我们可以看到并非所有字符都被返回了，如图9-24所示。

最后三个以十六进制值ABC结尾的字符没有显示在屏幕上。为了解决这个问题，我们可以使用一个变通方法，即不使用单个查询从数据库检索会话，而是使用MID()函数将会话分为两个部分。

需要使用的第一个SQL会话载荷（payload 1）如下：

如图9-25所示。

图　9-22

图　9-23

图　9-24

图9-26给出了执行前面的SQL载荷（payload 1）的结果。

图　9-25

图　9-26

现在，我们需要使用的第二个SQL会话载荷（payload 2）如下：

如图9-27所示。

图　9-27

图9-28中给出了执行第二个SQL载荷（payload 2）的结果。

图　9-28

现在，我们只需要将执行前面步骤中的载荷1和载荷2检索到的两个输出连接在一起。让我们将代码添加到模块中，如图9-29所示。

图　9-29

现在已经修改了代码，保存文件并执行模块以查看其是否有效，如图9-30所示。

图　9-30

从图9-30中可以看到，我们能够成功检索会话，并使用存储在数据库中的会话创建一个Meterpreter会话。

9.8　上传Joomla Shell

为了了解前面提到的漏洞利用程序中Shell的上传位置，我们将从管理员面板手动上传一个基本的命令执行Shell。

成功利用漏洞后，一旦我们以管理员身份登录，就可以从模板菜单上传Shell。图9-31显示了Joomla的管理面板。

图　9-31

在面板菜单中，依次单击Extensions→Templates→Templates，如图9-32所示。

图　9-32

我们被重定向到Templates页面，其中列出了当前上传的所有模板，包括当前正在使用的模板。最好不要对当前模板做任何操作，因为这可能导致管理员注意到更改并发现我们的代码。

图9-33显示了模板列表。我们将选择Protostar，因此单击模板，然后将重定向到下一个页面，在这个页面的左侧，列出了模板的所有PHP页面，如图9-34所示。

图　9-33

单击index.php并将自定义的PHP代码添加到文件中。这是一个后门，使我们能够执行系统级命令：

图9-35显示了index页面的第一行，包含我们的后门。

图　9-34

图　9-35

保存更改后，我们可以在以下路径中查看后门：

图9-36显示了我们的命令已成功执行。

图　9-36

一旦我们向客户提供了概念证明（PoC），对Joomla的漏洞利用就结束了。但是，要通过非常规的漏洞利用方法进入网络，是需要与客户在项目启动会议上提前讨论的。作为渗透测试人员，我们必须遵守客户定义的范围。

如果上传任何这样的载荷仅仅是为了获得概念证明，我们有义务在漏洞利用完成后删除这些后门。

9.9　小结

在本章中，我们学习了Joomla架构及其文件和目录结构。然后，我们继续进行侦察过程，并学习了找到Joomla实例及其版本号的不同方法。我们还研究了实现过程自动化的工具和脚本。最后，我们深入研究了Joomla漏洞利用的过程以及该漏洞利用的工作方式。

在下一章中，我们将学习如何对另一个流行的CMS——Drupal进行渗透测试。

9.10　问题

1.可以在任何操作系统上安装Joomla吗？

2.如果在现有Metasploit模块中找不到针对Joomla版本的模块，那么可以创建自己的Metasploit模块吗？

3.如果Metasploit模块无法检测Joomla的版本，那么有没有其他的检测方法？

4.既然可以利用Joomla上传漏洞来上传Shell，那么是否可以通过某种隐秘方式给CMS植入后门？

9.11　拓展阅读

·可以在https://vel.joomla.org/live-vel中找到Joomla中易受攻击的扩展列表。

·有关Joomla架构的更多信息，请访问https://docs.joomla.org/Archived:CMS_Architecture_in_1.5_and_1.6。

第10章
渗透测试CMS——Drupal

在第9章中，我们学习了如何对使用了Joomla的网站进行渗透测试。WordPress、Joomla和Drupal有很大区别，特别是在安全性和架构方面。在本章中，我们将学习Drupal、其架构以及如何测试基于Drupal的网站。

本章将涵盖以下内容：

·Drupal及其架构简介。

·Drupal侦察和枚举。

·使用droopescan对Drupal进行漏洞扫描。

·对Drupal进行漏洞利用。

10.1　技术条件要求

以下是学习本章内容所需满足的前提技术条件：

·PHP的基本知识。

·理解Metasploit框架的基础知识。

·了解基本的Linux命令，如grep和ag。

·了解Burp Suite的基础知识。

10.2　Drupal及其架构简介

Drupal是一个用PHP编写的免费开源CMS。它最初是由Dries Buytaert作为留言板编写的，但在2001年成了一个开源项目。与其他CMS相比，尽管Drupal的使用有些麻烦，但它确实提供了内置API来促进定制模块的开发。

10.2.1　Drupal架构

描述Drupal架构的一般方法是将其分为四个主要部分，如图10-1所示。

图　10-1

为了理解架构，首先来了解一下Drupal的组件，如下所示。

·Themes（主题）：主题是定义Drupal网站用户界面的文件集合。这些文件包含用PHP、HTML和JavaScript编写的代码。

·Modules（模块）：模块是事件驱动的代码文件，可用于扩展Drupal的功能。有些模块是由Drupal开发团队维护的核心模块，因为它们是Drupal运作的重要组成部分。

·CORE API（核心API）：Drupal的核心是用于与内容和其他模块进行通信的API。这些API包括以下内容。

　·数据库API：使开发人员可以轻松地更新/修改数据库中的数据。

　·缓存API：存储页面响应，这样浏览器就不必在每次发出请求时呈现页面。

　·会话处理API：它可以跟踪不同的用户及其在网站上的活动。

·Database（数据库）：这是存储所有数据的地方。Drupal支持不同类型的数据库，比如MySQL、Postgres和SQLite。

现在我们对Drupal的架构有了基本的了解，接下来让我们看一下目录结构。

10.2.2　目录结构

Drupal具有以下目录结构：

·Core：包括Drupal默认安装时所使用的文件。

·Modules：在Drupal中的所有自定义创建的模块都将存储这里。

·Profiles：此文件夹存储安装配置文件。安装配置文件包含有关预安装模块、主题和给定Drupal站点配置的信息。

·Sites：当Drupal与多个站点一起使用时，它包含特定于站点的模块。

·Themes：基本主题和所有其他自定义主题都存储在此目录中。

·Vendors：该目录包含Drupal使用的后端库，例如Symfony。

Drupal默认安装的目录结构如图10-2所示。

图　10-2

现在我们已经了解了Drupal及其目录结构的基础知识，让我们继续下一个主题：Drupal侦察和枚举。

10.3　Drupal侦察和枚举

正如我们在前面的章节中所讨论的那样，侦察和枚举是任何类型渗透测试的关键步骤。在本节中，我们将介绍一些可用于识别Drupal安装和已安装版本的方法。

10.3.1　通过README.txt检测

这是最简单、最基础的技术。我们所要做的就是访问README.txt页面，将看到保护文件和目录免受窥视的提示，如图10-3所示。

这将表明该实例确实是一个Drupal实例。

图　10-3

10.3.2　通过元标记检测

name属性为Generator的元标记表明软件用于生成文档/网页。版本号在元标记content属性中公开，如图10-4所示。

图　10-4

基于Drupal的网站通常在其源代码中带有此标签。

10.3.3　通过服务器标头检测

如果服务器响应中存在以下标头之一，也可以识别Drupal：

·X-Generator HTTP标头：表示网站是基于Drupal的。

·X-Drupal-Cache标头：Drupal的缓存使用此标头。如果标头值X-Drupal-Cache为MISS，则表示页面不从缓存中提供；如果标头值X-Drupal-Cache为HIT，则表示从缓存中提供页面。

·X-Drupal-Dynamic-Cache标头：站点使用动态缓存来加载动态内容（缓存的页面），个性化部分除外。

·Expires：表示过期时间，例如Sun,19 Nov 1978。

图10-5显示了服务器响应中的这些标头。

图　10-5

动态缓存标头X-Drupal-Dynamic-Cache是在Drupal 8之后引入的，不适用于Drupal 7或更早版本。

10.3.4　通过CHANGELOG.txt检测

有时，CHANGELOG.txt文件也会公开版本号。此文件可以在这里找到：

我们可以浏览/CHANGELOG.txt或/core/CHANGELOG.txt来识别已安装的Drupal版本，如图10-6所示。

图　10-6

有时候，我们可能找不到CHANGELOG.txt文件。在这种情况下，可以尝试本节中提到的其他检测技术。

10.3.5　通过install.php检测

尽管建议在安装后删除install.php文件，但开发人员通常将其保留在服务器上。它可用于查找Drupal的版本号，如图10-7所示。

图　10-7

此方法只对Drupal 8.x版本有效。

这些检测技术将仅识别站点是否基于Drupal以及所使用的版本。它不会检测Drupal中安装的插件、主题和模块。为了识别插件、主题和模块，我们需要对其进行使用枚举，因为它们是攻击者可以用来控制Drupal站点的入口。作为渗透测试人员，我们需要找到容易受到攻击的插件、主题和模块（已安装的版本）并进行报告。

10.3.6　插件、主题和模块枚举

目前，几乎所有在线可用的开源工具都使用了一种非常通用的技术来枚举Drupal插件、主题和模块。对于枚举，我们只需在themes/、plugins/和modules/目录中查找以下文件：

README.txt文件提供插件、主题和模块版本。它甚至公开了Drupal的版本号。LICENSE.txt文件包含GNU通用公共许可证（GPL）授权。如果plugins/、themes/或modules/目录中有此文件，则表示已安装特定的插件、主题或模块。CHANGELOG.txt文件公开了已安装的插件、主题或模块的版本号。

可以从README.txt文件或URL本身找到模块名称，如图10-8所示。

图　10-8

对于枚举，我们既可以编写自己的Metasploit包装器模块，也可以使用第三方开源工具droopescan。要编写自己的包装器，我们可以按照第8章所学的内容来编写。这里我们将使用droopescan进行漏洞扫描。

10.4　使用droopescan对Drupal进行漏洞扫描

没有可以在Drupal上执行漏洞扫描的Metasploit模块。因此，我们需要使用诸如droo-pescan之类的第三方工具来帮助我们发现Drupal中的漏洞。可以从https://github.com/droope/droopescan下载droopescan：

1）使用以下命令复制droopescan的Git存储库以进行安装：

图10-9显示了上述命令的输出。

图　10-9

2）在运行droopescan之前，我们仍然需要安装必要的Python模块，可以使用以下命令完成：

3）在将所有软件包安装到系统上之后，可以使用以下命令通过执行droopescan进行测试：

4）如果执行droopescan时出错，也可以使用以下命令执行：

5）安装droopescan之后，可以执行以下命令在Drupal上进行漏洞扫描：

图10-10显示了上述命令的输出。

图　10-10

droopescan是基于插件的扫描程序，可识别多个CMS（主要是Drupal）中的漏洞。droopescan会使用一个预先构建的词表，对模块、主题和插件的检测是通过暴力破解来完成的。因此，这一切都取决于我们的词表是否优质。我们还可以找到其他基于Drupal的漏洞扫描程序，这些扫描程序可用于识别Drupal中的漏洞。唯一的区别是它们所采用的编程语言（以提高效率）和使用的词表。

当我们在Drupal CMS中发现漏洞时，可以继续查找公开的漏洞利用。Drupalgeddon是最著名的漏洞之一。在下一节中，我们将介绍Drupalgeddon2漏洞并学习如何利用它。

10.5　对Drupal进行漏洞利用

在对Drupal进行漏洞利用时，我们需要牢记以下攻击向量：

·枚举Drupal用户进行暴力破解攻击。

·通过有瑕疵的身份验证（可猜测的密码）对Drupal进行漏洞利用。

·对Drupal插件、主题或模块进行任意文件的泄露和上传，对持久跨站脚本（XSS）进行利用等。

·对Drupal核心组件进行SQL注入和远程代码执行（RCE）利用。

对于不同版本的Drupal，可以使用不同的公开漏洞利用。有时，我们使用公开的漏洞利用就可以拿到Drupal站点的权限，有时我们必须对漏洞利用进行一些改动以使其正常工作。最好的方法是先理解漏洞利用，然后再执行它。现在让我们专注于Drupalgeddon2的公开漏洞利用。

10.5.1　使用Drupalgeddon2对Drupal进行漏洞利用

在2018年3月28日，Drupal发布了一份公告，重点介绍了各种版本Drupal中的RCE漏洞，后来将其重命名为Drupalgeddon2。Drupal 6中引入了Form API，该API用于在表单呈现过程中更改数据，而在Drupal 7中，它被概括为可呈现数组。可呈现数组包含键值结构中的元数据，并在呈现过程中使用：

现在让我们了解一下这个基于表单的漏洞。

10.5.1.1　理解Drupalgeddon漏洞

Drupalgeddon漏洞与特定的注册表单有关。该表单在所有Drupal中均可用，无须任何身份验证即可访问。在这个表单中，email字段允许来自用户的未经过滤的输入，这使攻击者可以将数组注入表单数组结构中（作为email字段的值）。可以使用以下属性来对此漏洞进行利用：

·#post_render

·#lazy_builder

·#pre_render

·#access_callback

Metasploit的利用模块使用#post_render属性将载荷注入mail数组中，如下所示：

在呈现时，将调用exec()函数，该函数将执行whoami命令并返回输出。可以在/core/lib/Drupal/Core/Render/Renderer.php中找到图10-11所示代码。

图　10-11

/core/modules/file/src/Element/ManagedFile.php如图10-12所示。

图　10-12

我们可以看到，使用斜杠将表单值分解，然后使用NestedArray::getValue()函数来获取值，将根据返回的数据呈现结果。在本例中，$form["user_picture"]["widget"][0]将变成user_picture/widget/0。我们可以给想要的元素输入自己的路径。在账户注册表单中，有mail和name参数。name参数过滤用户数据，但email参数不过滤。我们可以将这个参数转换成一个数组，并提交一个以#开头的行作为键。

回到/core/lib/Drupal/Core/Render/Renderer.php，我们可以看到#post_render属性使用#children元素，然后将其传递给call_user_func()函数，如图10-13所示。

PHP手册中的形式如图10-14所示。

如果我们传递call_user_func(system,id)，它将作为system(id)执行。因此，我们需要将#post_render定义为exec()，并将#children定义为要传递给exec()的值：

图　10-13

图　10-14

另一种方法是使用#markup元素，其他漏洞利用使用了该元素，你可以在互联网上找到。

10.5.1.2　使用Metasploit对Drupalgeddon2进行利用

Metasploit中有一个模块可用于对Drupalgeddon2进行漏洞利用，我们可以通过在msfconsole中执行以下命令来使用它：

执行以下步骤来利用此漏洞：

1）运行show options来查看选项，如图10-15所示。

2）设置rhosts和rport选项，如图10-16所示。

图　10-15

图　10-16

3）在运行该漏洞利用模块时，它首先通过向“/”发出请求，在响应标头或元标记中查找Drupal版本来进行指纹识别，如图10-17所示。

图　10-17

4）接下来，它通过调用CHANGELOG.txt并查找SA-CORE-2018-002补丁来执行补丁级别检查，如图10-18所示。

完成前两个步骤后，漏洞利用模块通过简单地调用printf函数打印一个值来确认RCE的存在，如图10-19所示。

从图10-19中可以看到，我们使用了testing123字符串。如果服务器以testing123响应，则该服务器存在Drupalgeddon2漏洞，如图10-20所示。

图　10-18

图　10-19

图　10-20

使用PHP的passthru()函数执行id、whoami和uname -a命令来确认存在RCE，如图10-21所示。

服务器将对执行的命令返回响应，如图10-22所示。

5）最后一步是发送PHP meterpreter载荷，该载荷在内存中注入并执行，如图10-23所示。

成功执行后，我们将在终端中打开meterpreter会话，如图10-24所示。

图　10-21

图　10-22

图　10-23

图　10-24

现在，让我们看看另一个Drupal漏洞利用的例子，并尝试理解它是如何工作的。

10.5.2　RESTful Web Services漏洞利用——unserialize()

2019年2月，CVE-2019-6340发布，披露了Drupal的RESTful Web Services模块中的一个bug。可以利用这个bug来执行RCE。仅当Drupal已安装所有Web服务（HAL、序列化、RESTful Web Services和HTTP基本身份验证，如图10-25所示）时，RCE才是可能的。

图　10-25

RESTful Web Services模块使用REST API与Drupal进行通信，该API可以执行诸如对网站资源进行更新、读取和写入的操作。它依赖于序列化模块对发送到API和从API发送的数据进行序列化。Drupal 8内核使用了超文本应用程序语言（HAL）模块，该模块在启用时使用HAL序列化实体。我们可以通过使用带有_format=hal_json参数的GET方法请求节点来检查Drupal服务器是否启用了这些Web服务，如图10-26所示。

图　10-26

如果安装了模块，我们就会得到一个基于JSON的响应，如图10-27所示。

图　10-27

如果服务器没有Web服务模块，我们将收到406（不可接受，Not Acceptable）HTTP代码错误，如图10-28所示。

存在此漏洞的原因是，LinkItem类接受未经处理的用户输入，并将其传递给unserialize()函数，如图10-29所示。

在图10-30中我们可以看到，根据PHP手册中对unserialize()函数的描述，在使用unserialize()时，我们不应该让不受信任的用户输入传递给这个函数。

图　10-28

图　10-29

图　10-30

要利用此漏洞需要满足三个条件：

·应用程序应该有一个可以由我们控制的unserialize()函数。

·应用程序必须有一个类，该类实现一个执行危险语句的PHP魔术方法（destruct()或wakeup()）。

·需要使用在应用程序中加载的类对载荷进行序列化。

从图10-29中我们可以确认已经控制了$value['options']表单实体。为了检查魔术方法，我们可以使用以下命令在源代码中搜索destruct()函数：

图10-31显示了上述命令的输出。

图　10-31

注意：在执行上面的命令之前，必须安装ag包。

在图10-31中，我们抓出guzzlehttp，因为Guzzle被Drupal 8用作PHP HTTP客户端和构建RESTful Web service客户端的框架。通过查看FnStream.php文件（请参阅图10-31），我们可以看到__destruct()魔术方法正在调用call_user_func()函数，如图10-32所示。

图　10-32

call_user_func()是一个非常危险的函数，尤其是当传递多个参数时。我们可以使用此函数执行函数注入攻击，如图10-33所示。

图　10-33

按照OWASP的定义，函数注入攻击包括从客户端向应用程序插入或注入函数名。成功的函数注入漏洞利用可以执行任何内置或用户定义的函数。函数注入是一种注入攻击，将任意函数名（有时带有参数）注入应用程序并执行。如果参数被传递到注入函数，就会导致RCE。

根据Drupal API文档，LinkItem类用于实现link字段类型，如图10-34所示。

图　10-34

我们知道LinkItem类将未经处理的用户输入传递给unserialize()函数，但是要调用这个类，我们需要首先调用一个实体。实体可以是特定实体类型的一个实例，例如评论、分类术语或用户配置文件，或者是一组实例，例如博客、文章或产品。我们需要找到一个LinkItem用于导航的实体，使用以下命令在源代码中搜索实体：

图10-35显示了上述命令的输出。

图　10-35

从图10-35中可以看到，LinkItem用于导航到MenuLinkContent.php和Shortcut. php实体，并且正如在Shortcut.php文件中看到的那样，shortcut（快捷方式）实体正在创建一个link属性，如图10-36所示。

要触发unserialize()函数，我们需要将目前已经说明的所有元素保持一致：

图　10-36

现在三个条件中已经满足了两个，接下来要做的就是创建序列化的载荷。创建序列化载荷的方法有多种，但是我们将使用一个称为PHP通用小工具链（PHP Generic Gadget Chains，PHPGGC）的库为Guzzle创建序列化载荷。为了使用phpggc生成序列化的载荷，我们可以使用以下命令：

图10-37显示了上述命令的输出。

图　10-37

在图10-37中生成的JSON序列化载荷将调用system()函数并运行id命令。我们将使用GET/POST/PUT方法以如下URL格式提交整个载荷：localhost/node/1?_format=hal_json。

服务器将执行id命令并返回如图10-38所示的输出。

我们已经成功地实现了RCE，但是问题仍然存在：为什么序列化的载荷能起作用？要回答这个问题，我们需要了解常规序列化数据的情况，并了解序列化格式。

10.5.2.1　理解序列化

为了对serialize()函数有一个基本的了解，让我们看看图10-39中的PHP代码片段。

图　10-38

图　10-39

在图10-39所示的代码中，我们使用以下元素初始化了一个名为my_array的数组：

·my_array[0] = "Harpreet"

·my_array[1] = "Himanshu"

然后我们使用serialize()函数为数组生成序列化数据。序列化的数据流如图10-40所示。

图　10-40

其他常用的PHP序列化格式如下所示：

·a：Array

·b：Boolean

·i：Integer

·d：Double

·O：Common object

·r：Object reference

·s：String

·C：Custom object

Metasploit还具有针对此漏洞的内置利用模块。看一下漏洞利用的源代码，我们可以看到它使用了与PHPGCC几乎相同的载荷，如图10-41所示。

图　10-41

二者唯一的区别是命令及其长度是根据我们通过漏洞利用选项提供的输入动态设置的。

正如我们在图10-42中看到的（在这里我们调用的是__destruct()函数），要在call_user_func()中执行函数注入，必须控制_fn_close方法，以便将危险函数（如system()、passthru()和eval()作为第一个参数传递给call_user_func()。

要控制_fn_close方法，我们必须查看构造函数（__construct()），如图10-43所示。

从图10-43可以看出，$methods数组作为参数传递给构造函数。__construct()函数将通过遍历$methods数组在_fn_字符串之前创建函数。如果$methods数组中有一个close字符串，则该字符串前面会加上一个_fn_，从而生成_fn_close方法。现在，让我们看看$methods数组中的元素，如图10-44所示。

图　10-42

图　10-43

图　10-44

从图10-44中可以清楚地看到，$methods数组中包含一个值为close的元素。现在我们知道了如何控制_fn_close方法，接下来，我们必须找到一种方法来将危险函数和要执行的命令传递给_fn_close。为此，我们必须创建一个POP链。

10.5.2.2　什么是POP链

内存损坏漏洞，例如缓冲区溢出和格式化字符串，如果存在内存防御措施，例如数据执行保护（DEP）和地址空间布局随机化（ASLR），则可以使用代码重用技术（如Return-to-libc，ret2libc）和面向返回编程（Return-Oriented Programming，ROP）来绕过这些防御措施。代码重用技术在基于PHP的Web应用程序中也是可行的，它使用对象的概念。面向属性的编程（POP）是可以使用对象的属性进行漏洞利用的一种代码重用技术。

POP链是针对Web应用程序中的对象注入漏洞的一种利用方法，该漏洞利用具有任意修改注入给定Web应用程序中的对象属性的能力，从而可以操纵受害者应用程序的数据和控制流。

序列化的载荷使用GuzzleHttp的HandlerStack类创建POP链，如图10-45所示。

图　10-45

我们将命令传递给handler方法，并将危险函数传递给stack[]方法，如图10-46所示。

图　10-46

一旦析构函数被调用（在对象销毁时自动完成调用），_fn_close方法的属性将传递给call_user_func()，并执行system(id)，如图10-47所示。

图　10-47

接下来，我们将反序列化载荷。

10.5.2.3　反序列化载荷

为了更好地理解载荷，我们可以对其进行反序列化并在其上使用var_dump。根据PHP手册，var_dump可以显示一个或多个表达式的结构化信息（包括类型和值）。数组和对象由var_dump递归地查看，值用来显示结构。我们还可以使用print_r()函数执行相同的操作，如图10-48所示。

图　10-48

由于我们使用的是基于GuzzleHttp客户端的载荷，因此我们需要安装Guzzle。我们可以使用以下PHP代码反序列化它：

运行该代码将得到以下输出：

在执行时，这会导致system()函数执行，并将命令作为参数传递给该函数，然后将输出返回给我们。

10.5.2.4　使用Metasploit通过unserialize()利用RESTful Web Services RCE

现在，我们了解了序列化的概念以及如何对载荷进行序列化，让我们使用Metasploit模块来利用此漏洞。我们执行以下命令使用该漏洞利用模块：

图10-49显示了上述命令的输出。

图　10-49

然后，我们设置选项并运行漏洞利用模块。运行Metasploit模块后，我们将看到它首先通过在CHANGELOG.txt中查找SA-CORE-2019-003补丁来执行补丁级检查。执行id命令以确认Drupal的RCE，如图10-50所示。

图　10-50

成功利用此漏洞后，服务器将返回id命令的输出，如图10-51所示。

图　10-51

然后，PHP meterpreter代码被序列化并发送到服务器，并且在我们的Metasploit中打开meterpreter会话，如图10-52所示。

图　10-52

通过RESTful Web Services漏洞利用模块，我们实现了对Drupal服务器的访问。

10.6　小结

本章首先学习了Drupal的架构以及目录结构。然后，我们学习了如何手动和自动执行Drupal侦察。之后，我们参考了两个漏洞利用的示例，并对整个漏洞利用过程进行了逐步介绍。

在下一章中，我们将研究针对JBoss服务器的枚举和利用。

10.7　问题

1.同一漏洞利用是否可以用于攻击不同版本的Drupal？

2.我们是否需要在本地安装Drupal，才能对远程Drupal站点进行漏洞利用？

3.RESTful API Web Services漏洞利用模块无法正常工作，我们该怎么办？

4.我们可以访问Drupal管理员账户，如何在服务器上实现RCE？

5.我们在Drupal网站上发现了一个.swp文件，可以将其用于漏洞利用吗？

10.8　拓展阅读

·Drupal 8的架构：https://www.drupal.org/docs/8/modules/entity-browser/architecture。

·深入了解Drupal 8 RCE：https://www.ambionics.io/blog/drupal8-rce。

第四篇

技术平台渗透测试

在本篇中，我们将介绍最常用的技术平台，如JBoss、Tomcat和Jenkins。我们还将研究针对它们的枚举和深入利用。我们将介绍针对上述技术平台的新的常见漏洞和披露，并尝试了解其根本原因。

本篇包括以下章节：

·第11章　技术平台渗透测试——JBoss

·第12章　技术平台渗透测试——Apache Tomcat

·第13章　技术平台渗透测试——Jenkins

第11章
技术平台渗透测试——JBoss

本书的前几章介绍了如何对内容管理系统（CMS）进行渗透测试。现在我们对不同的CMS架构以及使用不同的方法进行测试有了清晰的理解，接下来我们继续学习如何针对不同的技术平台进行测试。本章我们将学习JBoss的架构及针对它的漏洞利用。对于专注基于Java应用自动部署的组织来说，JBoss是最容易部署的应用程序之一。由于其灵活的架构，许多组织选择使用JBoss，但恰恰正是因为其易用性，JBoss也成为众多攻击者的目标。

本章将涵盖以下内容：

·Jboss简介。

·使用Metasploit对基于JBoss的应用服务器进行侦察。

·对JBoss进行漏洞评估。

·通过Metasploit模块对Jboss进行漏洞利用。

11.1　技术条件要求

学习本章内容需要满足以下技术条件：

·一个JBoss应用服务器（AS）实例（https://jbossas.jboss.org/）。

·Metasploit框架（https://www.metasploit.com/）。

·第三方工具JexBoss（https://github.com/joaomatosf/jexboss）。

11.2　JBoss简介

JBoss AS是一个开源的基于Java企业版（Java EE）的应用服务器。该项目由Mark Fluery于1999年开始创建。自此之后，JBoss Group（LLC）于2001年组建，并于2004年演变成JBoss公司。Oracle在2006年初试图收购JBoss公司，但是在同年晚些时候，RedHat成功收购了这家公司。

由于JBoss AS基于Java并且应用服务器支持跨平台安装，这与市场上其他专有软件不同，JBoss以非常低的价格提供了相同的功能。以下是JBoss的一些优点：

·基于插件架构的灵活性。

·易于安装和设置。

·提供完整的Java EE堆栈，包括企业JavaBeans（EJB）、Java消息服务（JMS）、Java管理扩展（JMX）和Java命名和目录接口（JNDI）。

·可以运行企业应用程序（EA）。

·节约成本。

由于JBoss具有灵活的插件架构，开发人员不必花时间为应用程序开发服务。其目标是节省资金和资源，从而使开发人员把更多的时间放在正在开发的产品上。

11.2.1　JBoss架构（JBoss 5）

在过去的几年中，随着每一个主要版本的发布，JBoss架构已经逐渐改变，也添加了新的服务。在本章中，我们将了解JBoss AS 5的基本架构，并介绍此架构的漏洞利用部分。JBoss AS架构如图11-1所示。

图　11-1

我们将架构划分为如下四个主要组件：

·用户应用程序：顾名思义，这个组件处理用户的应用程序，包括XML配置文件、Web应用程序资源（Web Application Resource，WAR）文件等。这是部署用户应用程序的地方。

·组件部署器：在JBoss中用于部署组件。MainDeployer、JARDeployer和SARDeployer是JBoss服务器内核中的硬编码部署器。所有其他部署器都属于托管Bean（Managed Bean，MBean）服务，它们使用MainDeployer将自己注册为部署器。

·企业服务：负责处理多项任务，例如事务、安全性和Web服务器。

·JBoss微容器：可以作为JBoss AS之外的独立容器使用，旨在提供一个配置和管理POJO（Plain Old Java Object）的环境。

接下来让我们看看目录结构。

11.2.2　JBoss文件及目录结构

JBoss有一个简化的目录结构。通过浏览Jboss的home目录并列出内容，我们可以看到如图11-2所示的结构。

图　11-2

让我们试着了解这些目录是什么以及它们包含哪些文件和文件夹：

·bin：该目录包含所有入口点Java包（Java Archives，JAR）和脚本，包括启动和关闭。

·client：该目录存储可能由外部Java客户端应用使用的配置文件。

·common：该目录包含所有服务端的通用JAR包及配置文件。

·docs：该目录包含JBoss文档及模式（schema），它们在开发过程中非常有用。

·lib：该目录包含JBoss启动所需的所有JAR包。

·server：该目录包含与不同服务器配置相关的文件，包括正式环境和测试环境。

然后进入server目录并列出内容，我们可以看到如图11-3所示的结构。

图　11-3

我们打开其中一个配置文件并了解其结构。图11-4显示了default文件夹的内容。

图　11-4

我们看一下图11-4中的目录分解：

·conf：该目录包含配置文件，包括login-config及bootstrap config。

·data：该目录可用于在文件系统中存储内容的服务。

·deploy：该目录包含部署在服务器上的WAR文件。

·lib：该目录是启动时把静态Java类库加载到共享类路径的默认位置。

·Log：该目录是所有日志写入的目录。

·tmp：JBoss使用该目录存储临时文件。

·work：该目录包含编译后的JSP和类文件。

进入deploy目录并列出其内容，如图11-5所示，我们可以看到不同的WAR文件、XML文件等。

图　11-5

我们需要了解的一些文件如下：

·admin-console.war是JBoss AS的管理控制台。

·ROOT.war是根（/root）Web应用程序。

·jbossweb.sar是服务器上部署的Tomcat Servlet引擎。

·jbossws.sar是支持Web服务的JBoss服务。

大多数时候，我们会发现服务器上缺少admin-console，原因是JBoss管理员会从服务器中删除admin-console、web-console和JMX-console应用。尽管这是保护JBoss实例的一种非常简洁的方法，但是这并不能有效抵御攻击。JBoss AS还可以通过MBean进行管理。对管理员来说，尽管MBean只是一个特性，但它也可以成为攻击者渗透网络的入口。为了访问MBean，我们首先需要了解文件及目录结构，因为这可以帮助我们了解在流程上如何访问MBean。部署在JBoss AS上的大量MBean可以直接通过JMX-console及web-console进行访问，这也造成了许多与部署相关的安全问题。

在开始对JBoss进行漏洞利用之前，我们首先来了解一下如何在JBoss AS上执行侦察和枚举。

11.3　侦察和枚举

在本节，我们将重点介绍针对JBoss服务器的侦察和枚举。有多种方法可以识别JBoss服务器，例如JBoss默认监听HTTP端口8080。让我们看看用来对JBoss进行侦察时常用的一些技术。

11.3.1　通过主页检测

我们可以使用的最基本的技术之一是访问Web服务器主页，该主页显示JBoss的标志，如图11-6所示。

图　11-6

当我们打开JBoss主页时，默认的JBoss设置会显示其他超链接，我们可以浏览这些超链接以获取更多信息。

11.3.2　通过错误页面检测

有时我们会发现JBoss AS运行在8080端口上，但却访问不了主页。在这种情况下，404错误页面可能暴露正在使用的JBoss应用程序实例的JBoss AS标头和版本号，如图11-7所示。

图　11-7

404错误页面可以通过打开任何随机的不存在的链接生成，这将给我们一个错误提示，正如我们在图11-7中看到的。

11.3.3　通过HTML<title>标签检测

在某些情况下，当我们尝试访问JBoss AS时，会得到一个空白页。通常，这是为了保护主页免受公开曝光和未经身份验证的访问。由于主页中包含非常有价值的信息，因此JBoss管理员倾向于通过反向代理身份验证或从应用程序中删除JMX控制台、Web控制台和admin控制台来保护页面。我们将在本章的扫描和利用阶段进一步讨论这些内容：

如果得到一个空白页面，我们仍然可以通过HTML <title>标签来识别JBoss，这会在页面标题中显示一些信息，如图11-8所示。

图　11-8

11.3.4　通过X-Powered-By检测

JBoss在HTTP响应标头中公开了它的版本号和编译信息，如图11-9所示。在X-Powered-By HTTP响应标头中，我们可以找到其版本号及编译信息。因为部署在JBoss上的应用程序没有配置为隐藏标头信息，所以即使在管理控制台或Web控制台不可访问时，这些信息也是可见的。

图　11-9

大多数攻击者通过在Shodan、Censys等系统中搜索相同的标头信息来检测正在被使用的JBoss AS版本。在撰写本书时，有19 000多个JBoss AS服务器可能被利用（如果没有被安全地配置）。

攻击者会查找此类信息并使用自动化的扫描器来查找易受攻击的JBoss实例。一旦被利用，JBoss就可能为攻击者打开进入一个组织网络的大门。

11.3.5　通过散列favicon.ico检测

这种技术通常不为渗透测试人员所知，因为它涉及一个图标的散列。这实际上是另一种判断服务器是否运行JBoss AS的好方法。我们可以对favicon.ico文件（一个图标文件）进行MD5散列，如图11-10所示。

图　11-10

通过在OWASP favicon数据库中搜索哈希值，我们就可以判断该服务器是否正在运行JBoss，如图11-11所示。

由于OWASP favicon数据库非常有限，因此我们可以创建自己的数据库来执行此操作。

图　11-11

11.3.6　通过样式表进行检测

通过查看HTML源代码，我们可以看到JBoss样式表（jboss.css），如图11-12所示，它清晰地表明JBoss AS正在运行。

图　11-12

有时，管理员会更改JBoss文件的命名约定，但在此过程中，他们会忘记添加必要的安全配置。现在，我们已经手动收集了用于标识JBoss AS实例使用情况的信息，接下来我们尝试使用Metasploit识别实例。

11.3.7　使用Metasploit执行JBoss状态扫描

Metasploit还为JBoss枚举提供了内置的辅助模块，其中之一是auxiliary/scanner/http/jboss_status。此模块用于查找状态页，该页面显示正在运行的应用程序服务器的状态历史。我们可以在msfconsole中使用以下命令来加载模块：

图11-13显示了上面命令的输出以及运行辅助模块所需的参数选项。

图　11-13

一旦我们设置了选项，然后运行辅助模块，如图11-14所示，服务器将根据发现的状态页确认应用程序服务器是基于JBoss的。

图　11-14

模块使用如图11-15所示的正则表达式在页面上查找文本。

图　11-15

该模块执行以下操作：

1）它向服务器发送一个GET请求以查找/status页面（默认页面由Target_uri选项设置）。

2）如果它收到来自服务器的200 OK响应，将会查找HTML <title>标记中的Tomcat Status字符串。

3）如果找到标记，模块将根据正则表达式查找数据，如图11-15所示。

当模块执行时，源IP、目标IP和被调用页面均存储于JBoss中，然后这些信息会被打印出来，我们可以在/status页面中查看，如图11-16所示。

图　11-16

jboss_status模块通过查找这一特定信息来采集JBoss AS实例的指纹信息。

11.3.8　JBoss服务枚举

运行在JBoss WS（JBoss Web Service）上的服务列表也可以为我们提供关于JBoss服务器的信息。

打开JBoss WS URI（即浏览/jbossws/services）将确认JBoss AS是否正在运行，如图11-17所示。现在，我们对如何枚举运行服务的JBoss并收集有关它们的更多信息有了更好的了解，接下来我们继续学习下一节，它将向我们展示如何在JBoss AS实例上执行漏洞扫描。

图　11-17

11.4　在JBoss AS上执行漏洞评估

如果我们在一台机器上发现一个JBoss AS实例，且需要执行漏洞评估，那么可以使用Metasploit来执行。Metasploit为此提供了一个名为auxiliary/scanner/http/jboss_vulnscan的模块，我们可以使用它在JBoss AS上执行漏洞扫描。该模块会检查一些漏洞，例如身份验证绕过、默认密码和可访问的JMX-console功能。以下是我们在JBoss AS上执行漏洞评估的步骤：

1）在msfconsole中输入如下命令，以使用jboss-vulnscan：

图11-18显示了上述命令的输出。

图　11-18

2）设置所有需要的选项，如图11-19所示。

图　11-19

3）一旦我们运行扫描器，它会检查各种漏洞，并报告在服务器上发现了哪些漏洞，如图11-20所示。

该模块可在运行于不同端口上的应用和Java命名服务上查找一些特定文件。

图　11-20

11.4.1　使用JexBoss执行漏洞扫描

还有另一个非常强大的工具叫作JexBoss，它是为JBoss和其他技术平台的枚举和利用而设计的，由Jo?o F. M. Figueiredo开发。在本节中，我们将快速了解如何使用JexBoss。该工具可以从https://github.com/joaomatosf/jexboss下载并安装。

完成所有设置后，我们可以使用以下命令运行该工具：

让我们使用这个工具（见图11-21所示）来查找JBoss AS实例上的漏洞。

图　11-21

图11-21中使用的命令会查找易受攻击的Apache Tomcat Struts、servlet反序列化以及Jenkins。该工具也会检查多种JBoss漏洞，我们将发现服务器是否易受这些漏洞的攻击。

11.4.2　可被攻击的JBoss入口点

众所周知，JBoss带有许多功能齐全且可操作的附加组件和扩展，例如JNDI、JMX和JMS，因此针对JBoss利用的可能入口点的数量会相应增加。表11-1列出了可用于JBoss侦察和利用的易受攻击的MBean及其各自的服务和方法名称。

表　11-1

MainDeployer MBean是部署的入口点，所有组件的部署请求都被发送到Main-Deployer。MainDeployer可以部署WAR归档文件、JARs、企业应用程序归档文件（EAR）、资源归档文件（RAR）、Hibernate归档文件（HAR）、服务归档文件（SAR）、BSHes和许多其他部署包。

11.5　JBoss漏洞利用

现在，我们已经清楚地了解了JBoss的侦察和漏洞扫描功能，接下来让我们学习JBoss的漏洞利用。可以使用以下几种基本方法对JBoss进行漏洞利用：

·通过管理控制台（admin-console）对JBoss进行漏洞利用。

·使用MainDeployer服务，通过JMX控制台对JBoss进行漏洞利用。

·使用MainDeployer服务（Metasploit版本），通过JMX控制台对JBoss进行漏洞利用。

·使用BSHDeployer服务，通过JMX控制台对JBoss进行漏洞利用。

·使用BSHDeployer服务（Metasploit版本），通过JMX控制台对JBoss进行漏洞利用。

·使用Java Applet，通过Web控制台对JBoss进行漏洞利用。

·使用Invoker方法，通过Web控制台对JBoss进行漏洞利用。

·使用第三方工具，通过Web控制台对JBoss进行漏洞利用。

让我们来逐个看看这些漏洞利用方法。

11.5.1　通过管理控制台对JBoss进行漏洞利用

我们将在本节开始梳理漏洞利用的过程。第一步是获得访问管理控制台的权限，默认情况下，管理控制台的用户名和密码分别为admin和admin。图11-22显示了管理后台的登录页面。

图　11-22

一旦成功登录，我们可以看到如图11-23所示页面。

图　11-23

执行漏洞利用的下一步是找到在服务器上执行命令的方法，以便获得服务器级别的访问权限。从左侧菜单中，选择Web Application（WAR）选项，我们将被重定向到图11-24所示的页面。单击Add a new resource按钮。

图　11-24

这将把我们转到一个新的页面，在那里可以选择上传一个WAR文件。通过使用msfvenom和以下命令，可以生成WAR文件：

一旦生成了基于WAR的Metasploit载荷，我们将把文件上传到控制台的Web Application（WAR）位置，如图11-25所示。

图　11-25

一旦文件上传成功，我们只需要转到它被解压到的目录，并在Web浏览器上打开它，就可以获得Meterpreter连接，如图11-26所示。

图　11-26

在运行载荷之前，我们需要考虑一些事情，最重要的是检查出口连接。如果载荷被执行，但是防火墙阻止了到服务器的出口流量（出站连接），那么就需要找到一种方法来获取反向shell。如果无法获得，我们可以选择到服务器的绑定连接。

11.5.2　通过JMX控制台进行漏洞利用（MainDeployer方法）

请考虑以下来自JBoss官方文档的引用（https://docs.jboss.org/jbossas/docs/Getting_Started_Guide/4/html-single/index.html）：

JMX Console是JBoss的管理控制台，它提供了组成服务器的JMX MBean原始视图。它们可以提供有关正在运行的服务器的大量信息，并允许你修改其配置，启动和停止组件等。

如果我们发现JBoss的开放实例未经身份验证就可以访问JMX控制台，那么就可以使用MainDeployer选项将shell上传到服务器。这允许我们从URL获取WAR文件并将其部署到服务器上。JMX控制台如图11-27所示。

图　11-27

我们实施如下步骤开始漏洞利用：

1）在控制台页面搜索MainDeployer服务选项，如图11-28所示。

图　11-28

2）单击该选项会跳转到新的页面，如图11-29所示。

3）向下滚动页面，我们可以看到多个deploy方法。选择URL Deploy方法，该方法允许我们从远程URL获得WAR文件，如图11-30所示。

图　11-29

图　11-30

4）通过如下命令生成基于WAR的Metasploit载荷：

5）现在我们需要在一个HTTP服务器上托管WAR文件，并将URL粘贴到输入字段中，如图11-31所示。

图　11-31

6）将漏洞利用处理程序（exploit handler）按图11-32所示进行设置。

图　11-32

7）一旦成功调用，我们将从服务器获得以下消息，如图11-33所示。

图　11-33

我们的s.war载荷已经部署完成。

8）接下来，我们需要找到正确的stager名称，以便调用该文件。解压缩Metasploit生成的文件，如图11-34所示。

图　11-34

在web.xml文件中定位servlet name，如图11-35所示。

9）我们通过把servlet name添加到URL来调用载荷，如图11-36所示。

10）输出将为空，但我们可以检查Metasploit漏洞利用处理程序上的stager请求，如图11-37所示。

图　11-35

图　11-36

图　11-37

通常更好的方法是自定义WAR文件，并使用常见的技术混淆内容。另外，为了有助于进一步规避检测，我们需要将文件名从随机名称更改为特定的通用名称，例如login.jsp、about.jsp或logout.jsp。

11.5.3　使用Metasploit（MainDeployer）通过JMX控制台进行漏洞利用

Metasploit还有一个内置的漏洞利用模块，可以使用MainDeployer方法对JMX控制台进行漏洞利用。现在让我们使用Metasploit模块通过JMX控制台上传一个shell。可以使用以下命令加载漏洞利用模块：

我们将会看到图11-38中所示的可用选项。

我们可以设置需要的选项，比如rhosts以及rport，如图11-39所示。

图　11-38

图　11-39

完成所有设置后，就可以运行漏洞利用程序了，Metasploit将执行与上一节中手动执行的相同步骤，从而在服务器上授予我们Meterpreter访问权限，如图11-40所示。

有时，如果JMX控制台开启身份验证保护，则该模块可能会无法工作。我们总是可以尝试对身份验证执行字典攻击，如果成功，则可以通过设置HttpUsername和HttpPassword选项，在此模块上使用在字典攻击期间找到的用户名和密码。

11.5.4　通过JMX控制台（BSHDeployer）进行漏洞利用

通过JMX控制台在JBoss上实现代码执行的另一种方法是使用BeanShell Deployer（BSHDeployer）。BSHDeployer允许我们以Bean shell脚本的形式在JBoss中部署一次性执行的脚本和服务。在获得JMX控制台访问权限后，我们可以查找service=BSHDeployer对象名称，如图11-41所示。

图　11-40

图　11-41

单击该对象将重定向到deployer页面，如图11-42所示。

图　11-42

这里我们需要将输入用于在服务器上部署载荷的BSH文件的URL。一个执行漏洞利用程序的简单方法是通过BSHDeployer来使用第三方工具，例如JexBoss。这也可以通过使用Metasploit来实现。

11.5.5　使用Metasploit（BSHDeployer）通过JMX控制台进行漏洞利用

Metasploit还可以用于部署BSH以在服务器上实现代码执行，为了实现这一目的，Metasploit内置了一个jboss_bshdeployer漏洞利用模块，让我们看看它的用法。可以使用以下命令在msfconsole中加载漏洞利用模块：

我们可以输入show options来查看选项列表，如图11-43所示。

图　11-43

在进行漏洞利用前我们需要设置相应的选项，如图11-44所示。

图　11-44

我们需要设置在这个模块中使用的载荷（默认为java/meterpreter/reverse_tcp）。一个通用的选择是使用基于Java的Meterpreter，但是在Java载荷不起作用的情况下，我们总是可以尝试使用基于OS类型和架构的载荷。

在运行该漏洞利用模块后，Metasploit将创建一个BSH脚本并调用部署程序，然后部署程序将部署并提取shellcode。调用JSP shellcode将执行我们的载荷，然后会得到一个反向连接，如图11-45所示。

图　11-45

现在我们知道了如何通过BSHDeployer来对JMX控制台进行漏洞利用，下面让我们看看如何通过Web控制台进行漏洞利用。

11.5.6　通过Web控制台（Java Applet）进行漏洞利用

本节将介绍JBoss Web控制台。请注意，JBoss Web控制台已被弃用并被管理控制台取代，但它对我们仍然有用，因为对于JBoss服务器的旧版本，Web控制台仍然可用。在浏览器中打开Web控制台时，也可能会遇到一些错误提示，如图11-46所示。

图　11-46

为了允许Applet运行，我们需要更改Java安全设置，将JBoss实例的域名和IP地址添加到Java例外站点列表中，如图11-47所示。

图　11-47

添加例外列表之后，虽然我们仍然会收到来自浏览器的警告，但是可以继续下一步并单击Continue按钮，如图11-48所示。

图　11-48

在下一个弹出窗口中，我们需要单击Run按钮以允许应用程序运行，如图11-49所示。

然后我们将看到JBoss服务器的Web控制台。在这里，可以按照11.5.3节中介绍的相同步骤继续使用MainDeployer上传shell。正如图11-50所示，我们需要做的就是在左侧窗格中找到并选择那个对象。

图　11-49

图　11-50

单击MainDeployer项将跳转到可以在服务器上部署WAR文件以实现代码执行的页面，如图11-51所示。

默认情况下，在大多数浏览器中Java Applet是禁用的，因此，当访问JBoss服务器的Web控制台页面时，我们可能只看到一个空白页面。打开Web控制台时遇到空白页并不意味着该服务不可访问，这只意味着我们必须调整一下浏览器，以允许Java Applet运行。

11.5.7　通过Web控制台（Invoker方法）进行漏洞利用

对JBoss AS实例执行漏洞利用的另一种方法是使用Web控制台的Invoker方法。在请求/web-console/Invoker URI路径时，执行curl命令将从服务器获得一个响应，其中响应文件的前4个字节中包含0xAC和0xED（即十六进制代码字符aced）。我们可以在任何Java序列化对象的开头看到它，如图11-52所示。

图　11-51

图　11-52

Invoker Servlet可以在Web控制台或网址http://example.com/web-console/Invoker中找到，且通常可以在没有身份验证的情况下访问。我们可以向这个Invoker发送一个序列化的post请求以在服务器上执行命令。

以下是对图11-52中字节的说明：

·aced：STREAM_MAGIC，指一个序列化协议。

·00o5：STREAM_VERSION，指正在使用的序列化版本。

·0x73：TC_OBJECT，指一个新对象。

·0x72：TC_CLASSDESC，指一个新类。

·0024：指类名的长度。

·{6F 72 67 2E 6A 62 6F 73 73 73 2E 69 6E 76 6F 63 61 74 69 6F 6E 2E 4D 61 72 73 68 61 6C 6C 65 64 56 61 6C 75 65} org.jboss.invocation.MarshalledValue：指类名。

·EA CC E0 D1 F4 4A D0 99：SerialVersionUID，指这个类的序列版本标识符。

·0x0C：指标记号。

·00 00：指类中的字段数量。

·0x78：TC_ENDBLOCKDATA，标记块对象的结束。

·0x70：TC_NULL，表示没有更多的超类，因为我们已经到达了类层次结构的顶部。

·使用第三方工具通过Web控制台进行漏洞利用。

在开始研究Metasploit模块之前，先看看另一套由RedTeam Pentesting开发的脚本。这个压缩包可以从其官网下载，网址为https://www.redteam-pentesting.de/files/redteam-jboss.tar.gz。

该压缩包包含以下文件：

·BeanShellDeployer/mkbeanshell.rb

·WAR/shell.jsp

·WAR/WEB-INF/web.xml

·Webconsole-Invoker/webconsole_invoker.rb

·JMXInvokerServlet/http_invoker.rb

·JMXInvokerServlet/jmxinvokerservlet.rb

·jboss_jars/console-mgr-classes.jar

·jboss_jars/jbossall-client.jar

·README

·setpath.sh

·Rakefile

图11-53展示了这个团队发布的不同脚本。

我们可以使用此工具来创建自定义的BSH脚本，通过Web控制台Invoker部署BSH脚本，创建JMXInvokerServlet载荷等。让我们看看如何使用这个工具来创建BSH脚本。

11.5.7.1　创建BSH脚本

压缩包中有一个名为mkbeanshell的脚本，它可以把一个WAR文件作为输入，然后创建一个BSH脚本作为输出：

图　11-53

1）通过使用-h参数来执行这个脚本，可以看到所有可用的命令选项列表，如图11-54所示。

图　11-54

2）现在，我们可以使用以下命令来创建一个BSH脚本：

命令的输出结果（即BSH脚本）将被保存到输出的文件中，即前面命令里提及的文件。这个例子里创建的文件是redteam.bsh，如图11-55所示。

图　11-55

3）源文件（即示例中使用的WAR文件）是普通的载荷文件。WAR文件中是JSP Web Shell，内容如图11-56所示。

图　11-56

4）默认情况下，如果我们打开刚刚创建的BSH脚本，将会看到它使用服务器上的/tmp/文件夹来解压缩和部署这个WAR压缩包。现在，Windows服务器已经没有/tmp/文件夹，而且mkbeanshell Ruby脚本只有修改路径的选项，并且大多数情况下，我们可能完全不知道服务器的路径。图11-57展示了BSH脚本的代码。

图　11-57

5）我们可以用下面几行代码替换原来代码（见图11-57）中的最后几行，来获取通用的文件位置：

6）此处，可以看到System.getProperty("jboss.server.home.dir");获取了JBoss目录。这是独立于平台的代码，可在Windows以及基于*nix的服务器上使用。我们需要做的就是使用new File(jboss_home + "/deploy/").mkdir();在home目录中创建一个名为deploy的新目录，然后使用Base64进行解码，并将其作为test.war写入deploy目录中。图11-58显示了进行这些更改后BSH脚本的最终代码。

图　11-58

准备好BSH脚本后，我们可以使用来自同一个第三方工具redteam-jboss.tar.gz的webconsole_invoker.rb脚本将BSH脚本远程部署到JBoss AS实例上。

11.5.7.2　使用webconsole_invoker.rb部署BSH脚本

我们可以使用webconsole_invoker.rb部署BSH脚本：

1）使用-h选项执行Ruby脚本将会展示所有选项的列表，如图11-59所示。

图　11-59

2）现在我们运行脚本并把目标Invoker URL一起传递给Invoke方法。在本例中，我们将使用createScriptDeployment()方法。该方法接收两个输入参数，都是String类型，所以我们使用-s选项来传递它们，然后再把路径传递给我们的BSH文件（使用-p选项传递文件名和部署器），如图11-60所示。

图　11-60

3）执行脚本之后，我们的test.war文件将会被部署，这会在我们的home文件夹下的/test/文件夹中创建shell，浏览这个链接会允许我们访问刚被上传的基于JSP的Web shell，如图11-61所示。

图　11-61

11.5.7.3　通过JMXInvokerServlet(JexBoss)进行漏洞利用

另一个很棒的JBoss漏洞利用工具是JexBoss。JexBoss是用于在JBoss AS和其他Java平台、框架和应用程序中进行测试和漏洞利用的一种工具。JexBoss是开源的，可以在GitHub上找到，网址为https://github.com/joaomatosf/jexboss。

1）当我们下载完并运行这个工具时，可以用一些组合键进行漏洞利用。只需要使用下面的命令把正在运行JBoss服务器的URL传过去即可：

如果Python还没配置好，我们可以使用python jexboss.py --jboss -P语法来执行上面的命令，两个选项都可以工作。

2）如图11-62所示，该工具已识别出多个易受攻击的端点，可利用这些端点获得访问服务器的权限。我们将使用JMXInvokerServlet，它类似于Invoker并接收序列化的post数据。

3）当工具询问是否确认利用漏洞时，选择yes，如图11-63所示。

图　11-62

图　11-63

4）当漏洞利用完成时，我们会获得一个可以在服务器上执行命令的shell，如图11-64所示。

图　11-64

使用jexremote还可以进一步进行漏洞利用。现在我们已经对使用JexBoss进行漏洞利用有了更好的理解，让我们继续下一节——使用Metasploit，通过JMXInvokerServlet进行漏洞利用。

11.5.8　使用Metasploit通过JMXInvokerServlet进行漏洞利用

Metasploit还有个模块名为JMXInvokerServlet，可以使用下面的命令来加载它：

在使用这个漏洞利用模块之前，我们需要先确保/invoker/JMXInvokerServlet的路径已经在服务器上存在了。如果路径不存在的话，漏洞利用将会失败。图11-65展示了前面命令的输出结果。

图　11-65

为了检查/invoker/JMXInvokerServlet路径是否存在，我们可以使用下面的命令来确认，如图11-66所示。

图　11-66

如果服务器以字节形式（从ac ed开头）的序列化数据进行响应，我们就可以运行漏洞利用模块，这将使我们能够通过Meterpreter访问服务器，如图11-67所示。

图　11-67

注意：如果不能成功获取反向shell，也可以选择绑定shell连接。

11.6　小结

在这一章，我们学习了JBoss的基础知识，然后继续学习了文件和目录的结构。接下来，我们又讨论了JBoss的枚举类型，然后继续学习了使用Metasploit框架进行漏洞评估的方法，之后学习了通过管理控制台进行漏洞利用的流程。最后，我们通过Web控制台进行了漏洞利用操作。

下一章，我们将学习关于Apache Tomcat的渗透测试。

11.7　问题

JBoss是否可以免费下载？

11.8　拓展阅读

JBoss目录结构：

·https://www.protechtraining.com/content/jboss_admin_tutorialdirectory_structure

·https://access.redhat.com/documentation/en-us/jboss_enterprise_application_platform/5/html/administration_and_configuration_guide/server_directory_structure

Java序列化格式：

·https://www.programering.com/a/MTN0UjNwATE.html

·https://www.javaworld.com/article/2072752/the-java-serializationalgorithm-revealed.html

第12章
技术平台渗透测试——Apache Tomcat

在第11章中，我们学习了在JBoss应用服务器（JBoss AS）上进行渗透测试。现在让我们看一下Apache Tomcat技术平台。Apache Tomcat软件是在开源的环境中开发的，并根据Apache License版本2发行。Apache Tomcat是一个Java Servlet容器，实现了多个核心企业功能，包括Java Servlet、Java Server Pages（JSP）、Java WebSocket和Java Persistence API（JPA）。许多组织在内部都有基于Java的应用程序，这些应用程序部署在Apache Tomcat上。鉴于众多支付网关、核心银行应用和客户关系管理（CRM）平台（以及许多其他功能）都运行在Apache Tomcat上，易受攻击的Apache Tomcat软件是攻击者的金矿。

本章将涵盖以下内容：

·Tomcat简介。

·Apache Tomcat架构。

·文件和目录结构。

·检测Tomcat的安装。

·版本检测。

·在Tomcat上进行漏洞利用。

·Apache struts简介。

·ONGL简介。

·OGNL表达式注入。

12.1　技术条件要求

学习本章内容，需要满足以下技术条件：

·Apache Tomcat（http://tomcat.apache.org/）。

·一种后端数据库，推荐MySQL（https://www.mysql.com/downloads/）。

·Metasploit框架（https://github.com/rapid7/metasploitframework）。

12.2　Tomcat简介

Apache Tomcat软件是一个开放源代码的Web服务器，旨在运行基于Java的Web应用程序。当前版本的Tomcat的一些功能如下：

·支持Java Servlet 3.1

·JSP 2.3

·Java Unified Expression Language (EL) 3.0

·Java WebSocket 1.0

Tomcat既可以作为独立的有自己内部Web服务器的产品使用，也可以与其他Web服务器结合使用，包括Apache和微软的IIS。

因为Apache Tomcat被许多组织广泛使用，所以应该考虑这个平台的安全性。在撰写本书时，Shodan已经在全世界发现超过93 000个Tomcat实例（包含独立的和那些与JBoss实例集成的）。

Apache Tomcat服务器中的漏洞可能使攻击者能够利用服务器上正在运行的应用程序，甚至可以超越通用应用程序的利用范围，并最终获得对组织内部网络的访问权限。

12.3　Apache Tomcat架构

Tomcat可以被描述为一系列不同的功能组件，通过良好定义的规则组合在一起。

图12-1展示了Tomcat的结构。

图　12-1

让我们试着理解图12-1中显示的每个组件扮演的角色：

·服务器：表示整个Catalina servlet容器。server.xml文件表示Tomcat安装的所有特性和配置。

·服务：服务器内部的一个组件，包含共享单个容器以处理其传入请求的连接器。

·引擎：引擎接收和处理来自不同连接器的信息并返回输出。

·主机：这是服务器使用的网络或域名。一台服务器可以有多个主机。

·情景：表示一个Web应用程序。主机上可以有多个具有不同URL路径的Web应用程序。

·连接器：连接器处理客户端和服务器之间的通信。不同类型的连接器用于处理不同的通信，例如，HTTP连接器用于处理HTTP通信，而AJP连接器用于使用AJP协议与Apache进行通信。

现在我们对Apache Tomcat的架构已经有了基本理解，下面让我们来看一下Tomcat服务器上的文件和目录结构。

12.4　文件和目录结构

Tomcat的文件和目录结构与JBoss相似，我们在第11章已经讨论过了。在本节中，我们将快速浏览Tomcat的目录结构，如图12-2所示。

图　12-2

Tomcat目录中的子目录可以解释如下：

·bin：这个目录包含初始化服务器时所需的所有脚本，例如启动和关闭脚本以及各种可执行文件。

·common：这个目录包含Catalina和开发人员托管的其他Web应用程序可以使用的通用类。

·conf：这个目录由服务器XML文件和相关的文档类型定义（DTD）组成，用以配置Tomcat。

·logs：这个目录如名字所示，用于存储Catalina和应用程序生成的日志文件。

·server：这个目录存储Catalina单独使用的类文件。

·shared：这个目录存储能被所有Web应用程序分享使用的类文件。

·webapps：这个目录包含所有Web应用程序。

·work：这个目录用于文件和目录的临时存储。

最有趣的目录之一是webapps，如图12-3所示。

图　12-3

通过导航到webapps目录并列出里面的内容，我们可以看到以下内容：

·ROOT：这是Web应用程序的根目录，它包含所有JSP文件和HTML页面、客户端JAR文件等。

·Docs：这个目录包含Apache Tomcat的文档。

·examples：这个文件夹包含Servlet、JSP和WebSocket示例，以帮助开发人员进行开发。

·host-manager：host-manager应用程序可以让我们在Tomcat里创建、删除和管理虚拟主机。这个目录包含了这些功能的代码。

·manager：manager允许我们管理以Web应用程序归档（WAR）文件的形式安装在Apache Tomcat实例上的Web应用程序。

对文件和目录结构有清晰的理解，可以帮助我们在目标Tomcat服务器上为渗透测试执行高效的侦察。

12.5　检测Tomcat的安装

现在，让我们看看如何检测服务器上是否安装了Tomcat，以及可以用于进一步侦察的常见检测技术。

12.5.1　通过HTTP响应标头检测——X-Powered-By

检测Apache Tomcat安装情况的一种很常见的方法是查看服务器响应的HTTP标头中X-Powered-By的值，如图12-4所示。

图　12-4

典型安装将在HTTP响应标头中提供Apache Tomcat的版本。

12.5.2　通过HTTP响应标头检测——WWW-Authenticate

检测Tomcat的一种简单方法是请求/manager/html页面。一旦我们发出请求，服务器将用一个带有WWW-Authenticate HTTP标头的HTTP代码401 Unauthorized进行响应，正如你在图12-5中看到的，这个特定的标头将带有一个Tomcat Manager Application字符串，通过使用这个标头的值，我们就能够检测目标服务器是否安装了Tomcat。

图　12-5

12.5.3　通过HTML标签检测——页面标题标签

如果当你打开Tomcat实例时看到一个空白页，那么仍然可以通过查看HTML的<title>标签来检测它是否是Tomcat页面。

Apache Tomcat字符串显示在<title>标签中，如图12-6所示。

图　12-6

12.5.4　通过HTTP 401未授权错误检测

Tomcat通常使用Tomcat Manager Web应用程序来管理和部署Web应用程序。它可以通过URL/manager/html来访问。这将生成一个HTTP身份验证面板，点击弹窗上的Cancel按钮将显示401错误，如图12-7所示，这样就可以确认Tomcat的存在了。

图　12-7

注意：这种信息披露只存在于Tomcat服务器配置错误的情况下。

12.5.5　通过唯一指纹（哈希值）检测

我们在前几章中看到，大多数Web应用程序都可以使用它们的网站图标进行检测。可以通过比较不同版本的网站图标的MD5哈希值确定所使用的Tomcat版本，如图12-8所示。

图　12-8

图12-9展示了OWASP网站图标数据库列表中不同的哈希值。

我们也可以维护自己的网站图标数据库来检查Apache Tomcat的不同版本。

图　12-9

12.5.6　通过目录和文件检测

安装之后，Apache Tomcat还会创建docs和examples目录来帮助开发人员开发和部署应用程序。默认情况下，文件夹的路径如下：

·/docs/

·/examples/

我们还可以使用SecLists（https://github.com/danielmiessler/SecLists）来枚举Tomcat中的敏感文件。

图12-10中显示了不同的文件和文件夹，这些文件和文件夹可用来标识安装了Tomcat的实例。在下一节中，我们将研究如何识别Tomcat的版本。

图　12-10

12.6　版本检测

一旦我们确认了服务器正在运行Tomcat，下一步就是确定版本信息。在本节中，我们将介绍几种检测现有Tomcat安装版本的方法。

12.6.1　通过HTTP 404错误页面检测

默认情况下，Tomcat的404错误页会公开正在运行的版本号，所以我们需要做的就是访问一个服务器上不存在的URL，服务器应该返回一个错误页面，如图12-11所示。

图　12-11

许多管理员并没有真正隐藏这种公开版本号的Web服务器标识。攻击者可以使用这些信息从他们的武器库中找到一个已知的或0-day漏洞，从而访问服务器。

12.6.2　通过Release-Notes.txt泄露版本号

Tomcat还有一个Release-Notes.txt文件，其中包含作为该版本一部分的有关增强功能的详细信息，以及该版本的已知问题。这个文件也可以把Apache Tomcat服务器的版本号泄露给攻击者。发布说明的第一行中就包含版本信息，如图12-12所示。

12.6.3　通过Changelog.html泄露版本信息

和Release-Notes.txt一起的还有一个名为Changelog.html的文件，这个文件将导致在页面上公开版本号，如图12-13所示。

现在我们可以继续进行下一步，对Tomcat进行漏洞利用。

图　12-12

图　12-13

12.7　对Tomcat进行漏洞利用

在本节中，我们将学习如何对易受攻击的Tomcat版本进行漏洞利用。我们将介绍各种技术，包括上传WAR shell和JSP上传绕过。

使用Metasploit上的search命令来查找Tomcat，会查到一些可用的模块，如图12-14所示。

我们将使用最基本的模块，该模块将对Tomcat Manager进行暴力破解并为我们提供凭证。

1）我们可以使用以下命令来加载模块：

2）在使用模块之前，最好先了解一下模块的工作原理。请记住，一旦部署了Web应用防火墙（WAF），渗透测试人员就需要随时调整模块。模块加载之后，我们可以使用show options命令查看需要由测试人员填写的选项（见图12-15）。

图　12-14

图　12-15

3）通过查看这些选项，我们可以看到它要求输入Tomcat的IP（RHOSTS）和端口（RPORT），以及用于暴力破解凭证的词表。我们使用run命令来执行模块，如图12-16所示。

图　12-16

4）我们将收到一条Login Successful的消息，其中包含正确的登录名/密码组合，如图12-17所示。

图　12-17

利用默认密码漏洞访问服务器是针对Apache Tomcat进行漏洞利用的最常见的方法之一。如果通过使用默认密码即可获得访问权限，那么攻击者甚至不必花费大量精力来查找不同的易受攻击的端点。

12.7.1　Apache Tomcat JSP上传绕过漏洞

有一个JSP上传绕过漏洞影响了Tomcat 7.x、8.x和9.x以及TomEE 1.x和7.x版本。该漏洞涉及使用PUT方法通过绕过文件名过滤器来上传JSP文件。有一个Metasploit模块也可以用于这个漏洞利用。我们通过执行下面的命令来使用这个模块：

图12-18展示了上一个命令的输出结果。

图　12-18

设置RHOSTS的值并使用run命令执行该模块，如图12-19所示。

图　12-19

如图12-20所示，这个Metasploit模块首先使用HTTP PUT方法，并通过在.jsp扩展名的后面加上/（正斜杠）来上传一个JSP文件。如果Apache Tomcat实例使用HTTP 201代码（已创建）进行响应，则表示这个文件已经被成功上传到了服务器。

图　12-20

上传文件成功的原因是Tomcat服务器（仅限特定版本）上存在文件上传限制漏洞，如果文件扩展名为JSP，则会被过滤掉。使用“/”，攻击者将可以绕过这个限制来上传恶意的基于JSP的Web shell。在这种情况下，使用PUT方法可将载荷文件发送到目标服务器，如图12-21所示。

如前面所述，一旦上传成功，服务器会返回HTTP 201代码，如图12-22所示。

一旦载荷文件上传成功，Metasploit模块将请求相同的文件名来执行该载荷文件，如图12-23所示。

当载荷文件成功被执行后，我们会获得一个通用的shell，如图12-24所示。

图　12-21

图　12-22

图　12-23

图　12-24

我们没有必要在利用JSP上传绕过漏洞后总是想获得root（特权）shell。在更多情况下，我们将不得不从普通用户权限升级到root用户权限。

12.7.2　Tomcat WAR shell上传（经过认证）

假设我们有Apache Tomcat实例的认证凭证（可能通过监听/嗅探或从包含敏感信息的文件中获得）。用户可以通过将打包的WAR文件上传到Apache Tomcat实例来运行Web应用程序。在本节中，我们将上传一个WAR文件以获得绑定/反向shell连接。请注意，进行WAR shell上传需要身份验证，否则服务器将以HTTP 401代码（未授权的）进行响应：

1）首先，让我们请求/manager/html页面。服务器将要求进行HTTP身份验证，如图12-25所示。

图　12-25

2）认证通过之后，页面会重定向到/manager/status，如图12-26所示。

图　12-26

3）点击List Applications将把这个Apache Tomcat实例管理的所有已安装的程序列出来，如图12-27所示。

图　12-27

4）在同一页中向下滚动页面，我们会找到一个Deploy部分，可以通过URL部署服务器上的WAR，也可以通过上传自己的WAR文件来部署它，如图12-28所示。

图　12-28

5）我们可以在页面上的WAR file to deploy部分把一个WAR文件（redteam.war）上传到服务器。单击Deploy按钮将部署WAR文件。当WAR成功部署后，我们的应用程序就被安装到Apache Tomcat服务器上了，可以通过List Applications选项来查看（如前面所提到的），如图12-29所示。

从图12-29可以看出，我们的WAR文件已经部署完成。现在我们只需要正常从浏览器访问JSP shell，并且把要执行的命令作为参数的值传递即可，如图12-30所示。

图　12-29

图　12-30

同样的过程也可以使用Metasploit实现。在Metasploit里使用tomcat_mgr_upload模块，我们也可以上传一个WAR shell。让我们在msfconsole里通过执行以下命令来使用这个模块：

图12-31展示了上面命令的输出结果。

图　12-31

由于这是一种身份验证机制，因此我们需要为HTTP身份验证提供凭证。让我们执行这个模块，以便Metasploit可以上传WAR文件并在服务器上执行载荷，如图12-32所示。

图　12-32

正如你在图12-32中看到的，该模块已成功地通过服务器的身份验证，并上传了一个WAR文件（ymRRnwH.war）。一旦上传成功，该模块会调用WAR文件中打包的JSP载荷并执行它以获得一个反向meterpreter连接，如图12-33所示。

图　12-33

下面是meterpreter在执行tomcat_mgr_upload模块时会检查的内容：

1）Metasploit模块检查凭证是否有效。

2）如果有效，该模块就会从服务器的响应中（CSRF令牌）获取org.apache.catalina.filters.CSRF_NONCE的值。

3）然后该模块会尝试通过HTTP POST方法上传一个WAR文件（无认证）。

4）如果前一步失败，该模块会使用之前获取到的凭证来上传WAR文件（POST/manager/html/upload）。

5）上传成功后，该模块会从服务器请求此JSP meterpreter文件，从而获得一个打开的meterpreter连接（在本例中是一个反向连接）。

注意：我们成功上传并执行了meterpreter shell以获得反向连接。有些情况下，反向连接是不可能实现的。在这些情况下，我们可以寻找绑定连接，或者可以通过HTTP隧道化meterpreter会话。

现在我们知道了如何将WAR shell上传到Apache Tomcat实例中，以及如何利用其中的一些漏洞，让我们继续研究如何在Apache Tomcat实例上执行下一级别的利用。

12.8　Apache Struts简介

Apache Struts是一个免费的开源框架，它遵循MVC架构，用于开发基于Java的Web应用程序。它使用Java Servlet API，最开始由Craig McClanahan创建，然后在2000年5月捐赠给了Apache基金会。Apache Struts首次被完整地发布是在2007年。

在本节中，我们将研究在Apache Struts中发现的一些漏洞。

12.8.1　理解OGNL

对象图表示语言（Object Graph Notation Language，OGNL）是一种EL（表达式语言），它简化了存储在ActionContext中的数据的可访问性。ActionContext是一个可能需要执行的对象的容器。OGNL在Apache Struts 2中有着非常紧密的链接，它被用来将表单参数作为Java Bean变量存储在ValueStack中。ValueStack是一种用于处理客户端请求的数据存储区域。

12.8.2　OGNL表达式注入

当未处理的用户输入被传递给ValueStack进行求值时，会发生OGNL表达式注入。在本节中，我们将尝试理解表达式注入查询，并研究一个漏洞利用示例。

图12-34展示了一个使用Struts 2的易受攻击的Web应用程序的示例，该应用程序易受CVE-2018-11776攻击。

图　12-34

我们尝试通过以下步骤手动利用Struts漏洞（CVE-2018-11776）：

1）当点击菜单栏中的Configuration|Action Chaining时，会发现一些请求被发送到服务器，如图12-35所示。

图　12-35

2）服务器返回响应内容，如图12-36所示。

图　12-36

3）现在我们可以把actionchaining字符串替换成其他内容，例如Testing123，如图12-37所示。

图　12-37

4）当我们这样做之后，服务器处理了Testing123字符串并以同样的字符串进行响应，如图12-38所示。

图　12-38

5）为了测试像OGNL这样的表达式语言注入，我们需要使用${..}或%{..}语法。OGNL会处理包含在${..}或%{..}里的内容。为了做一个简单的测试，我们使用${123*123}或%{123*123}字符串，如图12-39所示。

图　12-39

6）由于代码位于括号内，前面有$或%，服务器将其作为一个OGNL表达式处理，并使用如图12-40所示的结果进行响应。

图　12-40

现在我们已经成功确认了前面测试用例中的漏洞，下面来了解一下如何在进程上执行OGNL注入的同时注入载荷并绕过沙盒（如果有的话）。

12.8.3　通过OGNL注入测试远程代码执行

为了测试漏洞，我们将使用下面的载荷：

在拆解这个载荷之前，让我们先理解关于OGNL的一些内容，这可以帮我们更好地理解这个载荷。表12-1中给出了一些关于运算符的介绍。

表　12-1

现在让我们参考表12-1来拆解前面提到的载荷。

在早期版本的Struts里，_memberAccess对象用于控制OGNL可以做什么，但在最近的一些版本里，_memberAccess对象甚至在调用构造器方面受到限制。这是excludedClass、excludedPackageNames和excludedPackageNamePatterns黑名单造成的，它们禁止访问特定的类和包。尽管_memberAccess对象是可以访问的，针对这个对象还是有严格的限制。

为了绕过这样的限制，在Struts 2.3.20～2.3.29版本中，我们只需要用Default-MemberAccess对象（可通过SecurityMemberAccess类访问的静态对象）替换_memberAccess对象，这将使我们能够不受限制地控制OGNL的工作。

因此，这个载荷的第一行代码是用于通过将上下文从_memberAccess更改为Default-MemberAccess来绕过对_memberAccess对象的限制：

在前面的代码中，OgnlContext是一个类，它根据Apache Common OGNL表达式引用（https://commons.apache.org/proper/commons-ognl/apidocs/org/apache/commons/ognl/OgnlContext.html）定义OGNL表达式的执行上下文。

现在，上下文已从_memberAccess更改为DefaultMemberAccess，我们可以使用setMemberAccess方法设置MemberAccess。然而，为了访问这个对象，我们首先需要清除黑名单（excludedClasses、excludedPackageNames、excludedPackage-NamePatterns）。我们可以通过还原到原来的上下文来清除黑名单，参见载荷的高亮显示部分：

由于还没有上下文，则需要通过访问ActionContext.container来检索上下文映射。现在因为我们已经从struts.valueStack里获取到上下文，那便有可能访问这个容器了。参考下面载荷中的高亮部分：

现在我们可以访问上下文映射了（请参阅载荷的第一行高亮显示）。可以把黑名单清除，以便可以访问DefaultMemberAccess对象，使用它将没有任何限制。载荷里的第二行高亮代码将实现这一点：

一旦clear()方法被执行，我们就把黑名单清除掉了，现在可以使用setMember-Access()方法把MemberAccess设置为DEFAULT_MEMBER_ACCESS。参考下面载荷中的高亮部分：

现在可以访问DEFAULT_MEMBER_ACCESS对象了。我们可以从Java通用工具库里调用需要的类、方法和对象并在OGNL里运行。这本例中，我们将使用Runtime(). exec()方法来执行命令(#a=@java.lang.Runtime@getRuntime().exec('id'))。然后我们会使用getinputStream()方法在响应中打印出命令执行的输出结果，如我们的载荷中最后两行代码所示：

现在我们已经对该载荷有了比较好的了解，可以在HTTP请求中使用这个载荷，如图12-41所示。

图　12-41

服务器将处理这个OGNL表达式，并且在访问到DEFAULT_MEMBER_ACCESS对象后，Runtime().exec()方法将被调用，它将会执行我们的命令，如图12-42所示。

图　12-42

id命令的输出结果将被打印在Location的HTTP响应标头中，如图12-42所示。现在我们已经理解了OGNL表达式和手动进行漏洞利用的方法，下面让我们试着使用Metasploit来进行漏洞利用。

12.8.4　通过OGNL注入进行不可视的远程代码执行

这是一个不同的场景，服务器易受Apache Struts 2远程代码执行（Remote Code Execution，RCE）漏洞的攻击，但代码执行的响应由于某种原因被隐藏了。在这样的场景中，我们仍然可以使用sleep()函数来确认RCE漏洞。与基于时间的SQL注入中使用的sleep()函数类似，我们可以使用此函数来检查响应时间。如图12-43所示，我们已经执行了2000ms的sleep()函数。

图　12-43

要确认该漏洞，我们只需查看服务器的响应时间，即服务器处理请求并向我们发送响应所用的时间。在这个场景中，我们让sleep()函数执行了2000ms，然后服务器在2010 ms后返回响应，如图12-44所示。

图　12-44

我们应该始终通过将时间更改为不同的值来检查是否存在漏洞。

12.8.5　OGNL带外注入测试

另一种确认漏洞的方法是执行命令，这些命令将与位于组织外部的我们自己的服务器进行交互。为了检测OGNL带外注入（Out-Of-Band，OOB），我们可以执行一个简单的ping命令，如图12-45所示。

图　12-45

在将载荷发送到服务器之前，我们需要使用tcpdump来监听服务器端的公共接口。可以执行tcpdump icmp host <ip>命令来过滤服务器上的ICMP echo请求和echo应答包。这样做的目的是在执行载荷时，可以在服务器上获得ping echo请求，如图12-46所示。

图　12-46

对于OOB交互，我们可以尝试不同的协议，例如HTTP、FTP、SSH和DNS。当我们无法获得响应的输出（盲注）并检查是否有可能获得反向shell连接，OOB注入会有所帮助。

12.8.6　使用Metasploit对Struts 2进行漏洞利用

现在我们已经手动利用了Struts 2的漏洞并清楚地理解了这些概念，我们将看到使用Metasploit利用相同的漏洞是多么容易。使用Metasploit进行漏洞利用会更加轻松。可以通过执行下面的步骤来搜索所有与Struts相关的可用模块。

1）在Metasploit控制台搜索struts，如图12-47所示。

图　12-47

2）图12-48所示是一个运行Apache Struts的Web应用程序演示。此应用程序易受S2-013漏洞的攻击（CVE-2013-1966）。让我们看看如何使用Metasploit利用此漏洞。

图　12-48

3）通过在msfconsole里输入下面的命令，可以加载Metasploit利用模块：

4）通过输入show options命令，我们可以看到一些可用的选项，如图12-49所示。

设置好这些选项并运行漏洞利用程序将为我们提供命令行shell。在没有反向shell连接的情况下，我们需要执行一个简单的出口测试，以检查是否所有的端口都可以从目标服务器（出站连接）访问。如果出站连接被防火墙拦截，我们可以尝试通过HTTP隧道获得绑定连接。

图　12-49

12.9　小结

在本章中，我们介绍了Tomcat的基础知识，并了解了它的系统架构和文件结构。然后，我们介绍了识别Tomcat和检测版本的不同技术。之后，我们研究了如何使用JSP和WAR Shell上传对Tomcat进行漏洞利用。在本章的最后，我们讨论了Apache Struts、OGNL和Tomcat的漏洞利用。

在下一章中，我们将学习如何对另一个著名的技术平台Jenkins进行渗透测试。

12.10　问题

1.在黑盒渗透测试的情况下，我们如何公开识别Tomcat服务器？

2.Changelog.html文件会一直出现在Apache Tomcat服务器上吗？

3.我已经成功把JSP shell上传到Apache Tomcat服务器上，然而我却不能访问它，问题可能出在哪里？

4.我发现了一个OGNL带外注入漏洞，如何进一步利用它？

12.11　拓展阅读

以下链接可作为进一步了解Apache Tomcat和CVE 2019-0232的参考：

·https://blog.trendmicro.com/trendlabs-security-intelligence/uncovering-cve-2019-0232-a-remote-code-execution-vulnerability-inapache-tomcat/

·https://github.com/apache/tomcat

第13章
技术平台渗透测试——Jenkins

我们在前面章节中学习了如何对JBoss及Apache Tomcat进行漏洞利用，本章将熟悉一下Jenkins。Jenkins是一款流行的工具，用于自动化软件开发过程中的非人为部分。在企业对消费者（B2C）关系中，企业向消费者提供诸如电子支付、电子商务、在线移动和餐饮充值计划等服务模式中，开发人员的负担非常大。由于预发布环境和生产服务器上存在频繁更新，因此对于开发人员来说，环境变得越来越复杂。为了更有效地更新软件并能够按时发布，企业需要选择使用一个平台引擎来尝试和帮助进行更新发布和管理。

Jenkins就是这样的平台引擎。它处理部署并管理需要在一天中不同时间在不同服务器上部署的源代码。由于Jenkins在管理公司源代码时会处理敏感信息，因此对于那些专注于信息行业间谍活动的人来说，这是一个热门目标。一旦恶意行为者能够获取Jenkins平台的访问权限，他们就可以访问该组织提供服务的源代码（蓝图）。

作为渗透测试人员，我们必须确保客户的组织中有像Jenkins这样的实例是经过加固的。本章将涵盖以下内容：

·Jenkins介绍。

·Jenkins术语。

·Jenkins侦察和枚举。

·Jenkins漏洞利用。

13.1　技术条件要求

学习本章内容需要满足以下技术条件：

·Jenkins实例下载：https://jenkins.io/download/。

·Metasploit框架。

13.2　Jenkins简介

Jenkins是一种使用Java开发的开源工具，可以帮助人们在使用多种插件时进行持续集成。例如，如果我们想集成Git，就需要安装Git插件。Jenkins支持数百种插件，使其在实践中几乎兼容每种工具。这个特性可以保证持续集成（CI）和持续交付（CD）。

以下是Jenkins的主要特性：

·提供CI和CD。

·基于插件的架构。

·高扩展性。

·分布式。

·配置简单。

13.3　Jenkins术语

在我们深入了解如何枚举和利用Jenkins的漏洞之前，需要理解一些本章后面可能会出现的基础术语。

13.3.1　Stapler库

Stapler是Jenkins使用的一个库，它允许把对象自动映射到URL上。它可以解决把Expression Language（EL）这种复杂的应用程序映射到关联URL的难题（http://www-106.ibm.com/developerworks/java/library/j-jstl0211.html）。它接收一个对象和一个URL作为传入参数并对它们进行处理。它会重复这个过程，直到找到一个静态资源、一个视图（如JSP、Jelly、Groovy等）或一个动作方法。图13-1展示了这个过程的更多细节。

图　13-1

资料来源：http://stapler.kohsuke.org/what-is.html

如图13-1所示，根对象被映射到URL，而其他对象被映射为单独的路径，直到找到资源为止。

13.3.2　URL路由

Jenkins使用URL路由来处理URL路径，我们来具体看一下：

·Models

getLog()会被转化成/log/。

getJob("foo")会被转化成/job/foo。

·Action方法

在getJob("foo")里的action doArtifact(...)会变成/job/foo/1/artifact,1就是动态的getter。

13.3.3　Apache Groovy

Apache Groovy是一种支持静态类型和静态编译的多功能编程语言。用户在这里要记住的关键点是Groovy支持运行时和编译时元编程。

13.3.4　元编程

元编程是一种允许计算机程序接收其他程序作为输入数据的一种技术。因此，一个程序可以设计为读/写/修改其他程序，甚至其本身。如果一个程序简单的记述自己，这称为自省（introspection），当它可以修改自己时，则称为反射（reflection）。很多语言都支持元编程，例如PHP、Python、Apache Groovy。

让我们用一个例子来进一步理解元编程：

如你所见，上面的程序创建了另一个程序——program1，它打印数字1～500。

13.3.5　抽象语法树

抽象语法树（Abstract Syntax Tree，AST）表示程序的结构和与内容相关的详细信息。它不包括非必要的标点和分隔符。编译器使用AST进行语法分析、类型解析、流分析和代码生成。

13.3.6　Pipeline

Jenkins Pipeline是可协同工作并帮助持续交付的插件组合。可以使用JenkinsFile将Pipeline实现为代码，并且可以使用域特定语言（DSL）定义Pipeline。Jenkins中的Pipeline是使用Groovy构建的。

13.4　Jenkins侦察和枚举

Jenkins枚举是渗透测试的一个非常重要的方面。

执行侦察和枚举的过程中获取的活动信息可以帮助渗透测试人员更好地利用Jenkins实例的漏洞。

有不少方法可以确定Jenkins的安装和版本检测过程。现在我们来学习这些方法，包括如何对Jenkins进行漏洞利用。

13.4.1　使用收藏夹图标哈希值检测Jenkins

Jenkins有一个非常独特的收藏夹图标（favicon），当转换为哈希值形式时，它将变成81 586 312。它甚至可以在Shodan上用于识别运行Jenkins的系统。

图13-2展示了如何使用哈希值来识别Jenkins。

图　13-2

我们还可以利用不同的Jenkins HTTP响应标头来查找Jenkins实例。例如，可以使用如图13-3所示的X-Jenkins标头来查找特定版本的Jenkins。

图　13-3

让我们看看可以用来标识Jenkins实例的其他HTTP响应标头。

13.4.2　使用HTTP响应标头检测Jenkins

识别Jenkins实例最普遍的方法之一就是分析它的HTTP响应标头。Jenkins把非常多的信息都放在它的响应标头中，例如版本的公开信息、命令行界面（CLI）的端口、用户和组权限等，所有这些信息都可以用于将来的漏洞利用。从图13-4可以看到一个Jenkins实例返回的多个响应标头。

图　13-4

以下是可用于检测Jenkins实例的一些HTTP服务器响应标头：

·X-Hudson

·X-Jenkins

·X-Jenkins-Session

·X-You-Are-Authenticated-As

·X-You-Are-In-Group-Disabled

·X-Required-Permission

·X-Permission-Implied-By

·X-Hudson-CLI-Port

·X-Jenkins-CLI-Port

·X-Jenkins-CLI2-Port

·X-SSH-Endpoint

·X-Hudson-JNLP-Port

·X-Jenkins-JNLP-Port

·X-Jenkins-JNLP-Host

·X-Instance-Identity

·X-Jenkins-Agent-Protocols

现在我们已经学习了一些常用的手动检测Jenkins的方法，让我们进入渗透测试的下一个阶段——枚举。

13.4.3　使用Metasploit进行Jenkins枚举

我们已经学习了手动枚举Jenkins的方法，让我们继续看看如何使用Metasploit框架附带的jenkins_enum进行枚举。

Metasploit也有一个辅助模块使用类似的方法来执行侦察。它包括查找响应标头的值，即X-Jenkins，还有关键词的HTML源码。我们可以使用下面的命令来加载这个辅助模块：

图13-5展示了上面命令的输出结果。

设置好图13-5里展示的选项参数后，执行这个辅助模块即可以侦察到版本号并且执行一些基础检查，如图13-6所示。

现在我们可以更深入一些并查看这个辅助模块的源代码，这样可以理解这个模块到底做了什么。通过观察图13-7，我们可以看到这个模块检查了以下几项内容：

·/view/All/newJobs：显示所有工作的列表。

·/asynchPeople：显示所有用户的列表。

·/systemInfo：打印系统信息。

图　13-5

图　13-6

图　13-7

下面的命令展示了Metasploit里另一个可以用来暴力破解Jenkins账户的辅助模块：

图13-8展示了上面命令的输出结果。

图　13-8

在设置了必需的参数并运行这个模块之后，我们将看到这个辅助工具返回了合法的账户信息。从图13-9可以看到结果。

图　13-9

接下来我们继续探索Jenkins。

13.5　对Jenkins进行漏洞利用

枚举完成后，假设已经找到了一个容易被攻击的Jenkins，我们就进入了漏洞利用阶段。我们将在这一小节学习多种曾被@orangetsai发现的漏洞利用方法，以及如何把它们串联起来以在Jenkins服务器上执行一些系统命令。

首先，我们看一下在2019年由@orangetsai（https://blog.orange.tw/）发现的2个知名的漏洞利用，它们成功对Jenkins进行了漏洞利用并返回了一个shell。这些漏洞利用后来被添加到Metasploit作为未认证授权的RCE。

13.5.1　访问控制列表绕过

在Jenkins的脚本控制台漏洞被广泛利用之后，很多人开始在全局安全配置中将Jenkins的匿名读访问设置为禁用（disabled），如图13-10所示。

图　13-10

使用此设置，除了图13-11中显示的特定白名单项（这些项目在以下URL中提供）之外，匿名用户将无法再看到任何内容。

图　13-11

我们已经知道Jenkins是基于Java的，并且在Java中，所有内容都是java.lang.Object的子类。通过这种方式，所有对象都具有getClass()，并且getClass()的名称与命名约定规则匹配。因此，绕过此白名单的一种方法是将白名单上的对象用作入口并跳转到其他对象。

Orange发现调用对象（在此处列出）会导致ACL绕过，并且可以成功访问搜索（search）方法：

上述对象中显示的路由机制映射为以下URL格式：

从提供的URL中，我们可以看到，除非登录，否则不允许执行任何操作，如图13-12所示。

图　13-12

现在，让我们看看使用访问控制列表（ACL）绕过时会发生什么，如图13-13所示。

图　13-13

我们成功绕过了ACL并执行了一次搜索。

13.5.2　理解Jenkins的未认证远程代码执行

把绕过权限认证的漏洞和绕过沙箱（sandbox）串联起来就会让我们获得远程代码执行（RCE）的能力。Metasploit已经有了一个可以利用这些漏洞并执行Shell代码的模块。在学习漏洞利用的工作原理之前，让我们先看看它是如何工作的：

1）我们可以在msfconsole里使用下面的命令来加载漏洞利用模块：

2）图13-14展示了上面命令的输出结果。

图　13-14

3）设置必需的参数并执行漏洞利用，如图13-15所示。

图　13-15

4）现在我们有了反向Shell，让我们阅读该漏洞利用程序的源代码并尝试了解其工作原理。通过查看源代码，我们可以看到漏洞利用中使用的各种CVE，以及作者的详细信息，如图13-16所示。

图　13-16

5）查看该模块的源代码，可以看到该模块使用带有q=a参数的GET HTTP方法进行请求/搜索/索引，如图13-17所示。

如我们看到的，这个漏洞利用通过检查下面几项来确认应用程序是否在运行Jenkins：

·绕过ACL来调用search方法。

·响应标头中的X-Jenkins值。

·调用搜索URL后，关键字administrator的HTML页面正文。

图　13-17

在这里，我们可以看到与Groovy的doCheckScriptCompile方法有关的内容。doCheckScriptCompile是一种允许开发人员检查语法错误的方法。为了解析语法，使用了AST解析器（有关更多详细信息，请参阅13.3节），如图13-18所示。

图　13-18

为了获得成功的RCE，我们需要发送通过doCheckScriptCompile()发送时执行的代码。这就是元编程的用武之地。

当我们看一下Groovy参考手册时，会发现@groovy.transform.ASTTest，其描述如图13-19所示。

图　13-19

这意味着下面的代码在通过@ASTTest传递时将被执行：

到目前为止，漏洞利用可以这样写：

这个URL调用Jenkins的workflow-cps插件，它有一个checkScriptCompile方法。托管代码的URL为https://github.com/jenkinsci/workflow-cps-plugin/blob/2.46.x/src/main/java/org/jenkinsci/plugins/workflow/cps/CpsFlowDefinition.java，内容如图13-20所示。

图　13-20

然而，这个版本的漏洞利用只有在Jenkins中不存在Groovy Pipeline共享库插件（Pipeline Shared Groovy Libraries Plugin）的情况下才能正常工作。这就是原因，如果我们进一步查看漏洞利用代码，我们将看到在注释中提到的最终载荷中使用了与@Grab相关的内容，如图13-21所示。

图　13-21

现在我们需要了解一下什么是@Grab。根据Groovy的官方文档，Grape是一个JAR依赖关系管理器，它允许开发人员管理和添加Maven仓库对其类路径的依赖关系，如图13-22所示。

图　13-22

因此，@Grab将从上述存储库导入依赖项并将它们添加到代码中。现在，出现了一个问题：“如果存储库不在Maven上该怎么办？”在我们的示例中，由于它位于shellcode中，因此Grape将允许我们指定URL，如图13-23所示。

下面的代码将从http://evil.domain/evil/jar/org.restlet/1/org.restlet-1.jar下载JAR包：

图　13-23

现在我们已经从服务器下载了恶意JAR包，下一个任务就是执行它。为此，我们需要深入研究Groovy核心的源代码，这是实现Grape的地方（https://github.com/groovy/groovy-core/blob/master/src/main/groovy/grape/GrapeIvy.groovy）。

我们可以使用一种方法来处理ZIP（JAR）文件，并检查特定目录中的两个方法。请注意图13-24中显示的最后几行，有一个名为processRunners()的函数。

图　13-24

通过查看图13-25所示函数，我们可以看到newInstance()正在被调用。这意味着可以调用构造函数。

图　13-25

简而言之，如果我们创建了一个恶意的JAR，并将一个类文件放在JAR文件内的METAINF/services/org.codehaus.groovy.plugins.Runners文件夹中，我们就可以用代码调用构造函数，如下所示：

上面的代码将导致代码执行！

因此，如果我们回顾一下漏洞利用的源码，如图13-26所示，我们应该能够完全理解它的工作原理。

图　13-26

checkScriptCompile用于传递程序的语法。@Grabconfig用于禁用正在获取的文件的校验和。@GrabResolver用于获取外部依赖项（恶意JAR文件）。import用于执行编写shellcode的构造函数。

13.6　小结

在本章中，我们学习了Jenkins及其基本术语。我们介绍了如何手动以及通过使用Metasploit框架来检测Jenkins的安装。然后，我们学习了如何对Jenkins进行漏洞利用。如果你希望帮助你正在工作的企业应用更好的补丁程序，并让渗透测试人员开发更好的漏洞利用或绕过，那么了解这些漏洞利用的工作方式就非常重要。

我们的主要目标应该始终是尽可能多地学习技术。从渗透测试人员的角度来看，他们知道得越多，能够进行漏洞利用的机会就越大，并且从蓝队/SOC团队的角度来看，有关已安装技术的更多信息将有助于他们防御攻击。

我们将在下一章研究如何利用应用程序中的逻辑漏洞。

13.7　问题

1.我们如何在黑盒渗透测试中识别Jenkins实例？

2.还有哪些方法可以识别Jenkins实例？

3.我已经从HTTP标头中识别了Jenkins实例，但是无法访问该页面。如何使页面可访问？

4.一旦获得Jenkins的访问权限，我可以做什么？

13.8　拓展阅读

下面这些链接涵盖了Jenkins漏洞利用的更多细节：

·Hacking Jenkins Part 2-Abusing Meta Programming for Unauthenticated RCE: https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html

·Jenkins Security Advisory 2019-01-08: https://jenkins.io/security/advisory/2019-01-08/#SECURITY-1266

·Dependency management with Grape: http://docs.groovy-lang.org/latest/html/documentation/grape.html

第五篇

逻辑错误狩猎

在本篇中，我们将重点介绍如何利用应用程序的业务逻辑中存在的缺陷，并提供更深入的示例。我们还将介绍对Web应用进行模糊测试的方法，以便发现漏洞并编写相关报告。

本篇包括以下章节：

·第14章　Web应用模糊测试——逻辑错误狩猎

·第15章　编写渗透测试报告

第14章
Web应用模糊测试——逻辑错误狩猎

在前面的章节中，我们学习了Metasploit的基础知识、可用于Web应用渗透测试的Metasploit模块、使用Metasploit模块执行侦察和枚举、Metasploit支持的针对不同技术平台和不同内容管理系统（CMS）的不同模块，以及使用的不同利用技术等。在本章中，我们将学习Web应用渗透测试的另一个重要方面——Web应用模糊测试。

在一般的渗透测试中，Web应用模糊测试并非必需的阶段，但是这是发现逻辑漏洞的关键步骤。根据Web应用服务器对某些请求的响应方式，模糊器（fuzzer）可用于了解服务器的行为，以发现测试人员肉眼看不见的缺陷。Metasploit附带了三个Web模糊测试模块，可用于测试Web应用中表单和其他字段中的内存溢出。我们将在本章通过以下主题内容来学习模糊测试：

·什么是模糊测试？

·模糊测试的常用术语。

·模糊测试的攻击类型。

·Web应用模糊测试简介。

·识别Web应用攻击向量。

·场景。

14.1　技术条件要求

以下是学习本章内容所需满足的技术要求：

·Wfuzz：https://github.com/xmendez/wfuzz。

·Ffuf：https://github.com/ffuf/ffuf。

·Burp Suite：https://portswigger.net/burp。

14.2　什么是模糊测试

模糊测试（fuzz testing）是一种黑盒软件测试方式，用于通过自动使用异常/半异常的数据来发现逻辑错误。模糊测试是由Barton Miller教授和他在威斯康星大学麦迪逊分校的学生于1989年开发的（他们正在进行的工作可以在http://www.cs.wisc.edu/~bart/fuzz/上找到）。在进行模糊测试时，会观察应用程序/软件的响应，并根据其行为的变化（崩溃或挂起）发现逻辑错误。简而言之，模糊测试的过程如图14-1所示。

图　14-1

我们需要确定进行模糊测试的目标和输入向量（对于系统应用程序）以及终端（对于Web应用程序）。生成正确的输入种子（随机的模糊数据）后，异常/半异常的模糊数据将作为模糊测试的输入提供。

同时，我们需要在整个模糊测试的过程中通过监控和分析服务器/应用程序响应（如Web应用程序模糊测试情况下的Web服务器响应；系统应用程序模糊测试情况下为应用程序诊断信息/跟踪信息来了解整个模糊测试过程中应用程序的行为，其中涉及FTP服务器、SSH服务器和SMTP服务器）来理解应用的行为。为了更好地理解模糊测试，我们首先学习一些模糊测试中常用的术语。

14.3　模糊测试术语

为了更好地理解模糊测试以及相关技术，我们需要了解不同的模糊测试术语，这些术语将有助于我们掌握本章中使用的相关概念和技术：

·模糊器（fuzzer）：模糊器是一种程序/工具，可以将异常/半异常的数据注入服务器/Web应用程序，并观察应用程序的行为以检测缺陷。模糊器使用的异常/半异常的数据由生成器生成。

·生成器（generator）：生成器使用模糊向量和一些随机数据的组合将生成的数据输出给模糊器，模糊器会将异常的数据注入应用程序中。

·模糊向量（fuzz vector）：模糊向量是模糊器使用的已知危险值。通过观察应用程序的行为，模糊器可以注入不同的模糊向量。

·输入种子（input seed）：输入种子是模糊器用于测试的有效输入样本，可以是包含模糊器使用的数据格式的任何测试文件。生成器将基于模糊器使用的输入种子生成数据。如果仔细选择输入种子，我们可能会在应用程序中发现大量缺陷。

·仪表化（instrumentation）：仪表化是用于衡量应用程序性能和诊断信息（包括任何错误）的技术。在模糊测试期间，仪表化技术将像拦截器一样，暂时控制正在进行模糊测试的应用程序/软件，以从跟踪信息中查找错误。

现在我们已经学习了一些新的术语，接下来让我们看看可以用来执行模糊测试的攻击类型。

14.4　模糊测试的攻击类型

模糊器通常尝试使用数字（有符号/无符号整数或浮点数）、字符（URL或命令行输入）、用户输入文本、纯二进制序列等攻击组合。可以使用这些类型生成模糊向量列表。例如，对于整数，模糊向量可以是零、负值或非常大的整数值；对于字符，模糊向量可以是转义字符、Unicode字符、URL编码字符、特殊字符或所有字符的序列。一旦生成模糊向量列表，模糊器将使用该列表对应用程序执行模糊测试。

14.4.1　应用模糊测试

对于基于桌面的应用程序，模糊器可以在其界面（按钮序列、文本输入等的组合）、命令行选项（如果适用）以及应用程序提供的导入/导出功能上执行模糊测试。

对于基于Web的应用，模糊器可以对其URL、用户输入表单、HTTP请求标头、HTTP POST数据、HTTP协议和HTTP方法执行模糊测试。

14.4.2　协议模糊测试

协议模糊器伪造网络数据包并将其发送到服务器。如果协议栈中存在缺陷，则协议模糊测试将会发现这个缺陷。

14.4.3　文件格式模糊测试

文件格式模糊测试通常用于程序在文件中导入/导出数据流的情况。要执行文件格式模糊测试，必须生成具有不同文件格式的多个输入种子，并将其保存在单个文件中。然后，模糊器将使用保存的文件作为服务器/应用程序的输入，记录可能发生的任何崩溃。下一节我们将介绍Web应用程序模糊测试。

14.5　Web应用模糊测试简介

现在我们已经清楚地理解了模糊测试的概念、术语和攻击类型，让我们从Web应用程序的模糊测试开始。如前所述，Web应用程序的模糊测试是通过使用URL、表单、标头和方法作为主要的模糊向量来实现的。在本章中，我们将使用以下工具对基于HTTP的Web应用程序进行模糊测试：Wfuzz、Ffuf和Burp Suite。接下来，让我们安装本节中提到的工具来查找逻辑错误。

14.5.1　安装Wfuzz

Wfuzz是一个基于Python的Web应用模糊器，它使用替换技术将命令中的FUZZ关键字替换为提供给模糊器的模糊向量。这种模糊器可以在不同的Web应用组件中执行复杂的Web安全攻击，例如参数、身份验证、表单、目录/文件和标头。Wfuzz还配备了各种模块，包括迭代器、编码器、载荷、打印组件和脚本。根据不同的Web应用程序，我们可以使用这些模块来执行成功的模糊测试：

1）我们可以通过复制GitHub存储库来安装Wfuzz工具，如图14-2所示。

图　14-2

2）在运行这个工具之前，我们需要通过执行python setup.py install命令进行安装。这将在系统上安装所有文件，如图14-3所示。

3）执行wfuzz -h命令来确认工具是否已成功安装，如图14-4所示。

接下来我们安装学习本章内容需要使用的第二个工具——Fuzz Faster U Fool（ffuf）。

14.5.2　安装ffuf

ffuf（Fuzz Faster U Fool）是一个用Go编写的Web应用程序模糊器，具有Gobuster和Wfuzz的功能。可以从https://github.com/ffuf/ffuf复制GitHub存储库，也可以从https://github.com/ffuf/ffuf/releases下载预编译的版本。我们按照以下步骤进行安装：

图　14-3

图　14-4

1）可以使用git clone https://github.com/ffuf/ffuf命令或go get https://github.com/ffuf/ffuf命令复制存储库，如图14-5所示。

2）通过执行go build.命令进行安装，如图14-6所示。

3）成功编译后，可以看到在同一目录中创建了编译后的程序ffuf。我们可以运行该程序，如图14-7所示。

图　14-5

图　14-6

图　14-7

4）第三个工具Burp Suite Intruder，如图14-8所示。

图　14-8

现在，我们已经安装了执行模糊测试所需的所有工具，接下来将介绍对Web应用程序执行模糊测试时需要使用的模糊输入和向量。

14.6　识别Web应用攻击向量

攻击向量是Web应用程序的组成部分/组件，模糊器可以在其中插入异常/半异常的数据。对于Web应用程序，以下是我们可以执行模糊测试的部分：

·HTTP请求动词。

·HTTP请求URI。

·HTTP请求标头。

·HTTP POST数据。

·旧版本的HTTP协议。

接下来让我们尝试了解可用于Web应用程序模糊测试的每个部分以及所有模糊测试向量。

14.6.1　HTTP请求动词

请求动词也称为请求方法，Web应用程序客户端使用这些方法来指示要对服务器上给定资源执行的所需操作。所使用的方法取决于客户端想从服务器上获取的资源。最常见的HTTP动词是GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、PATCH和CONNECT。

对HTTP请求方法进行模糊测试可以帮助我们根据模糊器提供的不同方法来识别Web应用程序响应中的变化。我们还可以识别Web应用服务器允许的方法，这些方法可以用来检查一些攻击测试用例。

14.6.1.1　使用Wfuzz对HTTP方法/动词进行模糊测试

对HTTP方法进行模糊测试非常容易，也很有帮助。让我们尝试使用Wfuzz在简单的Web应用程序上对HTTP动词进行模糊测试。可以通过以下步骤对HTTP请求方法进行模糊测试：

1）在终端上执行以下命令以开始使用Wfuzz：

2）图14-9显示了上述命令的输出。

-z选项用于输入载荷。在本例中，我们使用常见的HTTP请求方法（GET、POST、HEAD、OPTIONS、TRACE和PUT）的列表（-z <list name>）。

-X选项用于提供模糊器要使用的HTTP请求方法。如果未提供-X选项，则默认情况下，模糊器将使用HTTP GET请求方法进行模糊测试。

图　14-9

现在，让我们看看如何使用ffuf对HTTP动词进行模糊测试。

14.6.1.2　使用ffuf对HTTP方法/动词进行模糊测试

我们还可以使用ffuf对请求标头进行模糊测试。可以执行以下命令，使用词表（wordlist）对请求标头进行模糊测试：

图14-10显示了上述命令的输出。

图　14-10

正如我们在图14-10中看到的那样，模糊器发现了一些Web应用程序服务器可接受的HTTP方法。让我们尝试使用Burp Suite对同一种情况进行模糊测试。

注意：ffuf中的-c选项用于为HTTP响应代码添加颜色。它能帮助我们更快地识别隐藏的文件和目录。

14.6.1.3　使用Burp Suite Intruder对HTTP方法/动词进行模糊测试

在Burp Suite Intruder中，通过单击Intruder选项卡并打开Positions子选项卡对HTTP动词进行模糊测试。Burp Suite将使用§载荷标记自动标记任何与[parameter] = [value]格式匹配的值。载荷标记中的所有内容都会被Burp Suite视为模糊向量。Burp Suite Intruder支持四种攻击类型：Sniper、Battering Ram、Pitchfork和Cluster Bomb。要了解有关攻击类型的更多信息，请参阅https://portswigger.net/burp/documentation/desktop/tools/intruder/positions。

我们通过单击Clear §按钮来清除模糊向量的位置，如图14-11所示。

图　14-11

为了对HTTP请求方法进行模糊测试，我们通过单击Add §按钮添加载荷标记（§），如图14-12所示。

设置载荷标记之后，我们需要定义Intruder应该使用的载荷进行模糊测试。可以通过单击Payloads选项卡来完成，如图14-13所示。在本例中，我们将使用一个词表，其中包含一些常见的HTTP请求方法。首先将Payload type设置为Simple list，然后单击Load ... 按钮加载列表，即可使用词表。

图　14-12

图　14-13

加载词表后，可以单击Start attack按钮开始模糊测试，如图14-14所示。

如图14-15所示，将打开一个新窗口，显示模糊测试的结果。

在图14-15中可以看到，当使用HTTP CONNECT和TRACE方法时，服务器分别使用HTTP 400（错误请求）和HTTP 405（不允许的方法）代码进行响应。这向我们展示了Web应用服务器关于这两个请求标头的行为。

图　14-14

图　14-15

注意：我们可以使用在线免费的其他自定义列表对HTTP方法进行模糊测试。

14.6.2　HTTP请求URI

在开始进行HTTP请求URI的模糊测试前，我们首先需要了解URI的结构，如下所示：

14.6.2.1　使用Wfuzz对HTTP请求URl路径进行模糊测试

要在Wfuzz的帮助下对URI路径进行模糊测试，可以执行以下命令：

图14-16显示了上述命令的输出。

图　14-16

使用--hc开关，我们可以根据HTTP代码过滤出结果。在本例中，我们过滤了HTTP 404（Not Found）代码，如图14-17所示。

图　14-17

ffuf也具有同样的功能。

14.6.2.2　使用ffuf对HTTP请求URl路径进行模糊测试

我们执行以下命令对URI路径进行模糊测试：

图14-18显示了上述命令的输出。

图　14-18

在上述两种情况下，FUZZ关键字被替换为用于模糊测试目录名称的词表条目。正如我们在图14-17中看到的，当模糊器请求css、img、js和setup时，服务器以HTTP 301响应。通过观察响应的大小和词数量的多少，我们可以得出结论，模糊器能够在Web应用程序服务器中找到目录。

14.6.2.3　使用Burp Suite Intruder对HTTP请求URl路径进行模糊测试

现在，我们已经使用Wfuzz和ffuf对URI路径进行了模糊测试，让我们在Burp Suite Intruder中尝试相同的操作。这里的概念是一样的。让我们放置一个载荷标记，如图14-19所示，供模糊器将数据发送到向量。

图　14-19

将Payload type设置为Simple list并使用Load ... 按钮导入词表，如图14-20所示。

图　14-20

单击Start attack按钮，Intruder将尝试使用给定的自定义词表对URI路径进行模糊测试。模糊器的结果将显示在另一个带有HTTP响应代码和Length的窗口中，如图14-21所示。

图　14-21

由前面的介绍可知，我们能够模糊测试Web应用服务器的URI路径（目录）。现在，让我们看看如何使用相同的工具模糊测试URI文件名和文件扩展名。

14.6.2.4　使用Wfuzz对HTTP请求URl文件名和文件扩展名进行模糊测试

Wfuzz还可以对Web应用程序服务器的文件名和文件扩展名进行模糊测试：

·wfuzz -c --hc=404 -z file,SecLists/Discovery/Web-Content/raftsmall-files-lowercase.txt http://192.168.2.19:8090/xvwa/FUZZ.php（文件名模糊测试）

·wfuzz -c --hc=404 -z list,php-asp-aspx-jsp-txt http://192.168.2.19:8090/xvwa/home.FUZZ（文件扩展名模糊测试）

14.6.2.5　使用ffuf对HTTP请求URl文件名和文件扩展名进行模糊测试

可以通过以下命令使用ffuf模糊器对HTTP请求URI文件名和文件扩展名进行模糊测试：

·ffuf -c -w <wordlist> -u http://192.168.2.19:8090/xvwa/FUZZ.php（文件名模糊测试）

·ffuf -c -w <wordlist> -u http://192.168.2.19:8090/xvwa/home.FUZZ（文件扩展名模糊测试）

14.6.2.6　使用Burp Suite Intruder对HTTP请求URl文件名和文件扩展名进行模糊测试

载荷标记位于模糊测试文件名的文件扩展名之前，如图14-22所示。

图　14-22

将载荷标记放在文件名后面以模糊测试文件扩展名，如图14-23所示。

Wfuzz和Burp Suite Intruder最优秀的地方是能够使用多个模糊向量测试多个载荷位置。

14.6.2.7　使用Wfuzz对HTTP请求URl进行模糊测试（GET参数名和值）

Wfuzz具有内置功能，可以通过添加FUZZ、FUZ2Z、FUZ3Z等关键字来模糊多个载荷位置。假设我们想要模糊GET参数名和Web应用服务器的值。因为我们不能在两个模糊向量中使用相同的词表，所以将使用FUZZ和FUZ2Z关键字执行模糊测试。让我们在Wfuzz中执行以下命令：

图　14-23

正如我们在前面的命令中看到的那样，使用-z选项（我们也可以重复使用-z、-H和-b选项）和/?FUZZ=FUZ2Z格式的[parameter]=[value]为Wfuzz提供两个词表——parameter_wordlist和value_wordlist。执行此命令后，模糊器将使用parameter_wordlist中的第一个条目，将其替换为FUZZ关键字，然后通过FUZ2Z遍历所有value_wordlist条目。模糊器将在两个词表中进行模糊测试。现在，让我们看看如何使用Intruder实现相同的目标。

14.6.2.8　使用Burp Suite Intruder对HTTP请求URl进行模糊测试（GET参数值）

在Burp Suite中，有不同的攻击类型可以帮助我们进行这样的测试。为了同时模糊测试两个词表，我们将在Intruder中使用Cluster bomb攻击类型：

1）将Attack type设置为Cluster bomb，并将载荷标记设置为/?§§=§§，如图14-24所示。

图　14-24

2）因为在这种情况下将使用两个载荷集，所以我们设置第一个Payload set（参数名称）并将Payload type更改为Simple list，如图14-25所示。

图　14-25

3）现在我们已经配置了第一个载荷集，接下来配置第二个载荷集（参数值）。将Payload set设置为2之后，我们将Payload type更改为Numbers。因为参数值是整数格式（在本例中），所以我们将范围设置为1～5，并将Step设置为1，如图14-26所示。

图　14-26

4）现在，我们的Intruder已配置为通过多个载荷集进行模糊测试。单击Start attack按钮开始进行模糊测试，然后将看到图14-27所示效果。

图　14-27

从图14-27中可以看出，Intruder能够找到带有一些参数值的item参数名称。通过观察响应长度来区分找到的参数名称和值与词表中其他条目的值。

让我们尝试使用Wfuzz对三个模糊向量（目录、文件和文件扩展名）进行测试。这肯定需要很多时间，因为它同时组合了不同的载荷集。要模糊目录、文件名和文件扩展名，可以执行以下命令：

图14-28显示了上述命令的输出。

图　14-28

可以根据字符数（--hh）、单词数（--hw）或行数（--hl）筛选结果，如图14-29所示。

我们已经知道如何对HTTP请求URI进行模糊测试，接下来学习如何对HTTP标头进行模糊测试。

图　14-29

14.6.3　HTTP请求标头

对请求头的模糊测试在概念上与对URI的模糊测试相同，唯一的区别是，通过模糊测试请求标头发现的漏洞数量将比模糊测试URI时多，因为这些标头被发送到Web应用程序服务器，并且服务器在内部处理这些标头。这意味着我们有更大的范围来发现漏洞。

不同类型的HTTP标头如下所示：

·标准HTTP标头（Cookie、User-Agent、Accept、Host等）。

·非标准的HTTP标头（X-Forwarded-For、X-Requested-With、DNT等）。

·自定义标头（非标准标头之外的以X-开头的其他标头）。

让我们试着理解如何使用与本章其余部分相同的模糊器对每种类型的标头进行模糊测试。

14.6.3.1　使用Wfuzz、ffuf和Burp Suite对标准HTTP标头进行模糊测试

Web服务器通常使用标准HTTP标头来处理客户端请求。在执行Web应用程序渗透测试时，建议你了解一下Web应用程序的工作原理以及Web应用程序服务器是如何处理请求标头（标准和非标准）的。更好地理解Web应用程序可以帮助我们定义一些相当不错的模糊向量，这些向量将大大增加在Web应用程序中发现逻辑缺陷的概率。在本节中，我们将通过一些自定义测试用例来理解如何模糊测试Web应用程序。

场景1——Cookie标头模糊测试

让我们看看图14-30所示的场景。有一个PHP文件cookie_test.php，我们请求这个文件时其Cookie标志（flag）为lang=en_us.php。

图　14-30

服务器以消息Language in use: English进行响应，如图14-31所示。

图　14-31

从en_us.php文件来看，我们可能认为cookie参数包含来自服务器的文件（文件包含）并执行该文件，而该文件又从服务器打印了消息。

现在让我们看看如何使用Wfuzz来模糊测试cookie标头，如图14-32所示。

图　14-32

正如我们在图14-32中看到的那样，-b选项用于提供cookie值，这里我们使用lang=FUZZ。使用基于Web应用程序攻击的模糊向量，我们能够找到载荷，服务器使用这些载荷以不同的响应长度进行响应。在这里，我们使用模糊器发现的一个载荷，如图14-33所示。

我们能够确认存在文件包含漏洞，如图14-34所示。

通过执行以下命令，可以使用ffuf执行相同的操作：

对于Burp Suite，我们只需要将载荷标记添加到Cookie标头中即可，如图14-35所示。

图　14-33

图　14-34

图　14-35

同样，我们可以使用相同的工具来模糊测试用户定义的Cookie标头。

场景2——用户定义的Cookie标头模糊测试

这个场景与前一个场景不同。在这个场景中，我们将从服务器请求带有Cookie值lang= en_us的cookie_test.php文件，如图14-36所示。

图　14-36

服务器以Unauthorized Access进行响应，如图14-37所示。

图　14-37

只需正常请求，服务器就会将定义的Cookie返回给我们，如图14-38所示。

图　14-38

假设我们的目标是访问home.php文件，但这个文件现在会受到限制，如图14-39所示。

图　14-39

由于没有可用于向服务器进行身份验证的登录验证页面，我们必须假定身份验证是在User-Agent部分或Cookie部分进行的。假设通过检查Cookie值来完成身份验证。客户端可以使用用户定义的Cookie值来连接到服务器并成功进行身份验证。要模糊测试用户定义的Cookie盲值，可以使用Wfuzz执行以下命令：

图14-40显示了上述命令的输出。

图　14-40

正如我们看到的那样，当用户定义的Cookie的值Cookie: admin=admin;被插入时，服务器将以不同的页面响应。我们使用用户定义的相同的Cookie参数名称和值来请求相同的页面，如图14-41所示。

正如在图14-42中看到的那样，服务器将我们重定向到home.php页面。

对用户定义的Cookie参数名称和值进行模糊测试时，可以使用cookie_test.php页面进行身份验证以访问home.php页面，如图14-43所示。

可以使用相同的方法来查找各种漏洞，例如SQL注入、XSS和RCE。

注意：这完全取决于Web应用程序以及其如何处理Cookie标头。如果Cookie标头仅用于服务器向客户端提供临时会话，除了测试基于会话的漏洞外，我们能做的很有限。

图　14-41

图　14-42

图　14-43

其他标准标头也可以进行模糊测试，包括User-Agent、Host、Accept和Content-Type。在对非标准HTTP标头进行模糊测试时，可以使用词表来检查模糊器请求的每个标头的服务器响应。有时，通过使用这些非标准标头（例如X-Forwarded-For等），我们可以绕过服务器对应用程序施加的基于IP的访问限制。

14.6.3.2　使用Wfuzz、ffuf和Burp-Suite对自定义标头进行模糊测试

在许多Web应用程序中，开发人员引入了一些定制的HTTP标头，然后在处理请求时解析这些标头。从生成特定于用户的令牌到允许通过此类自定义标头进行访问控制，这些标头具有不同级别的功能。在这种情况下，有时开发人员会忘记清理用户输入，而这又可能成为渗透的目标。接下来我们看看如何使用Wfuzz、ffuf和Burp Suite模糊测试自定义标头。

场景3——自定义标头模糊测试

在这个场景中，我们有一个在PHP文件——custom_header.php。我们从服务器请求图14-44所示页面。

图　14-44

服务器以一条“Unauthorized Access！”消息和两个未知的标头X-isAdmin: false和X-User: Joe响应，如图14-45所示。

图　14-45

来自服务器的消息如图14-46所示。

图　14-46

通过观察这两个自定义标头，我们可以假定服务器也处理这些标头。第一个标头，即X-isAdmin，看起来像一个接受布尔值（true或false）的自定义标头。另一个标头X-User可能用来接受用户的名字，因此该值采用字符串格式。让我们使用Wfuzz对这些标头进行模糊测试，看看能做些什么。我们在Wfuzz中执行以下命令：

图14-47显示了上述命令的输出。

图　14-47

我们可以在HTTP请求中的多个位置使用-H标志。现在我们从服务器收到了相同的响应，可根据字符长度（--hh标志）过滤出结果，如图14-48所示。

图　14-48

我们找到了X-isAdmin:true和X-User:Billy。这意味着Billy是这里的管理员。在HTTP请求中使用这个自定义标头，让我们看看是否可以访问图14-49所示页面。

如图14-50所示，我们能够使用自定义的HTTP标头对页面进行身份验证，在身份验证之后，服务器将把我们重定向到home.php页面。

图　14-49

图　14-50

home.php页面如图14-51所示。

图　14-51

现在我们已经对模糊测试HTTP请求标头有了一些清晰的认识。可以对HTTP POST参数使用类似的模糊测试技术，如图14-52所示。

同样，我们还可以对HTTP POST参数进行模糊测试，以查找应用程序支持的API和这些API参数支持的可接受值。

对Web应用攻击向量进行模糊测试可以为我们深入研究Web应用渗透测试提供更多的思路。当模糊器发现一些有趣的东西时，记录每个请求和响应是一个好习惯。最后，如果给模糊器提供详细的模糊数据，那么模糊测试就会非常有效。在大多数情况下，模糊测试可以发现常规Web应用程序扫描程序无法找到的代码执行和其他技术漏洞。

图　14-52

14.7　小结

在本章中，我们首先学习了模糊测试的基本知识和不同类型的模糊攻击。然后，我们更深入地研究了Web应用程序的模糊测试，并学习了Wfuzz和ffuf的安装。之后，我们对HTTP请求动词和请求URI进行了模糊测试。在本章的最后，我们研究了三个场景：Cookie标头模糊测试、用户定义的Cookie标头模糊测试和自定义标头模糊测试。学习了模糊测试之后，可以了解Web应用程序的行为，这将帮助我们发现技术和逻辑漏洞。在漏洞赏金活动或CTF（Capture The Flag）比赛中，可以将模糊测试作为常规渗透测试的一部分。

我们将在下一章讨论渗透测试报告中必须包含的关键点。

14.8　问题

1.我可以在基于SSL的Web应用程序上执行模糊化测试吗？

2.Windows是否支持本章提及的模糊器？

3.是否需要在所有Web应用程序渗透测试中执行模糊测试？

4.执行模糊测试可以发现哪些类型的漏洞？

14.9　拓展阅读

·Wfuzz下载页面：https://github.com/xmendez/wfuzz。

·ffuf下载页面：https://github.com/ffuf/ffuf。

·Burp Suite官方网站：https://portswigger.net/burp。

·了解模糊测试的基础知识：https://owasp.org/www-community/Fuzzing。

·了解Web应用程序攻击向量：https://www.blackhat.com/presentations/bh-dc-07/Sutton/Presentation/bh-dc-07-Sutton-up.pdf。

第15章
编写渗透测试报告

众所周知，一份好的报告必须包含有关漏洞的所有必要细节。所有渗透测试标准都强调编写结构合理的报告。我们将在本章学习一些可用于做出良好报告的工具。

以下是必须包含在报告中的关键点：

·漏洞详情。

·CVSS评分。

·漏洞对组织的影响。

·修补漏洞的建议。

报告应分为两部分，一部分供技术团队参考，另一部分则供管理团队参考。

本章将介绍以下内容。这些内容将涵盖报告生成过程中常用的工具：

·报告编写简介。

·Dradis框架介绍。

·使用Serpico。

15.1　技术条件要求

以下是学习本章内容所需满足的技术要求：

·Dradis（https://github.com/dradis）。

·Serpico（https://github.com/SerpicoProject/Serpico）。

·数据库服务器（MariaDB/MySQL）。

·Redis服务器（https://redis.io/download）。

·Ruby（https://www.ruby-lang.org/en/downloads/）。

15.2　报告编写简介

编写报告是渗透测试中最重要的阶段之一，因为报告不仅供技术团队使用，还供管理人员使用。通常需要向客户提供两种类型的报告——执行报告（executive report）和详细技术报告（Detailed Technical Report，DTR）。

执行报告是为组织/公司的最高管理者编写的，以便他们能够根据报告中提到的业务影响做出决策。DTR则是一份详细的报告，概述了发现的所有漏洞，也包括帮助技术团队（内部安全运营和开发人员）修复漏洞的建议步骤。总体而言，该报告应包含以下详细信息：

·目的和范围。

·使用的方法和原则。

·使用的通用漏洞评分系统（CVSS）版本。

·执行摘要。

·调查结果摘要（发现的漏洞列表）。

·漏洞详情。

·结论。

·附录。

了解了测试报告所包括的内容后，我们来看一下如何写好报告。

15.2.1　编写执行报告

正如我们在前面提到的，执行报告供C级执行人员（CXO）和管理层使用，以便基于所进行的风险评估（包括漏洞评估和渗透测试）来了解风险可能带来的影响等。由于C级的管理人员很忙，报告应该尽可能简洁，并包含他们所需的所有信息，以便做出明智的决定。让我们来看看执行报告的一般结构。

15.2.1.1　标题页

顾名思义，标题页（title page）包含有关项目、服务商和客户的信息。

15.2.1.2　文档版本控制

DTR报告中也定义了这个部分。当进行渗透测试时，报告并不是一次性完成的。双方都需要做很多更改，这样就可以创建一份客户和测试人员都可以接受的报告。报告的初稿完成后，该报告将被发送给客户。这部分内容记录了自报告初稿以来对报告所做的更改的次数。每次更改都会定义一个新版本。定稿后，报告中还会提到版本号。

15.2.1.3　目录

目录（ToC）是报告中最重要的部分之一，构成报告文档，以便C级主管可以轻松地理解它。

15.2.1.4　目的

这部分内容向管理层介绍渗透测试项目和确定的时间表。

15.2.1.5　限定范围

此部分中，应明确范围内定义的所有URL、IP、端点等。这些信息有助于C级管理者快速注意到受影响的资产，这可能会对组织产生业务关键性影响。

15.2.1.6　主要发现（影响）

这部分将列出每个漏洞的影响，也就是说，攻击者可以对组织的资产执行什么操作。这些指标帮助组织评估业务资产的安全级别。C级管理者将立即知道组织的哪些资产需要进行关键修复。

15.2.1.7　问题概述

此部分向高层管理人员深入介绍所发现漏洞的严重性。在这里可以使用漂亮的饼图或条形图来显示找到的漏洞，并根据严重性对其进行分类。

15.2.1.8　战略性建议

此部分向高层管理人员提供建议，他们可以遵循这些建议来修复真正至关重要的漏洞，如果这些漏洞被利用，可能会给业务带来问题。

由于执行报告的主要目标是向最高管理层提供评估的概述，因此报告中的所有细节都应简要提及。任何不必要的内容都应该从报告中删除。现在，让我们看看DTR报告。

15.2.2　编写详细的技术报告

有关漏洞的所有技术细节将包含在本报告中。DTR是为客户的技术团队准备的。让我们来看看DTR的通用结构。

15.2.2.1　标题页

同样，标题页包含有关项目、供应商和客户的信息。

15.2.2.2　文档版本控制

此部分也在执行报告中定义，并且所包含的详细信息相同。

15.2.2.3　目录

组织报告文档，以便客户的技术团队能够轻松理解。

15.2.2.4　报告摘要

这一部分概述渗透测试项目，向客户展示已发现漏洞的总数，并按照严重性级别的顺序显示。我们可以添加一些漏洞统计信息，如饼图或面积图，并将漏洞定义为严重、高、中、低或信息性。作为渗透测试人员，我们可以添加一个攻击描述，告诉我们攻击者如何找到这些漏洞，以及攻击者可以在多大程度上利用这些漏洞。报告摘要有助于技术团队以及C级管理看到项目的总体成功。

15.2.2.5　限定范围

在与客户的启动会议上，需要确定项目范围和目标。在报告的这一部分中，应该明确范围内定义的所有URL、IP、端点等。此信息可帮助技术团队快速管理当前的漏洞，并与负责该范围中URL/IP的开发人员/运维团队进行沟通。

将范围添加到报告中还有另一个原因——它有助于渗透测试人员顺利执行项目流程。在范围未定义的情况下，渗透测试人员无法评估需要完成的工作量或完成项目所需的天数。众所周知，计算渗透测试项目价格的核心依据之一是人天数。

当渗透测试项目处于初始阶段时，即与客户进行项目讨论时，将根据客户提供的范围以及执行测试所需的人天数来计算项目报价。请注意，这些并不是定义项目价值的唯一要素，资产、时间线、为项目分配的资源数量、差旅费（如果有的话）以及渗透测试人员的初始要求也是一些关键要素。

这个定义的范围有助于渗透测试人员将他们团队的资源分配到项目中，并定义时间线以确保项目顺利进行。如果有许多子项目，例如在同一客户机上执行内部网络或外部网络渗透测试，那么定义范围可以确保双方都有相同的期望。

15.2.2.6　采用的方法学

报告的此部分应包含渗透测试人员在安全评估期间采用的方法学。最好用图表展示这个过程，并向客户解释每个环节，这样客户的技术团队就会知道他们的IT资产是如何被测试的。

无论渗透测试人员是否遵循NIST-800标准、PTES标准或自己公司的标准，他们都必须在此部分中说明测试过程。

15.2.2.7　CVSS

CVSS是一个免费和开放的行业标准，用于确定漏洞的严重性。在根据漏洞的严重性描述漏洞时，我们需要根据CVSS评分对漏洞进行分类。报告的此部分将向客户介绍CVSS以及我们将在报告中使用的版本。撰写本书时，CVSS的版本为CVSS v3.1，该版本于2019年6月发布。

15.2.2.8　漏洞概述

渗透测试人员应在报告的此部分中添加漏洞描述、CVSS评分、漏洞严重程度、受影响的端点/IP、概念证明（PoC）、复现步骤、影响、建议和参考。

15.2.2.9　结论

在结论部分，渗透测试人员从攻击者的角度出发，以项目的总体难度来总结报告。任何其他建议都将添加到此部分中。

15.2.2.10　附录

任何其他信息，如屏幕截图、服务枚举、CVSS计算公式以及客户可能需要的其他信息都会添加到报告的这一部分中。

现在，我们知道了如何编写执行报告以及DTR。报告测试过程中发现的主要问题是收集所有技术细节。作为一名渗透测试人员，我们必须确保在渗透测试期间收集所有的屏幕截图、URL、使用的载荷等，以便将这些细节在DTR报告中展现。

如果范围是几个IP或URL就不会有问题，但是如果项目很大，那么收集数据有时会很麻烦。为了解决这些问题，我们可以选择在GitHub上公开提供的报告框架。这些框架可以自动分析输出扫描文件和Nmap端口扫描结果，并根据提供给它的详细信息为我们生成报告。在下一节中，我们将讨论一个这样的框架——Dradis。

15.3　Dradis框架简介

Dradis是一个基于浏览器的开源应用程序，可用于汇总来自不同工具的输出并生成单个报告。它可以支持超过15种工具，例如Burp Suite、Nessus、Acunetix和Nmap等。

15.3.1　安装前配置

要安装Dradis，我们需要先安装一些依赖包。它非常易于使用，并预装在了Kali Linux中。我们将重新安装它，然后学习如何使用它。

首先，我们需要通过运行以下命令来安装依赖项：

接下来，我们将继续进行安装。

15.3.2　安装和设置

我们可以使用以下命令从GitHub存储库下载Dradis社区版：

上述命令的输出如图15-1所示。

图　15-1

现在，我们需要运行以下命令：

图15-2显示了上述命令的输出。

图　15-2

接下来，我们需要移至Dradis文件夹。要安装Dradis，我们需要通过输入以下命令在bin文件夹下运行安装文件：

安装完成后，我们可以运行以下命令来启动Dradis服务器：

图15-3显示了上述命令的输出。

图　15-3

可以通过https://localhost:3000访问Dradis。

我们甚至可以使用Dradis的Docker镜像来避免安装步骤和在此过程中可能出现的任何错误。

现在，我们需要设置密码，以便访问框架并登录，如图15-4所示。

图　15-4

接下来，让我们开始使用Dradis。

15.3.3　开始使用Dradis

成功登录后，将被显示仪表板，如图15-5所示。

图　15-5

Dradis框架的免费版本支持各种工具的插件，比如Nmap、Acunetix、Nikto和Metasploit。它还允许我们创建可在渗透测试中使用的方法学。在平台的左侧面板中，可以看到三个主要分区，它们可以帮助完成报告的生成过程——所有问题（All issues）、方法学（Methodologies）和回收站（Trash），如图15-6所示。

图　15-6

·All issues：此页面允许我们创建在渗透测试活动期间发现的问题，可以手动创建，也可以通过从不同工具（如Nmap、Nikto和Nessus）导入结果来创建。单击此选项将重定向到图15-7所示页面。

现在，我们来学习如何将第三方报告导入Dradis。

图　15-7

15.3.4　将第三方报告导入Dradis

要从工具的输出中导入问题，请按照下列步骤操作：

1）选择第三个选项Upload the output of a tool（上传工具的输出），进入图15-8所示页面。

图　15-8

2）向下滚动页面将显示已安装的插件列表及其工具名称，如图15-9所示。

图　15-9

3）上传报告将向我们显示已解析的输出，如图15-10所示。

图　15-10

4）导入完成后，我们将在左侧面板中plugin.output下看到结果，如图15-11所示。

图　15-11

5）刚刚导入的扫描结果的输出如图15-12所示。

图　15-12

现在，我们需要定义安全测试方法。

15.3.5　在Dradis中定义安全测试方法

Methodology部分允许我们定义活动期间将要遵循的方法论。最常用的方法是开源安全测试方法手册（OSSTMM）、渗透测试执行标准（PTES）和国家标准与技术研究所给出的方法。我们甚至可以通过定义检查清单来创建自己的方法，如下所示：

1）要创建检查清单，请转到Methodologies，然后单击Add new按钮。你将看到图15-13所示的显示。

图　15-13

2）为其指定一个名称并单击Add to Project按钮，如图15-14所示。

图　15-14

3）我们看到已经创建了一个示例列表。可以通过单击右侧的Edit按钮进行编辑，如图15-15所示。

图　15-15

4）在这里，我们可以看到列表在一个XML文件中，可以通过单击Update methodology进行编辑和保存，如图15-16所示。

图　15-16

现在，让我们整理一下报告。

15.3.6　使用Dradis组织报告

现在，我们来学习如何组织扫描报告。节点（node）功能允许我们为不同的子网、网络和办公室位置创建单独的部分，然后将所有问题或屏幕截图放在那里。下面让我们快速了解如何创建节点：

1）转到左侧菜单中的Nodes选项，然后单击“+”，系统会在弹出一个对话框，在其中添加网络范围，然后单击Add按钮，如图15-17所示。

图　15-17

2）要添加一个新的子节点，我们需要从左侧菜单中选择Node，然后选择Add subnode选项。子节点用于进一步组织网络。我们甚至可以添加注释和屏幕截图，作为在特定节点中发现的缺陷的证据，如图15-18所示。

图　15-18

最后，让我们学习如何在Dradis中导出报告。

15.3.7　在Dradis中导出报告

可以使用Dradis Framework导入不同的扫描，合并后导出为一个报告，如图15-19所示。

图　15-19

注意：有关Dradis的更多信息，请访问其官方网站https://dradisframe-work.com/。

到目前为止，我们已经学习了如何安装和配置Dradis框架，还研究了在Dradis中导入、组织和导出报告。在下一节中，我们将介绍另一个名为Serpico的工具。

15.4　Serpico简介

Serpico（SimplE RePort wrIting and COllaboration）是使用Ruby开发的一个工具，用于加速报告编写过程。它是开源的、独立于平台的，可以通过GitHub获取。在本节中，我们将介绍Serpico的基本安装和用法。

15.4.1　安装和设置

对于64位Linux系统，安装很简单，我们只需从https://github.com/Serpico-Project/Serpico/releases下载并安装即可。

由于Serpico具有Docker镜像，因此我们将在示例中使用其镜像。

首先，我们需要设置一个数据库以及用户名和密码。为此，请运行以下命令：

图15-20显示了上述命令的输出。

图　15-20

然后，我们使用ruby serpico.rb运行该工具，如图15-21所示。

图　15-21

现在，我们已准备好开始使用这个工具，可以从http://127.0.0.1:8443访问该工具。

15.4.2　开始使用Serpico

图15-22显示了Serpico的登录界面。

图　15-22

使用用户名和密码登录后，你将看到类似于图15-23所示的仪表板。

图　15-23

登录后，我们将看到各种可用的选项，如AddUser、AddReportTemplate等，如图15-23的左侧菜单所示。

要创建一个新的报告，请按照下列步骤操作：

1）单击顶部菜单中的New Report选项，将打开如图15-24所示页面。

图　15-24

可以在该页面中填写各种详细信息，如公司全称（Full Company Name）、评估类型（Report Type）等。

2）单击Save按钮将进入下一个页面，可以填写其他详细信息，例如联系人的电子邮件等。所有这些信息都将出现在最终报告上。

3）将模板数据库结果（findings）添加到工具中。如果我们想使用常见的结果模板（如SQLi和XSS），可以选择Add Finding from Templates，也可以选择Create New Finding，如图15-25所示。

4）单击模板将下载相应的Word文档，其看起来应该类似于图15-26。

5）要为特定缺陷（bug）添加模板，我们只需勾选复选框，然后选择位于页面底部的Add按钮。

当我们不断向报告中添加发现的缺陷时，将看到结构正在逐渐成形，并且图表现在变得更加有意义。我们甚至可以直接从Metasploit数据库添加附件和管理主机。

稍后，可以使用Export report功能将其导出为单个报告。Serpico还支持各种插件，可用于从不同的工具（如Burp Suite和Nessus）导入数据。

图　15-25

图　15-26

15.4.3　将数据从Metasploit导入Serpico

让我们看看如何将Serpico连接到Metasploit以导入数据。首先，编辑要连接到Metasploit的报告。我们将被重定向到新页面。从左侧菜单中选择Additional Features，将打开图15-27所示页面。

图　15-27

现在，我们启动Metasploit RPC服务，如图15-28所示。

图　15-28

完成此操作后，我们需要在浏览器中切换回Serpico并单击Configure Metasploit RPC connection，进入图15-29所示页面。

填写连接详细信息并保存这些设置会将Serpico连接到Metasploit。这样，所有发现的缺陷将添加到报告中。

图　15-29

15.4.4　将第三方报告导入Serpico

与Dradis相似，我们还可以将其他工具的结果导入Serpico的报告中。下面快速学习一下如何从Nessus以及Burp Suite导入结果。

在Additional Features页面中编辑报告时，我们可以选择Auto Add Findings from a Nessus XML选项，如图15-30所示。

进入一个新页面，在此页面可以上传Nessus的XML文件，如图15-31所示。

当选择Auto Add Findings from Burp scanner report选项时，可以选择上传Burp扫描器的报告，如图15-32所示。

然后，Burp Suite报告将被解析为Serpico格式，并且该报告的结果将显示在Serpico的主面板上，如图15-33所示。

现在我们已经知道了如何将扫描报告从第三方工具导入Serpico，接下来我们学习如何管理用户。

15.4.5　Serpico中的用户管理

用户管理对于组织来说是必要的，尤其是当渗透测试团队很大的时候。Serpico允许我们管理用户，如图15-34所示。

图　15-30

图　15-31

Serpico支持两种类型的用户授权：本地授权和基于Active Directory（AD）的授权。添加用户后，可以通过单击左侧菜单中的List Users链接来查看当前用户列表，如图15-35所示。

图　15-32

图　15-33

除了用户管理，Serpico还允许我们管理报告模板。

15.4.6　Serpico中的模板管理

Serpico允许我们使用从Microsoft Word派生的元语言创建自定义报告模板。可以从Add Report Template页面定义和上传自定义报告模板，如图15-36所示。

图　15-34

图　15-35

互联网上还有许多预先构建的模板，这些模板是由其他用户创建和共享的。

图　15-36

15.4.7　生成多种格式的报告

我们可以使用Serpico生成不同格式的报告：

·纯文字格式。

·CSV格式。

·ASCII Doc格式。

·演示格式（包括PDF）。

·HTML格式。

我们对Dradis框架和Serpico的简介到此结束。有关Serpico的更多信息，请参见https://github.com/SerpicoProject/SerpicoPlugins/wiki/Main-Page。

15.5　小结

在本章中，我们介绍了报告编写及其两种类型，还介绍了两个工具——Dradis和Serpico。现在你已经熟悉了它们的框架，可以使用它们来生成和组织报告了。

我们希望你喜欢这本书，也欢迎你对本书提出任何反馈，因为它有助于我们改进和创作更好的内容。如果有任何疑问，请随时联系我们，不要忘了向你的朋友推荐这本书！

15.6　问题

1.Serpico支持的元语言是什么？

2.渗透测试报告中应包括哪些必要的项目？

3.还有哪些工具可以用于自动编写报告？

4.Microsoft Windows是否支持Dradis和Serpico？

15.7　拓展阅读

以下链接提供有关Dradis和Serpico的更多信息：

·https://dradisframework.com/ce/

·https://github.com/SerpicoProject/Serpico

·https://github.com/SerpicoProject/Serpico/wiki/Serpico-Meta-Language-In-Depth

·https://github.com/SerpicoProject/SerpicoPlugins/wiki/Main-Page

问题答案

第1章

1.是的，有一个由MITRE维护的CWE列表，网址为https://cwe.mitre.org/。

2.OWASP Top 10可以参考https://owasp.org/www-project-top-ten/，SAN Top 25可以参考https://www.sans.org/top25-software-errors/。

3.典型渗透测试中使用的许多工具都是开源的，例如Nmap和Metasploit框架。不过，市场上也有一些非常有效的商业工具可以使用，例如Burpsuite Professional和Nessus Professional。

4.根据项目的性质和范围，OSSTMM渗透测试可以是六种不同类型中的一种。基于PTES的渗透测试被归类为非常通用的测试类型，例如白盒、灰盒和黑盒。由于PTES是行业标准，因此大多数渗透测试都使用PTES方法。

第2章

1.Metasploit社区版和Metasploit框架是开源的。Metasploit Pro是商业版，具有许多额外功能。有关详细信息请访问以下链接：https://www.rapid7.com/products/metasploit/download/editions/。

2.Metasploit Framework 5允许我们使用AES或RC4来加密载荷。你只需要使用MSFVenom中的--encrypt选项生成载荷即可。

3.不能。目前Metasploit框架只支持PostgreSQL作为后端数据库。

4.Metasploit Framework数据库可以直接通过端口5432连接。如果希望通过安全通道与数据库通信，则可以使用PostgreSQL Web Service（通过HTTP/HTTPS运行）将Metasploit Framework连接到数据库。

第3章

1.从基本的网络侦察到任务链，很多功能你都可以使用。在Metasploit社区版中，许多功能被锁定，这些功能仅适用于Metasploit Pro版。

2.要使用自定义SSL证书，请转到<path/to/metasploit>/opt/metasploit/nginx/cert，并用你自己的文件替换Metasploit附带的默认的SSL证书。

3.Metasploit Web界面与Google Chrome 10+、Mozilla Firefox 18+、Internet Explorer 10+和Iceweasel 18+兼容。

4.是的。RESTful API适用于所有版本的Metasploit产品。请参考https://metasploit.help.rapid7.com/docs/standard-apimethods-reference以查看标准的Metasploit API文档。

5.是的。你可以检查自定义报告格式，并在Metasploit Web界面中进行相应的配置。更多相关信息请参见以下链接：https://metasploit.help.rapid7.com/docs/aboutreports。

第4章

1.HTTP标头检测模块获取服务器响应中的HTTP标头。如果管理员已经阻止/删除了HTTP标头，则此模块将不会为你提供任何输出。模块是正常工作的。

2.默认情况下，Metasploit Web界面在软件包中附带4.x版本的NMAP（预安装），用于执行主机发现和端口扫描。为了获得更好的结果，你可以安装和使用最新版本的NMAP。

3.是的。Web界面只是为Metasploit框架提供了一个图形用户界面（GUI），你可以添加自己的自定义模块。

4.你可以在登录页面之前放置一个反向代理。必须首先使用HTTP基本身份验证机制对自己进行身份验证，然后才能使用登录页面通过Metasploit Web界面进行身份验证。有关更多信息，请参阅https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/上的文档。

第5章

1.是的。GitHub上有许多著名的字典可以用来获得更好的枚举结果。

2.Metasploit提供了修改或添加自己的模块的能力，这些模块可以基于不同的模块运行。

3.你可以灵活地对自定义模块进行编码，也可以对自己的Metasploit插件进行编码，该插件可用于在单个命令中自动执行整个枚举过程。正则表达式用于有效过滤搜索。使用正则表达式，你可以执行更有针对性的抓取，而不是抓取一些没有价值的内容。

第6章

1.这完全取决于扫描运行的频率和并发性。至少可以使用两个客户端节点和一个主节点进行分布式扫描，但是你可以根据要扫描的系统数量来做出决定。

2.将WMAP插件加载到Metasploit后，会将所有结果保存在与其连接的数据库中。注意，此插件中没有特定功能可生成有关WMAP的报告。

3.db_import命令中提到了Metasploit框架支持的所有格式，你可以参考这部分内容。

4.WMAP是一个用Ruby编写的插件。你可以根据需要编辑文件和修改代码。在进行任何修改之前，请阅读LICENCE文件。

5.WMAP中每个节点最多只能有25个作业。这样做是为了防止节点负担过重。

第7章

1.不一定。Nessus可以安装在任何服务器上，你只需要向网络IP和端口提供身份验证凭证即可。Metasploit将自动使用远程安装的Nessus实例进行身份验证。

2.Metasploit支持Nexpose、Nessus和OpenVAS漏洞扫描程序作为插件式模块。对于其他漏洞扫描程序，你可能需要编写自己的插件模块。

3.是的。可以将Nessus Professional与Metasploit一起使用。你只需先激活Nessus Pro。

4.扫描的并发数与你的Nessus订阅允许的数量相同。

第8章

1.是的。如果WordPress是用默认配置安装的，那么本章中讨论的侦察技术足以获得WordPress所有版本的信息。

2.如果无法访问wp-admin目录，则可以随时尝试使用wplogin.php文件。具有正常权限设置的用户可以访问该文件以及wp-admin目录。如果仍然无法访问它，请尝试将wp-login.php?action=register添加到URI。

3.是的。WordPress是一种广泛使用的开源CMS。与WordPress核心不同，其中的某些主题和模板是需要付费订阅的。

第9章

1.Joomla是一个用PHP编写的CMS，可以在安装了PHP的操作系统上运行。

2.是的，如果你已经使用了社区未知的检测技术，则可以将该技术添加到Metasploit代码中。同时，你可以向Metasploit GitHub存储库发送推送请求，这也应该对社区有所帮助。

3.有多种方法可以找到已安装的版本。你甚至可以阅读源代码来查找公开Joomla版本的标头或参数。

4.渗透测试人员的目标是找到漏洞并将其利用到一定程度，以说服组织的管理层不要忽视Web应用程序的安全。后门应用程序会违背这种逻辑，这样做是不道德的。

第10章

1.不同的Drupal版本具有不同的架构和特性。如果漏洞利用基于Drupal的核心组件，则也可以用于老版本。其他基于模块和插件的漏洞利用在不同的Drupal版本中可能不起作用。

2.最好在本地安装Drupal来测试漏洞。如果我们成功地在本地实现对Drupal的漏洞利用，那么也可以在远程Drupal站点实现同样的利用。

3.有时，Web应用程序前面会有一个Web应用程序防火墙（WAF），这意味着漏洞利用程序不会成功运行。在这种情况下，我们可以对漏洞利用程序中使用的载荷进行混淆处理或编码，从而绕过WAF保护。

4.如果我们有权访问Drupal管理员账户，则可以启用PHP过滤器的模块并为其配置权限。设置权限后，就可以在站点上编写一个Web shell。我们甚至可以利用任意文件上传漏洞（对于某些版本的Drupal有效）来上传Web shell。

5.在执行文件和目录枚举时，如果遇到.swp文件，则可以利用它来发挥我们的优势。.swp文件是一个状态文件，用于存储文件中发生的更改。有时，管理员会编辑Drupal配置文件（settings.php），这意味着将创建一个.swp文件。如果可以访问settings.php.swp文件，则可以使用全局设置的变量，例如数据库的用户名和密码，这些变量可以用于进一步的利用。

第11章

JBoss有不同的发行版本。社区版可以免费下载，但是你需要购买许可证才可以得到技术支持。你可以在https://www.redhat.com/en/store/red-hat-jboss-enterpri-se-application-platform?extIdCarryOver=truesc_cid=701f2000001Css5AAC上查看许可信息。

第12章

1.可以使用Shodan、ZoomEye、Censys.io和类似服务来识别它们，还可以通过执行端口扫描和服务枚举来识别它们。有时，Tomcat服务不会在公共端口（例如80、443、8080等）上运行。在这种情况下，请执行完整的端口扫描，并通过服务器响应识别服务。

2.不是。Release-Notes.txt和Changelog.html文件仅在默认安装上可用。如果服务器管理员删除了这些文件，则需要寻找其他方法（本章中提到的）来检测和识别Apache Tomcat实例。

3.当防病毒程序检测到JSP Web shell时，通常会发生这种情况。要绕过此类安全措施，你可以对Web shell进行混淆处理。

4.在基于OOB的OGNL注入中，可以通过两种方式利用这种漏洞——通过DNS交互或通过HTTP交互。在这两种情况下，你都需要设置自己的实例并配置DNS服务器（用于DNS交互）或HTTP Web服务器（用于HTTP交互）。通过HTTP交互进行攻击时，对基于OOB的OGNL进行漏洞利用更容易。

第13章

1.可以使用Shodan、ZoomEye、Censys等来识别Jenkins实例。默认情况下，Jenkins服务在端口8080上运行。

2.识别Jenkins的方法有多种，但是最常见的方法是使用HTTP标头。X-Hudson、X-Jenkins、X-Jenkins Session和X-Permission-Implied-By标头是Jenkins使用的自定义HTTP标头。

3.可以使用HTTP标头来查看是否有标头阻止你访问Jenkins实例。还可以添加X-For-warded-For:127.0.0.1标头来绕过任何类型的入口访问限制。

4.Jenkins是一个使用Java开发的开源工具，它通过使用可用的基于插件的机制来支持CI和CD。如果你有权访问Jenkins实例，则可以中断CI/CD管道，从而破坏生产/非生产环境。由于Jenkins拥有应用程序的所有代码，因此你可以下载源代码以获取硬编码的凭证和敏感信息，然后可以将其用于进一步利用。

第14章

1.是的，可以在运行Web服务（包括SSL）的任何服务器上执行Web应用程序模糊测试。

2.Burp Suite是可以在Microsoft Windows上使用的基于Java的工具，但是对于Wfuzz和ffuf，必须在Windows上安装Python，因为这些工具都是基于Python的。

3.不是。在常规渗透测试中，执行模糊测试是可选的，需要与客户讨论。如果客户要求，那么它将是强制性的；否则，渗透测试就可以不包括模糊测试。但是，无论如何，执行模糊测试总是一个好的习惯，因为你可能发现被扫描器漏报的严重漏洞。

4.可以发现技术漏洞（例如远程代码执行（RCE）、SQL注入（SQLi）和跨站点脚本（XSS））和逻辑漏洞（例如账户接管、参数操作、响应操作和身份认证令牌绕过）。

第15章

1.Microsoft Word使用的元语言被设计得尽可能简单，同时仍提供足够的功能，从而可以创建基本的渗透测试报告。这是一种用于在Serpico中创建自定义模板的语言（在其GitHub存储库中定义）。要了解有关Serpico中的元语言的更多信息，请参阅https://github.com/SerpicoProject/Serpico/wiki/Serpico-Meta-Language-In-Depth。

2.通用渗透测试报告应包括漏洞名称、漏洞描述、受影响的端点、复现步骤（PoC）、业务影响、修复和参考。

3.Guinevere、Prithvi和许多其他开源自动报告工具都是公开可用的，可以用来轻松生成报告。

4.是的。Dradis Framework和Serpico都是用Ruby编写的，它们是支持跨平台的工具，可以在Microsoft Windows上运行。唯一的要求是需要在Windows系统上安装Ruby软件包。