# 一、渗透测试介绍 在本章中,我们将讨论 pen 测试在专业安全测试框架中扮演的角色。我们将讨论以下主题: * 定义安全测试 * 一种抽象的安全测试方法 * 关于笔试的误区和误解 如果你已经做渗透测试一段时间了,并且非常熟悉专业安全测试的方法和概念,你可以跳过本章,或者只是浏览一下,但是你可能会学到一些新的东西,或者至少是一种不同的渗透测试方法。我们将在本章中确立一些基本概念。 # 安全测试 如果你让 10 位顾问来定义今天的安全测试是什么,你很可能会得到各种各样的回答。如果我们参考维基百科,它们的定义是: > *“安全测试是确定信息系统按预期保护和维护功能的过程。”* 在我看来,这是渗透测试最重要的方面。安全是一个过程,而不是一个产品。我还要补充一点,这是一种方法,而不是一种产品。 我们讨论的另一个组成部分是,安全测试考虑了安全模型的主要方面;这方面的示例如下: * 认证 * 批准 * 保密性 * 诚实正直 * 可利用性 * 不可抵赖 当一个组织正在保护其环境时,必须考虑这些组件中的每一个。这些领域中的每一个本身都有许多子区域,在构建安全体系结构时也必须考虑这些子区域。我们需要做的是,当我们测试安全性时,我们必须解决这些领域中的每一个。 ## 认证 需要注意的是,今天几乎所有的系统和/或网络都有某种形式的身份验证,因此这通常是我们保护的第一个领域。这可以是用户选择复杂密码或向身份验证添加其他因素(如令牌、生物特征或证书)这样简单的事情。在当今的网络中,没有任何单一的身份验证因素被认为是安全的。 ## 授权 授权的概念经常被忽略,因为它被假定为,并且不是某些安全模型的组成部分。这是一种可以采用的方法,但最好将其包括在大多数测试模型中。授权的概念非常重要,因为它是我们分配访问资源的权限和权限的方式,我们希望确保其安全性。授权允许我们在一个系统中有不同类型、具有不同权限级别的用户共存。 ## 保密 保密性的概念是保证我们希望在机器或网络上得到保护的东西是安全的,不会有被泄露的风险。现在运行在互联网上的协议(TCP/IP)是在 20 世纪 70 年代早期开发的,这一事实使得这一点更加困难。当时,互联网只在少数几台计算机上使用,现在互联网已经发展到今天的规模,而且我们仍然在运行早期的相同协议,这使得保密变得更加困难。 需要注意的是,当开发人员创建协议时,网络非常小,并且与潜在的通信对象有一种内在的信任感。这种信任感是我们今天从安全角度继续努力的目标。早期创建的概念过去是,现在仍然是,当数据从可靠来源接收时,您可以信任数据。我们知道互联网现在的规模很大。然而,情况绝对不是这样。 ## 诚信 诚信与保密相似。在此,我们关注的是信息的折衷,以及数据的准确性,以及在传输过程中未被修改或未从原始形式修改的事实。执行此操作的常见方法是使用哈希算法验证文件是否未更改。 ## 可用性 最难保证的事情之一是可用性,即在需要时拥有服务的权利。“可用性”的讽刺之处在于,当一个特定的资源可供一个用户使用时,它就可供所有用户使用。从诚实/合法用户的角度来看,一切似乎都是完美的;然而,并非所有用户都是诚实/合法的,因为资源是有限的,他们可能会被淹没或耗尽。因此,保护这一地区就更加困难。 ## 不可抵赖性 不可否认性声明声明发送方不能拒绝发送某物;因此,这是一个我通常有最大的麻烦。我们知道计算机系统可能和/或已经被多次破坏,而且欺骗的艺术也不是一个新概念。考虑到这些事实,“我们可以保证某个人从某台计算机传输信息的来源”的说法并不完全准确。 由于我们不知道机器的状态,也不知道机器是否安全且未受损,因此这可能是一个准确的声明。然而,在我们今天拥有的网络中提出这一主张将是一件非常困难的事情。 只需要一台受损的机器,然后“你可以保证发送者”的理论就消失了。我们不会在这里详细介绍安全测试的每个组件,因为这超出了我们试图实现的范围。在本节中,我们要说明的一点是,安全测试是一个概念,即查看安全性的每一个组成部分,并通过确定一个组织所面临的风险,然后降低风险来解决这些问题。 # 抽象测试方法 如前所述,在进行安全测试时,我们将重点放在一个过程上,并将其应用于我们的安全组件。为此,我们在这里描述了一种抽象的方法。我们将在[第 4 章](04.html "Chapter 4. Identifying Range Architecture")、*识别射程架构*中详细介绍许多方法及其组成部分,我们将通过探索可用的测试参考来识别方法。 我们将定义我们的测试方法,包括以下步骤: * 计划 * 非侵入式目标搜索 * 侵入式目标搜索 * 数据分析 * 汇报 ## 规划 这是专业测试的一个关键步骤,但不幸的是,鉴于所需的时间,这是很少的步骤之一。原因有很多;然而,最常见的是预算。客户不想给顾问提供太多时间来计划他们的测试。事实上,由于这个原因,在合同中,计划通常只占很小的一部分时间。另一个需要注意的重要问题是,一个潜在的对手会花很多时间在计划上。关于这一步,测试人员应该告诉客户两件事,也就是说,有两件事是专业测试人员做不到的,攻击者可以做到,它们如下: * 六到九个月的计划 * 犯法 我想我可能会触犯法律,进监狱,但我觉得这不是一件有吸引力的事情,因此我不会这么做。此外,作为一名认证黑客和授权渗透测试人员,您必须遵守道德誓言,我不确定,但我认为在测试过程中违反法律违反了本道德规范。 ## 非侵入式目标搜索 对于非侵入性目标搜索,您会听到许多名称。其中一些是开源情报、公共信息搜索和网络情报。不管你用什么名字,它们都归结为同一件事,那就是,利用公共资源提取关于你正在研究的目标或公司的信息。有太多的工具可用于此。我们将简要讨论以下工具以了解概念,不熟悉的人可以自己试用: * NsLookup: NsLookup 工具是我们遇到的大多数操作系统中的标准程序。它是一种查询 DNS 服务器以确定有关潜在目标的信息的方法。它使用非常简单,提供了大量信息。在您的机器上打开**命令提示符**窗口,输入`nslookup www.packt.net`。这将产生类似于以下屏幕截图所示的输出: ![Nonintrusive target search](graphics/477-1_01_01.jpg) 您可以在前面的屏幕截图中看到,对我们命令的响应是域**www.packt.net**的 DNS 服务器的 IP 地址。您还可以看到他们的 DNS 配置了 IPv6 地址。如果我们测试这个网站,我们会进一步探索。或者,我们也可以使用另一个很棒的 DNS 查找工具**dig。**现在,我们将不讨论它,转而讨论下一个资源。 * Serversniff: [www.serversniff.net](http://www.serversniff.net)网站有许多工具,我们可以使用这些工具收集有关潜在目标的信息。有用于**IP**、**加密**、**名称服务器**、**Web 服务器**等的工具。以下屏幕截图显示了此网站的主页示例: ![Nonintrusive target search](graphics/477-1_01_08.jpg) 我们可以展示很多工具,但我们只想简单介绍一下安全测试各个领域的工具。打开**命令提示**窗口,输入`tracert www.microsoft.com`。如果您使用的是 Microsoft Windows 操作系统,您将看到该命令失败,如以下屏幕截图所示: ![Nonintrusive target search](graphics/477-1_01_09.jpg) 阅读本书的大多数人可能都知道为什么会被阻止,而对于那些不知道的人来说,这是因为微软已经阻止了 ICMP 协议,而这是`tracert`命令默认使用的。这很简单,因为服务器正在运行服务,我们可以使用特定的协议来访问它,在本例中,该协议就是 TCP。转到 Serversniff 页面并导航到**IP 工具****TCP 跟踪路由**。然后,在**IP 地址**或**主机名框**字段中输入`www.microsoft.com`并进行跟踪路由。您将看到它现在将成功,如以下屏幕截图所示: ![Nonintrusive target search](graphics/477-1_01_19.jpg) * Way Back Machine ([www.archive.org](http://www.archive.org)): 这个网站证明了互联网上的任何东西都不会离开!当客户通知团队他们正在测试一台未投入生产的 web 服务器时,已经有很多评估,当他们看到该站点已经被复制和存储时,他们惊奇地发现这确实发生了。我喜欢使用该站点下载一些我最喜欢的演示文稿、工具等,这些内容已从站点中删除,在某些情况下,该站点已不存在。例如,用于向学生展示隐写术概念的工具之一是工具*Infostego*。这个工具是由 Antiy 实验室发布的,它为学生提供了一个易于使用的工具来理解这些概念。如果你去他们的网站[www.antiy.net](http://www.antiy.net),你会发现没有提到这个工具。事实上,在他们的任何一页上都找不到。他们现在更专注于杀毒市场。他们页面的一部分显示在以下屏幕截图中: ![Nonintrusive target search](graphics/477-1_01_02.jpg) 现在让我们利用**回程机**的力量来寻找我们的软件。打开您选择的浏览器并输入`www.archive.org`。Way Back Machine 托管在这里,在下面的屏幕截图中可以看到这个站点的一个样本: ![Nonintrusive target search](graphics/477-1_01_03.jpg) 如前所述,在撰写本书时,共有 3660 亿页存档。在 URL 部分,输入`www.antiy.net`并点击**浏览历史**。这将导致网站在其档案中搜索输入的 URL,几分钟后,将显示搜索结果。以下屏幕截图显示了一个示例: ![Nonintrusive target search](graphics/477-1_01_04.jpg) 我们知道我们不想访问最近存档的页面,因此为了安全起见,请单击**2008**。这将导致显示日历,显示网站存档的**2008**中的所有日期。你可以选择你想要的任何一个。下面的屏幕截图显示了 12 月 18 日存档站点的示例。正如您可以看到的,*Infostego*工具可用,您甚至可以下载它!如果您愿意,可以免费下载并试用该工具。 ![Nonintrusive target search](graphics/477-1_01_05.jpg) * Shodanhq: Shodan 站点是我们可以使用的最强大的云扫描仪之一。您需要注册网站,才能执行更高级类型的查询。强烈建议您以扫描仪的强大功能在网站上注册,您可以发现的信息非常令人印象深刻,尤其是在注册之后。登录后显示的页面显示在以下屏幕截图中: ![Nonintrusive target search](graphics/477-1_01_06.jpg) 前面的截图显示了登录用户最近进行的共享搜索查询以及最新搜索。如果您正在执行专业安全测试,这是另一个您应该深入研究的工具。现在,我们将看一个例子并继续,因为我们可以用这个工具写一整本书。如果您以注册用户身份登录,可以在搜索查询窗口中输入`iphone ru`。这将在查询中返回 iPhone 页面,大部分在俄罗斯,但与任何工具一样,在其他网站上也会有一些点击。以下屏幕截图显示了此搜索结果的示例: ![Nonintrusive target search](graphics/477-1_01_07.jpg) 显示了此搜索结果的示例 ## 侵入式目标搜索 侵入性目标搜索是启动真正黑客类型活动的步骤。这是当你探测和探索目标网络时;因此,确保您拥有明确的书面许可,可以与您一起开展活动。切勿在未经许可的情况下执行侵入性目标搜索,因为此书面授权是区别于恶意黑客的唯一方面。没有它,你就被认为是罪犯。 在此步骤中,有许多组件进一步定义了方法,如下所示: * Find live systems: 无论我们的技能有多好,我们都需要找到可以攻击的系统。这是通过探测网络并寻找响应来实现的。最流行的工具之一是 Fyodor 编写的优秀开源工具 nmap。您可以从[www.nmap.org](http://www.nmap.org)下载 nmap,也可以为该工具使用任意数量的工具包发行版。我们将使用卓越的渗透测试框架 Kali Linux。您可以从[www.kali.org](http://www.kali.org)下载发行版。 无论您使用哪个版本的 nmap 进行探索,它们都有相似的命令语法,如果不是相同的话。在终端或命令提示窗口中,如果您在 Windows 操作系统上运行它,请输入`nmap –sP `。我们正在扫描的网络是 192.168.177.0/24 网络;你的很可能会有所不同。此 ping sweep 命令的示例如以下屏幕截图所示: ![Intrusive target search](graphics/477-1_01_10.jpg) 我们现在在网络上有实时系统,我们可以进一步调查。 * Discover open ports: 按照我们有实时系统的思路,我们接下来想看看这些机器上打开了什么。端口的一个很好的类比是门,也就是说,如果门是开着的,那么我可以接近开着的门。一旦我到了那扇门,我可能要做一些事情,但是如果它是开着的,那么我知道有可能进入,如果它是关着的,那么我知道我不能通过那扇门。这与港口相同;如果他们关上了,我们就不能用那扇门进入那台机器。我们有很多方法来检查是否有任何打开的端口,我们将继续使用相同的主题并使用 nmap。我们有已经识别的机器,因此我们不必像之前那样扫描整个网络。我们将只扫描当前在用的机器。 此外,发现的其中一台机器是我们自己的机器;因此,我们不会扫描我们自己,我们可以,但这不是最好的计划。我们网络上的实时目标是 1、2 和 254。我们可以通过输入`nmap –sS 192.168.177.1,2,254`来扫描这些。如果您想了解更多关于不同扫描类型的信息,请参考[http://nmap.org/book/man-port-scanning-techniques.html](http://nmap.org/book/man-port-scanning-techniques.html) 。或者,您可以使用`nmap –h`选项显示选项列表。扫描结果的第一部分显示在以下屏幕截图中: ![Intrusive target search](graphics/477-1_01_11.jpg) * Discover services: 我们现在在机器上有带电系统和开口。下一步是确定我们发现的这些端口上运行的是什么。我们必须确定机器上运行的是什么,以便在深入研究方法时使用它。我们再次转向 nmap。在大多数命令和终端窗口中,都有可用的历史记录。希望您可以使用键盘上的箭头键访问它。对于我们的网络,我们将进入`nmap –sV 192.168.177.1`。根据上次扫描,我们确定其他机器已关闭其所有扫描端口;因此,为了节省时间,我们将不再扫描它们。在以下屏幕截图中可以看到此扫描的示例: ![Intrusive target search](graphics/477-1_01_12.jpg) 可以看到这种扫描的一个例子 从结果中,您现在可以看到我们有关于目标上打开的端口的附加信息。我们可以使用这些信息使用我们前面介绍过的一些工具来搜索互联网,或者我们可以让一个工具来为我们做这件事。 * Enumeration: 这是提取潜在目标的更多信息的过程,包括操作系统、用户名、机器名以及我们可以发现的其他细节。最新版本的 nmap 有一个脚本引擎,它将尝试发现许多细节,事实上,在某些方面枚举系统。要使用 nmap 处理枚举,我们使用`–A`选项。在命令提示中输入`nmap –A 192.168.177.1`。提醒您,如果您的目标地址与我们的不同,您必须输入该地址。此外,此扫描需要一些时间才能完成,并且会在网络上产生大量流量。如果您想要更新,可以随时按空格键接收更新。此命令输出非常广泛,因此以下屏幕截图中显示了截断版本: ![Intrusive target search](graphics/477-1_01_13.jpg) 正如屏幕截图所示,您有大量关于目标的信息,并且您已经准备好开始下一阶段的测试。此外,我们正确识别了操作系统;直到这一步,我们才有了这一点。 * Identify vulnerabilities: 在我们处理到这一点的步骤之后,我们有关于机器上运行的软件的服务和版本的信息。我们可以使用每个版本在互联网上搜索漏洞,也可以使用一个工具。出于我们的目的,我们将选择后者。市场上有很多漏洞扫描器,您选择的漏洞扫描器很大程度上取决于个人偏好。大多数情况下,商业工具比免费的和开源的工具有更多的信息,所以你必须进行实验,看看你更喜欢哪一种。 我们将使用 Rapid7 的 Nexpose 漏洞扫描程序。他们的工具有一个社区版本,只扫描有限数量的目标,但值得研究。您可以从[www.rapid7.com](http://www.rapid7.com)下载 Nexpose。下载后,您必须注册并通过电子邮件接收密钥才能激活它。我们将省略的细节,让您自己体验。Nexpose 有一个 web 界面,因此一旦安装并启动该工具,您就必须访问它。您可以通过输入`https://localhost:3780`来访问它。初始化似乎需要非常长的时间,但最终会显示一个登录页面,如以下屏幕截图所示: ![Intrusive target search](graphics/477-1_01_14.jpg) 登录所需的凭据将在安装期间创建。设置扫描非常复杂,由于我们正在详细介绍过程,并且有一个优秀的快速入门指南,我们将继续讨论扫描结果。随着本书的进展,我们将有足够的时间探索这一领域。典型扫描的结果显示在以下屏幕截图中: ![Intrusive target search](graphics/477-1_01_15.jpg) 显示了典型扫描的结果 如所示,目标机状态不佳。Nexpose 的一个优点是,因为他们也拥有 metasploit;他们将列出 metasploit 中已知的漏洞。 * Exploitation: 这是安全测试的一个步骤,得到了所有的关注,简单地说,这是验证发现的漏洞的过程。需要注意的是,这并不是一个完全成功的过程,有些漏洞不会被利用,有些漏洞会在操作系统的某个补丁级别被利用,而其他漏洞则不会被利用。正如我们喜欢说的,这不是一门精确的科学,事实上,它只是专业安全测试的一个很小的部分,但它很有趣,所以我们将简要介绍这个过程。我们还想在安全测试中说,我们必须验证和验证工具向您报告的所有内容,这就是我们试图利用漏洞所做的。关键是,您正在客户机上执行一段代码,这段代码可能会造成损坏。最流行的免费开发工具是 metasploit,现在归 Rapid7 所有。有很多关于这个工具的书,所以我们将在这里展示运行这些工具和开发一台机器的结果。 可用的选项显示在以下屏幕截图中: ![Intrusive target search](graphics/477-1_01_16.jpg) 选项中有相当多的信息,但我们需要涵盖的选项是,因为我们正在利用漏洞 MS08-067 攻击服务器服务中的漏洞。这是一个更好的选择使用,因为它几乎总是工作,你可以利用它一次又一次。如果您想了解有关此漏洞的更多信息,请访问[查看 http://technet.microsoft.com/en-us/security/bulletin/ms08-067](http://technet.microsoft.com/en-us/security/bulletin/ms08-067) 。设置好选项后,我们准备尝试利用此漏洞,如以下屏幕截图所示,我们成功并在目标机器上获得了一个外壳: ![Intrusive target search](graphics/477-1_01_17.jpg) ## 数据分析 数据分析经常被忽略,这是一个耗时的过程。这是花费最多时间开发的过程。大多数测试人员可以运行工具、执行手动测试和利用,但真正的挑战是获取所有结果并进行分析。我们将在下一个屏幕截图中看一个例子。花点时间查看 WiresCark 工具中的协议分析捕获。作为一名分析师,您需要知道协议分析器向您展示了什么。你知道到底发生了什么吗?别担心,截图后我们会告诉你的。花一分钟的时间,看看您是否可以确定该工具正在使用以下屏幕截图中显示的数据包报告什么: ![Data analysis](graphics/477-1_01_18.jpg) 查看是否可以通过显示的数据包确定工具正在报告的内容 从上一个屏幕截图中,我们观察到 IP 地址为**192.168.3.10**的机器以**ICMP**数据包回复,该数据包为类型 3,代码为 13。换句话说,分组被拒绝的原因是因为通信被管理性过滤;此外,这告诉我们有一个路由器,它有一个**访问控制列表**(**ACL**正在阻止数据包。此外,它告诉我们,管理员没有遵循最佳做法来吸收数据包,并且不会回复任何错误消息,因为这可能会帮助攻击者。这只是数据分析步骤的一个小例子;您将遇到许多事情,并且需要分析更多的事情,以确定在测试环境中发生了什么。记住,管理员越聪明,笔测试就越具有挑战性。这对安全来说其实是件好事! ## 报告 这是测试中的另一个领域,在培训班中经常被忽视。这是不幸的,因为这是你需要掌握的最重要的事情之一。您必须能够向客户提交您的调查结果报告。这些发现将有助于他们改善安全状况,如果他们喜欢这份报告,他们将经常与合作伙伴和其他同事分享。这是你的广告,说明你与其他人的区别。它展示了您不仅知道如何遵循专业测试的系统流程和方法,而且知道如何将其转换为输出形式,以供客户参考。 归根结底,作为专业的安全测试人员,我们希望帮助我们的客户改善他们的安全状况,这就是报告的意义所在。报告中有很多参考资料,因此我们在这里只讨论调查结果的处理。当涉及到调查结果时,我们使用两个组件;首先,我们以表格形式提供调查结果摘要,以便客户可以在报告的早期参考调查结果。第二部分是详细调查结果部分。这就是我们把所有关于这个发现的信息放在这里的地方。我们根据严重程度对其进行评级,包括以下数据: * **说明**:这是我们提供漏洞说明的地方,特别是它是什么以及受到什么影响。 * **分析/曝光**:在本节中,你要向客户展示你已经完成了研究,而不仅仅是重复扫描工具告诉你的内容。非常重要的一点是,你要研究大量的资源,写一份关于漏洞是什么的好分析,并解释对客户网站造成的风险。 * **建议**:我们希望向客户提供补丁的参考,以帮助降低此漏洞的风险。我们从不告诉客户*不*使用它。我们不知道他们的政策是什么,这可能是他们必须拥有的,以支持他们的业务。在这些情况下,作为顾问,我们的工作是推荐并帮助客户确定降低风险或消除风险的最佳方法。当修补程序不可用时,我们会提供对潜在解决方法的参考,直到修补程序可用为止。 * **参考文献**:如果有微软公告号、CVE 号等参考文献,那么我们会将其放在这里。 # 笔试的神话和误解 经过二十多年的专业安全测试,我发现知道有多少人对什么是渗透测试感到困惑是一件令人惊讶的事情。我曾多次参加会议,客户确信他们想要进行渗透测试。然而,当我确切地解释一个人是什么时,他们用震惊的目光看着我。那么,渗透测试到底是什么?还记得我们的抽象方法学有一个侵入性目标搜索步骤,而这一步骤的一部分是另一个扫描方法学吗?嗯,扫描方法中的最后一项,即利用,是表明渗透测试的步骤。这一步是验证漏洞,这就是渗透测试的定义。同样,这不是大多数客户在引入团队时的想法。实际上,他们中的大多数人都希望进行脆弱性评估。当你开始向他们解释你将要在他们的系统和/或网络上运行一些利用漏洞的代码和所有这些非常酷的东西时,他们通常会非常惊讶。大多数情况下,客户机希望您在验证步骤停止。在某些情况下,他们会要求你证明你的发现,然后你可能会展示验证。我曾经在一次与外国股市 IT 部门的会议上,当我解释我们将如何验证漏洞时,IT 主管的反应是“这是我的股票经纪人记录,如果我们丢失了它们,我们将损失很多钱!”。因此,我们没有在该测试中执行验证步骤。 # 总结 在本章中,我们定义了与本书相关的安全测试,并确定了一种由以下步骤组成的抽象方法:规划、非侵入性目标搜索、侵入性目标搜索、数据分析和报告。更重要的是,当涉及到入侵目标搜索时,我们扩展了抽象模型,并在其中定义了扫描方法。这包括识别活动系统、查看开放端口、恢复服务、枚举、识别漏洞以及最终利用漏洞。 此外,我们还讨论了什么是渗透测试,它是漏洞的验证,并且通过扫描方法中的一个步骤来确定。不幸的是,大多数客户端不明白,当您验证漏洞时,需要您运行可能会损坏机器甚至更糟的是损坏其数据的代码。因此,大多数客户要求这不是测试的一部分。我们在本章中为渗透测试创建了一个基线,我们将在本书中使用这个定义。在下一章中,我们将讨论选择虚拟环境的过程。